From b2c1bff39075c294d4bafecef68461e7f44bef5c Mon Sep 17 00:00:00 2001 From: tonywangcn Date: Tue, 27 Oct 2026 10:21:59 +0800 Subject: [PATCH] release: regenerate for 1.50.0-sdk.1 --- CHANGELOG.md | 4 + docs/operations.md | 101 +- openapi/public.json | 112852 ++++++++------- pom.xml | 2 +- src/main/java/net/crawlora/ClientGroups.java | 64 + src/main/java/net/crawlora/OperationId.java | 97 + src/main/java/net/crawlora/Operations.java | 1939 +- src/main/java/net/crawlora/Version.java | 2 +- .../net/crawlora/groups/AliExpressGroup.java | 137 + .../net/crawlora/groups/DatasetsGroup.java | 97 + .../net/crawlora/groups/DramaBoxGroup.java | 454 + .../java/net/crawlora/groups/JumiaGroup.java | 66 + .../java/net/crawlora/groups/KickGroup.java | 555 + .../crawlora/groups/PriceChartingGroup.java | 189 + .../java/net/crawlora/groups/PsaGroup.java | 22 + .../net/crawlora/groups/ReelShortGroup.java | 290 + .../net/crawlora/groups/TcgplayerGroup.java | 246 + .../net/crawlora/groups/TelegramGroup.java | 131 + .../net/crawlora/groups/WallapopGroup.java | 149 + .../net/crawlora/groups/WattpadGroup.java | 290 + 20 files changed, 68373 insertions(+), 49314 deletions(-) create mode 100644 src/main/java/net/crawlora/groups/DramaBoxGroup.java create mode 100644 src/main/java/net/crawlora/groups/KickGroup.java create mode 100644 src/main/java/net/crawlora/groups/PriceChartingGroup.java create mode 100644 src/main/java/net/crawlora/groups/ReelShortGroup.java create mode 100644 src/main/java/net/crawlora/groups/TcgplayerGroup.java create mode 100644 src/main/java/net/crawlora/groups/TelegramGroup.java create mode 100644 src/main/java/net/crawlora/groups/WallapopGroup.java create mode 100644 src/main/java/net/crawlora/groups/WattpadGroup.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 25b9926..99ffb91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v1.50.0-sdk.1 + +- Regenerated from the public API contract (4012 operations). + ## v1.49.0-sdk.4 - Synchronized all seven generated SDKs with the 3,915-operation public API contract from current API master (up from 3,910). diff --git a/docs/operations.md b/docs/operations.md index 6f74244..c8f4f93 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -2,7 +2,7 @@ Generated from `openapi/public.json`. Deprecated, admin, and internal operations are excluded from this SDK contract. -Total operations: `3915` +Total operations: `4012` | Group | SDK method | Operation ID | HTTP | Params | Auth | Response | Notes | | --- | --- | --- | --- | --- | --- | --- | --- | @@ -66,9 +66,14 @@ Total operations: `3915` | alCom | `alCom.alcomHeadlines` | `alcom-headlines` | `GET /alcom/headlines` | `section` (query String required) | `ApiKeyAuth` | `AlComAlcomHeadlinesResponse` | | | alCom | `alCom.alcomNews` | `alcom-news` | `GET /alcom/news` | none | `ApiKeyAuth` | `AlComAlcomNewsResponse` | | | alCom | `alCom.alcomSections` | `alcom-sections` | `GET /alcom/sections` | none | `ApiKeyAuth` | `AlComAlcomSectionsResponse` | | +| aliExpress | `aliExpress.aliexpressCategories` | `aliexpress-categories` | `GET /aliexpress/categories` | `category_tab` (query String) | `ApiKeyAuth` | `AliExpressAliexpressCategoriesResponse` | | +| aliExpress | `aliExpress.aliexpressCategoryIds` | `aliexpress-category-ids` | `GET /aliexpress/category-ids` | `q` (query String)
`category_id` (query Integer)
`page` (query Integer) | `ApiKeyAuth` | `AliExpressAliexpressCategoryIdsResponse` | | +| aliExpress | `aliExpress.aliexpressCategoryProducts` | `aliexpress-category-products` | `GET /aliexpress/category-products` | `category_id` (query Integer required)
`slug` (query String)
`page` (query Integer) | `ApiKeyAuth` | `AliExpressAliexpressCategoryProductsResponse` | | | aliExpress | `aliExpress.aliexpressReviews` | `aliexpress-reviews` | `GET /aliexpress/reviews` | `product_id` (query String required)
`page` (query Integer) | `ApiKeyAuth` | `AliExpressAliexpressReviewsResponse` | | -| aliExpress | `aliExpress.aliexpressSearch` | `aliexpress-search` | `GET /aliexpress/search` | `q` (query String required)
`page` (query Integer)
`sort` (query String)
`min_price` (query Double)
`max_price` (query Double)
`free_shipping` (query Boolean)
`choice` (query Boolean)
`attr` (query String) | `ApiKeyAuth` | `AliExpressAliexpressSearchResponse` | | +| aliExpress | `aliExpress.aliexpressSearch` | `aliexpress-search` | `GET /aliexpress/search` | `q` (query String required)
`page` (query Integer)
`sort` (query String)
`min_price` (query Double)
`max_price` (query Double)
`free_shipping` (query Boolean)
`choice` (query Boolean)
`attr` (query String)
`cat_id` (query Integer) | `ApiKeyAuth` | `AliExpressAliexpressSearchResponse` | | | aliExpress | `aliExpress.aliexpressSearchFilters` | `aliexpress-search-filters` | `GET /aliexpress/search-filters` | `q` (query String required) | `ApiKeyAuth` | `AliExpressAliexpressSearchFiltersResponse` | | +| aliExpress | `aliExpress.aliexpressSuggest` | `aliexpress-suggest` | `GET /aliexpress/suggest` | `q` (query String required)
`limit` (query Integer) | `ApiKeyAuth` | `AliExpressAliexpressSuggestResponse` | | +| aliExpress | `aliExpress.aliexpressTrendingSearches` | `aliexpress-trending-searches` | `GET /aliexpress/trending-searches` | `limit` (query Integer) | `ApiKeyAuth` | `AliExpressAliexpressTrendingSearchesResponse` | | | alJazeera | `alJazeera.aljazeeraArticle` | `aljazeera-article` | `GET /aljazeera/article` | `url` (query String required) | `ApiKeyAuth` | `AlJazeeraAljazeeraArticleResponse` | | | alJazeera | `alJazeera.aljazeeraAuthor` | `aljazeera-author` | `GET /aljazeera/author` | `slug` (query String)
`url` (query String)
`page` (query Integer) | `ApiKeyAuth` | `AlJazeeraAljazeeraAuthorResponse` | | | alJazeera | `alJazeera.aljazeeraCategories` | `aljazeera-categories` | `GET /aljazeera/categories` | none | `ApiKeyAuth` | `AlJazeeraAljazeeraCategoriesResponse` | | @@ -658,6 +663,10 @@ Total operations: `3915` | datasets | `datasets.airbnbMarketsItem` | `datasets-airbnb-markets-item` | `GET /datasets/airbnb-markets/items/{country}` | `country` (path String required) | `ApiKeyAuth` | `DatasetsAirbnbMarketsItemResponse` | | | datasets | `datasets.airbnbMarketsNearby` | `datasets-airbnb-markets-nearby` | `GET /datasets/airbnb-markets/nearby` | `lat` (query Double required)
`lon` (query Double required)
`radius_m` (query Integer required)
`precision` (query Integer)
`min_listings` (query Integer)
`country` (query String)
`superhost` (query Boolean)
`min_rating` (query Double)
`active_since` (query String) | `ApiKeyAuth` | `DatasetsAirbnbMarketsNearbyResponse` | | | datasets | `datasets.airbnbMarketsSearch` | `datasets-airbnb-markets-search` | `GET /datasets/airbnb-markets/search` | `group_by` (query String)
`country` (query String)
`market` (query String)
`superhost` (query Boolean)
`guest_favorite` (query Boolean)
`min_rating` (query Double)
`min_review_count` (query Integer)
`active_since` (query String)
`min_listings` (query Integer)
`sort` (query String)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `DatasetsAirbnbMarketsSearchResponse` | | +| datasets | `datasets.appleMapsPlacesFacets` | `datasets-apple-maps-places-facets` | `GET /datasets/apple-maps-places/facets` | `facet` (query String required)
`q` (query String)
`category` (query String)
`city` (query String)
`state` (query String)
`country_code` (query String)
`postal_code` (query String)
`min_rating` (query Double)
`min_rating_count` (query Integer)
`has_website` (query Boolean)
`has_phone` (query Boolean)
`lat` (query Double)
`lon` (query Double)
`radius_m` (query Integer) | `ApiKeyAuth` | `DatasetsAppleMapsPlacesFacetsResponse` | | +| datasets | `datasets.appleMapsPlacesItem` | `datasets-apple-maps-places-item` | `GET /datasets/apple-maps-places/items/{place_id}` | `place_id` (path String required) | `ApiKeyAuth` | `DatasetsAppleMapsPlacesItemResponse` | | +| datasets | `datasets.appleMapsPlacesNearby` | `datasets-apple-maps-places-nearby` | `GET /datasets/apple-maps-places/nearby` | `lat` (query Double required)
`lon` (query Double required)
`radius_m` (query Integer required)
`category` (query String)
`min_rating` (query Double)
`min_rating_count` (query Integer)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `DatasetsAppleMapsPlacesNearbyResponse` | | +| datasets | `datasets.appleMapsPlacesSearch` | `datasets-apple-maps-places-search` | `GET /datasets/apple-maps-places/search` | `q` (query String)
`category` (query String)
`city` (query String)
`state` (query String)
`country_code` (query String)
`postal_code` (query String)
`min_rating` (query Double)
`min_rating_count` (query Integer)
`has_website` (query Boolean)
`has_phone` (query Boolean)
`lat` (query Double)
`lon` (query Double)
`radius_m` (query Integer)
`sort` (query String)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `DatasetsAppleMapsPlacesSearchResponse` | | | datasets | `datasets.applePodcastsShowsFacets` | `datasets-apple-podcasts-shows-facets` | `GET /datasets/apple-podcasts-shows/facets` | `facet` (query String required)
`q` (query String)
`genre` (query String)
`genre_id` (query String)
`country` (query String)
`explicitness` (query String)
`run_id` (query String)
`min_track_count` (query Integer) | `ApiKeyAuth` | `DatasetsApplePodcastsShowsFacetsResponse` | | | datasets | `datasets.applePodcastsShowsItem` | `datasets-apple-podcasts-shows-item` | `GET /datasets/apple-podcasts-shows/items/{id}` | `id` (path String required) | `ApiKeyAuth` | `DatasetsApplePodcastsShowsItemResponse` | | | datasets | `datasets.applePodcastsShowsSearch` | `datasets-apple-podcasts-shows-search` | `GET /datasets/apple-podcasts-shows/search` | `q` (query String)
`genre` (query String)
`genre_id` (query String)
`country` (query String)
`explicitness` (query String)
`run_id` (query String)
`min_track_count` (query Integer)
`sort` (query String)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `DatasetsApplePodcastsShowsSearchResponse` | | @@ -884,6 +893,22 @@ Total operations: `3915` | draftKingsSportsbook | `draftKingsSportsbook.draftkingsQuickLinks` | `draftkings-quick-links` | `GET /draftkings/sportsbook/quick-links` | none | `ApiKeyAuth` | `DraftKingsSportsbookDraftkingsQuickLinksResponse` | | | draftKingsSportsbook | `draftKingsSportsbook.draftkingsTeam` | `draftkings-team` | `GET /draftkings/sportsbook/team` | `team_id` (query String required)
`sport` (query String required)
`slug` (query String required) | `ApiKeyAuth` | `DraftKingsSportsbookDraftkingsTeamResponse` | | | draftKingsSportsbook | `draftKingsSportsbook.draftkingsTeams` | `draftkings-teams` | `GET /draftkings/sportsbook/teams` | `league` (query String required) | `ApiKeyAuth` | `DraftKingsSportsbookDraftkingsTeamsResponse` | | +| dramaBox | `dramaBox.dramaboxBrowse` | `dramabox-browse` | `GET /dramabox/browse` | `genre_id` (query Integer)
`page` (query Integer)
`language` (query String) | `ApiKeyAuth` | `DramaBoxDramaboxBrowseResponse` | | +| dramaBox | `dramaBox.dramaboxCategories` | `dramabox-categories` | `GET /dramabox/categories` | none | `ApiKeyAuth` | `DramaBoxDramaboxCategoriesResponse` | | +| dramaBox | `dramaBox.dramaboxCategoryBooks` | `dramabox-category-books` | `GET /dramabox/category-books` | `language` (query String)
`production` (query String)
`dub` (query String)
`genre` (query String)
`genre_2` (query String)
`sort` (query String)
`page` (query Integer)
`limit` (query Integer) | `ApiKeyAuth` | `DramaBoxDramaboxCategoryBooksResponse` | | +| dramaBox | `dramaBox.dramaboxChannels` | `dramabox-channels` | `GET /dramabox/channels` | none | `ApiKeyAuth` | `DramaBoxDramaboxChannelsResponse` | | +| dramaBox | `dramaBox.dramaboxDrama` | `dramabox-drama` | `GET /dramabox/drama` | `id` (query String required) | `ApiKeyAuth` | `DramaBoxDramaboxDramaResponse` | | +| dramaBox | `dramaBox.dramaboxGenres` | `dramabox-genres` | `GET /dramabox/genres` | `language` (query String) | `ApiKeyAuth` | `DramaBoxDramaboxGenresResponse` | | +| dramaBox | `dramaBox.dramaboxHome` | `dramabox-home` | `GET /dramabox/home` | `language` (query String) | `ApiKeyAuth` | `DramaBoxDramaboxHomeResponse` | | +| dramaBox | `dramaBox.dramaboxMore` | `dramabox-more` | `GET /dramabox/more` | `position` (query String required)
`page` (query Integer)
`language` (query String) | `ApiKeyAuth` | `DramaBoxDramaboxMoreResponse` | | +| dramaBox | `dramaBox.dramaboxPerformer` | `dramabox-performer` | `GET /dramabox/performer` | `performer_id` (query Integer required)
`page` (query Integer)
`limit` (query Integer) | `ApiKeyAuth` | `DramaBoxDramaboxPerformerResponse` | | +| dramaBox | `dramaBox.dramaboxRank` | `dramabox-rank` | `GET /dramabox/rank` | `rank_type` (query String) | `ApiKeyAuth` | `DramaBoxDramaboxRankResponse` | | +| dramaBox | `dramaBox.dramaboxRecommend` | `dramabox-recommend` | `GET /dramabox/recommend` | `page` (query Integer) | `ApiKeyAuth` | `DramaBoxDramaboxRecommendResponse` | | +| dramaBox | `dramaBox.dramaboxSearch` | `dramabox-search` | `GET /dramabox/search` | `keyword` (query String required)
`page` (query Integer)
`limit` (query Integer)
`sort` (query String) | `ApiKeyAuth` | `DramaBoxDramaboxSearchResponse` | | +| dramaBox | `dramaBox.dramaboxSuggest` | `dramabox-suggest` | `GET /dramabox/suggest` | `keyword` (query String required) | `ApiKeyAuth` | `DramaBoxDramaboxSuggestResponse` | | +| dramaBox | `dramaBox.dramaboxTag` | `dramabox-tag` | `GET /dramabox/tag` | `tag_id` (query Integer required)
`page` (query Integer)
`limit` (query Integer) | `ApiKeyAuth` | `DramaBoxDramaboxTagResponse` | | +| dramaBox | `dramaBox.dramaboxTheater` | `dramabox-theater` | `GET /dramabox/theater` | `channel` (query String required)
`page` (query Integer)
`limit` (query Integer) | `ApiKeyAuth` | `DramaBoxDramaboxTheaterResponse` | | +| dramaBox | `dramaBox.dramaboxTrending` | `dramabox-trending` | `GET /dramabox/trending` | none | `ApiKeyAuth` | `DramaBoxDramaboxTrendingResponse` | | | duckDuckGoSearch | `duckDuckGoSearch.duckduckgoImage` | `duckduckgo-image` | `GET /duckduckgo/image` | `q` (query String required)
`page` (query Integer)
`region` (query String) | `ApiKeyAuth` | `DuckDuckGoSearchDuckduckgoImageResponse` | | | duckDuckGoSearch | `duckDuckGoSearch.duckduckgoNews` | `duckduckgo-news` | `GET /duckduckgo/news` | `q` (query String required)
`page` (query Integer)
`region` (query String) | `ApiKeyAuth` | `DuckDuckGoSearchDuckduckgoNewsResponse` | | | duckDuckGoSearch | `duckDuckGoSearch.duckduckgoSearch` | `duckduckgo-search` | `GET /duckduckgo/search` | `q` (query String required)
`page` (query Integer)
`region` (query String)
`time_range` (query String)
`safe_search` (query String) | `ApiKeyAuth` | `DuckDuckGoSearchDuckduckgoSearchResponse` | | @@ -1762,7 +1787,10 @@ Total operations: `3915` | jumia | `jumia.category` | `jumia-category` | `GET /jumia/category` | `country` (query String required)
`category` (query String required)
`page` (query Integer) | `ApiKeyAuth` | `JumiaCategoryResponse` | | | jumia | `jumia.countries` | `jumia-countries` | `GET /jumia/countries` | none | `ApiKeyAuth` | `JumiaCountriesResponse` | | | jumia | `jumia.product` | `jumia-product` | `GET /jumia/product` | `url` (query String required) | `ApiKeyAuth` | `JumiaProductResponse` | | +| jumia | `jumia.reviews` | `jumia-reviews` | `GET /jumia/reviews` | `country` (query String required)
`sku` (query String required)
`page` (query Integer) | `ApiKeyAuth` | `JumiaReviewsResponse` | | | jumia | `jumia.search` | `jumia-search` | `GET /jumia/search` | `country` (query String required)
`q` (query String required)
`page` (query Integer) | `ApiKeyAuth` | `JumiaSearchResponse` | | +| jumia | `jumia.sitemapUrls` | `jumia-sitemap-urls` | `GET /jumia/sitemap-urls` | `country` (query String required)
`sitemap` (query String required)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `JumiaSitemapUrlsResponse` | | +| jumia | `jumia.sitemaps` | `jumia-sitemaps` | `GET /jumia/sitemaps` | `country` (query String required)
`type` (query String) | `ApiKeyAuth` | `JumiaSitemapsResponse` | | | justEat | `justEat.justeatRestaurant` | `justeat-restaurant` | `GET /justeat/restaurant` | `unique_name` (query String required) | `ApiKeyAuth` | `JustEatJusteatRestaurantResponse` | | | justEat | `justEat.justeatRestaurantMenu` | `justeat-restaurant-menu` | `GET /justeat/restaurant/menu` | `unique_name` (query String required) | `ApiKeyAuth` | `JustEatJusteatRestaurantMenuResponse` | | | justEat | `justEat.justeatSearch` | `justeat-search` | `GET /justeat/search` | `postcode` (query String required)
`limit` (query Integer)
`filter` (query List)
`sort_by` (query String) | `ApiKeyAuth` | `JustEatJusteatSearchResponse` | | @@ -1821,6 +1849,27 @@ Total operations: `3915` | khaleejTimes | `khaleejTimes.khaleejtimesHeadlines` | `khaleejtimes-headlines` | `GET /khaleejtimes/headlines` | `section` (query String required) | `ApiKeyAuth` | `KhaleejTimesKhaleejtimesHeadlinesResponse` | | | khaleejTimes | `khaleejTimes.khaleejtimesNews` | `khaleejtimes-news` | `GET /khaleejtimes/news` | none | `ApiKeyAuth` | `KhaleejTimesKhaleejtimesNewsResponse` | | | khaleejTimes | `khaleejTimes.khaleejtimesSections` | `khaleejtimes-sections` | `GET /khaleejtimes/sections` | none | `ApiKeyAuth` | `KhaleejTimesKhaleejtimesSectionsResponse` | | +| kick | `kick.categories` | `kick-categories` | `GET /kick/categories` | none | `ApiKeyAuth` | `KickCategoriesResponse` | | +| kick | `kick.categoryClips` | `kick-category-clips` | `GET /kick/category-clips` | `slug` (query String required)
`cursor` (query String) | `ApiKeyAuth` | `KickCategoryClipsResponse` | | +| kick | `kick.channel` | `kick-channel` | `GET /kick/channel` | `slug` (query String required) | `ApiKeyAuth` | `KickChannelResponse` | | +| kick | `kick.channelChatroom` | `kick-channel-chatroom` | `GET /kick/channel-chatroom` | `slug` (query String required) | `ApiKeyAuth` | `KickChannelChatroomResponse` | | +| kick | `kick.channelClips` | `kick-channel-clips` | `GET /kick/channel-clips` | `slug` (query String required)
`cursor` (query String) | `ApiKeyAuth` | `KickChannelClipsResponse` | | +| kick | `kick.channelEmotes` | `kick-channel-emotes` | `GET /kick/channel-emotes` | `slug` (query String required) | `ApiKeyAuth` | `KickChannelEmotesResponse` | | +| kick | `kick.channelLinks` | `kick-channel-links` | `GET /kick/channel-links` | `slug` (query String required) | `ApiKeyAuth` | `KickChannelLinksResponse` | | +| kick | `kick.channelStreams` | `kick-channel-streams` | `GET /kick/channel-streams` | `slug` (query String required) | `ApiKeyAuth` | `KickChannelStreamsResponse` | | +| kick | `kick.channelVideos` | `kick-channel-videos` | `GET /kick/channel-videos` | `slug` (query String required) | `ApiKeyAuth` | `KickChannelVideosResponse` | | +| kick | `kick.clip` | `kick-clip` | `GET /kick/clip` | `id` (query String required) | `ApiKeyAuth` | `KickClipResponse` | | +| kick | `kick.clips` | `kick-clips` | `GET /kick/clips` | `sort` (query String)
`time` (query String)
`cursor` (query String) | `ApiKeyAuth` | `KickClipsResponse` | | +| kick | `kick.drops` | `kick-drops` | `GET /kick/drops` | `status` (query String) | `ApiKeyAuth` | `KickDropsResponse` | | +| kick | `kick.gifts` | `kick-gifts` | `GET /kick/gifts` | none | `ApiKeyAuth` | `KickGiftsResponse` | | +| kick | `kick.languages` | `kick-languages` | `GET /kick/languages` | none | `ApiKeyAuth` | `KickLanguagesResponse` | | +| kick | `kick.livestreams` | `kick-livestreams` | `GET /kick/livestreams` | `sort` (query String)
`language` (query String)
`category_id` (query Integer)
`limit` (query Integer)
`after` (query String) | `ApiKeyAuth` | `KickLivestreamsResponse` | | +| kick | `kick.searchCategories` | `kick-search-categories` | `GET /kick/search-categories` | `query` (query String required)
`limit` (query Integer) | `ApiKeyAuth` | `KickSearchCategoriesResponse` | | +| kick | `kick.searchChannels` | `kick-search-channels` | `GET /kick/search-channels` | `query` (query String required)
`live` (query Boolean)
`limit` (query Integer) | `ApiKeyAuth` | `KickSearchChannelsResponse` | | +| kick | `kick.subcategories` | `kick-subcategories` | `GET /kick/subcategories` | `category` (query String)
`page` (query Integer)
`limit` (query Integer) | `ApiKeyAuth` | `KickSubcategoriesResponse` | | +| kick | `kick.subcategory` | `kick-subcategory` | `GET /kick/subcategory` | `slug` (query String required) | `ApiKeyAuth` | `KickSubcategoryResponse` | | +| kick | `kick.topChannels` | `kick-top-channels` | `GET /kick/top-channels` | none | `ApiKeyAuth` | `KickTopChannelsResponse` | | +| kick | `kick.video` | `kick-video` | `GET /kick/video` | `id` (query String required) | `ApiKeyAuth` | `KickVideoResponse` | | | kickstarter | `kickstarter.comments` | `kickstarter-comments` | `GET /kickstarter/comments` | `creator` (query String required)
`slug` (query String required) | `ApiKeyAuth` | `KickstarterCommentsResponse` | | | kickstarter | `kickstarter.discover` | `kickstarter-discover` | `GET /kickstarter/discover` | `category_id` (query Integer)
`term` (query String)
`sort` (query String)
`page` (query Integer)
`state` (query String)
`staff_pick_only` (query Boolean) | `ApiKeyAuth` | `KickstarterDiscoverResponse` | | | kickstarter | `kickstarter.project` | `kickstarter-project` | `GET /kickstarter/project` | `creator` (query String required)
`slug` (query String required) | `ApiKeyAuth` | `KickstarterProjectResponse` | | @@ -2509,6 +2558,12 @@ Total operations: `3915` | prada | `prada.search` | `prada-search` | `GET /prada/search` | `q` (query String required)
`gender` (query String)
`sort` (query String)
`page` (query Integer)
`limit` (query Integer) | `ApiKeyAuth` | `PradaSearchResponse` | | | prada | `prada.stores` | `prada-stores` | `GET /prada/stores` | `query` (query String)
`lat` (query Double)
`lng` (query Double)
`radius_km` (query Double)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `PradaStoresResponse` | | | prada | `prada.suggest` | `prada-suggest` | `GET /prada/suggest` | `q` (query String required)
`limit` (query Integer) | `ApiKeyAuth` | `PradaSuggestResponse` | | +| priceCharting | `priceCharting.pricechartingBigMovers` | `pricecharting-big-movers` | `GET /pricecharting/big-movers` | `category` (query String)
`sort` (query String)
`region` (query String) | `ApiKeyAuth` | `PriceChartingPricechartingBigMoversResponse` | | +| priceCharting | `priceCharting.pricechartingCategories` | `pricecharting-categories` | `GET /pricecharting/categories` | `category` (query String) | `ApiKeyAuth` | `PriceChartingPricechartingCategoriesResponse` | | +| priceCharting | `priceCharting.pricechartingConsole` | `pricecharting-console` | `GET /pricecharting/console` | `console` (query String required)
`sort` (query String)
`cursor` (query Integer) | `ApiKeyAuth` | `PriceChartingPricechartingConsoleResponse` | | +| priceCharting | `priceCharting.pricechartingPriceHistory` | `pricecharting-price-history` | `GET /pricecharting/price-history` | `id` (query Integer)
`url` (query String)
`console` (query String)
`slug` (query String) | `ApiKeyAuth` | `PriceChartingPricechartingPriceHistoryResponse` | | +| priceCharting | `priceCharting.pricechartingProduct` | `pricecharting-product` | `GET /pricecharting/product` | `id` (query Integer)
`console` (query String)
`slug` (query String)
`url` (query String) | `ApiKeyAuth` | `PriceChartingPricechartingProductResponse` | | +| priceCharting | `priceCharting.pricechartingSearch` | `pricecharting-search` | `GET /pricecharting/search` | `q` (query String required)
`console_uid` (query String)
`exclude_variants` (query Boolean)
`sort` (query String) | `ApiKeyAuth` | `PriceChartingPricechartingSearchResponse` | | | pristineAuction | `pristineAuction.categories` | `pristine-auction-categories` | `GET /pristine-auction/categories` | none | `ApiKeyAuth` | `PristineAuctionCategoriesResponse` | | | pristineAuction | `pristineAuction.lotDetail` | `pristine-auction-lot-detail` | `GET /pristine-auction/lot/{lot_number}` | `lot_number` (path Integer required) | `ApiKeyAuth` | `PristineAuctionLotDetailResponse` | | | pristineAuction | `pristineAuction.search` | `pristine-auction-search` | `GET /pristine-auction/search` | `term` (query String)
`category` (query String)
`auction_type` (query String)
`status` (query String)
`sort` (query String)
`min_price` (query Double)
`max_price` (query Double)
`page` (query Integer)
`per_page` (query String) | `ApiKeyAuth` | `PristineAuctionSearchResponse` | | @@ -2552,6 +2607,7 @@ Total operations: `3915` | psa | `psa.priceGuideCategories` | `psa-price-guide-categories` | `GET /psa/price-guide/categories` | none | `ApiKeyAuth` | `PsaPriceGuideCategoriesResponse` | | | psa | `psa.priceGuideSearch` | `psa-price-guide-search` | `GET /psa/price-guide/search` | `query` (query String required)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `PsaPriceGuideSearchResponse` | | | psa | `psa.priceGuideSet` | `psa-price-guide-set` | `GET /psa/price-guide/set` | `category_path` (query String required)
`set_path` (query String required)
`set_id` (query String required) | `ApiKeyAuth` | `PsaPriceGuideSetResponse` | | +| psa | `psa.priceGuideSets` | `psa-price-guide-sets` | `GET /psa/price-guide/sets` | `query` (query String required)
`category_path` (query String)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `PsaPriceGuideSetsResponse` | | | psa | `psa.probatfactsCategories` | `psa-probatfacts-categories` | `GET /psa/probatfacts/categories` | none | `ApiKeyAuth` | `PsaProbatfactsCategoriesResponse` | | | psa | `psa.probatfactsGallery` | `psa-probatfacts-gallery` | `GET /psa/probatfacts/gallery` | `subject_id` (query String required) | `ApiKeyAuth` | `PsaProbatfactsGalleryResponse` | | | psa | `psa.probatfactsSubject` | `psa-probatfacts-subject` | `GET /psa/probatfacts/subject` | `subject_id` (query String required) | `ApiKeyAuth` | `PsaProbatfactsSubjectResponse` | | @@ -2638,6 +2694,17 @@ Total operations: `3915` | redfin | `redfin.regionTrends` | `redfin-region-trends` | `GET /redfin/region-trends` | `region_id` (query Integer required)
`region_type` (query String) | `ApiKeyAuth` | `RedfinRegionTrendsResponse` | | | redfin | `redfin.search` | `redfin-search` | `GET /redfin/search` | `location` (query String)
`page` (query Integer)
`region_id` (query Integer)
`region_type` (query String)
`status` (query String)
`min_price` (query Integer)
`max_price` (query Integer)
`min_beds` (query Integer)
`min_baths` (query Double) | `ApiKeyAuth` | `RedfinSearchResponse` | | | redfin | `redfin.similar` | `redfin-similar` | `GET /redfin/similar` | `property_id` (query String required) | `ApiKeyAuth` | `RedfinSimilarResponse` | | +| reelShort | `reelShort.reelshortFandomCategories` | `reelshort-fandom-categories` | `GET /reelshort/fandom-categories` | none | `ApiKeyAuth` | `ReelShortReelshortFandomCategoriesResponse` | | +| reelShort | `reelShort.reelshortFandomPost` | `reelshort-fandom-post` | `GET /reelshort/fandom-post` | `id` (query String required) | `ApiKeyAuth` | `ReelShortReelshortFandomPostResponse` | | +| reelShort | `reelShort.reelshortFandomPosts` | `reelshort-fandom-posts` | `GET /reelshort/fandom-posts` | `search` (query String)
`category` (query String)
`page` (query Integer)
`limit` (query Integer) | `ApiKeyAuth` | `ReelShortReelshortFandomPostsResponse` | | +| reelShort | `reelShort.reelshortHome` | `reelshort-home` | `GET /reelshort/home` | `language` (query String) | `ApiKeyAuth` | `ReelShortReelshortHomeResponse` | | +| reelShort | `reelShort.reelshortMovie` | `reelshort-movie` | `GET /reelshort/movie` | `id` (query String required) | `ApiKeyAuth` | `ReelShortReelshortMovieResponse` | | +| reelShort | `reelShort.reelshortNewReleases` | `reelshort-new-releases` | `GET /reelshort/new-releases` | `book_id` (query String required)
`language` (query String) | `ApiKeyAuth` | `ReelShortReelshortNewReleasesResponse` | | +| reelShort | `reelShort.reelshortSearch` | `reelshort-search` | `GET /reelshort/search` | `keywords` (query String required)
`page` (query Integer)
`language` (query String) | `ApiKeyAuth` | `ReelShortReelshortSearchResponse` | | +| reelShort | `reelShort.reelshortShelf` | `reelshort-shelf` | `GET /reelshort/shelf` | `id` (query String required) | `ApiKeyAuth` | `ReelShortReelshortShelfResponse` | | +| reelShort | `reelShort.reelshortTagBooks` | `reelshort-tag-books` | `GET /reelshort/tag-books` | `tag_id` (query String required)
`page` (query Integer)
`limit` (query Integer)
`language` (query String) | `ApiKeyAuth` | `ReelShortReelshortTagBooksResponse` | | +| reelShort | `reelShort.reelshortTagSearch` | `reelshort-tag-search` | `GET /reelshort/tag-search` | `word` (query String required)
`page` (query Integer)
`language` (query String) | `ApiKeyAuth` | `ReelShortReelshortTagSearchResponse` | | +| reelShort | `reelShort.reelshortTags` | `reelshort-tags` | `GET /reelshort/tags` | `category` (query String required)
`language` (query String) | `ApiKeyAuth` | `ReelShortReelshortTagsResponse` | | | referrals | `referrals.click` | `referrals-click` | `POST /referrals/click` | `request` (body String required) | none | `ReferralsClickResponse` | | | referrals | `referrals.me` | `referrals-me` | `GET /referrals/me` | none | `JWTAuth` | `ReferralsMeResponse` | | | referrals | `referrals.meEvents` | `referrals-me-events` | `GET /referrals/me/events` | `limit` (query Integer) | `JWTAuth` | `ReferralsMeEventsResponse` | | @@ -3278,6 +3345,15 @@ Total operations: `3915` | target | `target.reviews` | `target-reviews` | `GET /target/reviews` | `tcin` (query String required)
`page` (query Integer)
`per_page` (query Integer) | `ApiKeyAuth` | `TargetReviewsResponse` | | | target | `target.search` | `target-search` | `GET /target/search` | `q` (query String required)
`page` (query Integer)
`sort` (query String)
`store_id` (query Integer)
`filter_ids` (query String) | `ApiKeyAuth` | `TargetSearchResponse` | | | target | `target.stores` | `target-stores` | `GET /target/stores` | `place` (query String required)
`limit` (query Integer)
`within` (query Integer) | `ApiKeyAuth` | `TargetStoresResponse` | | +| tcgplayer | `tcgplayer.filters` | `tcgplayer-filters` | `GET /tcgplayer/filters` | `product_line` (query String)
`id` (query Integer) | `ApiKeyAuth` | `TcgplayerFiltersResponse` | | +| tcgplayer | `tcgplayer.listings` | `tcgplayer-listings` | `GET /tcgplayer/listings` | `id` (query Integer required)
`condition` (query String)
`printing` (query String)
`language` (query String)
`sort` (query String)
`order` (query String)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `TcgplayerListingsResponse` | | +| tcgplayer | `tcgplayer.priceGuide` | `tcgplayer-price-guide` | `GET /tcgplayer/price-guide` | `set_id` (query Integer required)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `TcgplayerPriceGuideResponse` | | +| tcgplayer | `tcgplayer.priceHistory` | `tcgplayer-price-history` | `GET /tcgplayer/price-history` | `id` (query Integer required)
`range` (query String) | `ApiKeyAuth` | `TcgplayerPriceHistoryResponse` | | +| tcgplayer | `tcgplayer.product` | `tcgplayer-product` | `GET /tcgplayer/product` | `id` (query Integer required) | `ApiKeyAuth` | `TcgplayerProductResponse` | | +| tcgplayer | `tcgplayer.productLines` | `tcgplayer-product-lines` | `GET /tcgplayer/product-lines` | none | `ApiKeyAuth` | `TcgplayerProductLinesResponse` | | +| tcgplayer | `tcgplayer.sales` | `tcgplayer-sales` | `GET /tcgplayer/sales` | `id` (query Integer required)
`condition` (query String)
`variant` (query String)
`language` (query String)
`listing_type` (query String) | `ApiKeyAuth` | `TcgplayerSalesResponse` | | +| tcgplayer | `tcgplayer.search` | `tcgplayer-search` | `GET /tcgplayer/search` | `q` (query String)
`product_line` (query String)
`set` (query String)
`product_type` (query String)
`rarity` (query String)
`card_type` (query String)
`min_price` (query Double)
`max_price` (query Double)
`sort` (query String)
`order` (query String)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `TcgplayerSearchResponse` | | +| tcgplayer | `tcgplayer.sets` | `tcgplayer-sets` | `GET /tcgplayer/sets` | `product_line` (query String required) | `ApiKeyAuth` | `TcgplayerSetsResponse` | | | techCrunch | `techCrunch.techcrunchArticle` | `techcrunch-article` | `GET /techcrunch/article` | `url` (query String required) | `ApiKeyAuth` | `TechCrunchTechcrunchArticleResponse` | | | techCrunch | `techCrunch.techcrunchAuthor` | `techcrunch-author` | `GET /techcrunch/author` | `url` (query String required)
`page` (query Integer) | `ApiKeyAuth` | `TechCrunchTechcrunchAuthorResponse` | | | techCrunch | `techCrunch.techcrunchHeadlines` | `techcrunch-headlines` | `GET /techcrunch/headlines` | `section` (query String required) | `ApiKeyAuth` | `TechCrunchTechcrunchHeadlinesResponse` | | @@ -3288,6 +3364,11 @@ Total operations: `3915` | techRadar | `techRadar.techradarHeadlines` | `techradar-headlines` | `GET /techradar/headlines` | `section` (query String required) | `ApiKeyAuth` | `TechRadarTechradarHeadlinesResponse` | | | techRadar | `techRadar.techradarNews` | `techradar-news` | `GET /techradar/news` | none | `ApiKeyAuth` | `TechRadarTechradarNewsResponse` | | | techRadar | `techRadar.techradarSections` | `techradar-sections` | `GET /techradar/sections` | none | `ApiKeyAuth` | `TechRadarTechradarSectionsResponse` | | +| telegram | `telegram.bot` | `telegram-bot` | `GET /telegram/bot` | `username` (query String required) | `ApiKeyAuth` | `TelegramBotResponse` | | +| telegram | `telegram.channel` | `telegram-channel` | `GET /telegram/channel` | `username` (query String required) | `ApiKeyAuth` | `TelegramChannelResponse` | | +| telegram | `telegram.channelPosts` | `telegram-channel-posts` | `GET /telegram/channel-posts` | `username` (query String required)
`before` (query Integer)
`query` (query String) | `ApiKeyAuth` | `TelegramChannelPostsResponse` | | +| telegram | `telegram.group` | `telegram-group` | `GET /telegram/group` | `username` (query String required) | `ApiKeyAuth` | `TelegramGroupResponse` | | +| telegram | `telegram.post` | `telegram-post` | `GET /telegram/post` | `username` (query String required)
`id` (query Integer required) | `ApiKeyAuth` | `TelegramPostResponse` | | | theTelegraph | `theTelegraph.telegraphArticle` | `telegraph-article` | `GET /telegraph/article` | `url` (query String required) | `ApiKeyAuth` | `TheTelegraphTelegraphArticleResponse` | | | theTelegraph | `theTelegraph.telegraphAuthor` | `telegraph-author` | `GET /telegraph/author` | `url` (query String required) | `ApiKeyAuth` | `TheTelegraphTelegraphAuthorResponse` | | | theTelegraph | `theTelegraph.telegraphHeadlines` | `telegraph-headlines` | `GET /telegraph/headlines` | `section` (query String required) | `ApiKeyAuth` | `TheTelegraphTelegraphHeadlinesResponse` | | @@ -3690,6 +3771,11 @@ Total operations: `3915` | walesOnline | `walesOnline.walesonlineNews` | `walesonline-news` | `GET /walesonline/news` | none | `ApiKeyAuth` | `WalesOnlineWalesonlineNewsResponse` | | | walesOnline | `walesOnline.walesonlineSections` | `walesonline-sections` | `GET /walesonline/sections` | none | `ApiKeyAuth` | `WalesOnlineWalesonlineSectionsResponse` | | | walgreens | `walgreens.stores` | `walgreens-stores` | `GET /walgreens/stores` | `latitude` (query Double)
`longitude` (query Double)
`zip` (query String) | `ApiKeyAuth` | `WalgreensStoresResponse` | | +| wallapop | `wallapop.categories` | `wallapop-categories` | `GET /wallapop/categories` | none | `ApiKeyAuth` | `WallapopCategoriesResponse` | | +| wallapop | `wallapop.filterOptions` | `wallapop-filter-options` | `GET /wallapop/filter-options` | `filter_id` (query String required)
`category_id` (query Integer required)
`brand` (query String)
`q` (query String)
`sort` (query String)
`options_query` (query String)
`cursor` (query String) | `ApiKeyAuth` | `WallapopFilterOptionsResponse` | | +| wallapop | `wallapop.filters` | `wallapop-filters` | `GET /wallapop/filters` | `q` (query String)
`category_id` (query Integer) | `ApiKeyAuth` | `WallapopFiltersResponse` | | +| wallapop | `wallapop.itemDetail` | `wallapop-item-detail` | `GET /wallapop/item` | `url` (query String required) | `ApiKeyAuth` | `WallapopItemDetailResponse` | | +| wallapop | `wallapop.search` | `wallapop-search` | `GET /wallapop/search` | `q` (query String required)
`latitude` (query Double required)
`longitude` (query Double required)
`category_id` (query Integer)
`sort` (query String)
`min_price` (query Double)
`max_price` (query Double)
`condition` (query String)
`is_shippable` (query String)
`time_filter` (query String)
`distance_in_km` (query Integer)
`filter` (query List)
`cursor` (query String) | `ApiKeyAuth` | `WallapopSearchResponse` | | | walmart | `walmart.product` | `walmart-product` | `GET /walmart/product/{item_id}` | `item_id` (path String required) | `ApiKeyAuth` | `WalmartProductResponse` | | | walmart | `walmart.productReviews` | `walmart-product-reviews` | `GET /walmart/product/{item_id}/reviews` | `item_id` (path String required) | `ApiKeyAuth` | `WalmartProductReviewsResponse` | | | walmart | `walmart.search` | `walmart-search` | `GET /walmart/search` | `q` (query String required)
`page` (query Integer)
`sort` (query String) | `ApiKeyAuth` | `WalmartSearchResponse` | | @@ -3698,6 +3784,17 @@ Total operations: `3915` | washingtonPost | `washingtonPost.wapoHeadlines` | `wapo-headlines` | `GET /wapo/headlines` | `section` (query String required) | `ApiKeyAuth` | `WashingtonPostWapoHeadlinesResponse` | | | washingtonPost | `washingtonPost.wapoNews` | `wapo-news` | `GET /wapo/news` | none | `ApiKeyAuth` | `WashingtonPostWapoNewsResponse` | | | washingtonPost | `washingtonPost.wapoSections` | `wapo-sections` | `GET /wapo/sections` | none | `ApiKeyAuth` | `WashingtonPostWapoSectionsResponse` | | +| wattpad | `wattpad.categories` | `wattpad-categories` | `GET /wattpad/categories` | none | `ApiKeyAuth` | `WattpadCategoriesResponse` | | +| wattpad | `wattpad.languages` | `wattpad-languages` | `GET /wattpad/languages` | none | `ApiKeyAuth` | `WattpadLanguagesResponse` | | +| wattpad | `wattpad.part` | `wattpad-part` | `GET /wattpad/part` | `part_id` (query String required) | `ApiKeyAuth` | `WattpadPartResponse` | | +| wattpad | `wattpad.partComments` | `wattpad-part-comments` | `GET /wattpad/part-comments` | `part_id` (query String required)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `WattpadPartCommentsResponse` | | +| wattpad | `wattpad.search` | `wattpad-search` | `GET /wattpad/search` | `query` (query String)
`filter` (query String)
`category` (query Integer)
`language` (query String)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `WattpadSearchResponse` | | +| wattpad | `wattpad.searchUsers` | `wattpad-search-users` | `GET /wattpad/search-users` | `query` (query String required)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `WattpadSearchUsersResponse` | | +| wattpad | `wattpad.story` | `wattpad-story` | `GET /wattpad/story` | `story_id` (query String required) | `ApiKeyAuth` | `WattpadStoryResponse` | | +| wattpad | `wattpad.storyParts` | `wattpad-story-parts` | `GET /wattpad/story-parts` | `story_id` (query String required) | `ApiKeyAuth` | `WattpadStoryPartsResponse` | | +| wattpad | `wattpad.storyRecommendations` | `wattpad-story-recommendations` | `GET /wattpad/story-recommendations` | `story_id` (query String required)
`limit` (query Integer) | `ApiKeyAuth` | `WattpadStoryRecommendationsResponse` | | +| wattpad | `wattpad.user` | `wattpad-user` | `GET /wattpad/user` | `username` (query String required) | `ApiKeyAuth` | `WattpadUserResponse` | | +| wattpad | `wattpad.userStories` | `wattpad-user-stories` | `GET /wattpad/user-stories` | `username` (query String required)
`limit` (query Integer)
`offset` (query Integer) | `ApiKeyAuth` | `WattpadUserStoriesResponse` | | | wayfair | `wayfair.categories` | `wayfair-categories` | `GET /wayfair/categories` | `q` (query String)
`page` (query Integer)
`page_size` (query Integer) | `ApiKeyAuth` | `WayfairCategoriesResponse` | | | wayfair | `wayfair.category` | `wayfair-category` | `GET /wayfair/category` | `category` (query String required)
`page` (query Integer) | `ApiKeyAuth` | `WayfairCategoryResponse` | | | wayfair | `wayfair.product` | `wayfair-product` | `GET /wayfair/product/{id}` | `id` (path String required) | `ApiKeyAuth` | `WayfairProductResponse` | | diff --git a/openapi/public.json b/openapi/public.json index 0d89eba..9e4e955 100644 --- a/openapi/public.json +++ b/openapi/public.json @@ -3125,6 +3125,192 @@ }, "type": "object" }, + "aliexpress.CategoriesResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/aliexpress.Category" + }, + "type": "array" + }, + "category_tab": { + "description": "CategoryTab echoes the expanded tab, empty when only the top-level tabs\nwere returned.", + "example": "electronics", + "type": "string" + }, + "count": { + "example": 24, + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "source_url": { + "description": "SourceURL is the gateway operation the taxonomy comes from. The signed\nrequest URL itself is never exposed because it carries a freshly minted\ntoken and signature.", + "type": "string" + } + }, + "type": "object" + }, + "aliexpress.Category": { + "properties": { + "category_id": { + "example": "10536", + "type": "string" + }, + "children": { + "items": { + "$ref": "#/definitions/aliexpress.Category" + }, + "type": "array" + }, + "icon_url": { + "type": "string" + }, + "id": { + "example": "electronics", + "type": "string" + }, + "level": { + "example": 1, + "type": "integer" + }, + "name": { + "example": "Electronics", + "type": "string" + }, + "parent_id": { + "example": "electronics", + "type": "string" + }, + "search_keyword": { + "description": "SearchKeyword is the keyword AliExpress's own navigation uses for a\nthird-level category; pass it to aliexpress_search as q.", + "example": "semiconductors", + "type": "string" + }, + "search_url": { + "description": "SearchURL is the public web search page for SearchKeyword.", + "example": "https://www.aliexpress.com/w/wholesale-semiconductors.html?SearchText=semiconductors&catId=0", + "type": "string" + } + }, + "type": "object" + }, + "aliexpress.CategoryIDsResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/aliexpress.WebCategory" + }, + "type": "array" + }, + "category_id": { + "description": "CategoryID echoes the requested category id, when one was supplied.", + "example": 5090301, + "type": "integer" + }, + "count": { + "example": 3, + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "page": { + "example": 1, + "type": "integer" + }, + "paths": { + "items": { + "$ref": "#/definitions/aliexpress.CategoryPath" + }, + "type": "array" + }, + "query": { + "description": "Query echoes the requested keywords, when q was supplied.", + "example": "wireless earbuds", + "type": "string" + }, + "source": { + "description": "Source is \"search\" when q selected the page, \"category\" when category_id\ndid.", + "example": "category", + "type": "string" + }, + "source_url": { + "type": "string" + }, + "total_results": { + "example": 601, + "type": "integer" + } + }, + "type": "object" + }, + "aliexpress.CategoryPath": { + "properties": { + "depth": { + "type": "integer" + }, + "leaf_id": { + "type": "integer" + }, + "path": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "products": { + "type": "integer" + } + }, + "type": "object" + }, + "aliexpress.CategoryProductsResponse": { + "properties": { + "category_id": { + "example": 5090301, + "type": "integer" + }, + "count": { + "example": 60, + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "page": { + "example": 1, + "type": "integer" + }, + "page_size": { + "example": 60, + "type": "integer" + }, + "products": { + "items": { + "$ref": "#/definitions/aliexpress.ProductSummary" + }, + "type": "array" + }, + "slug": { + "example": "cellphones", + "type": "string" + }, + "source_url": { + "type": "string" + }, + "total_pages": { + "example": 58, + "type": "integer" + }, + "total_results": { + "example": 3421, + "type": "integer" + } + }, + "type": "object" + }, "aliexpress.FiltersResponse": { "properties": { "attribute_groups": { @@ -3181,6 +3367,7 @@ "type": "number" }, "price": { + "description": "Price is always emitted, including 0: AliExpress reports real $0/zero-price\ndeals, and omitting the field would make \"free\" indistinguishable from\n\"no price parsed\". This is an intentional payload-contract change.", "example": 2.18, "type": "number" }, @@ -3381,6 +3568,49 @@ }, "type": "object" }, + "aliexpress.SuggestResponse": { + "properties": { + "count": { + "example": 10, + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "limit": { + "example": 10, + "type": "integer" + }, + "query": { + "example": "wireless earbuds", + "type": "string" + }, + "source_url": { + "description": "SourceURL is the gateway operation the suggestions come from. The signed\nrequest URL itself is never exposed because it carries a freshly minted\ntoken and signature.", + "type": "string" + }, + "suggestions": { + "items": { + "$ref": "#/definitions/aliexpress.Suggestion" + }, + "type": "array" + } + }, + "type": "object" + }, + "aliexpress.Suggestion": { + "properties": { + "keyword": { + "example": "wireless earbuds bluetooth", + "type": "string" + }, + "url": { + "example": "https://www.aliexpress.com/w/wholesale-wireless-earbuds-bluetooth.html?SearchText=wireless+earbuds+bluetooth&catId=0", + "type": "string" + } + }, + "type": "object" + }, "aliexpress.SwitchOption": { "properties": { "label": { @@ -3394,6 +3624,160 @@ }, "type": "object" }, + "aliexpress.TrendingSearch": { + "properties": { + "category": { + "description": "Category is the hot-list card's category label (for example\n\"Home Appliances\"); it is only present for hot keywords.", + "example": "Home Appliances", + "type": "string" + }, + "display_keyword": { + "description": "DisplayKeyword is AliExpress's display casing for the keyword, present\nonly when it differs from keyword.", + "example": "Wireless Earbuds", + "type": "string" + }, + "image_url": { + "description": "ImageURL is the keyword's own thumbnail when the payload carries one;\nonly hot keywords carry image_list entries.", + "type": "string" + }, + "keyword": { + "example": "wireless earbuds", + "type": "string" + }, + "kind": { + "description": "Kind is one of hot, shading, discovery or history (the last is empty for\nanonymous callers, who have no search history).", + "example": "hot", + "type": "string" + }, + "label": { + "description": "Label is the module's own UI label, e.g. \"Home Shading\", \"Discover more\",\n\"Hot for you\" or \"#must buy list\".", + "example": "Hot for you", + "type": "string" + }, + "search_url": { + "example": "https://www.aliexpress.com/w/wholesale-wireless-earbuds.html?SearchText=wireless+earbuds&catId=0", + "type": "string" + } + }, + "type": "object" + }, + "aliexpress.TrendingSearchesResponse": { + "properties": { + "available": { + "example": 43, + "type": "integer" + }, + "count": { + "description": "Count is len(Items); Available is how many keywords AliExpress carried\nbefore limit was applied.", + "example": 10, + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/aliexpress.TrendingSearch" + }, + "type": "array" + }, + "limit": { + "example": 10, + "type": "integer" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "aliexpress.WebCategory": { + "properties": { + "category_id": { + "example": 5090301, + "type": "integer" + }, + "leaf": { + "description": "Leaf is true when this id is a product's post category (the last element\nof at least one observed path).", + "type": "boolean" + }, + "level": { + "description": "Level is the 1-based position in the observed path (1 = top-level\ndisplay category).", + "example": 2, + "type": "integer" + }, + "parent_id": { + "description": "ParentID is the immediately shallower id in the observed path; omitted\nfor a path's top-level element.", + "example": 509, + "type": "integer" + }, + "path": { + "description": "Path is the full observed breadcrumb this id was seen in.", + "example": [ + 509, + 5090301 + ], + "items": { + "type": "integer" + }, + "type": "array" + }, + "product_hits": { + "description": "ProductHits counts cards on this page whose path contains the id.", + "example": 60, + "type": "integer" + } + }, + "type": "object" + }, + "aliexpress.categoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/aliexpress.CategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "aliexpress.categoryIDsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/aliexpress.CategoryIDsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "aliexpress.categoryProductsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/aliexpress.CategoryProductsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "aliexpress.filtersResponseDoc": { "properties": { "code": { @@ -3442,6 +3826,38 @@ }, "type": "object" }, + "aliexpress.suggestResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/aliexpress.SuggestResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "aliexpress.trendingSearchesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/aliexpress.TrendingSearchesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "aljazeera.ArticleResponse": { "properties": { "authors": { @@ -43564,6 +43980,49 @@ }, "type": "object" }, + "datasets.ApplePlaceFacetResponse": { + "properties": { + "dataset": { + "type": "string" + }, + "facet": { + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/es.ApplePlaceDatasetFacetItem" + }, + "type": "array" + } + }, + "type": "object" + }, + "datasets.ApplePlaceSearchResponse": { + "properties": { + "dataset": { + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/es.ApplePlaceDatasetItem" + }, + "type": "array" + }, + "page": { + "type": "integer" + }, + "page_size": { + "type": "integer" + }, + "sort": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, "datasets.ApplePodcastsShowsFacetResponse": { "properties": { "dataset": { @@ -45946,6 +46405,54 @@ }, "type": "object" }, + "datasets.applePlaceResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/es.ApplePlaceRecord" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "datasets.applePlacesFacetResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/datasets.ApplePlaceFacetResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "datasets.applePlacesSearchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/datasets.ApplePlaceSearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "datasets.applePodcastsShowResponseDoc": { "properties": { "code": { @@ -52370,6 +52877,1073 @@ }, "type": "object" }, + "dramabox.AppTagRef": { + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.AppTitle": { + "properties": { + "cover_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "episodes": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "in_library": { + "description": "InLibrary is always false for the shared guest session.", + "type": "boolean" + }, + "play_count": { + "description": "PlayCount is the app's displayed play count where the route carries it.", + "type": "integer" + }, + "protagonist": { + "description": "Protagonist lists the cast names as the app prints them.", + "type": "string" + }, + "shelf_time": { + "description": "ShelfTime is the app's listing time as printed (\"2026-09-27 16:42:18\").", + "type": "string" + }, + "shelf_time_ms": { + "description": "ShelfTimeMS is the same listing time as Unix milliseconds.", + "type": "integer" + }, + "tag_refs": { + "description": "TagRefs pairs each tag with its id; pass an id to dramabox-tag.", + "items": { + "$ref": "#/definitions/dramabox.AppTagRef" + }, + "type": "array" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "url": { + "description": "URL is the public DramaBox website page for the title.", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.Book": { + "properties": { + "cover_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "episodes": { + "type": "integer" + }, + "follows": { + "type": "integer" + }, + "genres": { + "items": { + "$ref": "#/definitions/dramabox.Genre" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "language": { + "type": "string" + }, + "listed_at": { + "description": "ListedAt is the site's first-listing timestamp as printed\n(\"2026-10-24 10:00:00\"); its time zone is not stated by the site.", + "type": "string" + }, + "rating": { + "type": "number" + }, + "status": { + "description": "Status is the site's update label, for example \"Completed\".", + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "views_display": { + "description": "ViewsDisplay is the view count as the site prints it (\"15.6K\"); it is\nempty where the list does not carry one.", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.BrowseResponse": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/dramabox.Book" + }, + "type": "array" + }, + "genre_id": { + "type": "integer" + }, + "genre_name": { + "type": "string" + }, + "language": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "total_pages": { + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.CategoriesResponse": { + "properties": { + "groups": { + "items": { + "$ref": "#/definitions/dramabox.CategoryGroup" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.CategoryBooksResponse": { + "properties": { + "has_more": { + "type": "boolean" + }, + "limit": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "titles": { + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.CategoryGroup": { + "properties": { + "key": { + "description": "Key is language, production, dub, genre_1, genre_2 or sort.", + "type": "string" + }, + "options": { + "items": { + "$ref": "#/definitions/dramabox.CategoryOption" + }, + "type": "array" + }, + "row": { + "description": "Row is the genre row index for the two type-4 groups (0 then 1). It is\nzero/omitted for every other group.", + "type": "integer" + }, + "type": { + "description": "Type is the upstream classify type id (1, 6, 2, 4, 4, 5 respectively,\nin the order above).", + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.CategoryOption": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.Channel": { + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.ChannelsResponse": { + "properties": { + "channels": { + "items": { + "$ref": "#/definitions/dramabox.Channel" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.DramaResponse": { + "properties": { + "available_languages": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cover_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "episode_count": { + "type": "integer" + }, + "episodes": { + "items": { + "$ref": "#/definitions/dramabox.Episode" + }, + "type": "array" + }, + "follows": { + "type": "integer" + }, + "genres": { + "items": { + "$ref": "#/definitions/dramabox.Genre" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "language": { + "type": "string" + }, + "listed_at": { + "type": "string" + }, + "related": { + "items": { + "$ref": "#/definitions/dramabox.Book" + }, + "type": "array" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "url": { + "type": "string" + }, + "views": { + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.Episode": { + "properties": { + "duration_ms": { + "type": "integer" + }, + "free": { + "description": "Free is true for episodes the site unlocks without payment.", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "number": { + "description": "Number is the 1-based episode number.", + "type": "integer" + }, + "thumbnail_url": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.Genre": { + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.GenresResponse": { + "properties": { + "genres": { + "items": { + "$ref": "#/definitions/dramabox.Genre" + }, + "type": "array" + }, + "language": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.HomeResponse": { + "properties": { + "featured": { + "items": { + "$ref": "#/definitions/dramabox.Book" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "shelves": { + "items": { + "$ref": "#/definitions/dramabox.Shelf" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.MoreResponse": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/dramabox.Book" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "position": { + "type": "string" + }, + "total_pages": { + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.PerformerResponse": { + "properties": { + "avatar": { + "type": "string" + }, + "followed": { + "type": "boolean" + }, + "gender": { + "type": "integer" + }, + "has_more": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "titles": { + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + }, + "video_count": { + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.RankMeta": { + "properties": { + "hot_code": { + "type": "string" + }, + "sort": { + "type": "integer" + }, + "type": { + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.RankResponse": { + "properties": { + "rank_type": { + "description": "RankType echoes the requested tab; 0 means the default tab was used.", + "type": "integer" + }, + "tabs": { + "description": "Tabs are the ranking tabs the app API offers; pass a tab's type as\nrank_type to read that list.", + "items": { + "$ref": "#/definitions/dramabox.RankTab" + }, + "type": "array" + }, + "titles": { + "description": "Titles holds the ranking list (fixed at 20 titles upstream).", + "items": { + "$ref": "#/definitions/dramabox.RankedTitle" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.RankTab": { + "properties": { + "name": { + "type": "string" + }, + "type": { + "description": "Type is the value to pass as rank_type.", + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.RankedTitle": { + "properties": { + "cover_url": { + "type": "string" + }, + "data_from": { + "description": "DataFrom is the app's recommendation-source label.", + "type": "string" + }, + "description": { + "type": "string" + }, + "episodes": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "in_library": { + "description": "InLibrary reports whether the title is in the caller's library, which\nfor a guest session is always false.", + "type": "boolean" + }, + "position": { + "description": "Position is the title's ordinal in the ranking (1-based).", + "type": "integer" + }, + "protagonist": { + "description": "Protagonist lists the cast names as the app prints them.", + "type": "string" + }, + "rank": { + "$ref": "#/definitions/dramabox.RankMeta" + }, + "shelf_time": { + "description": "ShelfTime is the app's listing time as printed (\"2026-09-27 16:42:18\").", + "type": "string" + }, + "shelf_time_ms": { + "description": "ShelfTimeMS is the same listing time as Unix milliseconds.", + "type": "integer" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "url": { + "description": "URL is the public DramaBox website page for the title.", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.RecommendResponse": { + "properties": { + "has_more": { + "type": "boolean" + }, + "page": { + "type": "integer" + }, + "page_size": { + "description": "PageSize is the upstream page size (the route takes no page-size\nparameter, so callers cannot choose it).", + "type": "integer" + }, + "title": { + "type": "string" + }, + "titles": { + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.SearchPerson": { + "properties": { + "avatar": { + "description": "Avatar is the performer image URL the app serves (jpg); it is catalogue\nartwork, not playable media.", + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "videos": { + "description": "Videos is the number of series the performer appears in.", + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.SearchResponse": { + "properties": { + "is_more": { + "description": "HasMore is the answer's isMore flag (the app API's totalSize is not\nusable: it answers 0 even when more pages exist).", + "type": "boolean" + }, + "keyword": { + "description": "Keyword echoes the normalized keyword that was searched.", + "type": "string" + }, + "limit": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "people": { + "description": "People holds the performer rows.", + "items": { + "$ref": "#/definitions/dramabox.SearchPerson" + }, + "type": "array" + }, + "titles": { + "description": "Titles holds the book rows.", + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.Shelf": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/dramabox.Book" + }, + "type": "array" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "position": { + "description": "Position is the dramabox-more position that lists this shelf in full:\ntrending, must-sees or hidden-gems; empty for an unknown shelf.", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.SuggestItem": { + "properties": { + "avatar": { + "description": "Avatar is the performer image (jpg) for kind \"actor\".", + "type": "string" + }, + "cover_url": { + "description": "CoverURL is the book cover image (jpg) for kind \"book\".", + "type": "string" + }, + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "videos": { + "description": "Videos is the performer's series count for kind \"actor\".", + "type": "integer" + } + }, + "type": "object" + }, + "dramabox.SuggestResponse": { + "properties": { + "items": { + "items": { + "$ref": "#/definitions/dramabox.SuggestItem" + }, + "type": "array" + }, + "keyword": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.TagResponse": { + "properties": { + "has_more": { + "type": "boolean" + }, + "limit": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "tag_id": { + "type": "integer" + }, + "tag_name": { + "type": "string" + }, + "titles": { + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.TheaterBanner": { + "properties": { + "image_url": { + "type": "string" + }, + "title": { + "type": "string" + }, + "title_id": { + "type": "string" + } + }, + "type": "object" + }, + "dramabox.TheaterResponse": { + "properties": { + "banners": { + "items": { + "$ref": "#/definitions/dramabox.TheaterBanner" + }, + "type": "array" + }, + "channel": { + "$ref": "#/definitions/dramabox.Channel" + }, + "has_more": { + "description": "HasMore reports whether the recommendation block has another page.", + "type": "boolean" + }, + "hot_words": { + "items": { + "type": "string" + }, + "type": "array" + }, + "limit": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "sections": { + "items": { + "$ref": "#/definitions/dramabox.TheaterSection" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.TheaterSection": { + "properties": { + "style": { + "type": "string" + }, + "title": { + "type": "string" + }, + "titles": { + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.TrendingResponse": { + "properties": { + "hot": { + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + }, + "new_releases": { + "description": "NewReleases is the app's new-release list.", + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + }, + "preset_keyword": { + "description": "PresetKeyword is the word the app pre-fills in its search box.", + "type": "string" + }, + "rank_tabs": { + "description": "RankTabs are the ranking tabs; a tab's type is a valid rank_type for\ndramabox-rank.", + "items": { + "$ref": "#/definitions/dramabox.RankTab" + }, + "type": "array" + }, + "trending": { + "description": "Trending is the app's trending list.", + "items": { + "$ref": "#/definitions/dramabox.AppTitle" + }, + "type": "array" + } + }, + "type": "object" + }, + "dramabox.browseResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.BrowseResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.categoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.CategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.categoryBooksResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.CategoryBooksResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.channelsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.ChannelsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.dramaResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.DramaResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.genresResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.GenresResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.homeResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.HomeResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.moreResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.MoreResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.performerResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.PerformerResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.rankResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.RankResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.recommendResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.RecommendResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.suggestResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.SuggestResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.tagResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.TagResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.theaterResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.TheaterResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "dramabox.trendingResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/dramabox.TrendingResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "duckduckgo.ImageResponse": { "properties": { "pagination": { @@ -55106,6 +56680,308 @@ }, "type": "object" }, + "es.ApplePlaceDatasetFacetItem": { + "properties": { + "count": { + "type": "integer" + }, + "key": { + "type": "string" + } + }, + "type": "object" + }, + "es.ApplePlaceDatasetItem": { + "properties": { + "address": { + "type": "string" + }, + "alt_phones": { + "items": { + "type": "string" + }, + "type": "array" + }, + "catalog_country": { + "type": "string" + }, + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "category": { + "description": "Category is the deepest named Apple category; Categories is the whole\ntaxonomy path (names) and CategoryIDs the matching Apple category ids.", + "type": "string" + }, + "category_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "country_code": { + "type": "string" + }, + "county": { + "type": "string" + }, + "crawled_at": { + "type": "string" + }, + "discovery_keyword": { + "type": "string" + }, + "distance_m": { + "type": "number" + }, + "first_seen_at": { + "type": "string" + }, + "hours": { + "items": { + "$ref": "#/definitions/es.ApplePlaceHours" + }, + "type": "array" + }, + "hours_type": { + "type": "string" + }, + "id": { + "type": "string" + }, + "last_seen_at": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "location": { + "allOf": [ + { + "$ref": "#/definitions/es.GeoPoint" + } + ], + "description": "Location is a geo_point for radius search and distance sort." + }, + "longitude": { + "type": "number" + }, + "name": { + "type": "string" + }, + "neighborhood": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "photo_url": { + "type": "string" + }, + "place_id": { + "type": "string" + }, + "postal_code": { + "type": "string" + }, + "price_level": { + "type": "integer" + }, + "price_symbol": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "rating_count": { + "type": "integer" + }, + "rating_max": { + "type": "integer" + }, + "schema_version": { + "type": "integer" + }, + "state": { + "type": "string" + }, + "state_code": { + "type": "string" + }, + "street": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + }, + "website": { + "type": "string" + } + }, + "type": "object" + }, + "es.ApplePlaceHours": { + "properties": { + "close": { + "type": "string" + }, + "day": { + "type": "string" + }, + "open": { + "type": "string" + } + }, + "type": "object" + }, + "es.ApplePlaceRecord": { + "properties": { + "address": { + "type": "string" + }, + "alt_phones": { + "items": { + "type": "string" + }, + "type": "array" + }, + "catalog_country": { + "type": "string" + }, + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "category": { + "description": "Category is the deepest named Apple category; Categories is the whole\ntaxonomy path (names) and CategoryIDs the matching Apple category ids.", + "type": "string" + }, + "category_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "country_code": { + "type": "string" + }, + "county": { + "type": "string" + }, + "crawled_at": { + "type": "string" + }, + "discovery_keyword": { + "type": "string" + }, + "first_seen_at": { + "type": "string" + }, + "hours": { + "items": { + "$ref": "#/definitions/es.ApplePlaceHours" + }, + "type": "array" + }, + "hours_type": { + "type": "string" + }, + "id": { + "type": "string" + }, + "last_seen_at": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "location": { + "allOf": [ + { + "$ref": "#/definitions/es.GeoPoint" + } + ], + "description": "Location is a geo_point for radius search and distance sort." + }, + "longitude": { + "type": "number" + }, + "name": { + "type": "string" + }, + "neighborhood": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "photo_url": { + "type": "string" + }, + "place_id": { + "type": "string" + }, + "postal_code": { + "type": "string" + }, + "price_level": { + "type": "integer" + }, + "price_symbol": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "rating_count": { + "type": "integer" + }, + "rating_max": { + "type": "integer" + }, + "schema_version": { + "type": "integer" + }, + "state": { + "type": "string" + }, + "state_code": { + "type": "string" + }, + "street": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + }, + "website": { + "type": "string" + } + }, + "type": "object" + }, "es.ApplePodcastsShowRecord": { "properties": { "artist_id": { @@ -111193,6 +113069,101 @@ }, "type": "object" }, + "jumia.RatingBucket": { + "properties": { + "count": { + "example": 220, + "type": "integer" + }, + "stars": { + "example": 5, + "type": "integer" + } + }, + "type": "object" + }, + "jumia.Review": { + "properties": { + "author": { + "example": "Victor", + "type": "string" + }, + "date": { + "example": "2026-10-19", + "type": "string" + }, + "rating": { + "example": 5, + "type": "integer" + }, + "text": { + "type": "string" + }, + "title": { + "example": "i love it", + "type": "string" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" + }, + "jumia.ReviewsResponse": { + "properties": { + "average_rating": { + "example": 4.1, + "type": "number" + }, + "count": { + "example": 10, + "type": "integer" + }, + "country": { + "example": "ng", + "type": "string" + }, + "fetched_at": { + "type": "string" + }, + "has_next": { + "example": true, + "type": "boolean" + }, + "histogram": { + "items": { + "$ref": "#/definitions/jumia.RatingBucket" + }, + "type": "array" + }, + "page": { + "example": 1, + "type": "integer" + }, + "rating_count": { + "example": 396, + "type": "integer" + }, + "review_count": { + "example": 147, + "type": "integer" + }, + "reviews": { + "items": { + "$ref": "#/definitions/jumia.Review" + }, + "type": "array" + }, + "sku": { + "example": "SA948MP6Z6LPDNAFAMZ", + "type": "string" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, "jumia.Seller": { "properties": { "followers": { @@ -111221,6 +113192,118 @@ }, "type": "object" }, + "jumia.SitemapFile": { + "properties": { + "language": { + "example": "en", + "type": "string" + }, + "last_modified": { + "example": "2026-10-19", + "type": "string" + }, + "name": { + "example": "products-sitemap-9.xml.gz", + "type": "string" + }, + "type": { + "example": "products", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "jumia.SitemapURL": { + "properties": { + "image": { + "type": "string" + }, + "last_modified": { + "example": "2026-04-11", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "jumia.SitemapURLsResponse": { + "properties": { + "count": { + "example": 1000, + "type": "integer" + }, + "country": { + "example": "ng", + "type": "string" + }, + "fetched_at": { + "type": "string" + }, + "has_next": { + "example": true, + "type": "boolean" + }, + "page": { + "example": 1, + "type": "integer" + }, + "page_size": { + "example": 1000, + "type": "integer" + }, + "sitemap": { + "example": "products-sitemap-9.xml.gz", + "type": "string" + }, + "source_url": { + "type": "string" + }, + "total_count": { + "example": 16000, + "type": "integer" + }, + "urls": { + "items": { + "$ref": "#/definitions/jumia.SitemapURL" + }, + "type": "array" + } + }, + "type": "object" + }, + "jumia.SitemapsResponse": { + "properties": { + "count": { + "example": 61, + "type": "integer" + }, + "country": { + "example": "ng", + "type": "string" + }, + "fetched_at": { + "type": "string" + }, + "sitemaps": { + "items": { + "$ref": "#/definitions/jumia.SitemapFile" + }, + "type": "array" + }, + "source_url": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, "jumia.Specification": { "properties": { "name": { @@ -111298,6 +113381,54 @@ }, "type": "object" }, + "jumia.reviewsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/jumia.ReviewsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "jumia.sitemapURLsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/jumia.SitemapURLsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "jumia.sitemapsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/jumia.SitemapsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "justeat.FilterOption": { "properties": { "count": { @@ -115320,833 +117451,1032 @@ }, "type": "object" }, - "kickstarter.Category": { + "kick.CategoriesResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/kick.Category" + }, + "type": "array" + } + }, + "type": "object" + }, + "kick.Category": { "properties": { + "icon": { + "type": "string" + }, "id": { "type": "integer" }, "name": { - "example": "Technology", "type": "string" }, - "parent_id": { + "slug": { + "type": "string" + } + }, + "type": "object" + }, + "kick.CategoryHit": { + "properties": { + "id": { "type": "integer" }, + "mature": { + "type": "boolean" + }, + "name": { + "type": "string" + }, "slug": { - "example": "technology", + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "thumbnail_url": { "type": "string" }, "url": { "type": "string" + }, + "viewers": { + "type": "integer" } }, "type": "object" }, - "kickstarter.Comment": { + "kick.CategoryRef": { "properties": { - "author_name": { + "id": { + "type": "integer" + }, + "name": { "type": "string" }, - "body": { + "slug": { "type": "string" + } + }, + "type": "object" + }, + "kick.ChannelChatroomResponse": { + "properties": { + "account_age": { + "$ref": "#/definitions/kick.ChatMode" }, - "is_creator": { + "chatroom_id": { + "type": "integer" + }, + "emotes_only": { + "$ref": "#/definitions/kick.ChatMode" + }, + "followers_only": { + "$ref": "#/definitions/kick.ChatMode" + }, + "gifts_enabled": { "type": "boolean" }, - "posted_at": { + "rules": { + "description": "Rules is the channel's chat rules text; empty when none are set.", + "type": "string" + }, + "slow_mode": { + "$ref": "#/definitions/kick.ChatMode" + }, + "slug": { "type": "string" + }, + "subscribers_only": { + "$ref": "#/definitions/kick.ChatMode" } }, "type": "object" }, - "kickstarter.CommentsResult": { + "kick.ChannelEmotesResponse": { "properties": { - "comments": { + "channel": { "items": { - "$ref": "#/definitions/kickstarter.Comment" + "$ref": "#/definitions/kick.Emote" }, "type": "array" }, - "total_count": { - "type": "integer" + "emoji": { + "items": { + "$ref": "#/definitions/kick.Emote" + }, + "type": "array" + }, + "global": { + "items": { + "$ref": "#/definitions/kick.Emote" + }, + "type": "array" + }, + "slug": { + "type": "string" } }, "type": "object" }, - "kickstarter.Creator": { + "kick.ChannelHit": { "properties": { - "avatar": { - "type": "string" + "followers": { + "type": "integer" }, "id": { "type": "integer" }, - "name": { + "live": { + "type": "boolean" + }, + "profile_picture": { + "type": "string" + }, + "slug": { "type": "string" }, "url": { "type": "string" - } - }, - "type": "object" - }, - "kickstarter.DiscoverResult": { - "properties": { - "page": { - "type": "integer" }, - "projects": { - "items": { - "$ref": "#/definitions/kickstarter.Project" - }, - "type": "array" + "username": { + "type": "string" }, - "total_hits": { - "type": "integer" + "verified": { + "type": "boolean" } }, "type": "object" }, - "kickstarter.Location": { + "kick.ChannelLink": { "properties": { - "country": { - "example": "US", + "description": { "type": "string" }, - "displayable_name": { - "example": "Los Angeles, CA", + "id": { + "type": "integer" + }, + "image_url": { "type": "string" }, - "id": { + "kind": { + "description": "Kind is \"link\" for a panel with a URL and \"text\" for one that is only\na title and description.", + "type": "string" + }, + "order": { + "description": "Order is the position Kick shows the panel in; Kick numbers from 0 on\nsome channels and from 1 on others.", "type": "integer" }, - "name": { - "example": "Los Angeles", + "title": { "type": "string" }, - "short_name": { - "example": "Los Angeles, CA", + "url": { + "description": "URL is empty for a text panel.", "type": "string" } }, "type": "object" }, - "kickstarter.Photo": { + "kick.ChannelLinksResponse": { "properties": { - "full": { + "links": { + "items": { + "$ref": "#/definitions/kick.ChannelLink" + }, + "type": "array" + }, + "slug": { "type": "string" } }, "type": "object" }, - "kickstarter.Project": { + "kick.ChannelRef": { "properties": { - "backers_count": { + "id": { "type": "integer" }, - "blurb": { + "profile_picture": { "type": "string" }, - "category": { - "$ref": "#/definitions/kickstarter.Category" - }, - "comments_count": { - "type": "integer" - }, - "converted_pledged_amount": { - "type": "number" + "slug": { + "type": "string" }, - "country": { - "example": "US", + "url": { "type": "string" }, - "created_at": { + "username": { "type": "string" }, - "creator": { - "$ref": "#/definitions/kickstarter.Creator" + "verified": { + "type": "boolean" + } + }, + "type": "object" + }, + "kick.ChannelResponse": { + "properties": { + "affiliate": { + "type": "boolean" }, - "currency": { - "example": "USD", - "type": "string" + "banned": { + "type": "boolean" }, - "currency_symbol": { - "example": "$", + "banner_url": { "type": "string" }, - "deadline": { + "bio": { "type": "string" }, - "faq_count": { + "followers": { "type": "integer" }, - "goal": { - "type": "number" - }, - "has_video": { - "type": "boolean" - }, "id": { - "example": 1114436418, "type": "integer" }, - "is_launched": { - "type": "boolean" - }, - "launched_at": { - "type": "string" - }, - "location": { - "$ref": "#/definitions/kickstarter.Location" + "live": { + "$ref": "#/definitions/kick.LiveStream" }, - "name": { + "profile_picture": { "type": "string" }, - "percent_funded": { - "type": "integer" - }, - "photo": { - "$ref": "#/definitions/kickstarter.Photo" - }, - "pledged": { - "type": "number" - }, - "reward_tiers": { - "description": "RewardTiers is the campaign's pledge/reward tier list, captured from\nkickstarter.com's own natural GraphQL traffic when the campaign's\n/rewards sub-page renders -- see doc.go's \"Reward tiers\" section.\nBest-effort: omitted (not an error) if the capture-capable render\nbackends are unavailable or the campaign has no reward tiers.", + "recent_categories": { "items": { - "$ref": "#/definitions/kickstarter.RewardTier" + "$ref": "#/definitions/kick.CategoryRef" }, "type": "array" }, - "risks_and_challenges": { - "type": "string" - }, "slug": { "type": "string" }, - "spotlight": { - "type": "boolean" + "socials": { + "$ref": "#/definitions/kick.Socials" }, - "staff_pick": { + "subscription_enabled": { "type": "boolean" }, - "state": { - "example": "live", - "type": "string" - }, - "state_changed_at": { + "url": { "type": "string" }, - "story": { + "username": { "type": "string" }, - "updates_count": { - "type": "integer" - }, - "url": { - "type": "string" + "verified": { + "type": "boolean" }, - "usd_pledged": { - "type": "number" + "vod_enabled": { + "type": "boolean" } }, "type": "object" }, - "kickstarter.RewardAddOn": { + "kick.ChannelStreamsResponse": { "properties": { - "amount": { - "type": "number" - }, - "currency": { - "type": "string" - }, - "description": { + "slug": { "type": "string" }, - "id": { + "streams": { + "items": { + "$ref": "#/definitions/kick.StreamSession" + }, + "type": "array" + } + }, + "type": "object" + }, + "kick.ChannelVideosResponse": { + "properties": { + "slug": { "type": "string" }, - "name": { - "type": "string" + "videos": { + "items": { + "$ref": "#/definitions/kick.Video" + }, + "type": "array" } }, "type": "object" }, - "kickstarter.RewardItem": { + "kick.ChatMode": { "properties": { - "name": { - "type": "string" + "enabled": { + "type": "boolean" }, - "quantity": { + "interval_seconds": { + "description": "IntervalSeconds is the delay between a viewer's messages, for slow mode.", + "type": "integer" + }, + "minutes": { + "description": "Minutes is the minimum follow time or account age, in minutes, for\nfollowers-only and account-age modes; zero for the others.", "type": "integer" } }, "type": "object" }, - "kickstarter.RewardTier": { + "kick.Clip": { "properties": { - "add_ons": { - "items": { - "$ref": "#/definitions/kickstarter.RewardAddOn" - }, - "type": "array" + "category": { + "$ref": "#/definitions/kick.CategoryRef" }, - "amount": { - "type": "number" + "channel": { + "$ref": "#/definitions/kick.ChannelRef" }, - "available": { - "type": "boolean" + "created_at": { + "type": "string" }, - "backers_count": { + "duration_seconds": { "type": "integer" }, - "currency": { - "example": "USD", + "id": { "type": "string" }, - "description": { + "likes": { + "type": "integer" + }, + "mature": { + "type": "boolean" + }, + "started_at": { "type": "string" }, - "ends_at": { + "thumbnail_url": { "type": "string" }, - "estimated_delivery_on": { - "example": "2026-06-01", + "title": { "type": "string" }, - "featured": { - "type": "boolean" + "url": { + "type": "string" }, - "id": { + "video_id": { "type": "string" }, - "image": { + "video_offset_seconds": { + "type": "integer" + }, + "views": { + "type": "integer" + } + }, + "type": "object" + }, + "kick.ClipResponse": { + "properties": { + "clip": { + "$ref": "#/definitions/kick.Clip" + } + }, + "type": "object" + }, + "kick.ClipsResponse": { + "properties": { + "category": { + "description": "Category is the category slug a category clip list was read for.", "type": "string" }, - "items": { + "clips": { "items": { - "$ref": "#/definitions/kickstarter.RewardItem" + "$ref": "#/definitions/kick.Clip" }, "type": "array" }, - "limit": { - "type": "integer" - }, - "name": { + "next_cursor": { "type": "string" }, - "remaining_quantity": { - "type": "integer" - }, - "shipping_enabled": { - "type": "boolean" + "slug": { + "type": "string" }, - "shipping_preference": { - "example": "unrestricted", + "sort": { "type": "string" }, - "shipping_summary": { + "time": { "type": "string" } }, "type": "object" }, - "kickstarter.Update": { + "kick.DirectoryStream": { "properties": { - "author_name": { - "type": "string" + "category": { + "$ref": "#/definitions/kick.CategoryRef" }, - "body": { + "channel": { + "$ref": "#/definitions/kick.ChannelRef" + }, + "id": { "type": "string" }, - "comments_count": { - "type": "integer" + "language": { + "type": "string" }, - "is_creator": { + "mature": { "type": "boolean" }, - "number": { - "example": 7, - "type": "integer" + "started_at": { + "type": "string" }, - "published_at": { - "example": "July 10, 2026", + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "thumbnail_url": { "type": "string" }, "title": { "type": "string" }, - "url": { - "type": "string" + "viewers": { + "type": "integer" } }, "type": "object" }, - "kickstarter.UpdatesResult": { + "kick.DropCampaign": { "properties": { - "updates": { + "category": { + "$ref": "#/definitions/kick.CategoryRef" + }, + "channel_count": { + "type": "integer" + }, + "channels": { "items": { - "$ref": "#/definitions/kickstarter.Update" + "$ref": "#/definitions/kick.DropChannel" + }, + "type": "array" + }, + "ends_at": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "organization": { + "$ref": "#/definitions/kick.DropOrganization" + }, + "rewards": { + "items": { + "$ref": "#/definitions/kick.DropReward" }, "type": "array" + }, + "rule": { + "type": "string" + }, + "starts_at": { + "type": "string" + }, + "status": { + "type": "string" + }, + "url": { + "type": "string" } }, "type": "object" }, - "kickstarter.commentsResponseDoc": { + "kick.DropChannel": { "properties": { - "code": { - "example": 200, + "id": { "type": "integer" }, - "data": { - "$ref": "#/definitions/kickstarter.CommentsResult" + "profile_picture": { + "type": "string" }, - "msg": { - "example": "OK", + "slug": { + "type": "string" + }, + "url": { + "type": "string" + }, + "username": { "type": "string" } }, "type": "object" }, - "kickstarter.discoverResponseDoc": { + "kick.DropOrganization": { "properties": { - "code": { - "example": 200, - "type": "integer" + "id": { + "type": "string" }, - "data": { - "$ref": "#/definitions/kickstarter.DiscoverResult" + "logo_url": { + "type": "string" }, - "msg": { - "example": "OK", + "name": { + "type": "string" + }, + "url": { "type": "string" } }, "type": "object" }, - "kickstarter.projectResponseDoc": { + "kick.DropReward": { "properties": { - "code": { - "example": 200, + "category_id": { "type": "integer" }, - "data": { - "$ref": "#/definitions/kickstarter.Project" + "id": { + "type": "string" }, - "msg": { - "example": "OK", + "image_url": { + "type": "string" + }, + "name": { "type": "string" + }, + "required_units": { + "description": "RequiredUnits is Kick's threshold for the reward. For the\n\"Watch to redeem\" campaigns it reads as watch time (60, 120, 180 ...);\nKick does not state the unit.", + "type": "integer" } }, "type": "object" }, - "kickstarter.updatesResponseDoc": { + "kick.DropsResponse": { "properties": { - "code": { - "example": 200, + "campaigns": { + "items": { + "$ref": "#/definitions/kick.DropCampaign" + }, + "type": "array" + }, + "status": { + "type": "string" + }, + "total": { + "description": "Total is the number of campaigns Kick lists in all (active and\nexpired); Campaigns holds those matching Status.", + "type": "integer" + } + }, + "type": "object" + }, + "kick.Emote": { + "properties": { + "id": { "type": "integer" }, - "data": { - "$ref": "#/definitions/kickstarter.UpdatesResult" + "image_url": { + "type": "string" }, - "msg": { - "example": "OK", + "name": { "type": "string" + }, + "subscribers_only": { + "type": "boolean" } }, "type": "object" }, - "kohls.CategoryFacet": { + "kick.Gift": { "properties": { - "label": { - "example": "Department", + "character_limit": { + "description": "CharacterLimit is the message length a level-up gift allows (0 = none).", + "type": "integer" + }, + "id": { "type": "string" }, + "kicks": { + "type": "integer" + }, "name": { - "example": "Department", "type": "string" }, - "options": { + "pinned_seconds": { + "description": "PinnedSeconds is how long a level-up gift pins its message in chat.", + "type": "integer" + }, + "tier": { + "description": "Tier is BASIC, MID or HIGHER; Type is BASIC or LEVEL_UP.", + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "kick.GiftsResponse": { + "properties": { + "gifts": { "items": { - "$ref": "#/definitions/kohls.CategoryFacetOption" + "$ref": "#/definitions/kick.Gift" }, "type": "array" } }, "type": "object" }, - "kohls.CategoryFacetOption": { + "kick.Language": { "properties": { - "active": { - "type": "boolean" - }, - "category": { - "example": "Room:Dorm+Department:Bedding", + "code": { "type": "string" }, "name": { - "example": "Bedding", "type": "string" - }, - "product_count": { - "example": 479, - "type": "integer" } }, "type": "object" }, - "kohls.CategoryPriceRange": { + "kick.LanguagesResponse": { "properties": { - "max_price": { - "example": 9.99, - "type": "number" - }, - "min_price": { - "example": 2.99, - "type": "number" + "languages": { + "items": { + "$ref": "#/definitions/kick.Language" + }, + "type": "array" } }, "type": "object" }, - "kohls.CategoryProduct": { + "kick.LiveStream": { "properties": { - "available_for_pickup": { - "example": false, - "type": "boolean" - }, - "available_for_ship": { - "example": true, - "type": "boolean" - }, - "colors": { + "categories": { "items": { - "type": "string" + "$ref": "#/definitions/kick.CategoryRef" }, "type": "array" }, - "currency_code": { - "example": "USD", - "type": "string" + "id": { + "type": "integer" }, - "image_url": { + "language": { "type": "string" }, - "on_sale": { - "example": true, + "mature": { "type": "boolean" }, - "rating": { - "example": 3.9, - "type": "number" - }, - "regular_price": { - "$ref": "#/definitions/kohls.CategoryPriceRange" - }, - "review_count": { - "example": 27103, - "type": "integer" + "started_at": { + "type": "string" }, - "sale_price": { - "$ref": "#/definitions/kohls.CategoryPriceRange" + "tags": { + "items": { + "type": "string" + }, + "type": "array" }, - "title": { - "example": "The Big One® Solid Bath Towel, Bath Sheet, Hand Towel or Washcloth", + "thumbnail_url": { "type": "string" }, - "url": { + "title": { "type": "string" }, - "web_id": { - "example": "4569328", - "type": "string" + "viewers": { + "type": "integer" } }, "type": "object" }, - "kohls.CategoryResponse": { + "kick.LivestreamsResponse": { "properties": { - "category": { - "example": "Room:Dorm", - "type": "string" - }, - "count": { - "example": 120, + "category_id": { "type": "integer" }, - "facets": { - "items": { - "$ref": "#/definitions/kohls.CategoryFacet" - }, - "type": "array" - }, - "fetched_at": { + "language": { "type": "string" }, - "limit": { - "example": 120, - "type": "integer" - }, - "product_count": { - "example": 1317, - "type": "integer" - }, - "products": { + "livestreams": { "items": { - "$ref": "#/definitions/kohls.CategoryProduct" + "$ref": "#/definitions/kick.DirectoryStream" }, "type": "array" }, - "source_url": { + "next_cursor": { "type": "string" }, - "title": { - "example": "Essential Dorm Items for College-Bound Students | Kohl's", + "sort": { "type": "string" - }, - "total_pages": { - "example": 11, - "type": "integer" } }, "type": "object" }, - "kohls.ProductReviewsResponse": { + "kick.SearchCategoriesResponse": { "properties": { - "fetched_at": { - "type": "string" - }, - "page": { - "type": "integer" - }, - "page_size": { - "type": "integer" - }, - "reviews": { + "categories": { "items": { - "$ref": "#/definitions/kohls.Review" + "$ref": "#/definitions/kick.CategoryHit" }, "type": "array" }, - "source_url": { + "query": { "type": "string" + } + }, + "type": "object" + }, + "kick.SearchChannelsResponse": { + "properties": { + "channels": { + "items": { + "$ref": "#/definitions/kick.ChannelHit" + }, + "type": "array" }, - "total_count": { - "type": "integer" - }, - "web_id": { + "query": { "type": "string" } }, "type": "object" }, - "kohls.Review": { + "kick.Socials": { "properties": { - "author": { + "discord": { "type": "string" }, - "id": { + "facebook": { "type": "string" }, - "location": { + "instagram": { "type": "string" }, - "photo_urls": { + "tiktok": { + "type": "string" + }, + "twitter": { + "type": "string" + }, + "youtube": { + "type": "string" + } + }, + "type": "object" + }, + "kick.StreamSession": { + "properties": { + "categories": { "items": { - "type": "string" + "$ref": "#/definitions/kick.CategoryRef" }, "type": "array" }, - "rating": { + "duration_ms": { "type": "integer" }, - "recommended": { + "id": { + "type": "integer" + }, + "language": { + "type": "string" + }, + "live": { "type": "boolean" }, - "secondary_ratings": { + "mature": { + "type": "boolean" + }, + "started_at": { + "type": "string" + }, + "tags": { "items": { - "$ref": "#/definitions/kohls.ReviewSecondaryRating" + "type": "string" }, "type": "array" }, - "submitted_at": { + "thumbnail_url": { "type": "string" }, - "text": { + "title": { "type": "string" }, - "title": { + "video_url": { "type": "string" - } - }, - "type": "object" - }, - "kohls.ReviewSecondaryRating": { - "properties": { - "max_value": { - "example": 5, - "type": "integer" }, - "name": { - "example": "Quality", + "video_uuid": { + "description": "VideoUUID, VideoViews and VideoURL describe the recording; empty when\nthe broadcast has none.", "type": "string" }, - "value": { - "example": 4, + "video_views": { + "type": "integer" + }, + "viewer_count": { + "description": "ViewerCount is the viewer figure Kick reports for the broadcast; the\nupstream does not say whether it is a peak or an average.", "type": "integer" } }, "type": "object" }, - "kohls.Store": { + "kick.SubcategoriesResponse": { "properties": { - "address": { - "example": "17150 SOUTHCENTER PKWY", + "category": { "type": "string" }, - "badges": { - "example": [ - "Sephora", - "Baby Gifting Shop" - ], + "limit": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "reachable": { + "type": "integer" + }, + "subcategories": { "items": { - "type": "string" + "$ref": "#/definitions/kick.Subcategory" }, "type": "array" }, - "city": { - "example": "TUKWILA", + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "kick.Subcategory": { + "properties": { + "banner_url": { "type": "string" }, - "country": { - "example": "US", + "description": { "type": "string" }, - "distance_miles": { - "example": 11.3, - "type": "number" - }, - "hours": { - "items": { - "$ref": "#/definitions/kohls.StoreHours" - }, - "type": "array" + "followers": { + "type": "integer" }, "id": { - "example": "1152", - "type": "string" - }, - "latitude": { - "example": 47.450079, - "type": "number" + "type": "integer" }, - "longitude": { - "example": -122.2581113, - "type": "number" + "mature": { + "type": "boolean" }, "name": { - "example": "Kohl's Tukwila", "type": "string" }, - "phone": { - "example": "(206) 394-0078", + "parent_id": { + "type": "integer" + }, + "parent_name": { "type": "string" }, - "postal_code": { - "example": "98188", + "parent_slug": { "type": "string" }, - "services": { - "example": [ - "In-Store Pickup", - "Wifi Enabled" - ], + "slug": { + "type": "string" + }, + "tags": { "items": { "type": "string" }, "type": "array" }, - "state": { - "example": "WA", - "type": "string" - }, "url": { "type": "string" + }, + "viewers": { + "type": "integer" } }, "type": "object" }, - "kohls.StoreHours": { + "kick.SubcategoryResponse": { "properties": { - "close": { - "example": "21:00", - "type": "string" - }, - "day": { - "example": "Monday", - "type": "string" - }, - "open": { - "example": "09:00", - "type": "string" + "subcategory": { + "$ref": "#/definitions/kick.Subcategory" } }, "type": "object" }, - "kohls.StoresResponse": { + "kick.TopChannelsResponse": { "properties": { - "count": { + "channels": { + "items": { + "$ref": "#/definitions/kick.ChannelHit" + }, + "type": "array" + } + }, + "type": "object" + }, + "kick.Video": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/kick.CategoryRef" + }, + "type": "array" + }, + "duration_ms": { "type": "integer" }, - "fetched_at": { - "type": "string" + "id": { + "type": "integer" }, - "search": { + "language": { "type": "string" }, - "source_url": { + "live": { + "type": "boolean" + }, + "mature": { + "type": "boolean" + }, + "started_at": { "type": "string" }, - "stores": { + "tags": { "items": { - "$ref": "#/definitions/kohls.Store" + "type": "string" }, "type": "array" + }, + "thumbnail_url": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "views": { + "type": "integer" } }, "type": "object" }, - "kohls.SuggestResponse": { + "kick.VideoResponse": { "properties": { - "count": { + "categories": { + "items": { + "$ref": "#/definitions/kick.CategoryRef" + }, + "type": "array" + }, + "channel": { + "$ref": "#/definitions/kick.ChannelRef" + }, + "created_at": { + "type": "string" + }, + "duration_ms": { "type": "integer" }, - "fetched_at": { + "id": { + "type": "integer" + }, + "language": { "type": "string" }, - "query": { + "mature": { + "type": "boolean" + }, + "started_at": { "type": "string" }, - "source_url": { + "status": { "type": "string" }, - "suggestions": { + "tags": { "items": { "type": "string" }, "type": "array" + }, + "thumbnail_url": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "viewer_count": { + "type": "integer" + }, + "views": { + "type": "integer" } }, "type": "object" }, - "kohls.categoryResponseDoc": { + "kick.categoriesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kohls.CategoryResponse" + "$ref": "#/definitions/kick.CategoriesResponse" }, "msg": { "example": "OK", @@ -116155,14 +118485,14 @@ }, "type": "object" }, - "kohls.productReviewsResponseDoc": { + "kick.categoryClipsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kohls.ProductReviewsResponse" + "$ref": "#/definitions/kick.ClipsResponse" }, "msg": { "example": "OK", @@ -116171,14 +118501,14 @@ }, "type": "object" }, - "kohls.storesResponseDoc": { + "kick.channelChatroomResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kohls.StoresResponse" + "$ref": "#/definitions/kick.ChannelChatroomResponse" }, "msg": { "example": "OK", @@ -116187,14 +118517,14 @@ }, "type": "object" }, - "kohls.suggestResponseDoc": { + "kick.channelClipsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kohls.SuggestResponse" + "$ref": "#/definitions/kick.ClipsResponse" }, "msg": { "example": "OK", @@ -116203,510 +118533,340 @@ }, "type": "object" }, - "kotaku.AuthorResponse": { + "kick.channelEmotesResponseDoc": { "properties": { - "articles": { - "items": { - "$ref": "#/definitions/newsplatform.HeadlineItem" - }, - "type": "array" - }, - "biography": { - "items": { - "type": "string" - }, - "type": "array" - }, - "image_url": { - "type": "string" - }, - "name": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "social_links": { - "items": { - "$ref": "#/definitions/kotaku.AuthorSocialLink" - }, - "type": "array" + "data": { + "$ref": "#/definitions/kick.ChannelEmotesResponse" }, - "url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kotaku.AuthorSocialLink": { + "kick.channelLinksResponseDoc": { "properties": { - "type": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "url": { + "data": { + "$ref": "#/definitions/kick.ChannelLinksResponse" + }, + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.CategoriesResponse": { + "kick.channelResponseDoc": { "properties": { - "categories": { - "items": { - "$ref": "#/definitions/kroger.CategoryTaxon" - }, - "type": "array" - }, - "count": { + "code": { + "example": 200, "type": "integer" }, - "departments": { - "description": "Departments lists the top-level departments that contributed at least\none category below, in Kroger's own menu order.", - "items": { - "type": "string" - }, - "type": "array" + "data": { + "$ref": "#/definitions/kick.ChannelResponse" }, - "source_url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.CategoryResponse": { + "kick.channelStreamsResponseDoc": { "properties": { - "category_id": { - "type": "string" - }, - "facets": { - "items": { - "$ref": "#/definitions/kroger.SearchFacetGroup" - }, - "type": "array" - }, - "has_more": { - "description": "HasMore, Source and Facets carry the same meaning as on\nSearchResponse -- see that type and Search's doc comment.", - "type": "boolean" - }, - "page": { + "code": { + "example": 200, "type": "integer" }, - "products": { - "items": { - "$ref": "#/definitions/kroger.SearchResultProduct" - }, - "type": "array" - }, - "slug": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.ChannelStreamsResponse" }, - "source": { + "msg": { + "example": "OK", "type": "string" - }, - "total_count": { - "type": "integer" } }, "type": "object" }, - "kroger.CategoryTaxon": { + "kick.channelVideosResponseDoc": { "properties": { - "breadcrumb": { - "description": "Breadcrumb is the full department > aisle > category path, deduplicated\nwhere Kroger's own menu repeats a level's name at the next level down.", - "items": { - "type": "string" - }, - "type": "array" - }, - "category_id": { - "type": "string" - }, - "department": { - "description": "Department is the top-level department this category rolls up under\n(Breadcrumb[0]), included as a convenience field for grouping/filtering\nwithout parsing Breadcrumb.", - "type": "string" - }, - "name": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "slug": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.ChannelVideosResponse" }, - "url": { - "description": "URL is the canonical kroger.com category-browse page URL.", + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.Coupon": { + "kick.clipResponseDoc": { "properties": { - "brand": { - "type": "string" - }, - "categories": { - "items": { - "type": "string" - }, - "type": "array" - }, - "display_description": { - "type": "string" - }, - "end_date": { - "type": "string" - }, - "expiration_date": { - "type": "string" - }, - "id": { - "type": "string" - }, - "image_url": { - "type": "string" - }, - "kroger_coupon_number": { - "type": "string" - }, - "modalities": { - "items": { - "type": "string" - }, - "type": "array" - }, - "redemptions_allowed": { - "type": "integer" - }, - "requirement_description": { - "type": "string" - }, - "requirement_quantity": { + "code": { + "example": 200, "type": "integer" }, - "savings": { - "type": "number" - }, - "savings_tags": { - "items": { - "$ref": "#/definitions/kroger.CouponSavingsTag" - }, - "type": "array" - }, - "short_description": { - "type": "string" - }, - "start_date": { - "type": "string" - }, - "status": { - "type": "string" - }, - "title": { - "type": "string" - }, - "total_downloads": { - "type": "integer" + "data": { + "$ref": "#/definitions/kick.ClipResponse" }, - "type": { + "msg": { + "example": "OK", "type": "string" - }, - "value": { - "type": "number" } }, "type": "object" }, - "kroger.CouponSavingsTag": { + "kick.clipsResponseDoc": { "properties": { - "description": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "display_name": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.ClipsResponse" }, - "name": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.CouponsResponse": { + "kick.dropsResponseDoc": { "properties": { - "brand": { - "type": "string" - }, - "count": { + "code": { + "example": 200, "type": "integer" }, - "coupons": { - "items": { - "$ref": "#/definitions/kroger.Coupon" - }, - "type": "array" + "data": { + "$ref": "#/definitions/kick.DropsResponse" }, - "location_id": { + "msg": { + "example": "OK", "type": "string" - }, - "page": { + } + }, + "type": "object" + }, + "kick.giftsResponseDoc": { + "properties": { + "code": { + "example": 200, "type": "integer" }, - "page_size": { - "type": "integer" + "data": { + "$ref": "#/definitions/kick.GiftsResponse" }, - "upc": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.NutritionFact": { + "kick.languagesResponseDoc": { "properties": { - "daily_value": { - "type": "string" - }, - "name": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "unit": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.LanguagesResponse" }, - "value": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.ProductCategory": { + "kick.livestreamsResponseDoc": { "properties": { - "commodity": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "department": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.LivestreamsResponse" }, - "sub_commodity": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.ProductDetail": { + "kick.searchCategoriesResponseDoc": { "properties": { - "alcohol": { - "type": "boolean" - }, - "brand": { - "type": "string" - }, - "categories": { - "items": { - "type": "string" - }, - "type": "array" - }, - "category": { - "$ref": "#/definitions/kroger.ProductCategory" - }, - "country_of_origin": { - "type": "string" - }, - "image_url": { - "type": "string" - }, - "images": { - "items": { - "$ref": "#/definitions/kroger.ProductImage" - }, - "type": "array" - }, - "inventory": { - "$ref": "#/definitions/kroger.ProductInventory" - }, - "name": { - "type": "string" - }, - "nutrition": { - "$ref": "#/definitions/kroger.ProductNutrition" - }, - "price": { - "$ref": "#/definitions/kroger.ProductPrice" - }, - "rating": { - "$ref": "#/definitions/kroger.ProductRating" - }, - "size": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "upc": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.SearchCategoriesResponse" }, - "url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.ProductImage": { + "kick.searchChannelsResponseDoc": { "properties": { - "perspective": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "size": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.SearchChannelsResponse" }, - "url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.ProductInventory": { + "kick.subcategoriesResponseDoc": { "properties": { - "available": { + "code": { + "example": 200, "type": "integer" }, - "location_id": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.SubcategoriesResponse" }, - "stock_level": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.ProductNutrition": { + "kick.subcategoryResponseDoc": { "properties": { - "allergens": { - "type": "string" - }, - "facts": { - "items": { - "$ref": "#/definitions/kroger.NutritionFact" - }, - "type": "array" - }, - "gluten_free": { - "type": "boolean" - }, - "ingredients": { - "type": "string" - }, - "kosher": { - "type": "boolean" - }, - "non_gmo": { - "type": "boolean" - }, - "organic": { - "type": "boolean" - }, - "product_warning": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "serving_size": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.SubcategoryResponse" }, - "servings_per_container": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "kroger.ProductOffer": { + "kick.topChannelsResponseDoc": { "properties": { - "availability": { - "type": "string" - }, - "currency": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "original_price": { - "type": "number" + "data": { + "$ref": "#/definitions/kick.TopChannelsResponse" }, - "price": { - "type": "number" + "msg": { + "example": "OK", + "type": "string" } }, "type": "object" }, - "kroger.ProductPrice": { + "kick.videoResponseDoc": { "properties": { - "amount": { - "type": "number" + "code": { + "example": 200, + "type": "integer" }, - "currency": { - "type": "string" + "data": { + "$ref": "#/definitions/kick.VideoResponse" }, - "display": { + "msg": { + "example": "OK", "type": "string" + } + }, + "type": "object" + }, + "kickstarter.Category": { + "properties": { + "id": { + "type": "integer" }, - "location_id": { + "name": { + "example": "Technology", "type": "string" }, - "seller_id": { - "type": "string" + "parent_id": { + "type": "integer" }, - "seller_name": { + "slug": { + "example": "technology", "type": "string" }, - "unit_price_text": { + "url": { "type": "string" } }, "type": "object" }, - "kroger.ProductRating": { + "kickstarter.Comment": { "properties": { - "average": { - "type": "number" - }, - "count": { - "type": "integer" - }, - "five_stars": { - "type": "integer" - }, - "four_stars": { - "type": "integer" + "author_name": { + "type": "string" }, - "one_star": { - "type": "integer" + "body": { + "type": "string" }, - "three_stars": { - "type": "integer" + "is_creator": { + "type": "boolean" }, - "two_stars": { - "type": "integer" + "posted_at": { + "type": "string" } }, "type": "object" }, - "kroger.ProductResponse": { + "kickstarter.CommentsResult": { "properties": { - "brand": { - "type": "string" - }, - "categories": { + "comments": { "items": { - "type": "string" + "$ref": "#/definitions/kickstarter.Comment" }, "type": "array" }, - "description": { - "type": "string" - }, - "image_url": { + "total_count": { + "type": "integer" + } + }, + "type": "object" + }, + "kickstarter.Creator": { + "properties": { + "avatar": { "type": "string" }, - "offer": { - "$ref": "#/definitions/kroger.ProductOffer" - }, - "rating_count": { + "id": { "type": "integer" }, - "rating_value": { - "type": "number" - }, - "title": { - "type": "string" - }, - "upc": { + "name": { "type": "string" }, "url": { @@ -116715,393 +118875,317 @@ }, "type": "object" }, - "kroger.ProductsResponse": { + "kickstarter.DiscoverResult": { "properties": { - "count": { + "page": { "type": "integer" }, - "location_id": { - "type": "string" - }, - "products": { + "projects": { "items": { - "$ref": "#/definitions/kroger.ProductDetail" + "$ref": "#/definitions/kickstarter.Project" }, "type": "array" + }, + "total_hits": { + "type": "integer" } }, "type": "object" }, - "kroger.RelatedTag": { + "kickstarter.Location": { "properties": { - "position": { - "type": "integer" + "country": { + "example": "US", + "type": "string" }, - "query": { + "displayable_name": { + "example": "Los Angeles, CA", "type": "string" }, - "source": { + "id": { + "type": "integer" + }, + "name": { + "example": "Los Angeles", "type": "string" }, - "tag": { + "short_name": { + "example": "Los Angeles, CA", "type": "string" } }, "type": "object" }, - "kroger.RelatedTagsResponse": { + "kickstarter.Photo": { "properties": { - "count": { - "type": "integer" - }, - "location_id": { - "type": "string" - }, - "query": { + "full": { "type": "string" - }, - "related_tags": { - "items": { - "$ref": "#/definitions/kroger.RelatedTag" - }, - "type": "array" } }, "type": "object" }, - "kroger.Review": { + "kickstarter.Project": { "properties": { - "featured": { - "type": "boolean" - }, - "helpful_vote_count": { + "backers_count": { "type": "integer" }, - "id": { + "blurb": { "type": "string" }, - "not_helpful_vote_count": { - "type": "integer" - }, - "photos": { - "items": { - "$ref": "#/definitions/kroger.ReviewPhoto" - }, - "type": "array" + "category": { + "$ref": "#/definitions/kickstarter.Category" }, - "rating": { + "comments_count": { "type": "integer" }, - "ratings_only": { - "type": "boolean" - }, - "recommended": { - "type": "boolean" + "converted_pledged_amount": { + "type": "number" }, - "submitted_at": { + "country": { + "example": "US", "type": "string" }, - "text": { + "created_at": { "type": "string" }, - "title": { - "type": "string" - } - }, - "type": "object" - }, - "kroger.ReviewPhoto": { - "properties": { - "size": { + "creator": { + "$ref": "#/definitions/kickstarter.Creator" + }, + "currency": { + "example": "USD", "type": "string" }, - "url": { + "currency_symbol": { + "example": "$", "type": "string" - } - }, - "type": "object" - }, - "kroger.ReviewsResponse": { - "properties": { - "average_rating": { - "type": "number" }, - "page": { - "type": "integer" + "deadline": { + "type": "string" }, - "page_size": { + "faq_count": { "type": "integer" }, - "rating": { - "$ref": "#/definitions/kroger.ProductRating" + "goal": { + "type": "number" }, - "reviews": { - "items": { - "$ref": "#/definitions/kroger.Review" - }, - "type": "array" + "has_video": { + "type": "boolean" }, - "total_count": { + "id": { + "example": 1114436418, "type": "integer" }, - "upc": { - "type": "string" - } - }, - "type": "object" - }, - "kroger.SearchFacetGroup": { - "properties": { - "group": { + "is_launched": { + "type": "boolean" + }, + "launched_at": { "type": "string" }, - "values": { - "items": { - "$ref": "#/definitions/kroger.SearchFacetValue" - }, - "type": "array" - } - }, - "type": "object" - }, - "kroger.SearchFacetValue": { - "properties": { - "count": { - "type": "integer" + "location": { + "$ref": "#/definitions/kickstarter.Location" }, "name": { "type": "string" }, - "slug": { - "type": "string" - } - }, - "type": "object" - }, - "kroger.SearchResponse": { - "properties": { - "facets": { - "items": { - "$ref": "#/definitions/kroger.SearchFacetGroup" - }, - "type": "array" + "percent_funded": { + "type": "integer" }, - "has_more": { - "description": "HasMore reports whether Kroger says more results exist past this page.\nOnly meaningful on the JSON-API path; false on the HTML fallback.", - "type": "boolean" + "photo": { + "$ref": "#/definitions/kickstarter.Photo" }, - "page": { - "type": "integer" + "pledged": { + "type": "number" }, - "products": { + "reward_tiers": { + "description": "RewardTiers is the campaign's pledge/reward tier list, captured from\nkickstarter.com's own natural GraphQL traffic when the campaign's\n/rewards sub-page renders -- see doc.go's \"Reward tiers\" section.\nBest-effort: omitted (not an error) if the capture-capable render\nbackends are unavailable or the campaign has no reward tiers.", "items": { - "$ref": "#/definitions/kroger.SearchResultProduct" + "$ref": "#/definitions/kickstarter.RewardTier" }, "type": "array" }, - "query": { - "type": "string" - }, - "source": { - "description": "Source is which upstream path served this response: \"json_api\" (the\nprimary path) or \"html\" (the fallback). See Search's doc comment.", - "type": "string" - }, - "total_count": { - "type": "integer" - } - }, - "type": "object" - }, - "kroger.SearchResultProduct": { - "properties": { - "brand": { - "description": "Brand and StockLevel are populated by the JSON-API path only (the\nHTML result cards carry neither); both are omitted when the HTML\nfallback served the response. See Search's doc comment.", - "type": "string" - }, - "currency": { + "risks_and_challenges": { "type": "string" }, - "image_url": { + "slug": { "type": "string" }, - "low_stock": { + "spotlight": { "type": "boolean" }, - "original_price": { - "type": "number" - }, - "price": { - "type": "number" - }, - "size": { - "type": "string" - }, - "snap_ebt_eligible": { + "staff_pick": { "type": "boolean" }, - "stock_level": { + "state": { + "example": "live", "type": "string" }, - "title": { + "state_changed_at": { "type": "string" }, - "unit_price": { + "story": { "type": "string" }, - "upc": { - "type": "string" + "updates_count": { + "type": "integer" }, "url": { "type": "string" + }, + "usd_pledged": { + "type": "number" } }, "type": "object" }, - "kroger.StoreAddress": { + "kickstarter.RewardAddOn": { "properties": { - "address_lines": { - "items": { - "type": "string" - }, - "type": "array" + "amount": { + "type": "number" }, - "city": { + "currency": { "type": "string" }, - "country": { + "description": { "type": "string" }, - "postal_code": { + "id": { "type": "string" }, - "state": { + "name": { "type": "string" } }, "type": "object" }, - "kroger.StoreHours": { + "kickstarter.RewardItem": { "properties": { - "days": { - "type": "string" - }, - "hours": { + "name": { "type": "string" }, - "is_today": { - "type": "boolean" + "quantity": { + "type": "integer" } }, "type": "object" }, - "kroger.StoreLocation": { + "kickstarter.RewardTier": { "properties": { - "latitude": { - "type": "number" + "add_ons": { + "items": { + "$ref": "#/definitions/kickstarter.RewardAddOn" + }, + "type": "array" }, - "longitude": { + "amount": { "type": "number" - } - }, - "type": "object" - }, - "kroger.StoreResponse": { - "properties": { - "address": { - "$ref": "#/definitions/kroger.StoreAddress" }, - "brand": { + "available": { + "type": "boolean" + }, + "backers_count": { + "type": "integer" + }, + "currency": { + "example": "USD", "type": "string" }, - "break_hours": { - "items": { - "$ref": "#/definitions/kroger.StoreHours" - }, - "type": "array" + "description": { + "type": "string" }, - "has_drive_thru": { + "ends_at": { + "type": "string" + }, + "estimated_delivery_on": { + "example": "2026-06-01", + "type": "string" + }, + "featured": { "type": "boolean" }, - "hours": { + "id": { + "type": "string" + }, + "image": { + "type": "string" + }, + "items": { "items": { - "$ref": "#/definitions/kroger.StoreHours" + "$ref": "#/definitions/kickstarter.RewardItem" }, "type": "array" }, - "location": { - "$ref": "#/definitions/kroger.StoreLocation" + "limit": { + "type": "integer" }, "name": { "type": "string" }, - "open_text": { - "type": "string" + "remaining_quantity": { + "type": "integer" }, - "phone": { + "shipping_enabled": { + "type": "boolean" + }, + "shipping_preference": { + "example": "unrestricted", "type": "string" }, - "store_id": { + "shipping_summary": { "type": "string" } }, "type": "object" }, - "kroger.SuggestResponse": { + "kickstarter.Update": { "properties": { - "location_id": { + "author_name": { "type": "string" }, - "query": { + "body": { "type": "string" }, - "spelling_correction": { - "description": "SpellingCorrection is Kroger's own suggested respelling of Query, set\nonly when Query returned zero suggestions and Kroger judged it a\nlikely typo (confirmed live: \"Marble cake\" -> \"maple cake\" with an\nempty Suggestions list).", + "comments_count": { + "type": "integer" + }, + "is_creator": { + "type": "boolean" + }, + "number": { + "example": 7, + "type": "integer" + }, + "published_at": { + "example": "July 10, 2026", "type": "string" }, - "suggestions": { - "items": { - "$ref": "#/definitions/kroger.Suggestion" - }, - "type": "array" - } - }, - "type": "object" - }, - "kroger.Suggestion": { - "properties": { - "type": { + "title": { "type": "string" }, - "value": { + "url": { "type": "string" } }, "type": "object" }, - "kroger.categoriesResponseDoc": { + "kickstarter.UpdatesResult": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/kroger.CategoriesResponse" - }, - "msg": { - "example": "OK", - "type": "string" + "updates": { + "items": { + "$ref": "#/definitions/kickstarter.Update" + }, + "type": "array" } }, "type": "object" }, - "kroger.categoryResponseDoc": { + "kickstarter.commentsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kroger.CategoryResponse" + "$ref": "#/definitions/kickstarter.CommentsResult" }, "msg": { "example": "OK", @@ -117110,14 +119194,14 @@ }, "type": "object" }, - "kroger.couponsResponseDoc": { + "kickstarter.discoverResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kroger.CouponsResponse" + "$ref": "#/definitions/kickstarter.DiscoverResult" }, "msg": { "example": "OK", @@ -117126,14 +119210,14 @@ }, "type": "object" }, - "kroger.productResponseDoc": { + "kickstarter.projectResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kroger.ProductResponse" + "$ref": "#/definitions/kickstarter.Project" }, "msg": { "example": "OK", @@ -117142,14 +119226,14 @@ }, "type": "object" }, - "kroger.productsResponseDoc": { + "kickstarter.updatesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/kroger.ProductsResponse" + "$ref": "#/definitions/kickstarter.UpdatesResult" }, "msg": { "example": "OK", @@ -117158,211 +119242,317 @@ }, "type": "object" }, - "kroger.relatedTagsResponseDoc": { + "kohls.CategoryFacet": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/kroger.RelatedTagsResponse" + "label": { + "example": "Department", + "type": "string" }, - "msg": { - "example": "OK", + "name": { + "example": "Department", "type": "string" + }, + "options": { + "items": { + "$ref": "#/definitions/kohls.CategoryFacetOption" + }, + "type": "array" } }, "type": "object" }, - "kroger.reviewsResponseDoc": { + "kohls.CategoryFacetOption": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/kroger.ReviewsResponse" + "active": { + "type": "boolean" }, - "msg": { - "example": "OK", + "category": { + "example": "Room:Dorm+Department:Bedding", "type": "string" - } - }, - "type": "object" - }, - "kroger.searchResponseDoc": { - "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/kroger.SearchResponse" }, - "msg": { - "example": "OK", + "name": { + "example": "Bedding", "type": "string" + }, + "product_count": { + "example": 479, + "type": "integer" } }, "type": "object" }, - "kroger.storeResponseDoc": { + "kohls.CategoryPriceRange": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/kroger.StoreResponse" + "max_price": { + "example": 9.99, + "type": "number" }, - "msg": { - "example": "OK", - "type": "string" + "min_price": { + "example": 2.99, + "type": "number" } }, "type": "object" }, - "kroger.suggestResponseDoc": { + "kohls.CategoryProduct": { "properties": { - "code": { - "example": 200, - "type": "integer" + "available_for_pickup": { + "example": false, + "type": "boolean" }, - "data": { - "$ref": "#/definitions/kroger.SuggestResponse" + "available_for_ship": { + "example": true, + "type": "boolean" }, - "msg": { - "example": "OK", - "type": "string" - } - }, - "type": "object" - }, - "latimes.ArticleResponse": { - "properties": { - "authors": { + "colors": { "items": { "type": "string" }, "type": "array" }, - "description": { - "type": "string" - }, - "headline": { + "currency_code": { + "example": "USD", "type": "string" }, "image_url": { "type": "string" }, - "is_accessible_for_free": { + "on_sale": { + "example": true, "type": "boolean" }, - "paragraphs": { - "items": { - "type": "string" - }, - "type": "array" + "rating": { + "example": 3.9, + "type": "number" }, - "published_at": { - "type": "string" + "regular_price": { + "$ref": "#/definitions/kohls.CategoryPriceRange" }, - "section": { - "type": "string" + "review_count": { + "example": 27103, + "type": "integer" }, - "updated_at": { + "sale_price": { + "$ref": "#/definitions/kohls.CategoryPriceRange" + }, + "title": { + "example": "The Big One® Solid Bath Towel, Bath Sheet, Hand Towel or Washcloth", "type": "string" }, "url": { "type": "string" + }, + "web_id": { + "example": "4569328", + "type": "string" } }, "type": "object" }, - "latimes.AuthorArticle": { + "kohls.CategoryResponse": { "properties": { - "image_url": { + "category": { + "example": "Room:Dorm", "type": "string" }, - "published_at": { + "count": { + "example": 120, + "type": "integer" + }, + "facets": { + "items": { + "$ref": "#/definitions/kohls.CategoryFacet" + }, + "type": "array" + }, + "fetched_at": { "type": "string" }, - "summary": { + "limit": { + "example": 120, + "type": "integer" + }, + "product_count": { + "example": 1317, + "type": "integer" + }, + "products": { + "items": { + "$ref": "#/definitions/kohls.CategoryProduct" + }, + "type": "array" + }, + "source_url": { "type": "string" }, "title": { + "example": "Essential Dorm Items for College-Bound Students | Kohl's", "type": "string" }, - "url": { - "type": "string" + "total_pages": { + "example": 11, + "type": "integer" } }, "type": "object" }, - "latimes.AuthorResponse": { + "kohls.ProductReviewsResponse": { "properties": { - "articles": { + "fetched_at": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "page_size": { + "type": "integer" + }, + "reviews": { "items": { - "$ref": "#/definitions/latimes.AuthorArticle" + "$ref": "#/definitions/kohls.Review" }, "type": "array" }, - "bio": { + "source_url": { "type": "string" }, - "email": { - "type": "string" + "total_count": { + "type": "integer" }, - "image_url": { + "web_id": { + "type": "string" + } + }, + "type": "object" + }, + "kohls.Review": { + "properties": { + "author": { "type": "string" }, - "job_title": { + "id": { "type": "string" }, - "name": { + "location": { "type": "string" }, - "social_accounts": { + "photo_urls": { "items": { - "$ref": "#/definitions/latimes.AuthorSocialAccount" + "type": "string" }, "type": "array" }, - "url": { + "rating": { + "type": "integer" + }, + "recommended": { + "type": "boolean" + }, + "secondary_ratings": { + "items": { + "$ref": "#/definitions/kohls.ReviewSecondaryRating" + }, + "type": "array" + }, + "submitted_at": { + "type": "string" + }, + "text": { + "type": "string" + }, + "title": { "type": "string" } }, "type": "object" }, - "latimes.AuthorSocialAccount": { + "kohls.ReviewSecondaryRating": { "properties": { - "platform": { - "type": "string" + "max_value": { + "example": 5, + "type": "integer" }, - "url": { + "name": { + "example": "Quality", "type": "string" + }, + "value": { + "example": 4, + "type": "integer" } }, "type": "object" }, - "latimes.HeadlineItem": { + "kohls.Store": { "properties": { - "author": { + "address": { + "example": "17150 SOUTHCENTER PKWY", "type": "string" }, - "image_caption": { + "badges": { + "example": [ + "Sephora", + "Baby Gifting Shop" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "city": { + "example": "TUKWILA", "type": "string" }, - "image_url": { + "country": { + "example": "US", "type": "string" }, - "published_at": { + "distance_miles": { + "example": 11.3, + "type": "number" + }, + "hours": { + "items": { + "$ref": "#/definitions/kohls.StoreHours" + }, + "type": "array" + }, + "id": { + "example": "1152", "type": "string" }, - "summary": { + "latitude": { + "example": 47.450079, + "type": "number" + }, + "longitude": { + "example": -122.2581113, + "type": "number" + }, + "name": { + "example": "Kohl's Tukwila", "type": "string" }, - "title": { + "phone": { + "example": "(206) 394-0078", + "type": "string" + }, + "postal_code": { + "example": "98188", + "type": "string" + }, + "services": { + "example": [ + "In-Store Pickup", + "Wifi Enabled" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "state": { + "example": "WA", "type": "string" }, "url": { @@ -117371,53 +119561,77 @@ }, "type": "object" }, - "latimes.HeadlinesResponse": { + "kohls.StoreHours": { "properties": { - "items": { - "items": { - "$ref": "#/definitions/latimes.HeadlineItem" - }, - "type": "array" + "close": { + "example": "21:00", + "type": "string" }, - "section": { + "day": { + "example": "Monday", + "type": "string" + }, + "open": { + "example": "09:00", "type": "string" } }, "type": "object" }, - "latimes.SectionInfo": { + "kohls.StoresResponse": { "properties": { - "feed_url": { + "count": { + "type": "integer" + }, + "fetched_at": { "type": "string" }, - "name": { + "search": { "type": "string" }, - "slug": { + "source_url": { "type": "string" + }, + "stores": { + "items": { + "$ref": "#/definitions/kohls.Store" + }, + "type": "array" } }, "type": "object" }, - "latimes.SectionsResponse": { + "kohls.SuggestResponse": { "properties": { - "sections": { + "count": { + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "query": { + "type": "string" + }, + "source_url": { + "type": "string" + }, + "suggestions": { "items": { - "$ref": "#/definitions/latimes.SectionInfo" + "type": "string" }, "type": "array" } }, "type": "object" }, - "latimes.articleResponseDoc": { + "kohls.categoryResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/latimes.ArticleResponse" + "$ref": "#/definitions/kohls.CategoryResponse" }, "msg": { "example": "OK", @@ -117426,14 +119640,14 @@ }, "type": "object" }, - "latimes.authorResponseDoc": { + "kohls.productReviewsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/latimes.AuthorResponse" + "$ref": "#/definitions/kohls.ProductReviewsResponse" }, "msg": { "example": "OK", @@ -117442,14 +119656,14 @@ }, "type": "object" }, - "latimes.headlinesResponseDoc": { + "kohls.storesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/latimes.HeadlinesResponse" + "$ref": "#/definitions/kohls.StoresResponse" }, "msg": { "example": "OK", @@ -117458,14 +119672,14 @@ }, "type": "object" }, - "latimes.sectionsResponseDoc": { + "kohls.suggestResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/latimes.SectionsResponse" + "$ref": "#/definitions/kohls.SuggestResponse" }, "msg": { "example": "OK", @@ -117474,993 +119688,905 @@ }, "type": "object" }, - "lazada.CategoryDirectoryResponse": { + "kotaku.AuthorResponse": { "properties": { - "fetched_at": { - "example": "2026-08-28T04:00:00Z", - "type": "string" + "articles": { + "items": { + "$ref": "#/definitions/newsplatform.HeadlineItem" + }, + "type": "array" }, - "groups": { + "biography": { "items": { - "$ref": "#/definitions/lazada.CategoryGroup" + "type": "string" }, "type": "array" }, - "region": { - "example": "ID", + "image_url": { "type": "string" }, - "source_url": { - "example": "https://pages.lazada.co.id/wow/i/id/LandingPage/lazmall?wh_weex=true", + "name": { "type": "string" - } - }, - "type": "object" - }, - "lazada.CategoryGroup": { - "properties": { - "categories": { + }, + "social_links": { "items": { - "$ref": "#/definitions/lazada.CategoryNode" + "$ref": "#/definitions/kotaku.AuthorSocialLink" }, "type": "array" }, - "name": { - "example": "Elektronik", + "url": { "type": "string" } }, "type": "object" }, - "lazada.CategoryLink": { + "kotaku.AuthorSocialLink": { "properties": { - "name": { - "example": "Handphone", + "type": { "type": "string" }, "url": { - "example": "https://www.lazada.co.id/beli-handphone", "type": "string" } }, "type": "object" }, - "lazada.CategoryNode": { + "kroger.CategoriesResponse": { "properties": { - "children": { + "categories": { "items": { - "$ref": "#/definitions/lazada.CategoryNode" + "$ref": "#/definitions/kroger.CategoryTaxon" }, "type": "array" }, - "name": { - "example": "Laptop", - "type": "string" + "count": { + "type": "integer" }, - "url": { - "example": "https://www.lazada.co.id/shop-beli-laptop/", + "departments": { + "description": "Departments lists the top-level departments that contributed at least\none category below, in Kroger's own menu order.", + "items": { + "type": "string" + }, + "type": "array" + }, + "source_url": { "type": "string" } }, "type": "object" }, - "lazada.CategoryProductsResponse": { + "kroger.CategoryResponse": { "properties": { - "brand": { - "example": "lazada6910077_crown-127197821", - "type": "string" - }, - "category": { - "example": "shop-karaoke-systems", - "type": "string" - }, - "fetched_at": { - "example": "2026-09-02T04:00:00Z", + "category_id": { "type": "string" }, - "items": { + "facets": { "items": { - "$ref": "#/definitions/lazada.ListingItem" + "$ref": "#/definitions/kroger.SearchFacetGroup" }, "type": "array" }, + "has_more": { + "description": "HasMore, Source and Facets carry the same meaning as on\nSearchResponse -- see that type and Search's doc comment.", + "type": "boolean" + }, "page": { - "example": 1, "type": "integer" }, - "page_size": { - "example": 40, + "products": { + "items": { + "$ref": "#/definitions/kroger.SearchResultProduct" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "source": { + "type": "string" + }, + "total_count": { "type": "integer" + } + }, + "type": "object" + }, + "kroger.CategoryTaxon": { + "properties": { + "breadcrumb": { + "description": "Breadcrumb is the full department > aisle > category path, deduplicated\nwhere Kroger's own menu repeats a level's name at the next level down.", + "items": { + "type": "string" + }, + "type": "array" }, - "region": { - "example": "PH", + "category_id": { "type": "string" }, - "sort": { - "example": "popularity", + "department": { + "description": "Department is the top-level department this category rolls up under\n(Breadcrumb[0]), included as a convenience field for grouping/filtering\nwithout parsing Breadcrumb.", "type": "string" }, - "source_url": { - "example": "https://www.lazada.com.ph/shop-karaoke-systems/?ajax=true&page=1", + "name": { "type": "string" }, - "total_results": { - "example": 2400, - "type": "integer" + "slug": { + "type": "string" + }, + "url": { + "description": "URL is the canonical kroger.com category-browse page URL.", + "type": "string" } }, "type": "object" }, - "lazada.HomeResponse": { + "kroger.Coupon": { "properties": { + "brand": { + "type": "string" + }, "categories": { "items": { - "$ref": "#/definitions/lazada.CategoryLink" + "type": "string" }, "type": "array" }, - "fetched_at": { - "example": "2026-08-28T04:00:00Z", + "display_description": { "type": "string" }, - "flash_sale_items": { + "end_date": { + "type": "string" + }, + "expiration_date": { + "type": "string" + }, + "id": { + "type": "string" + }, + "image_url": { + "type": "string" + }, + "kroger_coupon_number": { + "type": "string" + }, + "modalities": { "items": { - "$ref": "#/definitions/lazada.ProductSummary" + "type": "string" }, "type": "array" }, - "official_stores": { - "description": "OfficialStores lists featured official-store shops from the same\nhomepage. This carousel was observed absent on one storefront\n(Philippines) during a live check; treat an empty list as \"not\ncurrently shown\", not as evidence of parser drift.", + "redemptions_allowed": { + "type": "integer" + }, + "requirement_description": { + "type": "string" + }, + "requirement_quantity": { + "type": "integer" + }, + "savings": { + "type": "number" + }, + "savings_tags": { "items": { - "$ref": "#/definitions/lazada.OfficialStore" + "$ref": "#/definitions/kroger.CouponSavingsTag" }, "type": "array" }, - "region": { - "example": "ID", + "short_description": { "type": "string" }, - "source_url": { - "example": "https://www.lazada.co.id/", + "start_date": { + "type": "string" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "total_downloads": { + "type": "integer" + }, + "type": { "type": "string" + }, + "value": { + "type": "number" } }, "type": "object" }, - "lazada.ListingItem": { + "kroger.CouponSavingsTag": { "properties": { - "currency": { - "example": "PHP", + "description": { "type": "string" }, - "discount": { - "example": "77% Off", + "display_name": { "type": "string" }, - "image": { - "example": "https://ph-live-01.slatic.net/p/example.png", + "name": { + "type": "string" + } + }, + "type": "object" + }, + "kroger.CouponsResponse": { + "properties": { + "brand": { "type": "string" }, - "item_id": { - "example": 15396167084, + "count": { "type": "integer" }, - "location": { - "example": "Benguet", - "type": "string" - }, - "price": { - "example": 159, - "type": "number" + "coupons": { + "items": { + "$ref": "#/definitions/kroger.Coupon" + }, + "type": "array" }, - "rating": { - "description": "Rating and Reviews are omitted entirely when the listing card has no\nrating yet (a brand-new or unrated listing) rather than defaulting to 0.", - "example": 5, - "type": "number" + "location_id": { + "type": "string" }, - "reviews": { - "example": 3, + "page": { "type": "integer" }, - "title": { - "example": "Digilab Original K12 Bluetooth Portable Karaoke Speaker", - "type": "string" + "page_size": { + "type": "integer" }, - "url": { - "example": "https://www.lazada.com.ph/products/pdp-i15396167084.html", + "upc": { "type": "string" } }, "type": "object" }, - "lazada.OfficialStore": { + "kroger.NutritionFact": { "properties": { - "brand_image": { - "example": "https://img.lazcdn.com/g/p/example.jpg", + "daily_value": { "type": "string" }, "name": { - "example": "Alfalink", "type": "string" }, - "shop_image": { - "example": "https://img.lazcdn.com/g/shop/example.jpeg", + "unit": { "type": "string" }, - "url": { - "example": "https://www.lazada.co.id/shop/alfalink", + "value": { "type": "string" } }, "type": "object" }, - "lazada.ProductResponse": { + "kroger.ProductCategory": { "properties": { - "brand": { - "example": "Pantene", + "commodity": { "type": "string" }, - "brand_url": { - "example": "https://www.lazada.co.id/pantene/", + "department": { "type": "string" }, - "category": { - "example": [ - "Kecantikan" - ], + "sub_commodity": { + "type": "string" + } + }, + "type": "object" + }, + "kroger.ProductDetail": { + "properties": { + "alcohol": { + "type": "boolean" + }, + "brand": { + "type": "string" + }, + "categories": { "items": { "type": "string" }, "type": "array" }, - "currency": { - "example": "IDR", - "type": "string" - }, - "description": { - "type": "string" + "category": { + "$ref": "#/definitions/kroger.ProductCategory" }, - "fetched_at": { - "example": "2026-09-02T04:00:00Z", + "country_of_origin": { "type": "string" }, - "highlights": { + "image_url": { "type": "string" }, "images": { "items": { - "type": "string" + "$ref": "#/definitions/kroger.ProductImage" }, "type": "array" }, - "item_id": { - "example": 159992555, - "type": "integer" - }, - "price": { - "example": 190500, - "type": "number" + "inventory": { + "$ref": "#/definitions/kroger.ProductInventory" }, - "region": { - "example": "ID", + "name": { "type": "string" }, - "seller_id": { - "example": 100161156, - "type": "integer" + "nutrition": { + "$ref": "#/definitions/kroger.ProductNutrition" }, - "sku_id": { - "example": 181803572, - "type": "integer" + "price": { + "$ref": "#/definitions/kroger.ProductPrice" }, - "source_url": { - "example": "https://www.lazada.co.id/products/pdp-i159992555-s181803572.html", + "rating": { + "$ref": "#/definitions/kroger.ProductRating" + }, + "size": { "type": "string" }, - "title": { - "example": "PANTENE Shampoo Hair Fall Control 990ml", + "upc": { "type": "string" }, "url": { - "example": "https://www.lazada.co.id/products/pantene-shampoo-hair-fall-control-990ml-i159992555-s181803572.html", "type": "string" - }, - "variants": { - "items": { - "$ref": "#/definitions/lazada.ProductVariant" - }, - "type": "array" } }, "type": "object" }, - "lazada.ProductSummary": { + "kroger.ProductImage": { "properties": { - "currency": { - "example": "IDR", - "type": "string" - }, - "discount": { - "example": "-32%", - "type": "string" - }, - "image": { - "example": "https://img.lazcdn.com/g/p/example.jpg", + "perspective": { "type": "string" }, - "item_id": { - "example": 159992555, - "type": "integer" - }, - "original_price": { - "example": 190500, - "type": "number" - }, - "price": { - "example": 129000, - "type": "number" - }, - "title": { - "example": "PANTENE Shampoo Hair Fall Control 990ml", + "size": { "type": "string" }, "url": { - "example": "https://www.lazada.co.id/products/pdp-i159992555-s181803572.html", "type": "string" } }, "type": "object" }, - "lazada.ProductVariant": { + "kroger.ProductInventory": { "properties": { - "name": { - "example": "Volume", + "available": { + "type": "integer" + }, + "location_id": { "type": "string" }, - "values": { - "example": [ - "990 ml" - ], - "items": { - "type": "string" - }, - "type": "array" + "stock_level": { + "type": "string" } }, "type": "object" }, - "lazada.SearchResponse": { + "kroger.ProductNutrition": { "properties": { - "fetched_at": { - "example": "2026-09-02T04:00:00Z", + "allergens": { "type": "string" }, - "items": { + "facts": { "items": { - "$ref": "#/definitions/lazada.ListingItem" + "$ref": "#/definitions/kroger.NutritionFact" }, "type": "array" }, - "page": { - "example": 1, - "type": "integer" - }, - "page_size": { - "example": 40, - "type": "integer" + "gluten_free": { + "type": "boolean" }, - "query": { - "example": "karaoke", + "ingredients": { "type": "string" }, - "region": { - "example": "PH", - "type": "string" + "kosher": { + "type": "boolean" }, - "sort": { - "example": "popularity", + "non_gmo": { + "type": "boolean" + }, + "organic": { + "type": "boolean" + }, + "product_warning": { "type": "string" }, - "source_url": { - "example": "https://www.lazada.com.ph/catalog/?q=karaoke&ajax=true&page=1", + "serving_size": { "type": "string" }, - "total_results": { - "example": 2400, - "type": "integer" + "servings_per_container": { + "type": "string" } }, "type": "object" }, - "lazada.categoriesResponseDoc": { + "kroger.ProductOffer": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/lazada.CategoryDirectoryResponse" + "availability": { + "type": "string" }, - "msg": { - "example": "OK", + "currency": { "type": "string" - } - }, - "type": "object" - }, - "lazada.categoryProductsResponseDoc": { - "properties": { - "code": { - "example": 200, - "type": "integer" }, - "data": { - "$ref": "#/definitions/lazada.CategoryProductsResponse" + "original_price": { + "type": "number" }, - "msg": { - "example": "OK", - "type": "string" + "price": { + "type": "number" } }, "type": "object" }, - "lazada.homeResponseDoc": { + "kroger.ProductPrice": { "properties": { - "code": { - "example": 200, - "type": "integer" + "amount": { + "type": "number" }, - "data": { - "$ref": "#/definitions/lazada.HomeResponse" + "currency": { + "type": "string" }, - "msg": { - "example": "OK", + "display": { "type": "string" - } - }, - "type": "object" - }, - "lazada.productResponseDoc": { - "properties": { - "code": { - "example": 200, - "type": "integer" }, - "data": { - "$ref": "#/definitions/lazada.ProductResponse" + "location_id": { + "type": "string" }, - "msg": { - "example": "OK", + "seller_id": { "type": "string" - } - }, - "type": "object" - }, - "lazada.searchResponseDoc": { - "properties": { - "code": { - "example": 200, - "type": "integer" }, - "data": { - "$ref": "#/definitions/lazada.SearchResponse" + "seller_name": { + "type": "string" }, - "msg": { - "example": "OK", + "unit_price_text": { "type": "string" } }, "type": "object" }, - "leboncoin.ListingCard": { + "kroger.ProductRating": { "properties": { - "category": { - "type": "string" + "average": { + "type": "number" }, - "id": { - "type": "string" + "count": { + "type": "integer" }, - "image_url": { - "type": "string" + "five_stars": { + "type": "integer" }, - "price_eur": { + "four_stars": { "type": "integer" }, - "title": { - "type": "string" + "one_star": { + "type": "integer" }, - "url": { - "type": "string" + "three_stars": { + "type": "integer" + }, + "two_stars": { + "type": "integer" } }, "type": "object" }, - "leboncoin.ListingResponse": { + "kroger.ProductResponse": { "properties": { - "availability": { - "type": "string" - }, - "category": { - "type": "string" - }, - "condition": { + "brand": { "type": "string" }, - "currency": { - "type": "string" + "categories": { + "items": { + "type": "string" + }, + "type": "array" }, "description": { "type": "string" }, - "id": { - "type": "string" - }, "image_url": { "type": "string" }, - "price_eur": { + "offer": { + "$ref": "#/definitions/kroger.ProductOffer" + }, + "rating_count": { "type": "integer" }, + "rating_value": { + "type": "number" + }, "title": { "type": "string" }, + "upc": { + "type": "string" + }, "url": { "type": "string" } }, "type": "object" }, - "leboncoin.SearchResponse": { + "kroger.ProductsResponse": { "properties": { - "listings": { - "items": { - "$ref": "#/definitions/leboncoin.ListingCard" - }, - "type": "array" + "count": { + "type": "integer" }, - "location": { + "location_id": { "type": "string" }, - "source_url": { - "type": "string" + "products": { + "items": { + "$ref": "#/definitions/kroger.ProductDetail" + }, + "type": "array" } }, "type": "object" }, - "leboncoin.listingResponseDoc": { + "kroger.RelatedTag": { "properties": { - "code": { - "example": 200, + "position": { "type": "integer" }, - "data": { - "$ref": "#/definitions/leboncoin.ListingResponse" + "query": { + "type": "string" }, - "msg": { - "example": "OK", + "source": { + "type": "string" + }, + "tag": { "type": "string" } }, "type": "object" }, - "leboncoin.searchResponseDoc": { + "kroger.RelatedTagsResponse": { "properties": { - "code": { - "example": 200, + "count": { "type": "integer" }, - "data": { - "$ref": "#/definitions/leboncoin.SearchResponse" + "location_id": { + "type": "string" }, - "msg": { - "example": "OK", + "query": { "type": "string" + }, + "related_tags": { + "items": { + "$ref": "#/definitions/kroger.RelatedTag" + }, + "type": "array" } }, "type": "object" }, - "letterboxd.FilmRating": { + "kroger.Review": { "properties": { - "average": { - "description": "Average Letterboxd member rating, out of 5.", - "example": 4.52, - "type": "number" + "featured": { + "type": "boolean" }, - "count": { - "description": "Number of member ratings behind the average.", - "example": 5553202, + "helpful_vote_count": { "type": "integer" }, - "review_count": { - "description": "Number of written reviews. Omitted when Letterboxd shows none.", - "example": 740173, + "id": { + "type": "string" + }, + "not_helpful_vote_count": { + "type": "integer" + }, + "photos": { + "items": { + "$ref": "#/definitions/kroger.ReviewPhoto" + }, + "type": "array" + }, + "rating": { "type": "integer" + }, + "ratings_only": { + "type": "boolean" + }, + "recommended": { + "type": "boolean" + }, + "submitted_at": { + "type": "string" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" } }, "type": "object" }, - "letterboxd.FilmRef": { + "kroger.ReviewPhoto": { "properties": { - "slug": { - "description": "Letterboxd film slug. Use it with the film endpoint for full detail.", - "type": "string" - }, - "title": { - "description": "Title of the film.", + "size": { "type": "string" }, - "uri": { - "description": "Link to the film's page on Letterboxd.", + "url": { "type": "string" } }, "type": "object" }, - "letterboxd.FilmResponse": { + "kroger.ReviewsResponse": { "properties": { - "cast": { - "description": "Cast members of the film, up to 25 credits.", - "items": { - "$ref": "#/definitions/letterboxd.PersonCredit" - }, - "type": "array" + "average_rating": { + "type": "number" }, - "countries": { - "description": "Countries the film was made in.", - "items": { - "type": "string" - }, - "type": "array" + "page": { + "type": "integer" }, - "directors": { - "description": "Directors of the film.", - "items": { - "$ref": "#/definitions/letterboxd.PersonCredit" - }, - "type": "array" + "page_size": { + "type": "integer" }, - "genres": { - "description": "Genres of the film.", - "items": { - "type": "string" - }, - "type": "array" + "rating": { + "$ref": "#/definitions/kroger.ProductRating" }, - "languages": { - "description": "Languages used in the film, as Letterboxd lists them.", + "reviews": { "items": { - "type": "string" + "$ref": "#/definitions/kroger.Review" }, "type": "array" }, - "poster_url": { - "description": "URL of the film's poster image.", + "total_count": { + "type": "integer" + }, + "upc": { + "type": "string" + } + }, + "type": "object" + }, + "kroger.SearchFacetGroup": { + "properties": { + "group": { "type": "string" }, - "production_companies": { - "description": "Names of the production companies behind the film.", + "values": { "items": { - "type": "string" + "$ref": "#/definitions/kroger.SearchFacetValue" }, "type": "array" + } + }, + "type": "object" + }, + "kroger.SearchFacetValue": { + "properties": { + "count": { + "type": "integer" }, - "rating": { - "allOf": [ - { - "$ref": "#/definitions/letterboxd.FilmRating" - } - ], - "description": "Aggregate Letterboxd member rating. Omitted when the film has no ratings." - }, - "release_date": { - "description": "Release date of the film, in YYYY-MM-DD format.", - "example": "2019-05-21", + "name": { "type": "string" }, - "runtime_minutes": { - "description": "Running time of the film in minutes.", - "example": 133, - "type": "integer" - }, "slug": { - "description": "Letterboxd film slug, for example `parasite-2019`. Use it with the film endpoints.", - "example": "parasite-2019", "type": "string" + } + }, + "type": "object" + }, + "kroger.SearchResponse": { + "properties": { + "facets": { + "items": { + "$ref": "#/definitions/kroger.SearchFacetGroup" + }, + "type": "array" }, - "source_url": { - "description": "URL the data was read from.", - "type": "string" + "has_more": { + "description": "HasMore reports whether Kroger says more results exist past this page.\nOnly meaningful on the JSON-API path; false on the HTML fallback.", + "type": "boolean" }, - "synopsis": { - "description": "Short plot synopsis of the film.", - "type": "string" + "page": { + "type": "integer" }, - "title": { - "description": "Title of the film.", - "example": "Parasite", + "products": { + "items": { + "$ref": "#/definitions/kroger.SearchResultProduct" + }, + "type": "array" + }, + "query": { "type": "string" }, - "uri": { - "description": "Link to the film's page on Letterboxd.", + "source": { + "description": "Source is which upstream path served this response: \"json_api\" (the\nprimary path) or \"html\" (the fallback). See Search's doc comment.", "type": "string" }, - "year": { - "description": "Year the film was released.", - "example": 2019, + "total_count": { "type": "integer" } }, "type": "object" }, - "letterboxd.MemberResponse": { + "kroger.SearchResultProduct": { "properties": { - "display_name": { + "brand": { + "description": "Brand and StockLevel are populated by the JSON-API path only (the\nHTML result cards carry neither); both are omitted when the HTML\nfallback served the response. See Search's doc comment.", "type": "string" }, - "films_this_year": { - "type": "integer" + "currency": { + "type": "string" }, - "films_watched": { - "type": "integer" + "image_url": { + "type": "string" }, - "followers": { - "type": "integer" + "low_stock": { + "type": "boolean" }, - "following": { - "type": "integer" + "original_price": { + "type": "number" }, - "lists": { - "type": "integer" + "price": { + "type": "number" }, - "source_url": { + "size": { "type": "string" }, - "uri": { + "snap_ebt_eligible": { + "type": "boolean" + }, + "stock_level": { "type": "string" }, - "username": { + "title": { "type": "string" - } - }, - "type": "object" - }, - "letterboxd.PersonCredit": { - "properties": { - "name": { - "description": "Name of the person.", + }, + "unit_price": { "type": "string" }, - "slug": { - "description": "Letterboxd slug of the person. Use it with the person endpoint.", + "upc": { + "type": "string" + }, + "url": { "type": "string" } }, "type": "object" }, - "letterboxd.PersonResponse": { + "kroger.StoreAddress": { "properties": { - "films": { + "address_lines": { "items": { - "$ref": "#/definitions/letterboxd.FilmRef" + "type": "string" }, "type": "array" }, - "name": { + "city": { "type": "string" }, - "role": { + "country": { "type": "string" }, - "slug": { + "postal_code": { "type": "string" }, - "source_url": { + "state": { "type": "string" } }, "type": "object" }, - "letterboxd.PopularResponse": { + "kroger.StoreHours": { "properties": { - "decade": { - "description": "Decade filter that was applied, for example `2010s`. Omitted when none was set.", - "type": "string" - }, - "films": { - "description": "Films in the chart, most popular first.", - "items": { - "$ref": "#/definitions/letterboxd.FilmRef" - }, - "type": "array" - }, - "genre": { - "description": "Genre filter that was applied. Omitted when none was set.", + "days": { "type": "string" }, - "period": { - "description": "Time window of the chart: `day`, `week`, `month` or `year`. Omitted for the all-time chart.", + "hours": { "type": "string" }, - "source_url": { - "description": "URL the data was read from.", - "type": "string" + "is_today": { + "type": "boolean" } }, "type": "object" }, - "letterboxd.RatingBucket": { + "kroger.StoreLocation": { "properties": { - "count": { - "type": "integer" - }, - "percent": { - "type": "integer" + "latitude": { + "type": "number" }, - "stars": { - "example": 4.5, + "longitude": { "type": "number" } }, "type": "object" }, - "letterboxd.RatingHistogramResponse": { + "kroger.StoreResponse": { "properties": { - "buckets": { + "address": { + "$ref": "#/definitions/kroger.StoreAddress" + }, + "brand": { + "type": "string" + }, + "break_hours": { "items": { - "$ref": "#/definitions/letterboxd.RatingBucket" + "$ref": "#/definitions/kroger.StoreHours" }, "type": "array" }, - "slug": { - "type": "string" - }, - "source_url": { - "type": "string" + "has_drive_thru": { + "type": "boolean" }, - "total_ratings": { - "type": "integer" - } - }, - "type": "object" - }, - "letterboxd.Review": { - "properties": { - "comment_count": { - "type": "integer" + "hours": { + "items": { + "$ref": "#/definitions/kroger.StoreHours" + }, + "type": "array" }, - "contains_spoilers": { - "type": "boolean" + "location": { + "$ref": "#/definitions/kroger.StoreLocation" }, - "date": { - "example": "2019-08-14", + "name": { "type": "string" }, - "display_name": { + "open_text": { "type": "string" }, - "like_count": { - "type": "integer" - }, - "liked": { - "type": "boolean" - }, - "rating": { - "example": 4.5, - "type": "number" - }, - "text": { + "phone": { "type": "string" }, - "username": { + "store_id": { "type": "string" } }, "type": "object" }, - "letterboxd.ReviewsResponse": { + "kroger.SuggestResponse": { "properties": { - "reviews": { - "items": { - "$ref": "#/definitions/letterboxd.Review" - }, - "type": "array" - }, - "slug": { + "location_id": { "type": "string" }, - "source_url": { - "type": "string" - } - }, - "type": "object" - }, - "letterboxd.SearchResponse": { - "properties": { "query": { - "description": "Search text that was run.", "type": "string" }, - "results": { - "description": "Search hits, one item per film, person, list or tag.", + "spelling_correction": { + "description": "SpellingCorrection is Kroger's own suggested respelling of Query, set\nonly when Query returned zero suggestions and Kroger judged it a\nlikely typo (confirmed live: \"Marble cake\" -> \"maple cake\" with an\nempty Suggestions list).", + "type": "string" + }, + "suggestions": { "items": { - "$ref": "#/definitions/letterboxd.SearchResult" + "$ref": "#/definitions/kroger.Suggestion" }, "type": "array" - }, - "source_url": { - "description": "URL the data was read from.", - "type": "string" - }, - "type": { - "description": "Result type the search was limited to, `film`. Omitted for a mixed search.", - "type": "string" } }, "type": "object" }, - "letterboxd.SearchResult": { + "kroger.Suggestion": { "properties": { - "owner": { - "description": "Username of the member who made the list. Present for list hits.", - "type": "string" - }, - "role": { - "description": "Role of the person, `actor` or `director`. Present for person hits.", - "example": "director", - "type": "string" - }, - "slug": { - "description": "Letterboxd slug of the film or person. Present for film and person hits.", - "type": "string" - }, - "title": { - "description": "Title of the film or list, name of the person, or the tag.", - "type": "string" - }, "type": { - "description": "Kind of hit: `film`, `person`, `list` or `tag`.", - "example": "film", "type": "string" }, - "uri": { - "description": "Link to the hit's page on Letterboxd.", + "value": { "type": "string" - }, - "year": { - "description": "Year the film was released. Present for film hits.", - "type": "integer" } }, "type": "object" }, - "letterboxd.SimilarResponse": { + "kroger.categoriesResponseDoc": { "properties": { - "films": { - "description": "Films Letterboxd lists as similar.", - "items": { - "$ref": "#/definitions/letterboxd.FilmRef" - }, - "type": "array" + "code": { + "example": 200, + "type": "integer" }, - "slug": { - "description": "Slug of the film the similar films are for.", - "type": "string" + "data": { + "$ref": "#/definitions/kroger.CategoriesResponse" }, - "source_url": { - "description": "URL the data was read from.", + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "letterboxd.filmResponseDoc": { + "kroger.categoryResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.FilmResponse" + "$ref": "#/definitions/kroger.CategoryResponse" }, "msg": { "example": "OK", @@ -118469,14 +120595,14 @@ }, "type": "object" }, - "letterboxd.memberResponseDoc": { + "kroger.couponsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.MemberResponse" + "$ref": "#/definitions/kroger.CouponsResponse" }, "msg": { "example": "OK", @@ -118485,14 +120611,14 @@ }, "type": "object" }, - "letterboxd.personResponseDoc": { + "kroger.productResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.PersonResponse" + "$ref": "#/definitions/kroger.ProductResponse" }, "msg": { "example": "OK", @@ -118501,14 +120627,14 @@ }, "type": "object" }, - "letterboxd.popularResponseDoc": { + "kroger.productsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.PopularResponse" + "$ref": "#/definitions/kroger.ProductsResponse" }, "msg": { "example": "OK", @@ -118517,14 +120643,14 @@ }, "type": "object" }, - "letterboxd.ratingHistogramResponseDoc": { + "kroger.relatedTagsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.RatingHistogramResponse" + "$ref": "#/definitions/kroger.RelatedTagsResponse" }, "msg": { "example": "OK", @@ -118533,14 +120659,14 @@ }, "type": "object" }, - "letterboxd.reviewsResponseDoc": { + "kroger.reviewsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.ReviewsResponse" + "$ref": "#/definitions/kroger.ReviewsResponse" }, "msg": { "example": "OK", @@ -118549,14 +120675,14 @@ }, "type": "object" }, - "letterboxd.searchResponseDoc": { + "kroger.searchResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.SearchResponse" + "$ref": "#/definitions/kroger.SearchResponse" }, "msg": { "example": "OK", @@ -118565,14 +120691,14 @@ }, "type": "object" }, - "letterboxd.similarResponseDoc": { + "kroger.storeResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/letterboxd.SimilarResponse" + "$ref": "#/definitions/kroger.StoreResponse" }, "msg": { "example": "OK", @@ -118581,494 +120707,218 @@ }, "type": "object" }, - "linkedin.Customer": { + "kroger.suggestResponseDoc": { "properties": { - "follower_count": { - "description": "Number of LinkedIn followers of the customer's company page.", - "example": 12345, + "code": { + "example": 200, "type": "integer" }, - "industry": { - "description": "Industry listed for the customer company.", - "example": "Information Technology & Services", - "type": "string" - }, - "link": { - "description": "LinkedIn URL of the customer's company page.", - "example": "https://www.linkedin.com/company/contoso/", - "type": "string" - }, - "logo": { - "description": "URL of the customer's logo image.", - "example": "https://media.licdn.com/dms/image/v2/company-logo_100_100/company-logo_100_100/0/123456789/logo?e=2147483647&v=beta&t=xyz", - "type": "string" + "data": { + "$ref": "#/definitions/kroger.SuggestResponse" }, - "name": { - "description": "Name of the featured customer company.", - "example": "Contoso Ltd.", + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "linkedin.LinkedinCompanyResponse": { + "latimes.ArticleResponse": { "properties": { - "about": { - "description": "Company description from the About section.", - "example": "We’re a team of scientists, engineers...", - "type": "string" - }, - "affiliated_pages": { - "description": "Related company pages listed as affiliated with this company.", + "authors": { "items": { - "$ref": "#/definitions/linkedin.Page" + "type": "string" }, "type": "array" }, - "company_size": { - "description": "Employee count range listed on the page, for example `501-1,000`.", - "example": "501-1,000", + "description": { "type": "string" }, - "follower_count": { - "description": "Number of LinkedIn followers of the company page.", - "example": 1176422, - "type": "integer" - }, - "founded_on": { - "description": "Year the company was founded.", - "example": 2010, - "type": "integer" - }, "headline": { - "description": "Tagline shown under the company name.", - "example": "We're committed to solving intelligence, to advance science and benefit humanity.", - "type": "string" - }, - "headquarters": { - "description": "Headquarters location as listed on the page.", - "example": "London, London", "type": "string" }, - "industry": { - "description": "Industry listed on the company page, for example `Research Services`.", - "example": "Research Services", + "image_url": { "type": "string" }, - "link": { - "description": "LinkedIn URL of the company page.", - "example": "https://www.linkedin.com/company/googledeepmind", - "type": "string" + "is_accessible_for_free": { + "type": "boolean" }, - "locations": { - "description": "Office locations listed on the company page.", + "paragraphs": { "items": { - "$ref": "#/definitions/linkedin.Location" + "type": "string" }, "type": "array" }, - "logo": { - "description": "URL of the company logo image.", - "example": "https://static.licdn.com/.../linkedin-bug-color.png", - "type": "string" - }, - "name": { - "description": "Company name as shown on its LinkedIn page.", - "example": "Google DeepMind", + "published_at": { "type": "string" }, - "num_of_employees_on_linkedin": { - "description": "Number of employees who list the company on their LinkedIn profile.", - "example": 5590, - "type": "integer" - }, - "products": { - "description": "Product Pages LinkedIn lists under the page's Products section.", - "items": { - "$ref": "#/definitions/linkedin.Product" - }, - "type": "array" - }, - "similar_pages": { - "description": "Company pages LinkedIn suggests as similar to this company.", - "items": { - "$ref": "#/definitions/linkedin.Page" - }, - "type": "array" - }, - "specialties": { - "description": "Specialties listed on the company page.", - "example": "Artificial Intelligence and Machine Learning", + "section": { "type": "string" }, - "type": { - "description": "Organization type listed on the page, for example `Privately Held`.", - "example": "Privately Held", + "updated_at": { "type": "string" }, - "updates": { - "description": "Recent posts shown on the company page.", - "items": { - "$ref": "#/definitions/linkedin.Update" - }, - "type": "array" - }, - "website": { - "description": "Company website address as listed on the page.", - "example": "https://www.deepmind.google", + "url": { "type": "string" } }, "type": "object" }, - "linkedin.LinkedinProductResponse": { + "latimes.AuthorArticle": { "properties": { - "about": { - "description": "Product description from the About section.", - "example": "Streamline, manage, and grow your business with Dynamics 365 Business Central - a flexible, scalable, comprehensive business management solution for small and medium-sized businesses.", + "image_url": { "type": "string" }, - "category_link": { - "description": "LinkedIn URL of the product category page.", - "example": "https://www.linkedin.com/products/categories/business-management-software", + "published_at": { "type": "string" }, - "category_name": { - "description": "Name of the LinkedIn product category the product is listed in.", - "example": "Business Management Software", + "summary": { "type": "string" }, - "cover_image": { - "description": "URL of the product page cover image.", - "example": "https://media.licdn.com/dms/image/v2/D4E1BAQF2jwQmfmDSiA/company-background_10000/B4EZYQcR0_HkAU-/0/1744032571051/microsoft_dynamics_cover?e=2147483647&v=beta&t=fUrpht_xQ4tCJkUKJcGr5hFyqQzXLxbETOV14KE5qk4", + "title": { "type": "string" }, - "external_link": { - "description": "URL of the product's own website, from the visit button on the page.", - "example": "https://dynamics.microsoft.com/en-us/business-central/overview/", + "url": { "type": "string" - }, - "featured_customers": { - "description": "Customer companies featured on the product page.", + } + }, + "type": "object" + }, + "latimes.AuthorResponse": { + "properties": { + "articles": { "items": { - "$ref": "#/definitions/linkedin.Customer" + "$ref": "#/definitions/latimes.AuthorArticle" }, "type": "array" }, - "link": { - "description": "LinkedIn URL of the product page.", - "example": "https://www.linkedin.com/products/microsoft-dynamics-microsoft-dynamics-365-business-central", + "bio": { "type": "string" }, - "logo": { - "description": "URL of the product logo image.", - "example": "https://media.licdn.com/dms/image/v2/C4E0BAQFXmfZJomhCcg/company-logo_100_100/company-logo_100_100/0/1630612268078/microsoft_dynamics_logo?e=2147483647&v=beta&t=2bAeeYjEdtNwIAdeHTqLAo6Av0AN3Ofe1vdzvN2ihpI", + "email": { "type": "string" }, - "medias": { - "description": "Media items shown on the product page, one entry per thumbnail.", - "items": { - "$ref": "#/definitions/linkedin.Media" - }, - "type": "array" - }, - "name": { - "description": "Product name as shown on its LinkedIn page.", - "example": "Microsoft Dynamics 365 Business Central", + "image_url": { "type": "string" }, - "organization_link": { - "description": "LinkedIn URL of the page of the company that makes the product.", - "example": "https://www.linkedin.com/company/microsoft-dynamics/", + "job_title": { "type": "string" }, - "organization_name": { - "description": "Name of the company that makes the product.", - "example": "Microsoft Dynamics 365", + "name": { "type": "string" }, - "other_products": { - "description": "Other products listed on the page, such as more products from the same company.", + "social_accounts": { "items": { - "$ref": "#/definitions/linkedin.Product" + "$ref": "#/definitions/latimes.AuthorSocialAccount" }, "type": "array" }, - "similar_products": { - "description": "Products LinkedIn suggests as similar to this one.", - "items": { - "$ref": "#/definitions/linkedin.Product" - }, - "type": "array" - } - }, - "type": "object" - }, - "linkedin.Location": { - "properties": { - "address": { - "description": "Full street address of the location, as listed on the company page.", - "example": "Kings Cross, London, London N1C4AG, GB", + "url": { "type": "string" - }, - "is_primary": { - "description": "Whether this is the company's primary location on LinkedIn.", - "example": true, - "type": "boolean" } }, "type": "object" }, - "linkedin.Media": { + "latimes.AuthorSocialAccount": { "properties": { - "link": { - "description": "URL of the media thumbnail image.", - "example": "https://media.licdn.com/media/sample-video.mp4", + "platform": { "type": "string" }, - "name": { - "description": "Caption of the media item on the product page.", - "example": "Product Demo Video", + "url": { "type": "string" } }, "type": "object" }, - "linkedin.Page": { + "latimes.HeadlineItem": { "properties": { - "address": { - "description": "Location shown on the page card, for example `San Francisco, CA`.", - "example": "San Francisco, CA", - "type": "string" - }, - "industry": { - "description": "Industry listed on the company page.", - "example": "Research Services", + "author": { "type": "string" }, - "link": { - "description": "LinkedIn URL of the company page.", - "example": "https://www.linkedin.com/company/openai", + "image_caption": { "type": "string" }, - "name": { - "description": "Name of the company page.", - "example": "OpenAI", - "type": "string" - } - }, - "type": "object" - }, - "linkedin.Product": { - "properties": { - "category_link": { - "description": "LinkedIn URL of the product category page.", - "example": "https://www.linkedin.com/products/categories/business-management-software", + "image_url": { "type": "string" }, - "category_name": { - "description": "Name of the LinkedIn product category the product is listed in.", - "example": "Business Management Software", + "published_at": { "type": "string" }, - "link": { - "description": "LinkedIn URL of the product page.", - "example": "https://www.linkedin.com/products/odoo/", + "summary": { "type": "string" }, - "logo": { - "description": "URL of the product logo image.", - "example": "https://media.licdn.com/dms/image/v2/D4E0BAQF91OMQCIi4dQ/company-logo_100_100/company-logo_100_100/0/1691657301051/odoo_logo?e=2147483647&v=beta&t=JfXKr0197Ib_ujXsUsYwXtga3l87Seko0icAH53nrHo", + "title": { "type": "string" }, - "name": { - "description": "Product name as shown on LinkedIn.", - "example": "Odoo", + "url": { "type": "string" } }, "type": "object" }, - "linkedin.ProductCategoriesResponse": { + "latimes.HeadlinesResponse": { "properties": { - "categories": { + "items": { "items": { - "$ref": "#/definitions/linkedin.ProductCategoryItem" + "$ref": "#/definitions/latimes.HeadlineItem" }, "type": "array" }, - "total": { - "example": 620, - "type": "integer" - } - }, - "type": "object" - }, - "linkedin.ProductCategoryItem": { - "properties": { - "id": { - "example": "1620", - "type": "string" - }, - "link": { - "example": "https://www.linkedin.com/products/categories/healthcare-crm-software", - "type": "string" - }, - "name": { - "example": "Healthcare CRM Software", - "type": "string" - }, - "universal_name": { - "example": "healthcare-crm-software", - "type": "string" - }, - "urn": { - "example": "urn:li:standardizedProductCategory:1620", + "section": { "type": "string" } }, "type": "object" }, - "linkedin.ProductSearchResultItem": { + "latimes.SectionInfo": { "properties": { - "category_link": { - "example": "https://www.linkedin.com/products/categories/sales-intelligence-software", - "type": "string" - }, - "category_name": { - "example": "Sales Intelligence Software", - "type": "string" - }, - "description": { - "example": "Sales Navigator helps sellers have high-quality conversations with the people that matter, at scale.", - "type": "string" - }, - "id": { - "example": "linkedin-sales-navigator", - "type": "string" - }, - "link": { - "example": "https://www.linkedin.com/products/linkedin-sales-navigator", - "type": "string" - }, - "logo": { - "example": "https://media.licdn.com/dms/image/v2/D4E33AQFKTZDLqpinzQ/productpage-logo-image_100_100/B4EZX4WGqkHUAY-/0/1743628299227/linkedin_sales_navigator_logo", + "feed_url": { "type": "string" }, "name": { - "example": "LinkedIn Sales Navigator", "type": "string" }, - "organization_name": { - "example": "LinkedIn", + "slug": { "type": "string" } }, "type": "object" }, - "linkedin.ProductsSearchResponse": { + "latimes.SectionsResponse": { "properties": { - "next_start": { - "description": "NextStart is the offset for the following page, omitted once LinkedIn's\nguest search stops returning results (see ProductSearchResultCap).", - "example": 10, - "type": "integer" - }, - "products": { + "sections": { "items": { - "$ref": "#/definitions/linkedin.ProductSearchResultItem" + "$ref": "#/definitions/latimes.SectionInfo" }, "type": "array" - }, - "start": { - "example": 0, - "type": "integer" - }, - "total": { - "description": "Total is only populated on the first page (start=0), where it is read\nfrom LinkedIn's server-rendered result count.", - "example": 145986, - "type": "integer" } }, "type": "object" }, - "linkedin.Update": { + "latimes.articleResponseDoc": { "properties": { - "author": { - "description": "Name of the page that published the post.", - "example": "Google DeepMind", - "type": "string" - }, - "author_link": { - "description": "LinkedIn URL of the page that published the post.", - "example": "https://uk.linkedin.com/company/googledeepmind", - "type": "string" - }, - "images": { - "description": "URLs of the images attached to the post.", - "example": [ - "[\"https://example.com/image1.jpg\"]" - ], - "items": { - "type": "string" - }, - "type": "array" - }, - "is_reposted": { - "description": "Whether the post is a repost of another LinkedIn post.", - "example": false, - "type": "boolean" - }, - "logo": { - "description": "URL of the logo image of the page that published the post.", - "example": "https://media.licdn.com/dms/image/v2/D4E0BAQEntrYwxPlbQA/company-logo_100_100/0/googledeepmind_logo", - "type": "string" - }, - "num_of_comments": { - "description": "Number of comments on the post.", - "example": 21, - "type": "integer" - }, - "num_of_reactions": { - "description": "Number of reactions on the post.", - "example": 571, + "code": { + "example": 200, "type": "integer" }, - "post_link": { - "description": "LinkedIn URL of the post.", - "example": "https://www.linkedin.com/posts/googledeepmind_thomas-story-activity-7313245349987385346-5COL", - "type": "string" - }, - "published_at": { - "description": "How long ago the post was published, as LinkedIn shows it, for example `1w`.", - "example": "1w", - "type": "string" + "data": { + "$ref": "#/definitions/latimes.ArticleResponse" }, - "summary": { - "description": "Text of the post.", - "example": "When his son was diagnosed with a rare disease, Googler Thomas Wagner...", + "msg": { + "example": "OK", "type": "string" - }, - "videos": { - "description": "URLs of the videos attached to the post.", - "example": [ - "[\"https://example.com/video1.mp4\"]" - ], - "items": { - "type": "string" - }, - "type": "array" } }, "type": "object" }, - "linkedin.companyResponseDoc": { + "latimes.authorResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/linkedin.LinkedinCompanyResponse" + "$ref": "#/definitions/latimes.AuthorResponse" }, "msg": { "example": "OK", @@ -119077,14 +120927,14 @@ }, "type": "object" }, - "linkedin.productCategoriesResponseDoc": { + "latimes.headlinesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/linkedin.ProductCategoriesResponse" + "$ref": "#/definitions/latimes.HeadlinesResponse" }, "msg": { "example": "OK", @@ -119093,14 +120943,14 @@ }, "type": "object" }, - "linkedin.productResponseDoc": { + "latimes.sectionsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/linkedin.LinkedinProductResponse" + "$ref": "#/definitions/latimes.SectionsResponse" }, "msg": { "example": "OK", @@ -119109,343 +120959,412 @@ }, "type": "object" }, - "linkedin.productsSearchResponseDoc": { + "lazada.CategoryDirectoryResponse": { "properties": { - "code": { - "example": 200, - "type": "integer" + "fetched_at": { + "example": "2026-08-28T04:00:00Z", + "type": "string" }, - "data": { - "$ref": "#/definitions/linkedin.ProductsSearchResponse" + "groups": { + "items": { + "$ref": "#/definitions/lazada.CategoryGroup" + }, + "type": "array" }, - "msg": { - "example": "OK", + "region": { + "example": "ID", + "type": "string" + }, + "source_url": { + "example": "https://pages.lazada.co.id/wow/i/id/LandingPage/lazmall?wh_weex=true", "type": "string" } }, "type": "object" }, - "linkedin.showcaseResponseDoc": { + "lazada.CategoryGroup": { "properties": { - "code": { - "example": 200, - "type": "integer" + "categories": { + "items": { + "$ref": "#/definitions/lazada.CategoryNode" + }, + "type": "array" }, - "data": { - "$ref": "#/definitions/linkedin.LinkedinCompanyResponse" + "name": { + "example": "Elektronik", + "type": "string" + } + }, + "type": "object" + }, + "lazada.CategoryLink": { + "properties": { + "name": { + "example": "Handphone", + "type": "string" }, - "msg": { - "example": "OK", + "url": { + "example": "https://www.lazada.co.id/beli-handphone", "type": "string" } }, "type": "object" }, - "livemint.AuthorResponse": { + "lazada.CategoryNode": { "properties": { - "biography": { + "children": { "items": { - "type": "string" + "$ref": "#/definitions/lazada.CategoryNode" }, "type": "array" }, - "facebook_url": { + "name": { + "example": "Laptop", "type": "string" }, - "image_url": { + "url": { + "example": "https://www.lazada.co.id/shop-beli-laptop/", "type": "string" - }, - "instagram_url": { + } + }, + "type": "object" + }, + "lazada.CategoryProductsResponse": { + "properties": { + "brand": { + "example": "lazada6910077_crown-127197821", "type": "string" }, - "job_title": { + "category": { + "example": "shop-karaoke-systems", "type": "string" }, - "linkedin_url": { + "fetched_at": { + "example": "2026-09-02T04:00:00Z", "type": "string" }, - "name": { + "items": { + "items": { + "$ref": "#/definitions/lazada.ListingItem" + }, + "type": "array" + }, + "page": { + "example": 1, + "type": "integer" + }, + "page_size": { + "example": 40, + "type": "integer" + }, + "region": { + "example": "PH", "type": "string" }, - "twitter_url": { + "sort": { + "example": "popularity", "type": "string" }, - "url": { + "source_url": { + "example": "https://www.lazada.com.ph/shop-karaoke-systems/?ajax=true&page=1", "type": "string" + }, + "total_results": { + "example": 2400, + "type": "integer" } }, "type": "object" }, - "livescience.AuthorResponse": { + "lazada.HomeResponse": { "properties": { - "articles": { + "categories": { "items": { - "$ref": "#/definitions/newsplatform.HeadlineItem" + "$ref": "#/definitions/lazada.CategoryLink" }, "type": "array" }, - "biography": { + "fetched_at": { + "example": "2026-08-28T04:00:00Z", + "type": "string" + }, + "flash_sale_items": { "items": { - "type": "string" + "$ref": "#/definitions/lazada.ProductSummary" }, "type": "array" }, - "has_next_page": { - "type": "boolean" + "official_stores": { + "description": "OfficialStores lists featured official-store shops from the same\nhomepage. This carousel was observed absent on one storefront\n(Philippines) during a live check; treat an empty list as \"not\ncurrently shown\", not as evidence of parser drift.", + "items": { + "$ref": "#/definitions/lazada.OfficialStore" + }, + "type": "array" }, - "job_title": { + "region": { + "example": "ID", "type": "string" }, - "name": { + "source_url": { + "example": "https://www.lazada.co.id/", + "type": "string" + } + }, + "type": "object" + }, + "lazada.ListingItem": { + "properties": { + "currency": { + "example": "PHP", "type": "string" }, - "page": { + "discount": { + "example": "77% Off", + "type": "string" + }, + "image": { + "example": "https://ph-live-01.slatic.net/p/example.png", + "type": "string" + }, + "item_id": { + "example": 15396167084, "type": "integer" }, - "slug": { + "location": { + "example": "Benguet", "type": "string" }, - "social_links": { - "items": { - "$ref": "#/definitions/livescience.AuthorSocialLink" - }, - "type": "array" + "price": { + "example": 159, + "type": "number" + }, + "rating": { + "description": "Rating and Reviews are omitted entirely when the listing card has no\nrating yet (a brand-new or unrated listing) rather than defaulting to 0.", + "example": 5, + "type": "number" + }, + "reviews": { + "example": 3, + "type": "integer" + }, + "title": { + "example": "Digilab Original K12 Bluetooth Portable Karaoke Speaker", + "type": "string" }, "url": { + "example": "https://www.lazada.com.ph/products/pdp-i15396167084.html", "type": "string" } }, "type": "object" }, - "livescience.AuthorSocialLink": { + "lazada.OfficialStore": { "properties": { - "platform": { + "brand_image": { + "example": "https://img.lazcdn.com/g/p/example.jpg", + "type": "string" + }, + "name": { + "example": "Alfalink", + "type": "string" + }, + "shop_image": { + "example": "https://img.lazcdn.com/g/shop/example.jpeg", "type": "string" }, "url": { + "example": "https://www.lazada.co.id/shop/alfalink", "type": "string" } }, "type": "object" }, - "livescore.livescoreNewsFeedItemDoc": { + "lazada.ProductResponse": { "properties": { - "author": { - "example": "LiveScore", + "brand": { + "example": "Pantene", "type": "string" }, - "categories": { - "example": [ - "football" + "brand_url": { + "example": "https://www.lazada.co.id/pantene/", + "type": "string" + }, + "category": { + "example": [ + "Kecantikan" ], "items": { "type": "string" }, "type": "array" }, - "content": { - "example": "

The complete RSS story body.

", + "currency": { + "example": "IDR", "type": "string" }, "description": { - "example": "A short summary of the latest story.", "type": "string" }, - "guid": { - "example": "https://www.livescore.com/en/news/football/example-story/", + "fetched_at": { + "example": "2026-09-02T04:00:00Z", "type": "string" }, - "link": { - "example": "https://www.livescore.com/en/news/football/example-story/", + "highlights": { "type": "string" }, - "published_at": { - "example": "Sat, 26 Sep 2026 08:45:00 GMT", - "type": "string" + "images": { + "items": { + "type": "string" + }, + "type": "array" }, - "title": { - "example": "Latest football news", + "item_id": { + "example": 159992555, + "type": "integer" + }, + "price": { + "example": 190500, + "type": "number" + }, + "region": { + "example": "ID", "type": "string" - } - }, - "type": "object" - }, - "livescore.livescoreNewsFeedResponseDoc": { - "properties": { - "code": { - "example": 200, + }, + "seller_id": { + "example": 100161156, "type": "integer" }, - "data": { - "properties": { - "count": { - "example": 75, - "type": "integer" - }, - "items": { - "items": { - "$ref": "#/definitions/livescore.livescoreNewsFeedItemDoc" - }, - "type": "array" - }, - "source_url": { - "example": "https://www.livescore.com/en/news/rss.xml", - "type": "string" - } - }, - "type": "object" + "sku_id": { + "example": 181803572, + "type": "integer" }, - "msg": { - "example": "OK", + "source_url": { + "example": "https://www.lazada.co.id/products/pdp-i159992555-s181803572.html", + "type": "string" + }, + "title": { + "example": "PANTENE Shampoo Hair Fall Control 990ml", "type": "string" + }, + "url": { + "example": "https://www.lazada.co.id/products/pantene-shampoo-hair-fall-control-990ml-i159992555-s181803572.html", + "type": "string" + }, + "variants": { + "items": { + "$ref": "#/definitions/lazada.ProductVariant" + }, + "type": "array" } }, "type": "object" }, - "livescore.livescoreNewsPublisherDoc": { + "lazada.ProductSummary": { "properties": { - "contact": { - "example": "https://www.statsperform.com/contact/", + "currency": { + "example": "IDR", "type": "string" }, - "logo_url": { - "example": "https://www.livescore.com/ls-web-assets/images/publishers-stats-perform.webp", + "discount": { + "example": "-32%", "type": "string" }, - "name": { - "example": "Stats Perform", + "image": { + "example": "https://img.lazcdn.com/g/p/example.jpg", "type": "string" }, - "telephone": { - "example": "+1 866 221 1426", + "item_id": { + "example": 159992555, + "type": "integer" + }, + "original_price": { + "example": 190500, + "type": "number" + }, + "price": { + "example": 129000, + "type": "number" + }, + "title": { + "example": "PANTENE Shampoo Hair Fall Control 990ml", "type": "string" }, - "website": { - "example": "https://www.statsperform.com/", + "url": { + "example": "https://www.lazada.co.id/products/pdp-i159992555-s181803572.html", "type": "string" } }, "type": "object" }, - "livescore.livescoreNewsPublishersResponseDoc": { + "lazada.ProductVariant": { "properties": { - "code": { - "example": 200, - "type": "integer" + "name": { + "example": "Volume", + "type": "string" }, - "data": { - "properties": { - "count": { - "example": 6, - "type": "integer" - }, - "publishers": { - "items": { - "$ref": "#/definitions/livescore.livescoreNewsPublisherDoc" - }, - "type": "array" - }, - "source_url": { - "example": "https://www.livescore.com/en/news/publishers/", - "type": "string" - } + "values": { + "example": [ + "990 ml" + ], + "items": { + "type": "string" }, - "type": "object" - }, - "msg": { - "example": "OK", - "type": "string" + "type": "array" } }, "type": "object" }, - "livescore.livescoreSearchResponseDoc": { + "lazada.SearchResponse": { "properties": { - "code": { - "example": 200, - "type": "integer" + "fetched_at": { + "example": "2026-09-02T04:00:00Z", + "type": "string" }, - "data": { - "properties": { - "query": { - "example": "Manchester City", - "type": "string" - }, - "results": { - "additionalProperties": true, - "type": "object" - }, - "source_url": { - "example": "https://prod-cdn-search-api.lsmedia1.com/api/v2/search/soccer?categories=true&locale=en&query=Manchester+City&stages=true&teams=true&limit=10", - "type": "string" - }, - "sport": { - "example": "soccer", - "type": "string" - } + "items": { + "items": { + "$ref": "#/definitions/lazada.ListingItem" }, - "type": "object" + "type": "array" }, - "msg": { - "example": "OK", - "type": "string" - } - }, - "type": "object" - }, - "livescore.newsCategoriesResponseDoc": { - "properties": { - "code": { - "example": 200, + "page": { + "example": 1, "type": "integer" }, - "data": { - "properties": { - "categories": { - "items": { - "$ref": "#/definitions/livescore.newsCategoryDoc" - }, - "type": "array" - } - }, - "type": "object" + "page_size": { + "example": 40, + "type": "integer" }, - "msg": { - "example": "OK", - "type": "string" - } - }, - "type": "object" - }, - "livescore.newsCategoryDoc": { - "properties": { - "id": { - "example": "football", + "query": { + "example": "karaoke", "type": "string" }, - "name": { - "example": "Football", + "region": { + "example": "PH", "type": "string" }, - "type": { - "example": "sport", + "sort": { + "example": "popularity", "type": "string" }, - "url": { - "example": "https://www.livescore.com/en/news/football/", + "source_url": { + "example": "https://www.lazada.com.ph/catalog/?q=karaoke&ajax=true&page=1", "type": "string" + }, + "total_results": { + "example": 2400, + "type": "integer" } }, "type": "object" }, - "livescore.responseDoc": { + "lazada.categoriesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/livescore.sourceDataDoc" + "$ref": "#/definitions/lazada.CategoryDirectoryResponse" }, "msg": { "example": "OK", @@ -119454,48 +121373,46 @@ }, "type": "object" }, - "livescore.sourceDataDoc": { + "lazada.categoryProductsResponseDoc": { "properties": { + "code": { + "example": 200, + "type": "integer" + }, "data": { - "additionalProperties": true, - "type": "object" + "$ref": "#/definitions/lazada.CategoryProductsResponse" }, - "source_url": { - "example": "https://www.livescore.com/en/football/uefa-nations-league/league-b-group-3/austria-vs-israel/1738267/", + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "livescore.sportDoc": { + "lazada.homeResponseDoc": { "properties": { - "id": { - "example": "soccer", - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "name": { - "example": "Football", + "data": { + "$ref": "#/definitions/lazada.HomeResponse" + }, + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "livescore.sportsResponseDoc": { + "lazada.productResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "properties": { - "sports": { - "items": { - "$ref": "#/definitions/livescore.sportDoc" - }, - "type": "array" - } - }, - "type": "object" + "$ref": "#/definitions/lazada.ProductResponse" }, "msg": { "example": "OK", @@ -119504,44 +121421,37 @@ }, "type": "object" }, - "lululemon.CategoriesResponse": { + "lazada.searchResponseDoc": { "properties": { - "categories": { - "items": { - "$ref": "#/definitions/lululemon.CategoryEntry" - }, - "type": "array" - }, - "count": { + "code": { + "example": 200, "type": "integer" }, - "fetched_at": { - "type": "string" + "data": { + "$ref": "#/definitions/lazada.SearchResponse" }, - "source_url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "lululemon.CategoryEntry": { + "leboncoin.ListingCard": { "properties": { "category": { "type": "string" }, - "cdp_hash": { + "id": { "type": "string" }, - "name": { + "image_url": { "type": "string" }, - "path": { - "items": { - "type": "string" - }, - "type": "array" + "price_eur": { + "type": "integer" }, - "section": { + "title": { "type": "string" }, "url": { @@ -119550,56 +121460,21 @@ }, "type": "object" }, - "lululemon.CategoryResponse": { + "leboncoin.ListingResponse": { "properties": { - "category": { - "description": "Category slug that was requested, such as `women-new-styles`.", - "type": "string" - }, - "cdp_hash": { - "description": "Short id segment of the category URL that was requested.", + "availability": { "type": "string" }, - "count": { - "description": "Number of products returned on this page.", - "type": "integer" - }, - "fetched_at": { - "description": "Time the data was fetched, in UTC (RFC 3339).", + "category": { "type": "string" }, - "page": { - "description": "Page number returned, starting at 1.", - "type": "integer" - }, - "page_size": { - "description": "Maximum number of products on a page.", - "type": "integer" - }, - "products": { - "description": "Products listed on this page of the category.", - "items": { - "$ref": "#/definitions/lululemon.ProductSummary" - }, - "type": "array" - }, - "source_url": { - "description": "URL the data was read from.", + "condition": { "type": "string" }, - "total_products": { - "description": "Total number of products in the category.", - "type": "integer" - } - }, - "type": "object" - }, - "lululemon.OutfitItem": { - "properties": { - "category": { + "currency": { "type": "string" }, - "currency": { + "description": { "type": "string" }, "id": { @@ -119608,14 +121483,8 @@ "image_url": { "type": "string" }, - "list_price": { - "type": "number" - }, - "on_sale": { - "type": "boolean" - }, - "sale_price": { - "type": "number" + "price_eur": { + "type": "integer" }, "title": { "type": "string" @@ -119626,442 +121495,505 @@ }, "type": "object" }, - "lululemon.OutfitLook": { + "leboncoin.SearchResponse": { "properties": { - "id": { - "type": "string" - }, - "items": { + "listings": { "items": { - "$ref": "#/definitions/lululemon.OutfitItem" + "$ref": "#/definitions/leboncoin.ListingCard" }, "type": "array" + }, + "location": { + "type": "string" + }, + "source_url": { + "type": "string" } }, "type": "object" }, - "lululemon.OutfitResponse": { + "leboncoin.listingResponseDoc": { "properties": { - "color_code": { - "type": "string" - }, - "fetched_at": { - "type": "string" - }, - "item": { - "$ref": "#/definitions/lululemon.OutfitItem" - }, - "looks": { - "items": { - "$ref": "#/definitions/lululemon.OutfitLook" - }, - "type": "array" + "code": { + "example": 200, + "type": "integer" }, - "source_url": { - "type": "string" + "data": { + "$ref": "#/definitions/leboncoin.ListingResponse" }, - "unified_id": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "lululemon.ProductDetailColor": { + "leboncoin.searchResponseDoc": { "properties": { "code": { - "type": "string" + "example": 200, + "type": "integer" }, - "name": { - "type": "string" + "data": { + "$ref": "#/definitions/leboncoin.SearchResponse" }, - "swatch_url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "lululemon.ProductDetailRating": { + "letterboxd.FilmRating": { "properties": { + "average": { + "description": "Average Letterboxd member rating, out of 5.", + "example": 4.52, + "type": "number" + }, "count": { + "description": "Number of member ratings behind the average.", + "example": 5553202, "type": "integer" }, - "value": { - "type": "number" + "review_count": { + "description": "Number of written reviews. Omitted when Letterboxd shows none.", + "example": 740173, + "type": "integer" } }, "type": "object" }, - "lululemon.ProductDetailResponse": { + "letterboxd.FilmRef": { "properties": { - "activities": { - "items": { - "type": "string" - }, - "type": "array" - }, - "category": { + "slug": { + "description": "Letterboxd film slug. Use it with the film endpoint for full detail.", "type": "string" }, - "category_id": { + "title": { + "description": "Title of the film.", "type": "string" }, - "colors": { + "uri": { + "description": "Link to the film's page on Letterboxd.", + "type": "string" + } + }, + "type": "object" + }, + "letterboxd.FilmResponse": { + "properties": { + "cast": { + "description": "Cast members of the film, up to 25 credits.", "items": { - "$ref": "#/definitions/lululemon.ProductDetailColor" + "$ref": "#/definitions/letterboxd.PersonCredit" }, "type": "array" }, - "currency": { - "type": "string" - }, - "description": { - "type": "string" - }, - "fetched_at": { - "type": "string" - }, - "gender": { + "countries": { + "description": "Countries the film was made in.", "items": { "type": "string" }, "type": "array" }, - "highlights": { + "directors": { + "description": "Directors of the film.", "items": { - "type": "string" + "$ref": "#/definitions/letterboxd.PersonCredit" }, "type": "array" }, - "name": { - "type": "string" - }, - "on_sale": { - "type": "boolean" - }, - "price": { - "type": "number" - }, - "product_id": { - "type": "string" - }, - "rating": { - "$ref": "#/definitions/lululemon.ProductDetailRating" - }, - "reviews": { + "genres": { + "description": "Genres of the film.", "items": { - "$ref": "#/definitions/lululemon.ProductDetailReview" + "type": "string" }, "type": "array" }, - "sizes": { + "languages": { + "description": "Languages used in the film, as Letterboxd lists them.", "items": { "type": "string" }, "type": "array" }, - "skus": { + "poster_url": { + "description": "URL of the film's poster image.", + "type": "string" + }, + "production_companies": { + "description": "Names of the production companies behind the film.", "items": { - "$ref": "#/definitions/lululemon.ProductDetailSKU" + "type": "string" }, "type": "array" }, + "rating": { + "allOf": [ + { + "$ref": "#/definitions/letterboxd.FilmRating" + } + ], + "description": "Aggregate Letterboxd member rating. Omitted when the film has no ratings." + }, + "release_date": { + "description": "Release date of the film, in YYYY-MM-DD format.", + "example": "2019-05-21", + "type": "string" + }, + "runtime_minutes": { + "description": "Running time of the film in minutes.", + "example": 133, + "type": "integer" + }, + "slug": { + "description": "Letterboxd film slug, for example `parasite-2019`. Use it with the film endpoints.", + "example": "parasite-2019", + "type": "string" + }, "source_url": { + "description": "URL the data was read from.", "type": "string" }, - "unified_id": { + "synopsis": { + "description": "Short plot synopsis of the film.", "type": "string" }, - "url": { + "title": { + "description": "Title of the film.", + "example": "Parasite", + "type": "string" + }, + "uri": { + "description": "Link to the film's page on Letterboxd.", "type": "string" + }, + "year": { + "description": "Year the film was released.", + "example": 2019, + "type": "integer" } }, "type": "object" }, - "lululemon.ProductDetailReview": { + "letterboxd.MemberResponse": { "properties": { - "badge": { + "display_name": { "type": "string" }, - "body": { - "type": "string" + "films_this_year": { + "type": "integer" }, - "fit": { - "type": "string" + "films_watched": { + "type": "integer" }, - "id": { - "type": "string" + "followers": { + "type": "integer" }, - "rating": { - "type": "number" + "following": { + "type": "integer" }, - "size_purchased": { - "type": "string" + "lists": { + "type": "integer" }, - "submitted_at": { + "source_url": { "type": "string" }, - "title": { + "uri": { "type": "string" }, - "verified_buyer": { - "type": "boolean" + "username": { + "type": "string" } }, "type": "object" }, - "lululemon.ProductDetailSKU": { + "letterboxd.PersonCredit": { "properties": { - "available": { - "type": "boolean" - }, - "color_code": { - "type": "string" - }, - "color_name": { + "name": { + "description": "Name of the person.", "type": "string" }, - "id": { + "slug": { + "description": "Letterboxd slug of the person. Use it with the person endpoint.", "type": "string" + } + }, + "type": "object" + }, + "letterboxd.PersonResponse": { + "properties": { + "films": { + "items": { + "$ref": "#/definitions/letterboxd.FilmRef" + }, + "type": "array" }, - "on_sale": { - "type": "boolean" - }, - "price": { - "type": "number" - }, - "sale_price": { - "type": "number" - }, - "size": { + "name": { "type": "string" }, - "style_id": { + "role": { "type": "string" }, - "style_number": { + "slug": { "type": "string" }, - "url": { + "source_url": { "type": "string" } }, "type": "object" }, - "lululemon.ProductSummary": { + "letterboxd.PopularResponse": { "properties": { - "activities": { - "description": "Activities the product is designed for, such as `Casual` or `Lounge`.", + "decade": { + "description": "Decade filter that was applied, for example `2010s`. Omitted when none was set.", + "type": "string" + }, + "films": { + "description": "Films in the chart, most popular first.", "items": { - "type": "string" + "$ref": "#/definitions/letterboxd.FilmRef" }, "type": "array" }, - "category": { - "description": "Name of the product's category, such as `Sweatpants`.", + "genre": { + "description": "Genre filter that was applied. Omitted when none was set.", "type": "string" }, - "category_id": { - "description": "Id of the product's category, such as `womens-sweatpants`.", + "period": { + "description": "Time window of the chart: `day`, `week`, `month` or `year`. Omitted for the all-time chart.", "type": "string" }, - "colors": { - "description": "Names of the colors the product comes in. Positions match `style_numbers`.", + "source_url": { + "description": "URL the data was read from.", + "type": "string" + } + }, + "type": "object" + }, + "letterboxd.RatingBucket": { + "properties": { + "count": { + "type": "integer" + }, + "percent": { + "type": "integer" + }, + "stars": { + "example": 4.5, + "type": "number" + } + }, + "type": "object" + }, + "letterboxd.RatingHistogramResponse": { + "properties": { + "buckets": { "items": { - "type": "string" + "$ref": "#/definitions/letterboxd.RatingBucket" }, "type": "array" }, - "currency": { - "description": "Currency code of the prices, such as `USD`.", + "slug": { "type": "string" }, - "id": { - "description": "lululemon product id.", + "source_url": { "type": "string" }, - "image_url": { - "description": "URL of the first image lululemon lists for the product.", - "type": "string" + "total_ratings": { + "type": "integer" + } + }, + "type": "object" + }, + "letterboxd.Review": { + "properties": { + "comment_count": { + "type": "integer" }, - "list_price": { - "description": "List price of the product.", - "type": "number" + "contains_spoilers": { + "type": "boolean" }, - "name": { - "description": "Product name as shown on lululemon.", + "date": { + "example": "2019-08-14", "type": "string" }, - "new_arrival": { - "description": "Whether lululemon flags the product as a new arrival.", - "type": "boolean" + "display_name": { + "type": "string" }, - "on_sale": { - "description": "Whether the product is on sale.", - "type": "boolean" + "like_count": { + "type": "integer" }, - "price": { - "description": "Current price of the product.", - "type": "number" + "liked": { + "type": "boolean" }, - "sale_price": { - "description": "Sale price of the product. Set only when `on_sale` is `true`.", + "rating": { + "example": 4.5, "type": "number" }, - "sizes": { - "description": "Sizes the product is available in.", - "items": { - "type": "string" - }, - "type": "array" + "text": { + "type": "string" }, - "style_numbers": { - "description": "Style numbers of the product, one per color. Positions match `colors`.", + "username": { + "type": "string" + } + }, + "type": "object" + }, + "letterboxd.ReviewsResponse": { + "properties": { + "reviews": { "items": { - "type": "string" + "$ref": "#/definitions/letterboxd.Review" }, "type": "array" }, - "unified_id": { - "description": "lululemon's unified product id, a slug such as `Scuba-Evolve-Straight-Leg-Pant-Regular`.", + "slug": { "type": "string" }, - "url": { - "description": "URL of the product page on lululemon.", + "source_url": { "type": "string" } }, "type": "object" }, - "lululemon.Store": { + "letterboxd.SearchResponse": { "properties": { - "address": { - "type": "string" - }, - "amenities": { - "$ref": "#/definitions/lululemon.StoreAmenities" - }, - "city": { - "type": "string" - }, - "country": { + "query": { + "description": "Search text that was run.", "type": "string" }, - "distance_miles": { - "type": "number" - }, - "hours": { + "results": { + "description": "Search hits, one item per film, person, list or tag.", "items": { - "$ref": "#/definitions/lululemon.StoreHours" + "$ref": "#/definitions/letterboxd.SearchResult" }, "type": "array" }, - "id": { + "source_url": { + "description": "URL the data was read from.", "type": "string" }, - "latitude": { - "type": "number" - }, - "longitude": { - "type": "number" - }, - "message": { + "type": { + "description": "Result type the search was limited to, `film`. Omitted for a mixed search.", + "type": "string" + } + }, + "type": "object" + }, + "letterboxd.SearchResult": { + "properties": { + "owner": { + "description": "Username of the member who made the list. Present for list hits.", "type": "string" }, - "name": { + "role": { + "description": "Role of the person, `actor` or `director`. Present for person hits.", + "example": "director", "type": "string" }, "slug": { + "description": "Letterboxd slug of the film or person. Present for film and person hits.", "type": "string" }, - "state": { + "title": { + "description": "Title of the film or list, name of the person, or the tag.", "type": "string" }, - "state_name": { + "type": { + "description": "Kind of hit: `film`, `person`, `list` or `tag`.", + "example": "film", "type": "string" }, - "status": { + "uri": { + "description": "Link to the hit's page on Letterboxd.", "type": "string" }, - "store_type": { + "year": { + "description": "Year the film was released. Present for film hits.", + "type": "integer" + } + }, + "type": "object" + }, + "letterboxd.SimilarResponse": { + "properties": { + "films": { + "description": "Films Letterboxd lists as similar.", + "items": { + "$ref": "#/definitions/letterboxd.FilmRef" + }, + "type": "array" + }, + "slug": { + "description": "Slug of the film the similar films are for.", "type": "string" }, - "url": { + "source_url": { + "description": "URL the data was read from.", "type": "string" } }, "type": "object" }, - "lululemon.StoreAmenities": { + "letterboxd.filmResponseDoc": { "properties": { - "buy_online_pickup_store": { - "type": "boolean" - }, - "complementary_hemming": { - "type": "boolean" - }, - "curbside_pickup": { - "type": "boolean" - }, - "footwear": { - "type": "boolean" - }, - "has_mirror": { - "type": "boolean" - }, - "like_new": { - "type": "boolean" + "code": { + "example": 200, + "type": "integer" }, - "personal_shopping": { - "type": "boolean" + "data": { + "$ref": "#/definitions/letterboxd.FilmResponse" }, - "returns_exchanges": { - "type": "boolean" + "msg": { + "example": "OK", + "type": "string" } }, "type": "object" }, - "lululemon.StoreHours": { + "letterboxd.memberResponseDoc": { "properties": { - "close": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "day": { - "type": "string" + "data": { + "$ref": "#/definitions/letterboxd.MemberResponse" }, - "open": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "lululemon.StoresResponse": { + "letterboxd.personResponseDoc": { "properties": { - "count": { + "code": { + "example": 200, "type": "integer" }, - "fetched_at": { - "type": "string" + "data": { + "$ref": "#/definitions/letterboxd.PersonResponse" }, - "source_url": { + "msg": { + "example": "OK", "type": "string" - }, - "stores": { - "items": { - "$ref": "#/definitions/lululemon.Store" - }, - "type": "array" } }, "type": "object" }, - "lululemon.categoriesResponseDoc": { + "letterboxd.popularResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/lululemon.CategoriesResponse" + "$ref": "#/definitions/letterboxd.PopularResponse" }, "msg": { "example": "OK", @@ -120070,14 +122002,14 @@ }, "type": "object" }, - "lululemon.categoryResponseDoc": { + "letterboxd.ratingHistogramResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/lululemon.CategoryResponse" + "$ref": "#/definitions/letterboxd.RatingHistogramResponse" }, "msg": { "example": "OK", @@ -120086,14 +122018,14 @@ }, "type": "object" }, - "lululemon.outfitResponseDoc": { + "letterboxd.reviewsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/lululemon.OutfitResponse" + "$ref": "#/definitions/letterboxd.ReviewsResponse" }, "msg": { "example": "OK", @@ -120102,14 +122034,14 @@ }, "type": "object" }, - "lululemon.productDetailResponseDoc": { + "letterboxd.searchResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/lululemon.ProductDetailResponse" + "$ref": "#/definitions/letterboxd.SearchResponse" }, "msg": { "example": "OK", @@ -120118,14 +122050,14 @@ }, "type": "object" }, - "lululemon.storesResponseDoc": { + "letterboxd.similarResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/lululemon.StoresResponse" + "$ref": "#/definitions/letterboxd.SimilarResponse" }, "msg": { "example": "OK", @@ -120134,252 +122066,478 @@ }, "type": "object" }, - "macrumors.AuthorArticle": { + "linkedin.Customer": { "properties": { - "image_url": { - "type": "string" + "follower_count": { + "description": "Number of LinkedIn followers of the customer's company page.", + "example": 12345, + "type": "integer" }, - "published_at": { + "industry": { + "description": "Industry listed for the customer company.", + "example": "Information Technology & Services", "type": "string" }, - "summary": { + "link": { + "description": "LinkedIn URL of the customer's company page.", + "example": "https://www.linkedin.com/company/contoso/", "type": "string" }, - "title": { + "logo": { + "description": "URL of the customer's logo image.", + "example": "https://media.licdn.com/dms/image/v2/company-logo_100_100/company-logo_100_100/0/123456789/logo?e=2147483647&v=beta&t=xyz", "type": "string" }, - "url": { + "name": { + "description": "Name of the featured customer company.", + "example": "Contoso Ltd.", "type": "string" } }, "type": "object" }, - "macrumors.AuthorResponse": { + "linkedin.LinkedinCompanyResponse": { "properties": { - "articles": { + "about": { + "description": "Company description from the About section.", + "example": "We’re a team of scientists, engineers...", + "type": "string" + }, + "affiliated_pages": { + "description": "Related company pages listed as affiliated with this company.", "items": { - "$ref": "#/definitions/macrumors.AuthorArticle" + "$ref": "#/definitions/linkedin.Page" }, "type": "array" }, - "bio": { - "type": "string" - }, - "image_url": { + "company_size": { + "description": "Employee count range listed on the page, for example `501-1,000`.", + "example": "501-1,000", "type": "string" }, - "name": { - "type": "string" + "follower_count": { + "description": "Number of LinkedIn followers of the company page.", + "example": 1176422, + "type": "integer" }, - "slug": { - "type": "string" + "founded_on": { + "description": "Year the company was founded.", + "example": 2010, + "type": "integer" }, - "url": { + "headline": { + "description": "Tagline shown under the company name.", + "example": "We're committed to solving intelligence, to advance science and benefit humanity.", "type": "string" - } - }, - "type": "object" - }, - "macys.ProductColor": { - "properties": { - "current_price": { - "type": "number" }, - "id": { + "headquarters": { + "description": "Headquarters location as listed on the page.", + "example": "London, London", "type": "string" }, - "name": { + "industry": { + "description": "Industry listed on the company page, for example `Research Services`.", + "example": "Research Services", "type": "string" }, - "on_sale": { - "type": "boolean" - }, - "regular_price": { - "type": "number" - } - }, - "type": "object" - }, - "macys.ProductDetailResponse": { - "properties": { - "available": { - "type": "boolean" - }, - "brand": { + "link": { + "description": "LinkedIn URL of the company page.", + "example": "https://www.linkedin.com/company/googledeepmind", "type": "string" }, - "bullet_points": { + "locations": { + "description": "Office locations listed on the company page.", "items": { - "type": "string" + "$ref": "#/definitions/linkedin.Location" }, "type": "array" }, - "categories": { + "logo": { + "description": "URL of the company logo image.", + "example": "https://static.licdn.com/.../linkedin-bug-color.png", + "type": "string" + }, + "name": { + "description": "Company name as shown on its LinkedIn page.", + "example": "Google DeepMind", + "type": "string" + }, + "num_of_employees_on_linkedin": { + "description": "Number of employees who list the company on their LinkedIn profile.", + "example": 5590, + "type": "integer" + }, + "products": { + "description": "Product Pages LinkedIn lists under the page's Products section.", "items": { - "type": "string" + "$ref": "#/definitions/linkedin.Product" }, "type": "array" }, - "colors": { + "similar_pages": { + "description": "Company pages LinkedIn suggests as similar to this company.", "items": { - "$ref": "#/definitions/macys.ProductColor" + "$ref": "#/definitions/linkedin.Page" }, "type": "array" }, - "currency_code": { + "specialties": { + "description": "Specialties listed on the company page.", + "example": "Artificial Intelligence and Machine Learning", "type": "string" }, - "current_price": { - "type": "number" + "type": { + "description": "Organization type listed on the page, for example `Privately Held`.", + "example": "Privately Held", + "type": "string" }, - "department_name": { + "updates": { + "description": "Recent posts shown on the company page.", + "items": { + "$ref": "#/definitions/linkedin.Update" + }, + "type": "array" + }, + "website": { + "description": "Company website address as listed on the page.", + "example": "https://www.deepmind.google", + "type": "string" + } + }, + "type": "object" + }, + "linkedin.LinkedinProductResponse": { + "properties": { + "about": { + "description": "Product description from the About section.", + "example": "Streamline, manage, and grow your business with Dynamics 365 Business Central - a flexible, scalable, comprehensive business management solution for small and medium-sized businesses.", "type": "string" }, - "description": { + "category_link": { + "description": "LinkedIn URL of the product category page.", + "example": "https://www.linkedin.com/products/categories/business-management-software", "type": "string" }, - "division_name": { + "category_name": { + "description": "Name of the LinkedIn product category the product is listed in.", + "example": "Business Management Software", "type": "string" }, - "fetched_at": { + "cover_image": { + "description": "URL of the product page cover image.", + "example": "https://media.licdn.com/dms/image/v2/D4E1BAQF2jwQmfmDSiA/company-background_10000/B4EZYQcR0_HkAU-/0/1744032571051/microsoft_dynamics_cover?e=2147483647&v=beta&t=fUrpht_xQ4tCJkUKJcGr5hFyqQzXLxbETOV14KE5qk4", "type": "string" }, - "images": { + "external_link": { + "description": "URL of the product's own website, from the visit button on the page.", + "example": "https://dynamics.microsoft.com/en-us/business-central/overview/", + "type": "string" + }, + "featured_customers": { + "description": "Customer companies featured on the product page.", "items": { - "type": "string" + "$ref": "#/definitions/linkedin.Customer" }, "type": "array" }, - "low_availability": { - "type": "boolean" + "link": { + "description": "LinkedIn URL of the product page.", + "example": "https://www.linkedin.com/products/microsoft-dynamics-microsoft-dynamics-365-business-central", + "type": "string" }, - "name": { + "logo": { + "description": "URL of the product logo image.", + "example": "https://media.licdn.com/dms/image/v2/C4E0BAQFXmfZJomhCcg/company-logo_100_100/company-logo_100_100/0/1630612268078/microsoft_dynamics_logo?e=2147483647&v=beta&t=2bAeeYjEdtNwIAdeHTqLAo6Av0AN3Ofe1vdzvN2ihpI", "type": "string" }, - "on_sale": { - "type": "boolean" + "medias": { + "description": "Media items shown on the product page, one entry per thumbnail.", + "items": { + "$ref": "#/definitions/linkedin.Media" + }, + "type": "array" }, - "product_id": { + "name": { + "description": "Product name as shown on its LinkedIn page.", + "example": "Microsoft Dynamics 365 Business Central", "type": "string" }, - "rating": { - "type": "number" + "organization_link": { + "description": "LinkedIn URL of the page of the company that makes the product.", + "example": "https://www.linkedin.com/company/microsoft-dynamics/", + "type": "string" }, - "regular_price": { - "type": "number" + "organization_name": { + "description": "Name of the company that makes the product.", + "example": "Microsoft Dynamics 365", + "type": "string" }, - "review_count": { - "type": "integer" + "other_products": { + "description": "Other products listed on the page, such as more products from the same company.", + "items": { + "$ref": "#/definitions/linkedin.Product" + }, + "type": "array" }, - "source_url": { + "similar_products": { + "description": "Products LinkedIn suggests as similar to this one.", + "items": { + "$ref": "#/definitions/linkedin.Product" + }, + "type": "array" + } + }, + "type": "object" + }, + "linkedin.Location": { + "properties": { + "address": { + "description": "Full street address of the location, as listed on the company page.", + "example": "Kings Cross, London, London N1C4AG, GB", "type": "string" }, - "url": { + "is_primary": { + "description": "Whether this is the company's primary location on LinkedIn.", + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "linkedin.Media": { + "properties": { + "link": { + "description": "URL of the media thumbnail image.", + "example": "https://media.licdn.com/media/sample-video.mp4", + "type": "string" + }, + "name": { + "description": "Caption of the media item on the product page.", + "example": "Product Demo Video", "type": "string" } }, "type": "object" }, - "macys.ProductReviewsResponse": { + "linkedin.Page": { "properties": { - "average_rating": { - "type": "number" + "address": { + "description": "Location shown on the page card, for example `San Francisco, CA`.", + "example": "San Francisco, CA", + "type": "string" }, - "count": { - "type": "integer" + "industry": { + "description": "Industry listed on the company page.", + "example": "Research Services", + "type": "string" }, - "fetched_at": { + "link": { + "description": "LinkedIn URL of the company page.", + "example": "https://www.linkedin.com/company/openai", "type": "string" }, - "page": { - "type": "integer" + "name": { + "description": "Name of the company page.", + "example": "OpenAI", + "type": "string" + } + }, + "type": "object" + }, + "linkedin.Product": { + "properties": { + "category_link": { + "description": "LinkedIn URL of the product category page.", + "example": "https://www.linkedin.com/products/categories/business-management-software", + "type": "string" }, - "page_size": { - "type": "integer" + "category_name": { + "description": "Name of the LinkedIn product category the product is listed in.", + "example": "Business Management Software", + "type": "string" }, - "product_id": { + "link": { + "description": "LinkedIn URL of the product page.", + "example": "https://www.linkedin.com/products/odoo/", "type": "string" }, - "rating_count": { - "description": "RatingCount, AverageRating, RecommendedRatio, and RatingHistogram are\nthe product's site-wide aggregate rating summary, not just this page --\nabsent (zero-valued) for a product with no reviews yet.", - "type": "integer" + "logo": { + "description": "URL of the product logo image.", + "example": "https://media.licdn.com/dms/image/v2/D4E0BAQF91OMQCIi4dQ/company-logo_100_100/company-logo_100_100/0/1691657301051/odoo_logo?e=2147483647&v=beta&t=JfXKr0197Ib_ujXsUsYwXtga3l87Seko0icAH53nrHo", + "type": "string" }, - "rating_histogram": { - "description": "RatingHistogram is the count of ratings per star, ascending: index 0 is\n1-star, index 4 is 5-star.", + "name": { + "description": "Product name as shown on LinkedIn.", + "example": "Odoo", + "type": "string" + } + }, + "type": "object" + }, + "linkedin.ProductCategoriesResponse": { + "properties": { + "categories": { "items": { - "type": "integer" + "$ref": "#/definitions/linkedin.ProductCategoryItem" }, "type": "array" }, - "recommended_ratio": { - "type": "number" + "total": { + "example": 620, + "type": "integer" + } + }, + "type": "object" + }, + "linkedin.ProductCategoryItem": { + "properties": { + "id": { + "example": "1620", + "type": "string" }, - "reviews": { - "items": { - "$ref": "#/definitions/macys.Review" - }, - "type": "array" + "link": { + "example": "https://www.linkedin.com/products/categories/healthcare-crm-software", + "type": "string" }, - "source_url": { + "name": { + "example": "Healthcare CRM Software", "type": "string" }, - "total_pages": { - "type": "integer" + "universal_name": { + "example": "healthcare-crm-software", + "type": "string" }, - "total_reviews": { - "type": "integer" + "urn": { + "example": "urn:li:standardizedProductCategory:1620", + "type": "string" } }, "type": "object" }, - "macys.Review": { + "linkedin.ProductSearchResultItem": { "properties": { - "author": { + "category_link": { + "example": "https://www.linkedin.com/products/categories/sales-intelligence-software", "type": "string" }, - "body": { + "category_name": { + "example": "Sales Intelligence Software", "type": "string" }, - "id": { + "description": { + "example": "Sales Navigator helps sellers have high-quality conversations with the people that matter, at scale.", "type": "string" }, - "location": { + "id": { + "example": "linkedin-sales-navigator", "type": "string" }, - "rating": { - "type": "integer" - }, - "ratings_only": { - "description": "RatingsOnly marks a review that carries only a star rating with no\nwritten title/body -- confirmed live 2026-08-11 that Macy's review\nplatform allows these and this endpoint still surfaces them.", - "type": "boolean" + "link": { + "example": "https://www.linkedin.com/products/linkedin-sales-navigator", + "type": "string" }, - "recommended": { - "type": "boolean" + "logo": { + "example": "https://media.licdn.com/dms/image/v2/D4E33AQFKTZDLqpinzQ/productpage-logo-image_100_100/B4EZX4WGqkHUAY-/0/1743628299227/linkedin_sales_navigator_logo", + "type": "string" }, - "submitted_at": { + "name": { + "example": "LinkedIn Sales Navigator", "type": "string" }, - "title": { + "organization_name": { + "example": "LinkedIn", "type": "string" } }, "type": "object" }, - "macys.SuggestResponse": { + "linkedin.ProductsSearchResponse": { "properties": { - "count": { + "next_start": { + "description": "NextStart is the offset for the following page, omitted once LinkedIn's\nguest search stops returning results (see ProductSearchResultCap).", + "example": 10, "type": "integer" }, - "fetched_at": { + "products": { + "items": { + "$ref": "#/definitions/linkedin.ProductSearchResultItem" + }, + "type": "array" + }, + "start": { + "example": 0, + "type": "integer" + }, + "total": { + "description": "Total is only populated on the first page (start=0), where it is read\nfrom LinkedIn's server-rendered result count.", + "example": 145986, + "type": "integer" + } + }, + "type": "object" + }, + "linkedin.Update": { + "properties": { + "author": { + "description": "Name of the page that published the post.", + "example": "Google DeepMind", "type": "string" }, - "query": { + "author_link": { + "description": "LinkedIn URL of the page that published the post.", + "example": "https://uk.linkedin.com/company/googledeepmind", "type": "string" }, - "source_url": { + "images": { + "description": "URLs of the images attached to the post.", + "example": [ + "[\"https://example.com/image1.jpg\"]" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "is_reposted": { + "description": "Whether the post is a repost of another LinkedIn post.", + "example": false, + "type": "boolean" + }, + "logo": { + "description": "URL of the logo image of the page that published the post.", + "example": "https://media.licdn.com/dms/image/v2/D4E0BAQEntrYwxPlbQA/company-logo_100_100/0/googledeepmind_logo", "type": "string" }, - "suggestions": { + "num_of_comments": { + "description": "Number of comments on the post.", + "example": 21, + "type": "integer" + }, + "num_of_reactions": { + "description": "Number of reactions on the post.", + "example": 571, + "type": "integer" + }, + "post_link": { + "description": "LinkedIn URL of the post.", + "example": "https://www.linkedin.com/posts/googledeepmind_thomas-story-activity-7313245349987385346-5COL", + "type": "string" + }, + "published_at": { + "description": "How long ago the post was published, as LinkedIn shows it, for example `1w`.", + "example": "1w", + "type": "string" + }, + "summary": { + "description": "Text of the post.", + "example": "When his son was diagnosed with a rare disease, Googler Thomas Wagner...", + "type": "string" + }, + "videos": { + "description": "URLs of the videos attached to the post.", + "example": [ + "[\"https://example.com/video1.mp4\"]" + ], "items": { "type": "string" }, @@ -120388,14 +122546,14 @@ }, "type": "object" }, - "macys.productDetailResponseDoc": { + "linkedin.companyResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/macys.ProductDetailResponse" + "$ref": "#/definitions/linkedin.LinkedinCompanyResponse" }, "msg": { "example": "OK", @@ -120404,14 +122562,14 @@ }, "type": "object" }, - "macys.productReviewsResponseDoc": { + "linkedin.productCategoriesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/macys.ProductReviewsResponse" + "$ref": "#/definitions/linkedin.ProductCategoriesResponse" }, "msg": { "example": "OK", @@ -120420,14 +122578,14 @@ }, "type": "object" }, - "macys.suggestResponseDoc": { + "linkedin.productResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/macys.SuggestResponse" + "$ref": "#/definitions/linkedin.LinkedinProductResponse" }, "msg": { "example": "OK", @@ -120436,79 +122594,74 @@ }, "type": "object" }, - "makeuseof.AuthorResponse": { + "linkedin.productsSearchResponseDoc": { "properties": { - "articles": { - "items": { - "$ref": "#/definitions/newsplatform.HeadlineItem" - }, - "type": "array" - }, - "biography": { - "type": "string" - }, - "image_url": { - "type": "string" - }, - "name": { - "type": "string" - }, - "social_links": { - "items": { - "$ref": "#/definitions/valnet.AuthorSocialLink" - }, - "type": "array" + "code": { + "example": 200, + "type": "integer" }, - "title": { - "type": "string" + "data": { + "$ref": "#/definitions/linkedin.ProductsSearchResponse" }, - "url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "marketwatch.AuthorArticle": { + "linkedin.showcaseResponseDoc": { "properties": { - "title": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "url": { + "data": { + "$ref": "#/definitions/linkedin.LinkedinCompanyResponse" + }, + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "marketwatch.AuthorResponse": { + "livemint.AuthorResponse": { "properties": { - "articles": { + "biography": { "items": { - "$ref": "#/definitions/marketwatch.AuthorArticle" + "type": "string" }, "type": "array" }, - "bio": { + "facebook_url": { + "type": "string" + }, + "image_url": { + "type": "string" + }, + "instagram_url": { "type": "string" }, "job_title": { "type": "string" }, - "name": { + "linkedin_url": { "type": "string" }, - "slug": { + "name": { "type": "string" }, - "url": { + "twitter_url": { "type": "string" }, - "works_for": { + "url": { "type": "string" } }, "type": "object" }, - "mashable.AuthorResponse": { + "livescience.AuthorResponse": { "properties": { "articles": { "items": { @@ -120525,7 +122678,7 @@ "has_next_page": { "type": "boolean" }, - "image_url": { + "job_title": { "type": "string" }, "name": { @@ -120539,20 +122692,17 @@ }, "social_links": { "items": { - "$ref": "#/definitions/mashable.AuthorSocialLink" + "$ref": "#/definitions/livescience.AuthorSocialLink" }, "type": "array" }, - "title": { - "type": "string" - }, "url": { "type": "string" } }, "type": "object" }, - "mashable.AuthorSocialLink": { + "livescience.AuthorSocialLink": { "properties": { "platform": { "type": "string" @@ -120563,593 +122713,617 @@ }, "type": "object" }, - "mcdonalds.CategoriesResponse": { + "livescore.livescoreNewsFeedItemDoc": { "properties": { + "author": { + "example": "LiveScore", + "type": "string" + }, "categories": { + "example": [ + "football" + ], "items": { - "$ref": "#/definitions/mcdonalds.Category" + "type": "string" }, "type": "array" }, - "count": { - "example": 13, - "type": "integer" - }, - "country": { - "description": "Country echoes the market these slugs belong to. Slugs are NOT\nportable across markets -- pass the same country back to\n/mcdonalds/menu.", - "example": "us", + "content": { + "example": "

The complete RSS story body.

", "type": "string" }, - "fetched_at": { + "description": { + "example": "A short summary of the latest story.", "type": "string" }, - "source_url": { + "guid": { + "example": "https://www.livescore.com/en/news/football/example-story/", "type": "string" - } - }, - "type": "object" - }, - "mcdonalds.Category": { - "properties": { - "name": { - "example": "Breakfast", + }, + "link": { + "example": "https://www.livescore.com/en/news/football/example-story/", "type": "string" }, - "slug": { - "example": "breakfast", + "published_at": { + "example": "Sat, 26 Sep 2026 08:45:00 GMT", "type": "string" }, - "url": { + "title": { + "example": "Latest football news", "type": "string" } }, "type": "object" }, - "mcdonalds.ItemComponent": { + "livescore.livescoreNewsFeedResponseDoc": { "properties": { - "allergens": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "ingredients": { + "data": { + "properties": { + "count": { + "example": 75, + "type": "integer" + }, + "items": { + "items": { + "$ref": "#/definitions/livescore.livescoreNewsFeedItemDoc" + }, + "type": "array" + }, + "source_url": { + "example": "https://www.livescore.com/en/news/rss.xml", + "type": "string" + } + }, + "type": "object" + }, + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "mcdonalds.ItemListEntry": { + "livescore.livescoreNewsPublisherDoc": { "properties": { - "allergens": { - "type": "string" - }, - "components": { - "description": "Components is the per-part ingredient/allergen breakdown -- e.g. a\nburger's bun, patty, cheese and condiment each carry their own\nstatement. Absent for a single-part item.", - "items": { - "$ref": "#/definitions/mcdonalds.ItemComponent" - }, - "type": "array" - }, - "description": { + "contact": { + "example": "https://www.statsperform.com/contact/", "type": "string" }, - "image_url": { + "logo_url": { + "example": "https://www.livescore.com/ls-web-assets/images/publishers-stats-perform.webp", "type": "string" }, - "ingredients": { + "name": { + "example": "Stats Perform", "type": "string" }, - "item_id": { - "example": "200466", + "telephone": { + "example": "+1 866 221 1426", "type": "string" }, - "name": { - "example": "Quarter Pounder with Cheese", + "website": { + "example": "https://www.statsperform.com/", "type": "string" - }, - "nutrients": { - "items": { - "$ref": "#/definitions/mcdonalds.Nutrient" - }, - "type": "array" } }, "type": "object" }, - "mcdonalds.ItemListResponse": { + "livescore.livescoreNewsPublishersResponseDoc": { "properties": { - "count": { - "example": 3, + "code": { + "example": 200, "type": "integer" }, - "country": { - "example": "us", - "type": "string" + "data": { + "properties": { + "count": { + "example": 6, + "type": "integer" + }, + "publishers": { + "items": { + "$ref": "#/definitions/livescore.livescoreNewsPublisherDoc" + }, + "type": "array" + }, + "source_url": { + "example": "https://www.livescore.com/en/news/publishers/", + "type": "string" + } + }, + "type": "object" }, - "fetched_at": { + "msg": { + "example": "OK", "type": "string" + } + }, + "type": "object" + }, + "livescore.livescoreSearchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" }, - "items": { - "items": { - "$ref": "#/definitions/mcdonalds.ItemListEntry" - }, - "type": "array" - }, - "requested": { - "description": "Requested echoes the id list as asked for, so a caller can tell which\nids McDonald's returned nothing for.", - "items": { - "type": "string" + "data": { + "properties": { + "query": { + "example": "Manchester City", + "type": "string" + }, + "results": { + "additionalProperties": true, + "type": "object" + }, + "source_url": { + "example": "https://prod-cdn-search-api.lsmedia1.com/api/v2/search/soccer?categories=true&locale=en&query=Manchester+City&stages=true&teams=true&limit=10", + "type": "string" + }, + "sport": { + "example": "soccer", + "type": "string" + } }, - "type": "array" + "type": "object" }, - "source_url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "mcdonalds.ItemResponse": { + "livescore.newsCategoriesResponseDoc": { "properties": { - "allergens": { - "description": "Allergens is McDonald's own allergen statement for the item.", - "type": "string" - }, - "country": { - "description": "Country echoes the market this item was read from. Item ids are NOT\nportable across markets.", - "example": "us", - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "description": { - "type": "string" + "data": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/livescore.newsCategoryDoc" + }, + "type": "array" + } + }, + "type": "object" }, - "fetched_at": { + "msg": { + "example": "OK", "type": "string" - }, - "image_url": { + } + }, + "type": "object" + }, + "livescore.newsCategoryDoc": { + "properties": { + "id": { + "example": "football", "type": "string" }, - "ingredients": { - "description": "Ingredients is the full ingredient statement.", + "name": { + "example": "Football", "type": "string" }, - "item_id": { - "example": "200463", + "type": { + "example": "sport", "type": "string" }, - "name": { - "example": "Big Mac", + "url": { + "example": "https://www.livescore.com/en/news/football/", "type": "string" + } + }, + "type": "object" + }, + "livescore.responseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" }, - "nutrients": { - "description": "Nutrients are the published per-serving nutrition values.", - "items": { - "$ref": "#/definitions/mcdonalds.Nutrient" - }, - "type": "array" + "data": { + "$ref": "#/definitions/livescore.sourceDataDoc" }, - "source_url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "mcdonalds.MenuItemSummary": { + "livescore.sourceDataDoc": { "properties": { - "calories": { - "description": "Calories is McDonald's own per-item calorie label where the category\npage prints one; often blank.", - "example": "460 Cal.", - "type": "string" + "data": { + "additionalProperties": true, + "type": "object" }, - "image_url": { + "source_url": { + "example": "https://www.livescore.com/en/football/uefa-nations-league/league-b-group-3/austria-vs-israel/1738267/", "type": "string" - }, - "item_id": { - "example": "200300", + } + }, + "type": "object" + }, + "livescore.sportDoc": { + "properties": { + "id": { + "example": "soccer", "type": "string" }, "name": { - "example": "Bacon, Egg & Cheese Biscuit", + "example": "Football", "type": "string" + } + }, + "type": "object" + }, + "livescore.sportsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" }, - "product_url": { + "data": { + "properties": { + "sports": { + "items": { + "$ref": "#/definitions/livescore.sportDoc" + }, + "type": "array" + } + }, + "type": "object" + }, + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "mcdonalds.MenuResponse": { + "lululemon.CategoriesResponse": { "properties": { - "category": { - "example": "breakfast", - "type": "string" + "categories": { + "items": { + "$ref": "#/definitions/lululemon.CategoryEntry" + }, + "type": "array" }, "count": { - "example": 32, "type": "integer" }, - "country": { - "example": "us", - "type": "string" - }, "fetched_at": { "type": "string" }, - "items": { - "items": { - "$ref": "#/definitions/mcdonalds.MenuItemSummary" - }, - "type": "array" - }, "source_url": { "type": "string" } }, "type": "object" }, - "mcdonalds.Nutrient": { + "lululemon.CategoryEntry": { "properties": { - "daily_value": { - "description": "DailyValue is the percent-daily-value where McDonald's prints one.", - "example": "45", + "category": { "type": "string" }, - "key": { - "description": "Key is McDonald's stable machine identifier for the nutrient\n(e.g. \"calories\"), safer to match on than the display name.", - "example": "calories", + "cdp_hash": { "type": "string" }, "name": { - "example": "Calories", "type": "string" }, - "unit": { - "example": "Cal.", + "path": { + "items": { + "type": "string" + }, + "type": "array" + }, + "section": { "type": "string" }, - "value": { - "description": "Value is kept as a string because McDonald's publishes values like\n\"580\", \"1060\" and occasionally non-numeric qualifiers; parsing to a\nnumber here would silently drop the latter.", - "example": "580", + "url": { "type": "string" } }, "type": "object" }, - "mcdonalds.Restaurant": { + "lululemon.CategoryResponse": { "properties": { - "address": { - "example": "160 Broadway", + "category": { + "description": "Category slug that was requested, such as `women-new-styles`.", "type": "string" }, - "city": { - "example": "New York", + "cdp_hash": { + "description": "Short id segment of the category URL that was requested.", "type": "string" }, - "delivery_url": { - "description": "DeliveryURL is the store's delivery deep link when one is published.\nNote McDonald's points this at a third-party delivery platform.", - "type": "string" + "count": { + "description": "Number of products returned on this page.", + "type": "integer" }, - "drive_thru_hours": { + "fetched_at": { + "description": "Time the data was fetched, in UTC (RFC 3339).", "type": "string" }, - "facilities": { - "description": "Facilities are McDonald's own amenity codes for the restaurant\n(e.g. GIFTCARDS, MOBILEOFFERS, DRIVETHRU, WIFI).", - "items": { - "type": "string" - }, - "type": "array" + "page": { + "description": "Page number returned, starting at 1.", + "type": "integer" }, - "hours": { - "description": "Hours is the full week where McDonald's publishes it.", + "page_size": { + "description": "Maximum number of products on a page.", + "type": "integer" + }, + "products": { + "description": "Products listed on this page of the category.", "items": { - "$ref": "#/definitions/mcdonalds.RestaurantHours" + "$ref": "#/definitions/lululemon.ProductSummary" }, "type": "array" }, - "latitude": { - "example": 40.709438, - "type": "number" - }, - "longitude": { - "example": -74.010086, - "type": "number" - }, - "name": { - "example": "160 BROADWAY", + "source_url": { + "description": "URL the data was read from.", "type": "string" }, - "open_status": { - "example": "OPEN", + "total_products": { + "description": "Total number of products in the category.", + "type": "integer" + } + }, + "type": "object" + }, + "lululemon.OutfitItem": { + "properties": { + "category": { "type": "string" }, - "postal_code": { - "example": "10038", + "currency": { "type": "string" }, - "state": { - "example": "NY", + "id": { "type": "string" }, - "store_id": { - "example": "10528", + "image_url": { "type": "string" }, - "telephone": { - "example": "(212) 385-2066", - "type": "string" + "list_price": { + "type": "number" }, - "timezone": { + "on_sale": { + "type": "boolean" + }, + "sale_price": { + "type": "number" + }, + "title": { "type": "string" }, - "today_hours": { - "description": "TodayHours and DriveThruHours are the published windows for today.", + "url": { "type": "string" } }, "type": "object" }, - "mcdonalds.RestaurantHours": { + "lululemon.OutfitLook": { "properties": { - "day_of_week": { - "example": "monday", + "id": { "type": "string" }, - "hours": { - "example": "00:00 - 00:00", - "type": "string" - } - }, - "type": "object" - }, - "mcdonalds.RestaurantMenuChoice": { - "properties": { - "options": { + "items": { "items": { - "$ref": "#/definitions/mcdonalds.RestaurantMenuChoiceOption" + "$ref": "#/definitions/lululemon.OutfitItem" }, "type": "array" } }, "type": "object" }, - "mcdonalds.RestaurantMenuChoiceOption": { + "lululemon.OutfitResponse": { "properties": { - "item_id": { - "example": "14877", + "color_code": { "type": "string" }, - "name": { - "example": "Lemonade", + "fetched_at": { "type": "string" }, - "price_delta": { - "description": "PriceDelta is the additional eat-in/pickup cost of choosing this\noption instead of what's already included: 0 for a same-priced\nswap, negative for a cheaper one, and equal to the option's own\nfull price for an add-on choice (nothing is included to offset\nagainst).", - "example": 0.4, - "type": "number" - } - }, - "type": "object" - }, - "mcdonalds.RestaurantMenuItem": { - "properties": { - "choices": { - "description": "Choices lists this item's customizable components McDonald's\npublishes a curated substitute/add-on list for -- e.g. a meal's\ndrink upgrade options, or a dip-able item's sauce choices -- with\nthe live eat-in/pickup price delta for each real alternative.\nPresent only when the upstream payload exposed at least one such\nchoice for this item; see the package doc comment for how these are\nderived and the deliberate fail-closed rule behind what gets left\nout (in particular, plain entree/side substitution is not exposed\nat all -- McDonald's does not publish a curated candidate list for\nit, only for upgrade/add-on style choices).", + "item": { + "$ref": "#/definitions/lululemon.OutfitItem" + }, + "looks": { "items": { - "$ref": "#/definitions/mcdonalds.RestaurantMenuChoice" + "$ref": "#/definitions/lululemon.OutfitLook" }, "type": "array" }, - "delivery_price": { - "example": 8.39, - "type": "number" - }, - "eat_in_price": { - "example": 7.29, - "type": "number" - }, - "family_group": { - "description": "FamilyGroup is McDonald's own internal product classification (e.g.\nREGULAR_ENTREE, DESSERT) -- not the same category list\n/mcdonalds/categories returns, and not always present.", - "example": "REGULAR_ENTREE", + "source_url": { "type": "string" }, - "image_url": { + "unified_id": { "type": "string" - }, - "item_id": { - "example": "5", + } + }, + "type": "object" + }, + "lululemon.ProductDetailColor": { + "properties": { + "code": { "type": "string" }, "name": { - "example": "Big Mac®", "type": "string" }, - "pickup_price": { - "example": 7.29, - "type": "number" + "swatch_url": { + "type": "string" } }, "type": "object" }, - "mcdonalds.RestaurantMenuResponse": { + "lululemon.ProductDetailRating": { "properties": { "count": { - "example": 563, "type": "integer" }, - "currency": { - "example": "$", + "value": { + "type": "number" + } + }, + "type": "object" + }, + "lululemon.ProductDetailResponse": { + "properties": { + "activities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "category": { "type": "string" }, - "fetched_at": { + "category_id": { "type": "string" }, - "items": { + "colors": { "items": { - "$ref": "#/definitions/mcdonalds.RestaurantMenuItem" + "$ref": "#/definitions/lululemon.ProductDetailColor" }, "type": "array" }, - "source_url": { - "type": "string" - }, - "store_id": { - "example": "10528", + "currency": { "type": "string" - } - }, - "type": "object" - }, - "mcdonalds.RestaurantsResponse": { - "properties": { - "count": { - "example": 5, - "type": "integer" }, - "country": { - "description": "Country echoes the market searched, so a response is self-describing\nwhen several markets are queried in one workflow.", - "example": "us", + "description": { "type": "string" }, "fetched_at": { "type": "string" }, - "restaurants": { + "gender": { "items": { - "$ref": "#/definitions/mcdonalds.Restaurant" + "type": "string" }, "type": "array" }, - "source_url": { + "highlights": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { "type": "string" - } - }, - "type": "object" - }, - "mcdonalds.categoriesResponseDoc": { - "properties": { - "code": { - "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", - "type": "integer" }, - "data": { - "$ref": "#/definitions/mcdonalds.CategoriesResponse" + "on_sale": { + "type": "boolean" }, - "msg": { - "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" - } - }, - "type": "object" - }, - "mcdonalds.itemListResponseDoc": { - "properties": { - "code": { - "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", - "type": "integer" + "price": { + "type": "number" }, - "data": { - "$ref": "#/definitions/mcdonalds.ItemListResponse" + "product_id": { + "type": "string" }, - "msg": { - "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" - } - }, - "type": "object" - }, - "mcdonalds.itemResponseDoc": { - "properties": { - "code": { - "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", - "type": "integer" + "rating": { + "$ref": "#/definitions/lululemon.ProductDetailRating" }, - "data": { - "$ref": "#/definitions/mcdonalds.ItemResponse" + "reviews": { + "items": { + "$ref": "#/definitions/lululemon.ProductDetailReview" + }, + "type": "array" }, - "msg": { - "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" - } - }, - "type": "object" - }, - "mcdonalds.menuResponseDoc": { - "properties": { - "code": { - "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", - "type": "integer" + "sizes": { + "items": { + "type": "string" + }, + "type": "array" }, - "data": { - "$ref": "#/definitions/mcdonalds.MenuResponse" + "skus": { + "items": { + "$ref": "#/definitions/lululemon.ProductDetailSKU" + }, + "type": "array" }, - "msg": { - "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" - } - }, - "type": "object" - }, - "mcdonalds.restaurantMenuResponseDoc": { - "properties": { - "code": { - "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", - "type": "integer" + "source_url": { + "type": "string" }, - "data": { - "$ref": "#/definitions/mcdonalds.RestaurantMenuResponse" + "unified_id": { + "type": "string" }, - "msg": { - "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" + "url": { + "type": "string" } }, "type": "object" }, - "mcdonalds.restaurantsResponseDoc": { + "lululemon.ProductDetailReview": { "properties": { - "code": { - "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", - "type": "integer" + "badge": { + "type": "string" }, - "data": { - "$ref": "#/definitions/mcdonalds.RestaurantsResponse" + "body": { + "type": "string" }, - "msg": { - "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" - } - }, - "type": "object" - }, - "mediaite.AuthorArticle": { - "properties": { - "date": { + "fit": { "type": "string" }, - "title": { + "id": { "type": "string" }, - "url": { + "rating": { + "type": "number" + }, + "size_purchased": { + "type": "string" + }, + "submitted_at": { + "type": "string" + }, + "title": { "type": "string" + }, + "verified_buyer": { + "type": "boolean" } }, "type": "object" }, - "mediaite.AuthorResponse": { + "lululemon.ProductDetailSKU": { "properties": { - "articles": { - "items": { - "$ref": "#/definitions/mediaite.AuthorArticle" - }, - "type": "array" + "available": { + "type": "boolean" }, - "avatar_url": { + "color_code": { "type": "string" }, - "bio": { + "color_name": { "type": "string" }, - "email": { + "id": { "type": "string" }, - "name": { + "on_sale": { + "type": "boolean" + }, + "price": { + "type": "number" + }, + "sale_price": { + "type": "number" + }, + "size": { "type": "string" }, - "slug": { + "style_id": { "type": "string" }, - "twitter": { + "style_number": { "type": "string" }, "url": { @@ -121158,57 +123332,124 @@ }, "type": "object" }, - "medicalnewstoday.ArticleResponse": { + "lululemon.ProductSummary": { "properties": { - "authors": { + "activities": { + "description": "Activities the product is designed for, such as `Casual` or `Lounge`.", "items": { "type": "string" }, "type": "array" }, - "description": { + "category": { + "description": "Name of the product's category, such as `Sweatpants`.", "type": "string" }, - "image_url": { + "category_id": { + "description": "Id of the product's category, such as `womens-sweatpants`.", "type": "string" }, - "paragraphs": { + "colors": { + "description": "Names of the colors the product comes in. Positions match `style_numbers`.", "items": { "type": "string" }, "type": "array" }, - "paywalled": { - "description": "Paywalled is true when the publisher serves only a teaser of this\narticle to anonymous readers, so Paragraphs is a partial body rather than\nthe full text. It is omitted when the full public body was returned.", - "type": "boolean" + "currency": { + "description": "Currency code of the prices, such as `USD`.", + "type": "string" }, - "published_at": { + "id": { + "description": "lululemon product id.", "type": "string" }, - "section": { + "image_url": { + "description": "URL of the first image lululemon lists for the product.", "type": "string" }, - "title": { + "list_price": { + "description": "List price of the product.", + "type": "number" + }, + "name": { + "description": "Product name as shown on lululemon.", "type": "string" }, - "updated_at": { + "new_arrival": { + "description": "Whether lululemon flags the product as a new arrival.", + "type": "boolean" + }, + "on_sale": { + "description": "Whether the product is on sale.", + "type": "boolean" + }, + "price": { + "description": "Current price of the product.", + "type": "number" + }, + "sale_price": { + "description": "Sale price of the product. Set only when `on_sale` is `true`.", + "type": "number" + }, + "sizes": { + "description": "Sizes the product is available in.", + "items": { + "type": "string" + }, + "type": "array" + }, + "style_numbers": { + "description": "Style numbers of the product, one per color. Positions match `colors`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "unified_id": { + "description": "lululemon's unified product id, a slug such as `Scuba-Evolve-Straight-Leg-Pant-Regular`.", "type": "string" }, "url": { + "description": "URL of the product page on lululemon.", "type": "string" } }, "type": "object" }, - "medicalnewstoday.AuthorResponse": { + "lululemon.Store": { "properties": { - "articles": { + "address": { + "type": "string" + }, + "amenities": { + "$ref": "#/definitions/lululemon.StoreAmenities" + }, + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "distance_miles": { + "type": "number" + }, + "hours": { "items": { - "$ref": "#/definitions/newsplatform.HeadlineItem" + "$ref": "#/definitions/lululemon.StoreHours" }, "type": "array" }, - "bio": { + "id": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "longitude": { + "type": "number" + }, + "message": { "type": "string" }, "name": { @@ -121217,56 +123458,95 @@ "slug": { "type": "string" }, + "state": { + "type": "string" + }, + "state_name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "store_type": { + "type": "string" + }, "url": { "type": "string" } }, "type": "object" }, - "medicalnewstoday.HeadlinesResponse": { + "lululemon.StoreAmenities": { "properties": { - "items": { - "items": { - "$ref": "#/definitions/newsplatform.HeadlineItem" - }, - "type": "array" + "buy_online_pickup_store": { + "type": "boolean" }, - "section": { - "type": "string" + "complementary_hemming": { + "type": "boolean" + }, + "curbside_pickup": { + "type": "boolean" + }, + "footwear": { + "type": "boolean" + }, + "has_mirror": { + "type": "boolean" + }, + "like_new": { + "type": "boolean" + }, + "personal_shopping": { + "type": "boolean" + }, + "returns_exchanges": { + "type": "boolean" } }, "type": "object" }, - "medicalnewstoday.NewsResponse": { + "lululemon.StoreHours": { "properties": { - "items": { - "items": { - "$ref": "#/definitions/newsplatform.HeadlineItem" - }, - "type": "array" + "close": { + "type": "string" + }, + "day": { + "type": "string" + }, + "open": { + "type": "string" } }, "type": "object" }, - "medicalnewstoday.SectionsResponse": { + "lululemon.StoresResponse": { "properties": { - "sections": { + "count": { + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "source_url": { + "type": "string" + }, + "stores": { "items": { - "$ref": "#/definitions/newsplatform.Section" + "$ref": "#/definitions/lululemon.Store" }, "type": "array" } }, "type": "object" }, - "medicalnewstoday.articleResponseDoc": { + "lululemon.categoriesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/medicalnewstoday.ArticleResponse" + "$ref": "#/definitions/lululemon.CategoriesResponse" }, "msg": { "example": "OK", @@ -121275,14 +123555,14 @@ }, "type": "object" }, - "medicalnewstoday.authorResponseDoc": { + "lululemon.categoryResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/medicalnewstoday.AuthorResponse" + "$ref": "#/definitions/lululemon.CategoryResponse" }, "msg": { "example": "OK", @@ -121291,14 +123571,14 @@ }, "type": "object" }, - "medicalnewstoday.headlinesResponseDoc": { + "lululemon.outfitResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/medicalnewstoday.HeadlinesResponse" + "$ref": "#/definitions/lululemon.OutfitResponse" }, "msg": { "example": "OK", @@ -121307,14 +123587,14 @@ }, "type": "object" }, - "medicalnewstoday.newsResponseDoc": { + "lululemon.productDetailResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/medicalnewstoday.NewsResponse" + "$ref": "#/definitions/lululemon.ProductDetailResponse" }, "msg": { "example": "OK", @@ -121323,14 +123603,14 @@ }, "type": "object" }, - "medicalnewstoday.sectionsResponseDoc": { + "lululemon.storesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/medicalnewstoday.SectionsResponse" + "$ref": "#/definitions/lululemon.StoresResponse" }, "msg": { "example": "OK", @@ -121339,12 +123619,15 @@ }, "type": "object" }, - "men.AuthorArticle": { + "macrumors.AuthorArticle": { "properties": { - "label": { + "image_url": { "type": "string" }, - "label_url": { + "published_at": { + "type": "string" + }, + "summary": { "type": "string" }, "title": { @@ -121356,21 +123639,18 @@ }, "type": "object" }, - "men.AuthorResponse": { + "macrumors.AuthorResponse": { "properties": { "articles": { "items": { - "$ref": "#/definitions/men.AuthorArticle" + "$ref": "#/definitions/macrumors.AuthorArticle" }, "type": "array" }, "bio": { "type": "string" }, - "email": { - "type": "string" - }, - "job_title": { + "image_url": { "type": "string" }, "name": { @@ -121379,107 +123659,104 @@ "slug": { "type": "string" }, - "twitter": { - "type": "string" - }, "url": { "type": "string" } }, "type": "object" }, - "mercari.AutocompleteResponse": { + "macys.ProductColor": { "properties": { - "query": { - "type": "string" + "current_price": { + "type": "number" }, - "suggestions": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "mercari.Brand": { - "properties": { "id": { - "type": "integer" + "type": "string" }, "name": { "type": "string" + }, + "on_sale": { + "type": "boolean" + }, + "regular_price": { + "type": "number" } }, "type": "object" }, - "mercari.Category": { + "macys.ProductDetailResponse": { "properties": { - "icon_url": { + "available": { + "type": "boolean" + }, + "brand": { "type": "string" }, - "id": { - "type": "integer" + "bullet_points": { + "items": { + "type": "string" + }, + "type": "array" }, - "name": { - "type": "string" + "categories": { + "items": { + "type": "string" + }, + "type": "array" }, - "parent_id": { - "type": "integer" - } - }, - "type": "object" - }, - "mercari.HomeResponse": { - "properties": { - "items": { + "colors": { "items": { - "$ref": "#/definitions/mercari.ItemSummary" + "$ref": "#/definitions/macys.ProductColor" }, "type": "array" - } - }, - "type": "object" - }, - "mercari.ItemDetailResponse": { - "properties": { - "category_code": { - "type": "integer" }, - "condition_code": { - "type": "integer" + "currency_code": { + "type": "string" + }, + "current_price": { + "type": "number" + }, + "department_name": { + "type": "string" }, "description": { "type": "string" }, - "hashtags": { - "items": { - "type": "string" - }, - "type": "array" + "division_name": { + "type": "string" }, - "id": { + "fetched_at": { "type": "string" }, - "photos": { + "images": { "items": { "type": "string" }, "type": "array" }, - "price_cents": { - "type": "integer" + "low_availability": { + "type": "boolean" }, - "shipping_from_state": { + "name": { "type": "string" }, - "similar_items": { - "items": { - "$ref": "#/definitions/mercari.ItemSummary" - }, - "type": "array" + "on_sale": { + "type": "boolean" }, - "title": { + "product_id": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "regular_price": { + "type": "number" + }, + "review_count": { + "type": "integer" + }, + "source_url": { "type": "string" }, "url": { @@ -121488,125 +123765,122 @@ }, "type": "object" }, - "mercari.ItemSummary": { + "macys.ProductReviewsResponse": { "properties": { - "condition_code": { - "type": "integer" + "average_rating": { + "type": "number" }, - "created_at_unix": { + "count": { "type": "integer" }, - "id": { + "fetched_at": { "type": "string" }, - "num_likes": { - "type": "integer" - }, - "original_price_cents": { + "page": { "type": "integer" }, - "price_cents": { + "page_size": { "type": "integer" }, - "seller_id": { - "type": "string" - }, - "thumbnail_url": { - "type": "string" - }, - "title": { + "product_id": { "type": "string" }, - "updated_at_unix": { + "rating_count": { + "description": "RatingCount, AverageRating, RecommendedRatio, and RatingHistogram are\nthe product's site-wide aggregate rating summary, not just this page --\nabsent (zero-valued) for a product with no reviews yet.", "type": "integer" }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "mercari.MasterResponse": { - "properties": { - "brands": { + "rating_histogram": { + "description": "RatingHistogram is the count of ratings per star, ascending: index 0 is\n1-star, index 4 is 5-star.", "items": { - "$ref": "#/definitions/mercari.Brand" + "type": "integer" }, "type": "array" }, - "categories": { - "items": { - "$ref": "#/definitions/mercari.Category" - }, - "type": "array" + "recommended_ratio": { + "type": "number" }, - "sizes": { - "items": { - "$ref": "#/definitions/mercari.Size" - }, - "type": "array" - } - }, - "type": "object" - }, - "mercari.SearchResponse": { - "properties": { - "items": { + "reviews": { "items": { - "$ref": "#/definitions/mercari.ItemSummary" + "$ref": "#/definitions/macys.Review" }, "type": "array" }, - "query": { + "source_url": { "type": "string" }, - "total_results": { + "total_pages": { + "type": "integer" + }, + "total_reviews": { "type": "integer" } }, "type": "object" }, - "mercari.Size": { + "macys.Review": { "properties": { - "code": { + "author": { + "type": "string" + }, + "body": { "type": "string" }, "id": { + "type": "string" + }, + "location": { + "type": "string" + }, + "rating": { "type": "integer" }, - "name": { + "ratings_only": { + "description": "RatingsOnly marks a review that carries only a star rating with no\nwritten title/body -- confirmed live 2026-08-11 that Macy's review\nplatform allows these and this endpoint still surfaces them.", + "type": "boolean" + }, + "recommended": { + "type": "boolean" + }, + "submitted_at": { "type": "string" }, - "short_name": { + "title": { "type": "string" } }, "type": "object" }, - "mercari.autocompleteResponseDoc": { + "macys.SuggestResponse": { "properties": { - "code": { - "example": 200, + "count": { "type": "integer" }, - "data": { - "$ref": "#/definitions/mercari.AutocompleteResponse" + "fetched_at": { + "type": "string" }, - "msg": { - "example": "OK", + "query": { + "type": "string" + }, + "source_url": { "type": "string" + }, + "suggestions": { + "items": { + "type": "string" + }, + "type": "array" } }, "type": "object" }, - "mercari.homeResponseDoc": { + "macys.productDetailResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/mercari.HomeResponse" + "$ref": "#/definitions/macys.ProductDetailResponse" }, "msg": { "example": "OK", @@ -121615,14 +123889,14 @@ }, "type": "object" }, - "mercari.masterResponseDoc": { + "macys.productReviewsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/mercari.MasterResponse" + "$ref": "#/definitions/macys.ProductReviewsResponse" }, "msg": { "example": "OK", @@ -121631,14 +123905,14 @@ }, "type": "object" }, - "mercari.searchResponseDoc": { + "macys.suggestResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/mercari.SearchResponse" + "$ref": "#/definitions/macys.SuggestResponse" }, "msg": { "example": "OK", @@ -121647,1288 +123921,837 @@ }, "type": "object" }, - "metacritic.BrowseItem": { + "makeuseof.AuthorResponse": { "properties": { - "description": { - "type": "string" - }, - "genres": { + "articles": { "items": { - "$ref": "#/definitions/metacritic.Genre" + "$ref": "#/definitions/newsplatform.HeadlineItem" }, "type": "array" }, - "id": { - "type": "integer" - }, - "image": { + "biography": { "type": "string" }, - "metascore": { - "$ref": "#/definitions/metacritic.ScoreSummary" - }, - "premiere_year": { - "type": "integer" - }, - "rating": { + "image_url": { "type": "string" }, - "release_date": { + "name": { "type": "string" }, - "season_count": { - "type": "integer" - }, - "slug": { - "type": "string" + "social_links": { + "items": { + "$ref": "#/definitions/valnet.AuthorSocialLink" + }, + "type": "array" }, "title": { "type": "string" }, - "type": { - "example": "game", - "type": "string" - }, "url": { "type": "string" - }, - "user_score": { - "type": "number" } }, "type": "object" }, - "metacritic.BrowseResponse": { + "marketwatch.AuthorArticle": { "properties": { - "genre": { + "title": { "type": "string" }, - "items": { + "url": { + "type": "string" + } + }, + "type": "object" + }, + "marketwatch.AuthorResponse": { + "properties": { + "articles": { "items": { - "$ref": "#/definitions/metacritic.BrowseItem" + "$ref": "#/definitions/marketwatch.AuthorArticle" }, "type": "array" }, - "page": { - "type": "integer" - }, - "per_page": { - "type": "integer" + "bio": { + "type": "string" }, - "sort": { + "job_title": { "type": "string" }, - "total": { - "type": "integer" + "name": { + "type": "string" }, - "type": { + "slug": { "type": "string" - } - }, - "type": "object" - }, - "metacritic.Credit": { - "properties": { - "name": { - "description": "Name of the person credited.", + }, + "url": { "type": "string" }, - "role": { - "description": "Role of the person on the title, for example `Director`.", - "example": "Director", + "works_for": { "type": "string" } }, "type": "object" }, - "metacritic.CriticReview": { + "mashable.AuthorResponse": { "properties": { - "author": { - "description": "Name of the critic who wrote the review.", - "type": "string" + "articles": { + "items": { + "$ref": "#/definitions/newsplatform.HeadlineItem" + }, + "type": "array" }, - "date": { - "description": "Date the review was published, in YYYY-MM-DD.", - "example": "2022-02-23", - "type": "string" + "biography": { + "items": { + "type": "string" + }, + "type": "array" }, - "platform": { - "description": "Platform the game was reviewed on. Set for game reviews.", - "type": "string" + "has_next_page": { + "type": "boolean" }, - "publication": { - "description": "Name of the publication that published the review.", + "image_url": { "type": "string" }, - "publication_slug": { - "description": "Metacritic slug of the publication.", + "name": { "type": "string" }, - "quote": { - "description": "Excerpt or summary of the review text.", + "page": { + "type": "integer" + }, + "slug": { "type": "string" }, - "score": { - "description": "Score the critic gave, out of 100. Omitted when the review has no score.", - "type": "integer" + "social_links": { + "items": { + "$ref": "#/definitions/mashable.AuthorSocialLink" + }, + "type": "array" + }, + "title": { + "type": "string" }, "url": { - "description": "URL of the full review on the publication's site.", "type": "string" } }, "type": "object" }, - "metacritic.CriticReviewsResponse": { + "mashable.AuthorSocialLink": { "properties": { - "page": { - "description": "Page number returned, starting at 1.", - "type": "integer" - }, - "per_page": { - "description": "Number of reviews per page.", - "type": "integer" + "platform": { + "type": "string" }, - "reviews": { - "description": "Critic reviews on this page.", + "url": { + "type": "string" + } + }, + "type": "object" + }, + "mcdonalds.CategoriesResponse": { + "properties": { + "categories": { "items": { - "$ref": "#/definitions/metacritic.CriticReview" + "$ref": "#/definitions/mcdonalds.Category" }, "type": "array" }, - "slug": { - "description": "Metacritic slug of the title the reviews belong to.", - "type": "string" + "count": { + "example": 13, + "type": "integer" }, - "sort": { - "description": "Sort order applied: `date`, `score` or `publication`.", + "country": { + "description": "Country echoes the market these slugs belong to. Slugs are NOT\nportable across markets -- pass the same country back to\n/mcdonalds/menu.", + "example": "us", "type": "string" }, - "total": { - "description": "Total number of critic reviews for the title.", - "type": "integer" + "fetched_at": { + "type": "string" }, - "type": { - "description": "Content type of the title: `game`, `movie` or `tv`.", + "source_url": { "type": "string" } }, "type": "object" }, - "metacritic.Genre": { + "mcdonalds.Category": { "properties": { - "id": { - "description": "Metacritic genre id.", - "type": "integer" - }, "name": { - "description": "Genre name, for example `Action RPG`.", + "example": "Breakfast", + "type": "string" + }, + "slug": { + "example": "breakfast", + "type": "string" + }, + "url": { "type": "string" } }, "type": "object" }, - "metacritic.Platform": { + "mcdonalds.ItemComponent": { "properties": { - "id": { - "description": "Metacritic platform id.", - "type": "integer" - }, - "is_lead": { - "description": "Whether this is the game's lead platform.", - "type": "boolean" - }, - "metascore": { - "allOf": [ - { - "$ref": "#/definitions/metacritic.ScoreSummary" - } - ], - "description": "Critic score summary for the game on this platform." - }, - "name": { - "description": "Platform name, for example `PlayStation 5`.", - "example": "PlayStation 5", + "allergens": { "type": "string" }, - "release_date": { - "description": "Release date of the game on this platform.", + "ingredients": { "type": "string" } }, "type": "object" }, - "metacritic.Product": { + "mcdonalds.ItemListEntry": { "properties": { - "countries": { - "description": "Countries Metacritic lists for the title.", + "allergens": { + "type": "string" + }, + "components": { + "description": "Components is the per-part ingredient/allergen breakdown -- e.g. a\nburger's bun, patty, cheese and condiment each carry their own\nstatement. Absent for a single-part item.", "items": { - "type": "string" + "$ref": "#/definitions/mcdonalds.ItemComponent" }, "type": "array" }, "description": { - "description": "Plot or game summary as shown on Metacritic.", "type": "string" }, - "duration": { - "description": "Running time of the title as Metacritic lists it.", - "type": "integer" + "image_url": { + "type": "string" }, - "genres": { - "description": "Genres Metacritic assigns to the title.", + "ingredients": { + "type": "string" + }, + "item_id": { + "example": "200466", + "type": "string" + }, + "name": { + "example": "Quarter Pounder with Cheese", + "type": "string" + }, + "nutrients": { "items": { - "$ref": "#/definitions/metacritic.Genre" + "$ref": "#/definitions/mcdonalds.Nutrient" }, "type": "array" - }, - "id": { - "description": "Metacritic's numeric id for the title.", + } + }, + "type": "object" + }, + "mcdonalds.ItemListResponse": { + "properties": { + "count": { + "example": 3, "type": "integer" }, - "image": { - "description": "Main image of the title as Metacritic lists it.", - "type": "string" - }, - "imdb_id": { - "description": "IMDb id of the title, for example `tt0903747`.", + "country": { + "example": "us", "type": "string" }, - "imdb_url": { - "description": "URL of the title's IMDb page.", + "fetched_at": { "type": "string" }, - "in_theaters": { - "description": "Whether the movie is currently in theaters. Omitted when false.", - "type": "boolean" - }, - "metascore": { - "allOf": [ - { - "$ref": "#/definitions/metacritic.ScoreSummary" - } - ], - "description": "Critic score summary for the title." - }, - "networks": { - "description": "TV networks that air the show.", + "items": { "items": { - "type": "string" + "$ref": "#/definitions/mcdonalds.ItemListEntry" }, "type": "array" }, - "platforms": { - "description": "Platforms the game is released on, each with its own Metascore.", + "requested": { + "description": "Requested echoes the id list as asked for, so a caller can tell which\nids McDonald's returned nothing for.", "items": { - "$ref": "#/definitions/metacritic.Platform" + "type": "string" }, "type": "array" }, - "premiere_year": { - "description": "Year the title premiered or was first released.", - "type": "integer" - }, - "production": { - "allOf": [ - { - "$ref": "#/definitions/metacritic.Production" - } - ], - "description": "Companies, crew and official site for the title." - }, - "rating": { - "description": "Content rating of the title, for example `M` or `TV-MA`.", - "example": "M", + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "mcdonalds.ItemResponse": { + "properties": { + "allergens": { + "description": "Allergens is McDonald's own allergen statement for the item.", "type": "string" }, - "release_date": { - "description": "Release date of the title, in YYYY-MM-DD.", - "example": "2022-02-25", + "country": { + "description": "Country echoes the market this item was read from. Item ids are NOT\nportable across markets.", + "example": "us", "type": "string" }, - "season_count": { - "description": "Number of seasons of the show.", - "type": "integer" + "description": { + "type": "string" }, - "slug": { - "description": "Metacritic URL slug of the title. Use it with the review endpoints.", + "fetched_at": { "type": "string" }, - "tagline": { - "description": "Marketing tagline of the title.", + "image_url": { "type": "string" }, - "title": { - "description": "Title name as shown on Metacritic.", + "ingredients": { + "description": "Ingredients is the full ingredient statement.", "type": "string" }, - "type": { - "description": "Content type of the title: `game`, `movie` or `tv`.", - "example": "game", + "item_id": { + "example": "200463", "type": "string" }, - "url": { - "description": "Metacritic page URL of the title.", + "name": { + "example": "Big Mac", "type": "string" }, - "user_score": { - "allOf": [ - { - "$ref": "#/definitions/metacritic.ScoreSummary" - } - ], - "description": "User score summary for the title. Omitted when it has no user score yet." + "nutrients": { + "description": "Nutrients are the published per-serving nutrition values.", + "items": { + "$ref": "#/definitions/mcdonalds.Nutrient" + }, + "type": "array" }, - "video": { - "allOf": [ - { - "$ref": "#/definitions/metacritic.Video" - } - ], - "description": "Trailer or clip Metacritic links for the title." + "source_url": { + "type": "string" } }, "type": "object" }, - "metacritic.Production": { + "mcdonalds.MenuItemSummary": { "properties": { - "companies": { - "description": "Companies involved in making or publishing the title, without duplicates (up to 12).", - "items": { - "type": "string" - }, - "type": "array" + "calories": { + "description": "Calories is McDonald's own per-item calorie label where the category\npage prints one; often blank.", + "example": "460 Cal.", + "type": "string" }, - "crew": { - "description": "Crew credits for the title.", - "items": { - "$ref": "#/definitions/metacritic.Credit" - }, - "type": "array" + "image_url": { + "type": "string" }, - "official_site": { - "description": "URL of the title's official website.", + "item_id": { + "example": "200300", + "type": "string" + }, + "name": { + "example": "Bacon, Egg & Cheese Biscuit", + "type": "string" + }, + "product_url": { "type": "string" } }, "type": "object" }, - "metacritic.ScoreSummary": { + "mcdonalds.MenuResponse": { "properties": { - "max": { - "description": "Highest possible value of `score`, for example `100`.", - "example": 100, - "type": "integer" - }, - "negative_count": { - "description": "Number of negative reviews counted in the score.", - "type": "integer" - }, - "neutral_count": { - "description": "Number of neutral (mixed) reviews counted in the score.", - "type": "integer" - }, - "positive_count": { - "description": "Number of positive reviews counted in the score.", - "type": "integer" + "category": { + "example": "breakfast", + "type": "string" }, - "review_count": { - "description": "Number of reviews the score is based on.", + "count": { + "example": 32, "type": "integer" }, - "score": { - "description": "Score value on the scale given by `max`. Metascores are out of 100 and user scores out of 10.", - "type": "number" + "country": { + "example": "us", + "type": "string" }, - "sentiment": { - "description": "Metacritic's verdict for the score, for example `Universal acclaim`.", - "example": "Universal acclaim", + "fetched_at": { "type": "string" }, - "url": { - "description": "Metacritic page listing the reviews behind the score.", + "items": { + "items": { + "$ref": "#/definitions/mcdonalds.MenuItemSummary" + }, + "type": "array" + }, + "source_url": { "type": "string" } }, "type": "object" }, - "metacritic.UserReview": { + "mcdonalds.Nutrient": { "properties": { - "author": { - "description": "Username of the member who wrote the review.", + "daily_value": { + "description": "DailyValue is the percent-daily-value where McDonald's prints one.", + "example": "45", "type": "string" }, - "date": { - "description": "Date the review was posted, in YYYY-MM-DD.", + "key": { + "description": "Key is McDonald's stable machine identifier for the nutrient\n(e.g. \"calories\"), safer to match on than the display name.", + "example": "calories", "type": "string" }, - "id": { - "description": "Metacritic review id.", + "name": { + "example": "Calories", "type": "string" }, - "platform": { - "description": "Platform the game was reviewed on. Set for game reviews.", + "unit": { + "example": "Cal.", "type": "string" }, - "quote": { - "description": "Text of the user review.", + "value": { + "description": "Value is kept as a string because McDonald's publishes values like\n\"580\", \"1060\" and occasionally non-numeric qualifiers; parsing to a\nnumber here would silently drop the latter.", + "example": "580", "type": "string" - }, - "score": { - "description": "Score the user gave, out of 10. Omitted when the review has no score.", - "type": "integer" - }, - "spoiler": { - "description": "Whether the review is flagged as containing spoilers.", - "type": "boolean" - }, - "thumbs_down": { - "description": "Number of members who voted the review not helpful.", - "type": "integer" - }, - "thumbs_up": { - "description": "Number of members who voted the review helpful.", - "type": "integer" } }, "type": "object" }, - "metacritic.UserReviewsResponse": { + "mcdonalds.Restaurant": { "properties": { - "page": { - "description": "Page number returned, starting at 1.", - "type": "integer" + "address": { + "example": "160 Broadway", + "type": "string" }, - "per_page": { - "description": "Number of reviews per page.", - "type": "integer" + "city": { + "example": "New York", + "type": "string" }, - "reviews": { - "description": "User reviews on this page.", + "delivery_url": { + "description": "DeliveryURL is the store's delivery deep link when one is published.\nNote McDonald's points this at a third-party delivery platform.", + "type": "string" + }, + "drive_thru_hours": { + "type": "string" + }, + "facilities": { + "description": "Facilities are McDonald's own amenity codes for the restaurant\n(e.g. GIFTCARDS, MOBILEOFFERS, DRIVETHRU, WIFI).", "items": { - "$ref": "#/definitions/metacritic.UserReview" + "type": "string" }, "type": "array" }, - "slug": { - "description": "Metacritic slug of the title the reviews belong to.", - "type": "string" + "hours": { + "description": "Hours is the full week where McDonald's publishes it.", + "items": { + "$ref": "#/definitions/mcdonalds.RestaurantHours" + }, + "type": "array" }, - "sort": { - "description": "Sort order applied: `date`, `score` or `helpful`.", + "latitude": { + "example": 40.709438, + "type": "number" + }, + "longitude": { + "example": -74.010086, + "type": "number" + }, + "name": { + "example": "160 BROADWAY", "type": "string" }, - "total": { - "description": "Total number of user reviews for the title.", - "type": "integer" + "open_status": { + "example": "OPEN", + "type": "string" }, - "type": { - "description": "Content type of the title: `game`, `movie` or `tv`.", + "postal_code": { + "example": "10038", "type": "string" - } - }, - "type": "object" - }, - "metacritic.Video": { - "properties": { - "duration": { - "description": "Length of the video as Metacritic lists it.", - "type": "integer" }, - "embed_url": { - "description": "URL for embedding the video player.", + "state": { + "example": "NY", "type": "string" }, - "title": { - "description": "Title of the video.", + "store_id": { + "example": "10528", "type": "string" }, - "url": { - "description": "URL of the video.", + "telephone": { + "example": "(212) 385-2066", "type": "string" - } - }, - "type": "object" - }, - "metacritic.browseResponseDoc": { - "properties": { - "code": { - "example": 200, - "type": "integer" }, - "data": { - "$ref": "#/definitions/metacritic.BrowseResponse" + "timezone": { + "type": "string" }, - "msg": { - "example": "OK", + "today_hours": { + "description": "TodayHours and DriveThruHours are the published windows for today.", "type": "string" } }, "type": "object" }, - "metacritic.criticReviewsResponseDoc": { + "mcdonalds.RestaurantHours": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/metacritic.CriticReviewsResponse" + "day_of_week": { + "example": "monday", + "type": "string" }, - "msg": { - "example": "OK", + "hours": { + "example": "00:00 - 00:00", "type": "string" } }, "type": "object" }, - "metacritic.productResponseDoc": { + "mcdonalds.RestaurantMenuChoice": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/metacritic.Product" - }, - "msg": { - "example": "OK", - "type": "string" + "options": { + "items": { + "$ref": "#/definitions/mcdonalds.RestaurantMenuChoiceOption" + }, + "type": "array" } }, "type": "object" }, - "metacritic.userReviewsResponseDoc": { + "mcdonalds.RestaurantMenuChoiceOption": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/metacritic.UserReviewsResponse" + "item_id": { + "example": "14877", + "type": "string" }, - "msg": { - "example": "OK", + "name": { + "example": "Lemonade", "type": "string" + }, + "price_delta": { + "description": "PriceDelta is the additional eat-in/pickup cost of choosing this\noption instead of what's already included: 0 for a same-priced\nswap, negative for a cheaper one, and equal to the option's own\nfull price for an add-on choice (nothing is included to offset\nagainst).", + "example": 0.4, + "type": "number" } }, "type": "object" }, - "metaculus.ForecastHistoryPoint": { + "mcdonalds.RestaurantMenuItem": { "properties": { - "center": { - "description": "Central value of the community forecast, as Metaculus reports it. Same as the first value in `centers`.", - "example": 0.36, - "type": "number" - }, - "centers": { - "description": "All central values of the forecast, as Metaculus reports them. Multiple-choice questions have one per option.", + "choices": { + "description": "Choices lists this item's customizable components McDonald's\npublishes a curated substitute/add-on list for -- e.g. a meal's\ndrink upgrade options, or a dip-able item's sauce choices -- with\nthe live eat-in/pickup price delta for each real alternative.\nPresent only when the upstream payload exposed at least one such\nchoice for this item; see the package doc comment for how these are\nderived and the deliberate fail-closed rule behind what gets left\nout (in particular, plain entree/side substitution is not exposed\nat all -- McDonald's does not publish a curated candidate list for\nit, only for upgrade/add-on style choices).", "items": { - "type": "number" + "$ref": "#/definitions/mcdonalds.RestaurantMenuChoice" }, "type": "array" }, - "end_time": { - "description": "End of the period this point covers, in UTC (RFC 3339).", - "example": "2026-06-01T17:06:20Z", - "type": "string" - }, - "end_ts": { - "description": "End of the period this point covers, in Unix seconds.", - "example": 1780333580.206417, + "delivery_price": { + "example": 8.39, "type": "number" }, - "forecaster_count": { - "description": "Number of forecasters behind this point.", - "example": 17, - "type": "integer" - }, - "interval_lower_bounds": { - "description": "All lower interval bounds of the forecast, in the same order as `centers`.", - "items": { - "type": "number" - }, - "type": "array" + "eat_in_price": { + "example": 7.29, + "type": "number" }, - "interval_upper_bounds": { - "description": "All upper interval bounds of the forecast, in the same order as `centers`.", - "items": { - "type": "number" - }, - "type": "array" + "family_group": { + "description": "FamilyGroup is McDonald's own internal product classification (e.g.\nREGULAR_ENTREE, DESSERT) -- not the same category list\n/mcdonalds/categories returns, and not always present.", + "example": "REGULAR_ENTREE", + "type": "string" }, - "lower": { - "description": "Lower bound of the forecast interval, as Metaculus reports it.", - "example": 0.26, - "type": "number" + "image_url": { + "type": "string" }, - "start_time": { - "description": "Start of the period this point covers, in UTC (RFC 3339).", - "example": "2026-06-01T17:00:00Z", + "item_id": { + "example": "5", "type": "string" }, - "start_ts": { - "description": "Start of the period this point covers, in Unix seconds.", - "example": 1780333200, - "type": "number" + "name": { + "example": "Big Mac®", + "type": "string" }, - "upper": { - "description": "Upper bound of the forecast interval, as Metaculus reports it.", - "example": 0.61, + "pickup_price": { + "example": 7.29, "type": "number" } }, "type": "object" }, - "metaculus.ForecastHistoryResponse": { + "mcdonalds.RestaurantMenuResponse": { "properties": { - "fetched_at": { - "description": "Time the data was fetched, in UTC (RFC 3339).", - "example": "2026-06-07T14:00:00Z", - "type": "string" - }, - "max_points": { - "description": "Maximum number of history points requested. When there are more, the most recent are returned.", - "example": 500, + "count": { + "example": 563, "type": "integer" }, - "method": { - "description": "Aggregation method used: `recency_weighted`, `unweighted` or `single_aggregation`.", - "example": "recency_weighted", + "currency": { + "example": "$", "type": "string" }, - "points": { - "description": "Forecast history points in time order, one item per period.", + "fetched_at": { + "type": "string" + }, + "items": { "items": { - "$ref": "#/definitions/metaculus.ForecastHistoryPoint" + "$ref": "#/definitions/mcdonalds.RestaurantMenuItem" }, "type": "array" }, - "points_count": { - "description": "Number of history points returned.", - "example": 25, - "type": "integer" - }, - "public_page_derived": { - "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", - "example": true, - "type": "boolean" - }, - "question": { - "allOf": [ - { - "$ref": "#/definitions/metaculus.QuestionRow" - } - ], - "description": "Summary of the Metaculus question this response is about." - }, "source_url": { - "description": "URL the data was read from.", - "example": "https://www.metaculus.com/questions/43612/", + "type": "string" + }, + "store_id": { + "example": "10528", "type": "string" } }, "type": "object" }, - "metaculus.ForecastSummary": { + "mcdonalds.RestaurantsResponse": { "properties": { - "center": { - "description": "Central value of the community forecast, as Metaculus reports it.", - "example": 0.52, - "type": "number" - }, - "centers": { - "description": "All central values of the forecast, as Metaculus reports them. Multiple-choice questions have one per option.", - "items": { - "type": "number" - }, - "type": "array" - }, - "forecaster_count": { - "description": "Number of forecasters behind the latest forecast.", - "example": 54, + "count": { + "example": 5, "type": "integer" }, - "history_points": { - "description": "Number of history points available for this method.", - "example": 25, - "type": "integer" + "country": { + "description": "Country echoes the market searched, so a response is self-describing\nwhen several markets are queried in one workflow.", + "example": "us", + "type": "string" }, - "interval_lower_bounds": { - "description": "All lower interval bounds of the forecast, in the same order as `centers`.", - "items": { - "type": "number" - }, - "type": "array" + "fetched_at": { + "type": "string" }, - "interval_upper_bounds": { - "description": "All upper interval bounds of the forecast, in the same order as `centers`.", + "restaurants": { "items": { - "type": "number" + "$ref": "#/definitions/mcdonalds.Restaurant" }, "type": "array" }, - "lower": { - "description": "Lower bound of the forecast interval, as Metaculus reports it.", - "example": 0.37, - "type": "number" - }, - "method": { - "description": "Aggregation method name, for example `recency_weighted`, `unweighted` or `single_aggregation`.", - "example": "recency_weighted", + "source_url": { "type": "string" - }, - "upper": { - "description": "Upper bound of the forecast interval, as Metaculus reports it.", - "example": 0.66, - "type": "number" } }, "type": "object" }, - "metaculus.ForecastsResponse": { + "mcdonalds.categoriesResponseDoc": { "properties": { - "fetched_at": { - "description": "Time the data was fetched, in UTC (RFC 3339).", - "example": "2026-06-07T14:00:00Z", - "type": "string" - }, - "methods": { - "description": "Latest forecast per aggregation method, with the preferred methods first.", - "items": { - "$ref": "#/definitions/metaculus.ForecastSummary" - }, - "type": "array" - }, - "methods_count": { - "description": "Number of aggregation methods returned.", - "example": 3, + "code": { + "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", "type": "integer" }, - "public_page_derived": { - "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", - "example": true, - "type": "boolean" - }, - "question": { - "allOf": [ - { - "$ref": "#/definitions/metaculus.QuestionRow" - } - ], - "description": "Summary of the Metaculus question this response is about." + "data": { + "$ref": "#/definitions/mcdonalds.CategoriesResponse" }, - "source_url": { - "description": "URL the data was read from.", - "example": "https://www.metaculus.com/questions/43612/", - "type": "string" + "msg": { + "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" } }, "type": "object" }, - "metaculus.OptionForecast": { + "mcdonalds.itemListResponseDoc": { "properties": { - "center": { - "description": "Central value of the community forecast for this option.", - "example": 0.42, - "type": "number" - }, - "forecast_value": { - "description": "Forecast value for this option, as Metaculus reports it.", - "example": 0.42, - "type": "number" - }, - "forecaster_count": { - "description": "Number of forecasters behind this option's forecast.", - "example": 5, - "type": "integer" - }, - "index": { - "description": "Position of the option in the question's option list, starting at 0.", - "example": 0, + "code": { + "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", "type": "integer" }, - "label": { - "description": "Name of the option, for example `OpenAI`.", - "example": "OpenAI", - "type": "string" - }, - "lower": { - "description": "Lower bound of the forecast interval for this option.", - "example": 0.31, - "type": "number" - }, - "mean": { - "description": "Mean of the community forecast for this option.", - "example": 0.39, - "type": "number" + "data": { + "$ref": "#/definitions/mcdonalds.ItemListResponse" }, - "upper": { - "description": "Upper bound of the forecast interval for this option.", - "example": 0.43, - "type": "number" + "msg": { + "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" } }, "type": "object" }, - "metaculus.OptionsChange": { + "mcdonalds.itemResponseDoc": { "properties": { - "changed_at": { - "description": "Time the option list changed, as Metaculus reports it.", - "example": "0001-01-01T00:00:00", - "type": "string" + "code": { + "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", + "type": "integer" }, - "options": { - "description": "Option labels in effect from that time.", - "items": { - "type": "string" - }, - "type": "array" + "data": { + "$ref": "#/definitions/mcdonalds.ItemResponse" + }, + "msg": { + "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" } }, "type": "object" }, - "metaculus.OptionsResponse": { + "mcdonalds.menuResponseDoc": { "properties": { - "fetched_at": { - "description": "Time the data was fetched, in UTC (RFC 3339).", - "example": "2026-06-07T14:00:00Z", - "type": "string" - }, - "method": { - "description": "Aggregation method used: `recency_weighted`, `unweighted` or `single_aggregation`.", - "example": "recency_weighted", - "type": "string" - }, - "options": { - "description": "Latest forecast for each option of the question.", - "items": { - "$ref": "#/definitions/metaculus.OptionForecast" - }, - "type": "array" - }, - "options_count": { - "description": "Number of options returned.", - "example": 2, + "code": { + "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", "type": "integer" }, - "options_history": { - "description": "Earlier versions of the option list, when the options changed.", - "items": { - "$ref": "#/definitions/metaculus.OptionsChange" - }, - "type": "array" - }, - "public_page_derived": { - "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", - "example": true, - "type": "boolean" - }, - "question": { - "allOf": [ - { - "$ref": "#/definitions/metaculus.QuestionRow" - } - ], - "description": "Summary of the Metaculus question this response is about." + "data": { + "$ref": "#/definitions/mcdonalds.MenuResponse" }, - "source_url": { - "description": "URL the data was read from.", - "example": "https://www.metaculus.com/questions/43731/", - "type": "string" + "msg": { + "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" } }, "type": "object" }, - "metaculus.Project": { + "mcdonalds.restaurantMenuResponseDoc": { "properties": { - "emoji": { - "description": "Emoji shown next to the category or project on Metaculus.", - "example": "💼", - "type": "string" - }, - "id": { - "description": "Metaculus id of the category or project.", - "example": 3698, + "code": { + "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", "type": "integer" }, - "name": { - "description": "Display name, for example `Economy & Business`.", - "example": "Economy & Business", - "type": "string" - }, - "slug": { - "description": "URL slug, for example `economy-business`.", - "example": "economy-business", - "type": "string" + "data": { + "$ref": "#/definitions/mcdonalds.RestaurantMenuResponse" }, - "type": { - "description": "Kind of project, for example `category` or `tournament`.", - "example": "category", - "type": "string" + "msg": { + "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" } }, "type": "object" }, - "metaculus.QuestionMetadataResponse": { + "mcdonalds.restaurantsResponseDoc": { "properties": { - "actual_close_time": { - "description": "Time the question actually closed to forecasts, as Metaculus reports it.", - "example": "2026-12-30T23:59:00Z", - "type": "string" - }, - "actual_resolve_time": { - "description": "Time the question actually resolved, as Metaculus reports it.", - "example": "2027-01-02T00:00:00Z", - "type": "string" - }, - "all_options_ever": { - "description": "Every option label the question has ever had.", - "items": { - "type": "string" - }, - "type": "array" + "code": { + "description": "Code is the HTTP status code or a custom code used to indicate the result of the request\n@example 200", + "type": "integer" }, - "default_aggregation_method": { - "description": "Aggregation method Metaculus shows by default, for example `recency_weighted`.", - "example": "recency_weighted", - "type": "string" + "data": { + "$ref": "#/definitions/mcdonalds.RestaurantsResponse" }, - "default_score_type": { - "description": "Score type Metaculus uses by default, for example `peer`.", - "example": "peer", + "msg": { + "description": "Msg is the message that describes the result of the request\n@example \"Request successful\"" + } + }, + "type": "object" + }, + "mediaite.AuthorArticle": { + "properties": { + "date": { "type": "string" }, - "fetched_at": { - "description": "Time the data was fetched, in UTC (RFC 3339).", - "example": "2026-06-07T14:00:00Z", + "title": { "type": "string" }, - "group_variable": { - "description": "Name of the variable that distinguishes the questions in a group, for example `Company`.", - "example": "Company", + "url": { "type": "string" - }, - "inbound_outcome_count": { - "description": "Number of outcomes inside the question's range.", - "example": 10, - "type": "integer" - }, - "include_bots_in_aggregates": { - "description": "Whether bot forecasts are included in the aggregate forecasts.", - "example": false, - "type": "boolean" - }, - "open_lower_bound": { - "description": "Whether the answer can fall below the lower end of the range.", - "example": false, - "type": "boolean" - }, - "open_upper_bound": { - "description": "Whether the answer can fall above the upper end of the range.", - "example": false, - "type": "boolean" - }, - "options": { - "description": "Current option labels of a multiple-choice question.", - "items": { - "type": "string" - }, - "type": "array" - }, - "options_history": { - "description": "Earlier versions of the option list, when the options changed.", + } + }, + "type": "object" + }, + "mediaite.AuthorResponse": { + "properties": { + "articles": { "items": { - "$ref": "#/definitions/metaculus.OptionsChange" + "$ref": "#/definitions/mediaite.AuthorArticle" }, "type": "array" }, - "options_order": { - "description": "How the options are ordered, for example `DEFAULT`.", - "example": "DEFAULT", + "avatar_url": { "type": "string" }, - "possibilities": { - "description": "Possible outcomes of the question, as Metaculus describes them." - }, - "public_page_derived": { - "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", - "example": true, - "type": "boolean" - }, - "question": { - "allOf": [ - { - "$ref": "#/definitions/metaculus.QuestionRow" - } - ], - "description": "Summary of the Metaculus question this response is about." - }, - "resolution": { - "description": "Resolution of the question, as Metaculus reports it. Omitted while unresolved.", + "bio": { "type": "string" }, - "resolution_set_time": { - "description": "Time the resolution was set, as Metaculus reports it.", - "example": "2027-01-02T00:00:00Z", + "email": { "type": "string" }, - "scaling": { - "allOf": [ - { - "$ref": "#/definitions/metaculus.QuestionScaling" - } - ], - "description": "Range and scale settings of a numeric or date question." - }, - "short_title": { - "description": "Short form of the question title.", - "example": "OpenAI or Anthropic - higher valuation on Jan 1, 2027?", + "name": { "type": "string" }, - "source_url": { - "description": "URL the data was read from.", - "example": "https://www.metaculus.com/questions/43731/", - "type": "string" - } - }, - "type": "object" - }, - "metaculus.QuestionResponse": { - "properties": { - "fetched_at": { - "example": "2026-06-07T14:00:00Z", + "slug": { "type": "string" }, - "question": { - "$ref": "#/definitions/metaculus.QuestionRow" + "twitter": { + "type": "string" }, - "source_url": { - "example": "https://www.metaculus.com/questions/43612/", + "url": { "type": "string" } }, "type": "object" }, - "metaculus.QuestionRow": { + "medicalnewstoday.ArticleResponse": { "properties": { - "categories": { - "description": "Categories the question is filed under.", + "authors": { "items": { - "$ref": "#/definitions/metaculus.Project" + "type": "string" }, "type": "array" }, - "comment_count": { - "description": "Number of comments on the question.", - "example": 16, - "type": "integer" - }, - "edited_at": { - "description": "Time the question was last edited, in UTC (RFC 3339).", - "example": "2026-06-07T13:14:34Z", + "description": { "type": "string" }, - "forecaster_count": { - "description": "Number of forecasters who have forecast on the question.", - "example": 54, - "type": "integer" - }, - "forecasts_count": { - "description": "Total number of forecasts submitted on the question.", - "example": 149, - "type": "integer" - }, - "id": { - "description": "Metaculus post id of the question. Use it with the question endpoints.", - "example": 43612, - "type": "integer" - }, - "latest_forecast_center": { - "description": "Central value of the latest community forecast, as Metaculus reports it.", - "example": 0.52, - "type": "number" - }, - "latest_forecast_lower": { - "description": "Lower bound of the latest community forecast interval.", - "example": 0.37, - "type": "number" - }, - "latest_forecast_upper": { - "description": "Upper bound of the latest community forecast interval.", - "example": 0.66, - "type": "number" - }, - "open_time": { - "description": "Time the question opened for forecasts, in UTC (RFC 3339).", - "example": "2026-06-01T17:00:00Z", + "image_url": { "type": "string" }, - "projects": { - "description": "Tournaments and projects the question belongs to.", + "paragraphs": { "items": { - "$ref": "#/definitions/metaculus.Project" + "type": "string" }, "type": "array" }, - "public_page_derived": { - "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", - "example": true, + "paywalled": { + "description": "Paywalled is true when the publisher serves only a teaser of this\narticle to anonymous readers, so Paragraphs is a partial body rather than\nthe full text. It is omitted when the full public body was returned.", "type": "boolean" }, "published_at": { - "description": "Time the question was published, in UTC (RFC 3339).", - "example": "2026-05-29T15:33:53Z", - "type": "string" - }, - "question_id": { - "description": "Metaculus id of the underlying question, which can differ from the post `id`.", - "example": 43609, - "type": "integer" - }, - "question_title": { - "description": "Full wording of the question.", - "example": "What will be the World Bank monthly price of liquid sulphur in June 2026?", "type": "string" }, - "question_type": { - "description": "Question type, for example `binary`, `numeric` or `multiple_choice`.", - "example": "numeric", + "section": { "type": "string" }, - "resolved": { - "description": "Whether the question has been resolved.", - "example": false, - "type": "boolean" - }, - "scheduled_close_time": { - "description": "Time the question is scheduled to close to forecasts, in UTC (RFC 3339).", - "example": "2026-07-15T00:00:00Z", + "title": { "type": "string" }, - "scheduled_resolve_time": { - "description": "Time the question is scheduled to resolve, in UTC (RFC 3339).", - "example": "2026-09-07T00:00:00Z", + "updated_at": { "type": "string" }, - "slug": { - "description": "URL slug of the question.", - "example": "tampa-sulphur-price-in-june-2026", + "url": { "type": "string" + } + }, + "type": "object" + }, + "medicalnewstoday.AuthorResponse": { + "properties": { + "articles": { + "items": { + "$ref": "#/definitions/newsplatform.HeadlineItem" + }, + "type": "array" }, - "status": { - "description": "Question status on Metaculus, for example `open`.", - "example": "open", + "bio": { "type": "string" }, - "title": { - "description": "Question title as shown on Metaculus.", - "example": "Tampa sulphur price in June 2026?", + "name": { "type": "string" }, - "unit": { - "description": "Unit of the answer for numeric questions, for example `USD/metric ton`.", - "example": "USD/metric ton", + "slug": { "type": "string" }, "url": { - "description": "Metaculus page URL of the question.", - "example": "https://www.metaculus.com/questions/43612/tampa-sulphur-price-in-june-2026/", "type": "string" } }, "type": "object" }, - "metaculus.QuestionScaling": { + "medicalnewstoday.HeadlinesResponse": { "properties": { - "continuous_range": { - "description": "ContinuousRange passes through Metaculus's scaling.continuous_range: null\nfor discrete questions, an array of numbers (the CDF internal locations)\nfor continuous/numeric ones. It was previously typed []string, so hydrating\na commented continuous question failed to decode and 503'd the comments\nfeeds; numbers are the correct element type.", - "items": {}, + "items": { + "items": { + "$ref": "#/definitions/newsplatform.HeadlineItem" + }, "type": "array" }, - "inbound_outcome_count": { - "description": "Number of outcomes inside the question's range.", - "example": 10, - "type": "integer" - }, - "nominal_max": { - "description": "Highest value of the range as shown to forecasters.", - "example": 100, - "type": "number" - }, - "nominal_min": { - "description": "Lowest value of the range as shown to forecasters.", - "example": 0, - "type": "number" - }, - "open_lower_bound": { - "description": "Whether the answer can fall below the lower end of the range.", - "example": false, - "type": "boolean" - }, - "open_upper_bound": { - "description": "Whether the answer can fall above the upper end of the range.", - "example": false, - "type": "boolean" - }, - "range_max": { - "description": "Upper end of the question's range.", - "example": 100, - "type": "number" - }, - "range_min": { - "description": "Lower end of the question's range.", - "example": 0, - "type": "number" - }, - "zero_point": { - "description": "Zero point of the question's range, when Metaculus defines one.", - "example": 0, - "type": "number" + "section": { + "type": "string" } }, "type": "object" }, - "metaculus.QuestionsResponse": { + "medicalnewstoday.NewsResponse": { "properties": { - "feed": { - "description": "Feed the questions came from, for example `questions`.", - "example": "questions", - "type": "string" - }, - "fetched_at": { - "description": "Time the data was fetched, in UTC (RFC 3339).", - "example": "2026-06-07T14:00:00Z", - "type": "string" - }, - "limit": { - "description": "Maximum number of questions requested.", - "example": 10, - "type": "integer" - }, - "questions": { - "description": "Questions in the feed, one item per question.", + "items": { "items": { - "$ref": "#/definitions/metaculus.QuestionRow" + "$ref": "#/definitions/newsplatform.HeadlineItem" }, "type": "array" - }, - "source_url": { - "description": "URL the data was read from.", - "example": "https://www.metaculus.com/questions/", - "type": "string" } }, "type": "object" }, - "metaculus.forecastHistoryResponseDoc": { + "medicalnewstoday.SectionsResponse": { + "properties": { + "sections": { + "items": { + "$ref": "#/definitions/newsplatform.Section" + }, + "type": "array" + } + }, + "type": "object" + }, + "medicalnewstoday.articleResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metaculus.ForecastHistoryResponse" + "$ref": "#/definitions/medicalnewstoday.ArticleResponse" }, "msg": { "example": "OK", @@ -122937,14 +124760,14 @@ }, "type": "object" }, - "metaculus.forecastsResponseDoc": { + "medicalnewstoday.authorResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metaculus.ForecastsResponse" + "$ref": "#/definitions/medicalnewstoday.AuthorResponse" }, "msg": { "example": "OK", @@ -122953,14 +124776,14 @@ }, "type": "object" }, - "metaculus.metadataResponseDoc": { + "medicalnewstoday.headlinesResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metaculus.QuestionMetadataResponse" + "$ref": "#/definitions/medicalnewstoday.HeadlinesResponse" }, "msg": { "example": "OK", @@ -122969,14 +124792,14 @@ }, "type": "object" }, - "metaculus.optionsResponseDoc": { + "medicalnewstoday.newsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metaculus.OptionsResponse" + "$ref": "#/definitions/medicalnewstoday.NewsResponse" }, "msg": { "example": "OK", @@ -122985,14 +124808,14 @@ }, "type": "object" }, - "metaculus.questionResponseDoc": { + "medicalnewstoday.sectionsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metaculus.QuestionResponse" + "$ref": "#/definitions/medicalnewstoday.SectionsResponse" }, "msg": { "example": "OK", @@ -123001,205 +124824,258 @@ }, "type": "object" }, - "metaculus.questionsResponseDoc": { + "men.AuthorArticle": { "properties": { - "code": { - "example": 200, - "type": "integer" + "label": { + "type": "string" }, - "data": { - "$ref": "#/definitions/metaculus.QuestionsResponse" + "label_url": { + "type": "string" }, - "msg": { - "example": "OK", + "title": { + "type": "string" + }, + "url": { "type": "string" } }, "type": "object" }, - "metajobs.ListResponse": { + "men.AuthorResponse": { "properties": { - "listings": { + "articles": { "items": { - "$ref": "#/definitions/metajobs.MetaJobListing" + "$ref": "#/definitions/men.AuthorArticle" }, "type": "array" }, - "page": { - "example": 1, - "type": "integer" + "bio": { + "type": "string" }, - "page_size": { - "example": 50, - "type": "integer" + "email": { + "type": "string" }, - "source_url": { + "job_title": { "type": "string" }, - "total": { - "example": 754, - "type": "integer" + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "twitter": { + "type": "string" + }, + "url": { + "type": "string" } }, "type": "object" }, - "metajobs.MetaJob": { + "mercari.AutocompleteResponse": { "properties": { - "compensation_country": { - "example": "US", - "type": "string" - }, - "compensation_max": { - "example": "$241,000/year", - "type": "string" - }, - "compensation_min": { - "example": "$173,000/year", + "query": { "type": "string" }, - "departments": { - "example": [ - "Product Management" - ], + "suggestions": { "items": { "type": "string" }, "type": "array" - }, - "description": { - "type": "string" + } + }, + "type": "object" + }, + "mercari.Brand": { + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "mercari.Category": { + "properties": { + "icon_url": { + "type": "string" }, "id": { - "example": "1238249364564427", + "type": "integer" + }, + "name": { "type": "string" }, - "locations": { - "example": [ - "Menlo Park", - " CA" - ], + "parent_id": { + "type": "integer" + } + }, + "type": "object" + }, + "mercari.HomeResponse": { + "properties": { + "items": { "items": { - "type": "string" + "$ref": "#/definitions/mercari.ItemSummary" }, "type": "array" + } + }, + "type": "object" + }, + "mercari.ItemDetailResponse": { + "properties": { + "category_code": { + "type": "integer" }, - "minimum_qualifications": { + "condition_code": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "hashtags": { "items": { "type": "string" }, "type": "array" }, - "preferred_qualifications": { + "id": { + "type": "string" + }, + "photos": { "items": { "type": "string" }, "type": "array" }, - "responsibilities": { + "price_cents": { + "type": "integer" + }, + "shipping_from_state": { + "type": "string" + }, + "similar_items": { "items": { - "type": "string" + "$ref": "#/definitions/mercari.ItemSummary" }, "type": "array" }, "title": { - "example": "Product Manager", "type": "string" }, "url": { - "example": "https://www.metacareers.com/profile/job_details/1238249364564427/", "type": "string" } }, "type": "object" }, - "metajobs.MetaJobListing": { + "mercari.ItemSummary": { "properties": { + "condition_code": { + "type": "integer" + }, + "created_at_unix": { + "type": "integer" + }, "id": { - "example": "1238249364564427", "type": "string" }, - "last_modified": { - "example": "2026-07-29T01:17:34-07:00", + "num_likes": { + "type": "integer" + }, + "original_price_cents": { + "type": "integer" + }, + "price_cents": { + "type": "integer" + }, + "seller_id": { + "type": "string" + }, + "thumbnail_url": { "type": "string" }, + "title": { + "type": "string" + }, + "updated_at_unix": { + "type": "integer" + }, "url": { - "example": "https://www.metacareers.com/profile/job_details/1238249364564427/", "type": "string" } }, "type": "object" }, - "metajobs.MetaJobSearchResult": { + "mercari.MasterResponse": { "properties": { - "id": { - "example": "1010234865172301", - "type": "string" - }, - "locations": { - "example": [ - "Sunnyvale", - " CA" - ], + "brands": { "items": { - "type": "string" + "$ref": "#/definitions/mercari.Brand" }, "type": "array" }, - "sub_teams": { - "example": [ - "Hardware" - ], + "categories": { "items": { - "type": "string" + "$ref": "#/definitions/mercari.Category" }, "type": "array" }, - "teams": { - "example": [ - "Infrastructure" - ], + "sizes": { "items": { - "type": "string" + "$ref": "#/definitions/mercari.Size" }, "type": "array" - }, - "title": { - "example": "ASIC Engineer, Design", - "type": "string" - }, - "url": { - "example": "https://www.metacareers.com/profile/job_details/1010234865172301/", - "type": "string" } }, "type": "object" }, - "metajobs.SearchResponse": { + "mercari.SearchResponse": { "properties": { - "jobs": { + "items": { "items": { - "$ref": "#/definitions/metajobs.MetaJobSearchResult" + "$ref": "#/definitions/mercari.ItemSummary" }, "type": "array" }, - "source_url": { + "query": { "type": "string" }, - "total": { - "example": 58, + "total_results": { "type": "integer" } }, "type": "object" }, - "metajobs.jobResponseDoc": { + "mercari.Size": { + "properties": { + "code": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "short_name": { + "type": "string" + } + }, + "type": "object" + }, + "mercari.autocompleteResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metajobs.MetaJob" + "$ref": "#/definitions/mercari.AutocompleteResponse" }, "msg": { "example": "OK", @@ -123208,14 +125084,14 @@ }, "type": "object" }, - "metajobs.listResponseDoc": { + "mercari.homeResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metajobs.ListResponse" + "$ref": "#/definitions/mercari.HomeResponse" }, "msg": { "example": "OK", @@ -123224,14 +125100,14 @@ }, "type": "object" }, - "metajobs.searchResponseDoc": { + "mercari.masterResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/metajobs.SearchResponse" + "$ref": "#/definitions/mercari.MasterResponse" }, "msg": { "example": "OK", @@ -123240,1104 +125116,1304 @@ }, "type": "object" }, - "metro.AuthorArticle": { + "mercari.searchResponseDoc": { "properties": { - "image_url": { - "type": "string" - }, - "published_at": { - "type": "string" - }, - "section": { - "type": "string" - }, - "summary": { - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "title": { - "type": "string" + "data": { + "$ref": "#/definitions/mercari.SearchResponse" }, - "url": { + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "metro.AuthorResponse": { + "metacritic.BrowseItem": { "properties": { - "articles": { + "description": { + "type": "string" + }, + "genres": { "items": { - "$ref": "#/definitions/metro.AuthorArticle" + "$ref": "#/definitions/metacritic.Genre" }, "type": "array" }, - "bio": { + "id": { + "type": "integer" + }, + "image": { "type": "string" }, - "image_url": { + "metascore": { + "$ref": "#/definitions/metacritic.ScoreSummary" + }, + "premiere_year": { + "type": "integer" + }, + "rating": { "type": "string" }, - "job_title": { + "release_date": { "type": "string" }, - "knows_about": { - "items": { - "type": "string" - }, - "type": "array" + "season_count": { + "type": "integer" }, - "name": { + "slug": { "type": "string" }, - "same_as": { - "items": { - "type": "string" - }, - "type": "array" + "title": { + "type": "string" + }, + "type": { + "example": "game", + "type": "string" }, "url": { "type": "string" + }, + "user_score": { + "type": "number" } }, "type": "object" }, - "microsoftstore.AgeRating": { + "metacritic.BrowseResponse": { "properties": { - "age": { - "example": 13, - "type": "integer" - }, - "description": { - "example": "For ages 13 and up", + "genre": { "type": "string" }, - "descriptors": { - "example": [ - "[\"Diverse Content: Discretion Advised\"]" - ], + "items": { "items": { - "type": "string" + "$ref": "#/definitions/metacritic.BrowseItem" }, "type": "array" }, - "system": { - "example": "ESRB", + "page": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "sort": { "type": "string" }, - "value": { - "example": "TEEN", + "total": { + "type": "integer" + }, + "type": { "type": "string" } }, "type": "object" }, - "microsoftstore.Award": { + "metacritic.Credit": { "properties": { - "category": { - "example": "Productivity category", + "name": { + "description": "Name of the person credited.", "type": "string" }, - "description": { - "example": "The Microsoft Store Awards celebrate apps and games that emphasize exceptional experiences for their users.", + "role": { + "description": "Role of the person on the title, for example `Director`.", + "example": "Director", + "type": "string" + } + }, + "type": "object" + }, + "metacritic.CriticReview": { + "properties": { + "author": { + "description": "Name of the critic who wrote the review.", "type": "string" }, - "editorial_id": { - "example": "Editorials/Awards_2025/Global/Notion_xpdbvss44r0l9h", + "date": { + "description": "Date the review was published, in YYYY-MM-DD.", + "example": "2022-02-23", "type": "string" }, - "title": { - "example": "Microsoft Store Awards 2025", + "platform": { + "description": "Platform the game was reviewed on. Set for game reviews.", "type": "string" }, - "year": { - "example": 2025, + "publication": { + "description": "Name of the publication that published the review.", + "type": "string" + }, + "publication_slug": { + "description": "Metacritic slug of the publication.", + "type": "string" + }, + "quote": { + "description": "Excerpt or summary of the review text.", + "type": "string" + }, + "score": { + "description": "Score the critic gave, out of 100. Omitted when the review has no score.", "type": "integer" + }, + "url": { + "description": "URL of the full review on the publication's site.", + "type": "string" } }, "type": "object" }, - "microsoftstore.Badge": { + "metacritic.CriticReviewsResponse": { "properties": { - "icon_id": { - "example": "AI", + "page": { + "description": "Page number returned, starting at 1.", + "type": "integer" + }, + "per_page": { + "description": "Number of reviews per page.", + "type": "integer" + }, + "reviews": { + "description": "Critic reviews on this page.", + "items": { + "$ref": "#/definitions/metacritic.CriticReview" + }, + "type": "array" + }, + "slug": { + "description": "Metacritic slug of the title the reviews belong to.", "type": "string" }, - "text": { - "example": "Uses AI features", + "sort": { + "description": "Sort order applied: `date`, `score` or `publication`.", + "type": "string" + }, + "total": { + "description": "Total number of critic reviews for the title.", + "type": "integer" + }, + "type": { + "description": "Content type of the title: `game`, `movie` or `tv`.", "type": "string" } }, "type": "object" }, - "microsoftstore.CategoriesResponse": { + "metacritic.Genre": { "properties": { - "categories": { - "items": { - "$ref": "#/definitions/microsoftstore.CategoryTaxonomy" - }, - "type": "array" + "id": { + "description": "Metacritic genre id.", + "type": "integer" }, - "media_type": { - "example": "apps", + "name": { + "description": "Genre name, for example `Action RPG`.", "type": "string" } }, "type": "object" }, - "microsoftstore.CategoryResponse": { + "metacritic.Platform": { "properties": { - "category": { - "example": "Photo & video", - "type": "string" - }, - "count": { - "example": 20, + "id": { + "description": "Metacritic platform id.", "type": "integer" }, - "has_more": { - "example": true, + "is_lead": { + "description": "Whether this is the game's lead platform.", "type": "boolean" }, - "items": { - "items": { - "$ref": "#/definitions/microsoftstore.Product" - }, - "type": "array" - }, - "media_type": { - "example": "apps", - "type": "string" + "metascore": { + "allOf": [ + { + "$ref": "#/definitions/metacritic.ScoreSummary" + } + ], + "description": "Critic score summary for the game on this platform." }, - "next_cursor": { + "name": { + "description": "Platform name, for example `PlayStation 5`.", + "example": "PlayStation 5", "type": "string" }, - "source_url": { + "release_date": { + "description": "Release date of the game on this platform.", "type": "string" } }, "type": "object" }, - "microsoftstore.CategoryTaxonomy": { + "metacritic.Product": { "properties": { - "category": { - "example": "Books & reference", - "type": "string" - }, - "subcategories": { - "example": [ - "[\"E-reader\"", - "\"Fiction\"", - "\"Nonfiction\"", - "\"Reference\"]" - ], + "countries": { + "description": "Countries Metacritic lists for the title.", "items": { "type": "string" }, "type": "array" - } - }, - "type": "object" - }, - "microsoftstore.ChartsResponse": { - "properties": { - "category": { - "example": "Photo & video", + }, + "description": { + "description": "Plot or game summary as shown on Metacritic.", "type": "string" }, - "count": { - "example": 20, + "duration": { + "description": "Running time of the title as Metacritic lists it.", "type": "integer" }, - "discount_filter": { - "example": "onsale", - "type": "string" - }, - "items": { + "genres": { + "description": "Genres Metacritic assigns to the title.", "items": { - "$ref": "#/definitions/microsoftstore.Product" + "$ref": "#/definitions/metacritic.Genre" }, "type": "array" }, - "list": { - "example": "TopFree", + "id": { + "description": "Metacritic's numeric id for the title.", + "type": "integer" + }, + "image": { + "description": "Main image of the title as Metacritic lists it.", "type": "string" }, - "media_type": { - "example": "apps", + "imdb_id": { + "description": "IMDb id of the title, for example `tt0903747`.", "type": "string" }, - "num_players_filter": { - "example": "SinglePlayer", + "imdb_url": { + "description": "URL of the title's IMDb page.", "type": "string" }, - "page": { - "example": 1, - "type": "integer" + "in_theaters": { + "description": "Whether the movie is currently in theaters. Omitted when false.", + "type": "boolean" }, - "page_size": { - "example": 20, + "metascore": { + "allOf": [ + { + "$ref": "#/definitions/metacritic.ScoreSummary" + } + ], + "description": "Critic score summary for the title." + }, + "networks": { + "description": "TV networks that air the show.", + "items": { + "type": "string" + }, + "type": "array" + }, + "platforms": { + "description": "Platforms the game is released on, each with its own Metascore.", + "items": { + "$ref": "#/definitions/metacritic.Platform" + }, + "type": "array" + }, + "premiere_year": { + "description": "Year the title premiered or was first released.", "type": "integer" }, - "source_url": { + "production": { + "allOf": [ + { + "$ref": "#/definitions/metacritic.Production" + } + ], + "description": "Companies, crew and official site for the title." + }, + "rating": { + "description": "Content rating of the title, for example `M` or `TV-MA`.", + "example": "M", "type": "string" }, - "subcategory": { - "example": "E-reader", + "release_date": { + "description": "Release date of the title, in YYYY-MM-DD.", + "example": "2022-02-25", "type": "string" }, - "subscription_filter": { - "example": "gamepass", + "season_count": { + "description": "Number of seasons of the show.", + "type": "integer" + }, + "slug": { + "description": "Metacritic URL slug of the title. Use it with the review endpoints.", + "type": "string" + }, + "tagline": { + "description": "Marketing tagline of the title.", "type": "string" }, "title": { - "example": "Must-have free apps", + "description": "Title name as shown on Metacritic.", + "type": "string" + }, + "type": { + "description": "Content type of the title: `game`, `movie` or `tv`.", + "example": "game", "type": "string" + }, + "url": { + "description": "Metacritic page URL of the title.", + "type": "string" + }, + "user_score": { + "allOf": [ + { + "$ref": "#/definitions/metacritic.ScoreSummary" + } + ], + "description": "User score summary for the title. Omitted when it has no user score yet." + }, + "video": { + "allOf": [ + { + "$ref": "#/definitions/metacritic.Video" + } + ], + "description": "Trailer or clip Metacritic links for the title." } }, "type": "object" }, - "microsoftstore.EditorialResponse": { + "metacritic.Production": { "properties": { - "editorial_id": { - "example": "Editorials/Awards_2025/Global/Notion_xpdbvss44r0l9h", - "type": "string" - }, - "header_image": { - "type": "string" - }, - "paragraphs": { + "companies": { + "description": "Companies involved in making or publishing the title, without duplicates (up to 12).", "items": { "type": "string" }, "type": "array" }, - "relevant_products": { + "crew": { + "description": "Crew credits for the title.", "items": { - "$ref": "#/definitions/microsoftstore.Product" + "$ref": "#/definitions/metacritic.Credit" }, "type": "array" }, - "source_url": { + "official_site": { + "description": "URL of the title's official website.", "type": "string" + } + }, + "type": "object" + }, + "metacritic.ScoreSummary": { + "properties": { + "max": { + "description": "Highest possible value of `score`, for example `100`.", + "example": 100, + "type": "integer" }, - "subtitle": { - "$ref": "#/definitions/microsoftstore.EditorialSubtitle" + "negative_count": { + "description": "Number of negative reviews counted in the score.", + "type": "integer" }, - "title": { - "example": "Productivity category", + "neutral_count": { + "description": "Number of neutral (mixed) reviews counted in the score.", + "type": "integer" + }, + "positive_count": { + "description": "Number of positive reviews counted in the score.", + "type": "integer" + }, + "review_count": { + "description": "Number of reviews the score is based on.", + "type": "integer" + }, + "score": { + "description": "Score value on the scale given by `max`. Metascores are out of 100 and user scores out of 10.", + "type": "number" + }, + "sentiment": { + "description": "Metacritic's verdict for the score, for example `Universal acclaim`.", + "example": "Universal acclaim", + "type": "string" + }, + "url": { + "description": "Metacritic page listing the reviews behind the score.", "type": "string" } }, "type": "object" }, - "microsoftstore.EditorialSubtitle": { + "metacritic.UserReview": { "properties": { - "icon": { + "author": { + "description": "Username of the member who wrote the review.", "type": "string" }, - "text": { - "example": "Microsoft Store Awards 2025", + "date": { + "description": "Date the review was posted, in YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Metacritic review id.", + "type": "string" + }, + "platform": { + "description": "Platform the game was reviewed on. Set for game reviews.", + "type": "string" + }, + "quote": { + "description": "Text of the user review.", "type": "string" + }, + "score": { + "description": "Score the user gave, out of 10. Omitted when the review has no score.", + "type": "integer" + }, + "spoiler": { + "description": "Whether the review is flagged as containing spoilers.", + "type": "boolean" + }, + "thumbs_down": { + "description": "Number of members who voted the review not helpful.", + "type": "integer" + }, + "thumbs_up": { + "description": "Number of members who voted the review helpful.", + "type": "integer" } }, "type": "object" }, - "microsoftstore.EventsResponse": { + "metacritic.UserReviewsResponse": { "properties": { - "count": { - "example": 7, + "page": { + "description": "Page number returned, starting at 1.", "type": "integer" }, - "items": { + "per_page": { + "description": "Number of reviews per page.", + "type": "integer" + }, + "reviews": { + "description": "User reviews on this page.", "items": { - "$ref": "#/definitions/microsoftstore.Product" + "$ref": "#/definitions/metacritic.UserReview" }, "type": "array" }, - "media_type": { - "example": "apps", + "slug": { + "description": "Metacritic slug of the title the reviews belong to.", "type": "string" }, - "page": { - "example": 1, + "sort": { + "description": "Sort order applied: `date`, `score` or `helpful`.", + "type": "string" + }, + "total": { + "description": "Total number of user reviews for the title.", "type": "integer" }, - "page_size": { - "example": 20, + "type": { + "description": "Content type of the title: `game`, `movie` or `tv`.", + "type": "string" + } + }, + "type": "object" + }, + "metacritic.Video": { + "properties": { + "duration": { + "description": "Length of the video as Metacritic lists it.", "type": "integer" }, - "source_url": { + "embed_url": { + "description": "URL for embedding the video player.", "type": "string" }, "title": { - "example": "Special events", + "description": "Title of the video.", + "type": "string" + }, + "url": { + "description": "URL of the video.", "type": "string" } }, "type": "object" }, - "microsoftstore.Feature": { + "metacritic.browseResponseDoc": { "properties": { - "description": { - "example": "Get answers, writing help, and image generation.", - "type": "string" + "code": { + "example": 200, + "type": "integer" }, - "title": { - "example": "AI assistant", + "data": { + "$ref": "#/definitions/metacritic.BrowseResponse" + }, + "msg": { + "example": "OK", "type": "string" } }, "type": "object" }, - "microsoftstore.Image": { + "metacritic.criticReviewsResponseDoc": { "properties": { - "height": { - "example": 1080, + "code": { + "example": 200, "type": "integer" }, - "type": { - "example": "Screenshot", - "type": "string" + "data": { + "$ref": "#/definitions/metacritic.CriticReviewsResponse" }, - "url": { - "example": "https://store-images.s-microsoft.com/image/apps.19060...f4dfc459-dae3-4ab8-8f40-18aa7ae9762f", + "msg": { + "example": "OK", "type": "string" + } + }, + "type": "object" + }, + "metacritic.productResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" }, - "width": { - "example": 1920, + "data": { + "$ref": "#/definitions/metacritic.Product" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "metacritic.userReviewsResponseDoc": { + "properties": { + "code": { + "example": 200, "type": "integer" + }, + "data": { + "$ref": "#/definitions/metacritic.UserReviewsResponse" + }, + "msg": { + "example": "OK", + "type": "string" } }, "type": "object" }, - "microsoftstore.Product": { + "metaculus.ForecastHistoryPoint": { "properties": { - "average_rating": { - "example": 4.3, + "center": { + "description": "Central value of the community forecast, as Metaculus reports it. Same as the first value in `centers`.", + "example": 0.36, "type": "number" }, - "award": { - "$ref": "#/definitions/microsoftstore.Award" - }, - "categories": { - "example": [ - "[\"Music\"]" - ], + "centers": { + "description": "All central values of the forecast, as Metaculus reports them. Multiple-choice questions have one per option.", "items": { - "type": "string" + "type": "number" }, "type": "array" }, - "description": { - "example": "Love music and podcasts? Play your favorite songs...", - "type": "string" - }, - "display_price": { - "example": "Free", - "type": "string" - }, - "free": { - "example": true, - "type": "boolean" - }, - "icon_url": { - "example": "https://store-images.s-microsoft.com/image/apps.10546...", + "end_time": { + "description": "End of the period this point covers, in UTC (RFC 3339).", + "example": "2026-06-01T17:06:20Z", "type": "string" }, - "is_application": { - "example": true, - "type": "boolean" + "end_ts": { + "description": "End of the period this point covers, in Unix seconds.", + "example": 1780333580.206417, + "type": "number" }, - "is_game": { - "type": "boolean" + "forecaster_count": { + "description": "Number of forecasters behind this point.", + "example": 17, + "type": "integer" }, - "is_pwa": { - "type": "boolean" + "interval_lower_bounds": { + "description": "All lower interval bounds of the forecast, in the same order as `centers`.", + "items": { + "type": "number" + }, + "type": "array" }, - "is_subscription": { - "type": "boolean" + "interval_upper_bounds": { + "description": "All upper interval bounds of the forecast, in the same order as `centers`.", + "items": { + "type": "number" + }, + "type": "array" }, - "is_theme": { - "type": "boolean" + "lower": { + "description": "Lower bound of the forecast interval, as Metaculus reports it.", + "example": 0.26, + "type": "number" }, - "kind": { - "example": "app", + "start_time": { + "description": "Start of the period this point covers, in UTC (RFC 3339).", + "example": "2026-06-01T17:00:00Z", "type": "string" }, - "media_type": { - "example": "Apps", - "type": "string" + "start_ts": { + "description": "Start of the period this point covers, in Unix seconds.", + "example": 1780333200, + "type": "number" }, - "poster_art_url": { + "upper": { + "description": "Upper bound of the forecast interval, as Metaculus reports it.", + "example": 0.61, + "type": "number" + } + }, + "type": "object" + }, + "metaculus.ForecastHistoryResponse": { + "properties": { + "fetched_at": { + "description": "Time the data was fetched, in UTC (RFC 3339).", + "example": "2026-06-07T14:00:00Z", "type": "string" }, - "price": { - "example": 0, - "type": "number" + "max_points": { + "description": "Maximum number of history points requested. When there are more, the most recent are returned.", + "example": 500, + "type": "integer" }, - "product_id": { - "example": "9ncbcszsjrsb", + "method": { + "description": "Aggregation method used: `recency_weighted`, `unweighted` or `single_aggregation`.", + "example": "recency_weighted", "type": "string" }, - "publisher": { - "example": "Spotify AB", - "type": "string" + "points": { + "description": "Forecast history points in time order, one item per period.", + "items": { + "$ref": "#/definitions/metaculus.ForecastHistoryPoint" + }, + "type": "array" }, - "rating_count": { - "example": "34K", - "type": "string" + "points_count": { + "description": "Number of history points returned.", + "example": 25, + "type": "integer" }, - "release_date_utc": { - "example": "2017-10-24T12:04:25Z", - "type": "string" + "public_page_derived": { + "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", + "example": true, + "type": "boolean" }, - "title": { - "example": "Spotify - Music and Podcasts", - "type": "string" + "question": { + "allOf": [ + { + "$ref": "#/definitions/metaculus.QuestionRow" + } + ], + "description": "Summary of the Metaculus question this response is about." }, - "url": { - "example": "https://apps.microsoft.com/detail/9ncbcszsjrsb", + "source_url": { + "description": "URL the data was read from.", + "example": "https://www.metaculus.com/questions/43612/", "type": "string" } }, "type": "object" }, - "microsoftstore.ProductDetail": { + "metaculus.ForecastSummary": { "properties": { - "age_ratings": { - "items": { - "$ref": "#/definitions/microsoftstore.AgeRating" - }, - "type": "array" - }, - "allowed_platforms": { - "example": [ - "[\"Windows.Desktop\"", - "\"Windows.Xbox\"]" - ], - "items": { - "type": "string" - }, - "type": "array" - }, - "approximate_size_bytes": { - "example": 210105174, - "type": "integer" - }, - "average_rating": { - "example": 4.3, + "center": { + "description": "Central value of the community forecast, as Metaculus reports it.", + "example": 0.52, "type": "number" }, - "badges": { + "centers": { + "description": "All central values of the forecast, as Metaculus reports them. Multiple-choice questions have one per option.", "items": { - "$ref": "#/definitions/microsoftstore.Badge" + "type": "number" }, "type": "array" }, - "box_art_url": { - "type": "string" + "forecaster_count": { + "description": "Number of forecasters behind the latest forecast.", + "example": 54, + "type": "integer" }, - "capabilities": { - "items": { - "type": "string" - }, - "type": "array" + "history_points": { + "description": "Number of history points available for this method.", + "example": 25, + "type": "integer" }, - "card_actions": { - "example": [ - "[\"Install\"", - "\"Launch\"]" - ], + "interval_lower_bounds": { + "description": "All lower interval bounds of the forecast, in the same order as `centers`.", "items": { - "type": "string" + "type": "number" }, "type": "array" }, - "categories": { - "example": [ - "[\"Music\"]" - ], + "interval_upper_bounds": { + "description": "All upper interval bounds of the forecast, in the same order as `centers`.", "items": { - "type": "string" + "type": "number" }, "type": "array" }, - "category": { - "example": "Music", - "type": "string" - }, - "currency_code": { - "example": "USD", - "type": "string" + "lower": { + "description": "Lower bound of the forecast interval, as Metaculus reports it.", + "example": 0.37, + "type": "number" }, - "description": { + "method": { + "description": "Aggregation method name, for example `recency_weighted`, `unweighted` or `single_aggregation`.", + "example": "recency_weighted", "type": "string" }, - "display_price": { - "example": "Free", + "upper": { + "description": "Upper bound of the forecast interval, as Metaculus reports it.", + "example": 0.66, + "type": "number" + } + }, + "type": "object" + }, + "metaculus.ForecastsResponse": { + "properties": { + "fetched_at": { + "description": "Time the data was fetched, in UTC (RFC 3339).", + "example": "2026-06-07T14:00:00Z", "type": "string" }, - "features": { + "methods": { + "description": "Latest forecast per aggregation method, with the preferred methods first.", "items": { - "$ref": "#/definitions/microsoftstore.Feature" + "$ref": "#/definitions/metaculus.ForecastSummary" }, "type": "array" }, - "free": { + "methods_count": { + "description": "Number of aggregation methods returned.", + "example": 3, + "type": "integer" + }, + "public_page_derived": { + "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", "example": true, "type": "boolean" }, - "hero_image_url": { - "type": "string" - }, - "icon_url": { - "type": "string" - }, - "is_application": { - "type": "boolean" - }, - "is_game": { - "type": "boolean" - }, - "is_purchase_enabled": { - "type": "boolean" - }, - "is_pwa": { - "type": "boolean" - }, - "is_subscription": { - "type": "boolean" - }, - "is_theme": { - "type": "boolean" - }, - "kind": { - "example": "app", - "type": "string" - }, - "last_update_date_utc": { - "example": "2026-09-22T14:30:28Z", - "type": "string" - }, - "media_type": { - "example": "Apps", - "type": "string" - }, - "package_family_names": { - "example": [ - "[\"SpotifyAB.SpotifyMusic_zpdnekdrzrea0\"]" - ], - "items": { - "type": "string" - }, - "type": "array" - }, - "platforms": { - "example": [ - "[\"x86\"", - "\"x64\"]" + "question": { + "allOf": [ + { + "$ref": "#/definitions/metaculus.QuestionRow" + } ], - "items": { - "type": "string" - }, - "type": "array" + "description": "Summary of the Metaculus question this response is about." }, - "poster_art_url": { + "source_url": { + "description": "URL the data was read from.", + "example": "https://www.metaculus.com/questions/43612/", "type": "string" - }, - "price": { - "example": 0, + } + }, + "type": "object" + }, + "metaculus.OptionForecast": { + "properties": { + "center": { + "description": "Central value of the community forecast for this option.", + "example": 0.42, "type": "number" }, - "privacy_url": { - "example": "https://www.spotify.com/legal/privacy-policy/", - "type": "string" - }, - "product_id": { - "example": "9ncbcszsjrsb", - "type": "string" - }, - "product_type": { - "example": "Application", - "type": "string" - }, - "publisher": { - "example": "Spotify AB", - "type": "string" - }, - "publisher_address": { - "type": "string" - }, - "publisher_id": { - "example": "10113470", - "type": "string" + "forecast_value": { + "description": "Forecast value for this option, as Metaculus reports it.", + "example": 0.42, + "type": "number" }, - "rating_count": { - "example": 34225, + "forecaster_count": { + "description": "Number of forecasters behind this option's forecast.", + "example": 5, "type": "integer" }, - "rating_count_formatted": { - "example": "34.2K", - "type": "string" + "index": { + "description": "Position of the option in the question's option list, starting at 0.", + "example": 0, + "type": "integer" }, - "release_date_utc": { - "example": "2017-10-24T12:04:25Z", + "label": { + "description": "Name of the option, for example `OpenAI`.", + "example": "OpenAI", "type": "string" }, - "screenshots": { - "items": { - "$ref": "#/definitions/microsoftstore.Image" - }, - "type": "array" + "lower": { + "description": "Lower bound of the forecast interval for this option.", + "example": 0.31, + "type": "number" }, - "skus_summary": { - "items": { - "$ref": "#/definitions/microsoftstore.SkuPrice" - }, - "type": "array" + "mean": { + "description": "Mean of the community forecast for this option.", + "example": 0.39, + "type": "number" }, - "source_url": { + "upper": { + "description": "Upper bound of the forecast interval for this option.", + "example": 0.43, + "type": "number" + } + }, + "type": "object" + }, + "metaculus.OptionsChange": { + "properties": { + "changed_at": { + "description": "Time the option list changed, as Metaculus reports it.", + "example": "0001-01-01T00:00:00", "type": "string" }, - "supported_languages": { + "options": { + "description": "Option labels in effect from that time.", "items": { "type": "string" }, "type": "array" + } + }, + "type": "object" + }, + "metaculus.OptionsResponse": { + "properties": { + "fetched_at": { + "description": "Time the data was fetched, in UTC (RFC 3339).", + "example": "2026-06-07T14:00:00Z", + "type": "string" }, - "title": { - "example": "Spotify - Music and Podcasts", + "method": { + "description": "Aggregation method used: `recency_weighted`, `unweighted` or `single_aggregation`.", + "example": "recency_weighted", "type": "string" }, - "trailers": { + "options": { + "description": "Latest forecast for each option of the question.", "items": { - "$ref": "#/definitions/microsoftstore.Image" + "$ref": "#/definitions/metaculus.OptionForecast" }, "type": "array" }, - "url": { - "example": "https://apps.microsoft.com/detail/9ncbcszsjrsb", - "type": "string" - }, - "version": { - "type": "string" - }, - "website": { - "example": "https://www.spotify.com", - "type": "string" - } - }, - "type": "object" - }, - "microsoftstore.PublisherResponse": { - "properties": { - "count": { - "example": 3, + "options_count": { + "description": "Number of options returned.", + "example": 2, "type": "integer" }, - "has_more": { - "example": false, - "type": "boolean" - }, - "items": { + "options_history": { + "description": "Earlier versions of the option list, when the options changed.", "items": { - "$ref": "#/definitions/microsoftstore.Product" + "$ref": "#/definitions/metaculus.OptionsChange" }, "type": "array" }, - "next_cursor": { - "type": "string" + "public_page_derived": { + "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", + "example": true, + "type": "boolean" }, - "publisher_name": { - "example": "Spotify AB", - "type": "string" + "question": { + "allOf": [ + { + "$ref": "#/definitions/metaculus.QuestionRow" + } + ], + "description": "Summary of the Metaculus question this response is about." }, "source_url": { + "description": "URL the data was read from.", + "example": "https://www.metaculus.com/questions/43731/", "type": "string" } }, "type": "object" }, - "microsoftstore.RecommendedProduct": { + "metaculus.Project": { "properties": { - "average_rating": { - "example": 4.5, - "type": "number" - }, - "categories": { - "example": [ - "[\"Action & adventure\"]" - ], - "items": { - "type": "string" - }, - "type": "array" - }, - "icon_url": { + "emoji": { + "description": "Emoji shown next to the category or project on Metaculus.", + "example": "💼", "type": "string" }, - "product_id": { - "example": "9p4qk476j199", + "id": { + "description": "Metaculus id of the category or project.", + "example": 3698, + "type": "integer" + }, + "name": { + "description": "Display name, for example `Economy & Business`.", + "example": "Economy & Business", "type": "string" }, - "title": { - "example": "Bermuda Adventures: Farm Games", + "slug": { + "description": "URL slug, for example `economy-business`.", + "example": "economy-business", "type": "string" }, - "url": { - "example": "https://apps.microsoft.com/detail/9p4qk476j199", + "type": { + "description": "Kind of project, for example `category` or `tournament`.", + "example": "category", "type": "string" } }, "type": "object" }, - "microsoftstore.RecommendedResponse": { + "metaculus.QuestionMetadataResponse": { "properties": { - "items": { - "items": { - "$ref": "#/definitions/microsoftstore.RecommendedProduct" - }, - "type": "array" - }, - "section_title": { - "example": "Recommended for you", + "actual_close_time": { + "description": "Time the question actually closed to forecasts, as Metaculus reports it.", + "example": "2026-12-30T23:59:00Z", "type": "string" }, - "source_url": { + "actual_resolve_time": { + "description": "Time the question actually resolved, as Metaculus reports it.", + "example": "2027-01-02T00:00:00Z", "type": "string" - } - }, - "type": "object" - }, - "microsoftstore.RelatedResponse": { - "properties": { - "has_more_pages": { - "example": true, - "type": "boolean" }, - "items": { + "all_options_ever": { + "description": "Every option label the question has ever had.", "items": { - "$ref": "#/definitions/microsoftstore.Product" + "type": "string" }, "type": "array" }, - "page": { - "example": 1, - "type": "integer" - }, - "page_size": { - "example": 10, - "type": "integer" - }, - "product_id": { - "example": "9ncbcszsjrsb", + "default_aggregation_method": { + "description": "Aggregation method Metaculus shows by default, for example `recency_weighted`.", + "example": "recency_weighted", "type": "string" }, - "product_type": { - "example": "Application", + "default_score_type": { + "description": "Score type Metaculus uses by default, for example `peer`.", + "example": "peer", "type": "string" }, - "source_url": { + "fetched_at": { + "description": "Time the data was fetched, in UTC (RFC 3339).", + "example": "2026-06-07T14:00:00Z", "type": "string" }, - "total_count": { - "example": 50, - "type": "integer" - } - }, - "type": "object" - }, - "microsoftstore.Review": { - "properties": { - "device_family": { - "example": "Windows.Desktop", + "group_variable": { + "description": "Name of the variable that distinguishes the questions in a group, for example `Company`.", + "example": "Company", "type": "string" }, - "helpful_negative": { - "example": 30, + "inbound_outcome_count": { + "description": "Number of outcomes inside the question's range.", + "example": 10, "type": "integer" }, - "helpful_positive": { - "example": 74, - "type": "integer" + "include_bots_in_aggregates": { + "description": "Whether bot forecasts are included in the aggregate forecasts.", + "example": false, + "type": "boolean" }, - "id": { - "example": "74a23681-6299-5cc4-5e83-a48d1c49ece6", - "type": "string" + "open_lower_bound": { + "description": "Whether the answer can fall below the lower end of the range.", + "example": false, + "type": "boolean" }, - "is_revised": { + "open_upper_bound": { + "description": "Whether the answer can fall above the upper end of the range.", + "example": false, "type": "boolean" }, - "locale": { - "example": "EN-US", - "type": "string" + "options": { + "description": "Current option labels of a multiple-choice question.", + "items": { + "type": "string" + }, + "type": "array" }, - "market": { - "example": "US", - "type": "string" + "options_history": { + "description": "Earlier versions of the option list, when the options changed.", + "items": { + "$ref": "#/definitions/metaculus.OptionsChange" + }, + "type": "array" }, - "os_version": { - "example": "10.0.26200.8524", + "options_order": { + "description": "How the options are ordered, for example `DEFAULT`.", + "example": "DEFAULT", "type": "string" }, - "rating": { - "example": 1, - "type": "integer" + "possibilities": { + "description": "Possible outcomes of the question, as Metaculus describes them." }, - "reviewer_name": { - "example": "constance", - "type": "string" + "public_page_derived": { + "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", + "example": true, + "type": "boolean" }, - "submitted_at_utc": { - "example": "2026-07-12T21:41:45Z", + "question": { + "allOf": [ + { + "$ref": "#/definitions/metaculus.QuestionRow" + } + ], + "description": "Summary of the Metaculus question this response is about." + }, + "resolution": { + "description": "Resolution of the question, as Metaculus reports it. Omitted while unresolved.", "type": "string" }, - "text": { - "example": "so, the app used to be great...", + "resolution_set_time": { + "description": "Time the resolution was set, as Metaculus reports it.", + "example": "2027-01-02T00:00:00Z", "type": "string" }, - "title": { - "example": "spotify has fallen off. HARD.", + "scaling": { + "allOf": [ + { + "$ref": "#/definitions/metaculus.QuestionScaling" + } + ], + "description": "Range and scale settings of a numeric or date question." + }, + "short_title": { + "description": "Short form of the question title.", + "example": "OpenAI or Anthropic - higher valuation on Jan 1, 2027?", "type": "string" }, - "url": { + "source_url": { + "description": "URL the data was read from.", + "example": "https://www.metaculus.com/questions/43731/", "type": "string" } }, "type": "object" }, - "microsoftstore.ReviewsResponse": { + "metaculus.QuestionResponse": { "properties": { - "has_more_pages": { - "example": true, - "type": "boolean" - }, - "next_page": { - "example": 2, - "type": "integer" - }, - "page": { - "example": 1, - "type": "integer" + "fetched_at": { + "example": "2026-06-07T14:00:00Z", + "type": "string" }, - "page_size": { - "example": 20, - "type": "integer" + "question": { + "$ref": "#/definitions/metaculus.QuestionRow" }, - "product_id": { - "example": "9ncbcszsjrsb", + "source_url": { + "example": "https://www.metaculus.com/questions/43612/", "type": "string" - }, - "reviews": { + } + }, + "type": "object" + }, + "metaculus.QuestionRow": { + "properties": { + "categories": { + "description": "Categories the question is filed under.", "items": { - "$ref": "#/definitions/microsoftstore.Review" + "$ref": "#/definitions/metaculus.Project" }, "type": "array" }, - "sort": { - "example": "MostHelpful", - "type": "string" + "comment_count": { + "description": "Number of comments on the question.", + "example": 16, + "type": "integer" }, - "source_url": { + "edited_at": { + "description": "Time the question was last edited, in UTC (RFC 3339).", + "example": "2026-06-07T13:14:34Z", "type": "string" }, - "total_count": { - "example": 307, + "forecaster_count": { + "description": "Number of forecasters who have forecast on the question.", + "example": 54, "type": "integer" - } - }, - "type": "object" - }, - "microsoftstore.ReviewsSummaryResponse": { - "properties": { - "average_rating": { - "example": 4.3, + }, + "forecasts_count": { + "description": "Total number of forecasts submitted on the question.", + "example": 149, + "type": "integer" + }, + "id": { + "description": "Metaculus post id of the question. Use it with the question endpoints.", + "example": 43612, + "type": "integer" + }, + "latest_forecast_center": { + "description": "Central value of the latest community forecast, as Metaculus reports it.", + "example": 0.52, "type": "number" }, - "most_critical_review": { - "$ref": "#/definitions/microsoftstore.Review" + "latest_forecast_lower": { + "description": "Lower bound of the latest community forecast interval.", + "example": 0.37, + "type": "number" }, - "most_favorable_review": { - "$ref": "#/definitions/microsoftstore.Review" + "latest_forecast_upper": { + "description": "Upper bound of the latest community forecast interval.", + "example": 0.66, + "type": "number" }, - "product_id": { - "example": "9ncbcszsjrsb", + "open_time": { + "description": "Time the question opened for forecasts, in UTC (RFC 3339).", + "example": "2026-06-01T17:00:00Z", "type": "string" }, - "rating_distribution": { - "type": "object" + "projects": { + "description": "Tournaments and projects the question belongs to.", + "items": { + "$ref": "#/definitions/metaculus.Project" + }, + "type": "array" }, - "rating_status": { - "example": "RatingAvailable", + "public_page_derived": { + "description": "Always `true`: the values are those shown publicly on Metaculus, without a login.", + "example": true, + "type": "boolean" + }, + "published_at": { + "description": "Time the question was published, in UTC (RFC 3339).", + "example": "2026-05-29T15:33:53Z", "type": "string" }, - "review_count": { - "example": 307, + "question_id": { + "description": "Metaculus id of the underlying question, which can differ from the post `id`.", + "example": 43609, "type": "integer" }, - "source_url": { - "type": "string" - } - }, - "type": "object" - }, - "microsoftstore.SearchResponse": { - "properties": { - "age": { - "example": "all", + "question_title": { + "description": "Full wording of the question.", + "example": "What will be the World Bank monthly price of liquid sulphur in June 2026?", "type": "string" }, - "category": { - "example": "all", + "question_type": { + "description": "Question type, for example `binary`, `numeric` or `multiple_choice`.", + "example": "numeric", "type": "string" }, - "count": { - "example": 20, - "type": "integer" - }, - "has_more": { - "example": true, + "resolved": { + "description": "Whether the question has been resolved.", + "example": false, "type": "boolean" }, - "items": { - "items": { - "$ref": "#/definitions/microsoftstore.Product" - }, - "type": "array" + "scheduled_close_time": { + "description": "Time the question is scheduled to close to forecasts, in UTC (RFC 3339).", + "example": "2026-07-15T00:00:00Z", + "type": "string" }, - "media_type": { - "example": "all", + "scheduled_resolve_time": { + "description": "Time the question is scheduled to resolve, in UTC (RFC 3339).", + "example": "2026-09-07T00:00:00Z", "type": "string" }, - "next_cursor": { - "example": "bz0wJmI9OU5DQkNTWlNKUlNCLD...", + "slug": { + "description": "URL slug of the question.", + "example": "tampa-sulphur-price-in-june-2026", "type": "string" }, - "price": { - "example": "all", + "status": { + "description": "Question status on Metaculus, for example `open`.", + "example": "open", "type": "string" }, - "query": { - "example": "spotify", + "title": { + "description": "Question title as shown on Metaculus.", + "example": "Tampa sulphur price in June 2026?", "type": "string" }, - "source_url": { + "unit": { + "description": "Unit of the answer for numeric questions, for example `USD/metric ton`.", + "example": "USD/metric ton", + "type": "string" + }, + "url": { + "description": "Metaculus page URL of the question.", + "example": "https://www.metaculus.com/questions/43612/tampa-sulphur-price-in-june-2026/", "type": "string" } }, "type": "object" }, - "microsoftstore.SkuPrice": { + "metaculus.QuestionScaling": { "properties": { - "display_msrp": { - "example": "Free", - "type": "string" + "continuous_range": { + "description": "ContinuousRange passes through Metaculus's scaling.continuous_range: null\nfor discrete questions, an array of numbers (the CDF internal locations)\nfor continuous/numeric ones. It was previously typed []string, so hydrating\na commented continuous question failed to decode and 503'd the comments\nfeeds; numbers are the correct element type.", + "items": {}, + "type": "array" }, - "display_price": { - "example": "Free", - "type": "string" + "inbound_outcome_count": { + "description": "Number of outcomes inside the question's range.", + "example": 10, + "type": "integer" }, - "msrp": { - "example": 0, + "nominal_max": { + "description": "Highest value of the range as shown to forecasters.", + "example": 100, "type": "number" }, - "price": { + "nominal_min": { + "description": "Lowest value of the range as shown to forecasters.", "example": 0, "type": "number" - } - }, - "type": "object" - }, - "microsoftstore.SpotlightResponse": { - "properties": { - "count": { - "example": 8, - "type": "integer" - }, - "items": { - "items": { - "$ref": "#/definitions/microsoftstore.Product" - }, - "type": "array" }, - "media_type": { - "example": "home", - "type": "string" + "open_lower_bound": { + "description": "Whether the answer can fall below the lower end of the range.", + "example": false, + "type": "boolean" }, - "source_url": { - "type": "string" - } - }, - "type": "object" - }, - "microsoftstore.SuggestResponse": { - "properties": { - "completions": { - "example": [ - "[\"spotify\"", - "\"spot\"", - "\"spotify for podcasters\"]" - ], - "items": { - "type": "string" - }, - "type": "array" + "open_upper_bound": { + "description": "Whether the answer can fall above the upper end of the range.", + "example": false, + "type": "boolean" }, - "prefix": { - "example": "spot", - "type": "string" + "range_max": { + "description": "Upper end of the question's range.", + "example": 100, + "type": "number" }, - "products": { - "items": { - "$ref": "#/definitions/microsoftstore.SuggestedProduct" - }, - "type": "array" + "range_min": { + "description": "Lower end of the question's range.", + "example": 0, + "type": "number" }, - "source_url": { - "type": "string" + "zero_point": { + "description": "Zero point of the question's range, when Metaculus defines one.", + "example": 0, + "type": "number" } }, "type": "object" }, - "microsoftstore.SuggestedProduct": { + "metaculus.QuestionsResponse": { "properties": { - "icon_url": { + "feed": { + "description": "Feed the questions came from, for example `questions`.", + "example": "questions", "type": "string" }, - "is_application": { - "example": true, - "type": "boolean" - }, - "is_game": { - "type": "boolean" - }, - "media_type": { - "example": "apps", + "fetched_at": { + "description": "Time the data was fetched, in UTC (RFC 3339).", + "example": "2026-06-07T14:00:00Z", "type": "string" }, - "product_id": { - "example": "9ncbcszsjrsb", - "type": "string" + "limit": { + "description": "Maximum number of questions requested.", + "example": 10, + "type": "integer" }, - "title": { - "example": "Spotify - Music and Podcasts", - "type": "string" + "questions": { + "description": "Questions in the feed, one item per question.", + "items": { + "$ref": "#/definitions/metaculus.QuestionRow" + }, + "type": "array" }, - "url": { - "example": "https://apps.microsoft.com/detail/9ncbcszsjrsb", + "source_url": { + "description": "URL the data was read from.", + "example": "https://www.metaculus.com/questions/", "type": "string" } }, "type": "object" }, - "microsoftstore.categoriesResponseDoc": { + "metaculus.forecastHistoryResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.CategoriesResponse" + "$ref": "#/definitions/metaculus.ForecastHistoryResponse" }, "msg": { "example": "OK", @@ -124346,14 +126422,14 @@ }, "type": "object" }, - "microsoftstore.categoryResponseDoc": { + "metaculus.forecastsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.CategoryResponse" + "$ref": "#/definitions/metaculus.ForecastsResponse" }, "msg": { "example": "OK", @@ -124362,14 +126438,14 @@ }, "type": "object" }, - "microsoftstore.chartsResponseDoc": { + "metaculus.metadataResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.ChartsResponse" + "$ref": "#/definitions/metaculus.QuestionMetadataResponse" }, "msg": { "example": "OK", @@ -124378,14 +126454,14 @@ }, "type": "object" }, - "microsoftstore.editorialResponseDoc": { + "metaculus.optionsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.EditorialResponse" + "$ref": "#/definitions/metaculus.OptionsResponse" }, "msg": { "example": "OK", @@ -124394,14 +126470,14 @@ }, "type": "object" }, - "microsoftstore.eventsResponseDoc": { + "metaculus.questionResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.EventsResponse" + "$ref": "#/definitions/metaculus.QuestionResponse" }, "msg": { "example": "OK", @@ -124410,14 +126486,14 @@ }, "type": "object" }, - "microsoftstore.productResponseDoc": { + "metaculus.questionsResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.ProductDetail" + "$ref": "#/definitions/metaculus.QuestionsResponse" }, "msg": { "example": "OK", @@ -124426,94 +126502,189 @@ }, "type": "object" }, - "microsoftstore.publisherResponseDoc": { + "metajobs.ListResponse": { "properties": { - "code": { - "example": 200, + "listings": { + "items": { + "$ref": "#/definitions/metajobs.MetaJobListing" + }, + "type": "array" + }, + "page": { + "example": 1, "type": "integer" }, - "data": { - "$ref": "#/definitions/microsoftstore.PublisherResponse" + "page_size": { + "example": 50, + "type": "integer" }, - "msg": { - "example": "OK", + "source_url": { "type": "string" + }, + "total": { + "example": 754, + "type": "integer" } }, "type": "object" }, - "microsoftstore.recommendedResponseDoc": { + "metajobs.MetaJob": { "properties": { - "code": { - "example": 200, - "type": "integer" + "compensation_country": { + "example": "US", + "type": "string" }, - "data": { - "$ref": "#/definitions/microsoftstore.RecommendedResponse" + "compensation_max": { + "example": "$241,000/year", + "type": "string" }, - "msg": { - "example": "OK", + "compensation_min": { + "example": "$173,000/year", + "type": "string" + }, + "departments": { + "example": [ + "Product Management" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "id": { + "example": "1238249364564427", + "type": "string" + }, + "locations": { + "example": [ + "Menlo Park", + " CA" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "minimum_qualifications": { + "items": { + "type": "string" + }, + "type": "array" + }, + "preferred_qualifications": { + "items": { + "type": "string" + }, + "type": "array" + }, + "responsibilities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "example": "Product Manager", + "type": "string" + }, + "url": { + "example": "https://www.metacareers.com/profile/job_details/1238249364564427/", "type": "string" } }, "type": "object" }, - "microsoftstore.relatedResponseDoc": { + "metajobs.MetaJobListing": { "properties": { - "code": { - "example": 200, - "type": "integer" + "id": { + "example": "1238249364564427", + "type": "string" }, - "data": { - "$ref": "#/definitions/microsoftstore.RelatedResponse" + "last_modified": { + "example": "2026-07-29T01:17:34-07:00", + "type": "string" }, - "msg": { - "example": "OK", + "url": { + "example": "https://www.metacareers.com/profile/job_details/1238249364564427/", "type": "string" } }, "type": "object" }, - "microsoftstore.reviewsResponseDoc": { + "metajobs.MetaJobSearchResult": { "properties": { - "code": { - "example": 200, - "type": "integer" + "id": { + "example": "1010234865172301", + "type": "string" }, - "data": { - "$ref": "#/definitions/microsoftstore.ReviewsResponse" + "locations": { + "example": [ + "Sunnyvale", + " CA" + ], + "items": { + "type": "string" + }, + "type": "array" }, - "msg": { - "example": "OK", + "sub_teams": { + "example": [ + "Hardware" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "teams": { + "example": [ + "Infrastructure" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "example": "ASIC Engineer, Design", + "type": "string" + }, + "url": { + "example": "https://www.metacareers.com/profile/job_details/1010234865172301/", "type": "string" } }, "type": "object" }, - "microsoftstore.reviewsSummaryResponseDoc": { + "metajobs.SearchResponse": { "properties": { - "code": { - "example": 200, - "type": "integer" - }, - "data": { - "$ref": "#/definitions/microsoftstore.ReviewsSummaryResponse" + "jobs": { + "items": { + "$ref": "#/definitions/metajobs.MetaJobSearchResult" + }, + "type": "array" }, - "msg": { - "example": "OK", + "source_url": { "type": "string" + }, + "total": { + "example": 58, + "type": "integer" } }, "type": "object" }, - "microsoftstore.searchResponseDoc": { + "metajobs.jobResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.SearchResponse" + "$ref": "#/definitions/metajobs.MetaJob" }, "msg": { "example": "OK", @@ -124522,14 +126693,14 @@ }, "type": "object" }, - "microsoftstore.spotlightResponseDoc": { + "metajobs.listResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.SpotlightResponse" + "$ref": "#/definitions/metajobs.ListResponse" }, "msg": { "example": "OK", @@ -124538,14 +126709,14 @@ }, "type": "object" }, - "microsoftstore.suggestResponseDoc": { + "metajobs.searchResponseDoc": { "properties": { "code": { "example": 200, "type": "integer" }, "data": { - "$ref": "#/definitions/microsoftstore.SuggestResponse" + "$ref": "#/definitions/metajobs.SearchResponse" }, "msg": { "example": "OK", @@ -124554,12 +126725,18 @@ }, "type": "object" }, - "mirror.AuthorArticle": { + "metro.AuthorArticle": { "properties": { - "label": { + "image_url": { "type": "string" }, - "label_url": { + "published_at": { + "type": "string" + }, + "section": { + "type": "string" + }, + "summary": { "type": "string" }, "title": { @@ -124571,31 +126748,37 @@ }, "type": "object" }, - "mirror.AuthorResponse": { + "metro.AuthorResponse": { "properties": { "articles": { "items": { - "$ref": "#/definitions/mirror.AuthorArticle" + "$ref": "#/definitions/metro.AuthorArticle" }, "type": "array" }, "bio": { "type": "string" }, - "email": { + "image_url": { "type": "string" }, "job_title": { "type": "string" }, - "name": { - "type": "string" + "knows_about": { + "items": { + "type": "string" + }, + "type": "array" }, - "slug": { + "name": { "type": "string" }, - "twitter": { - "type": "string" + "same_as": { + "items": { + "type": "string" + }, + "type": "array" }, "url": { "type": "string" @@ -124603,104 +126786,114 @@ }, "type": "object" }, - "mlb.BoxscorePlayer": { + "microsoftstore.AgeRating": { "properties": { - "batting_order": { + "age": { + "example": 13, + "type": "integer" + }, + "description": { + "example": "For ages 13 and up", "type": "string" }, - "person": { - "$ref": "#/definitions/mlb.NamedRef" + "descriptors": { + "example": [ + "[\"Diverse Content: Discretion Advised\"]" + ], + "items": { + "type": "string" + }, + "type": "array" }, - "position": { + "system": { + "example": "ESRB", "type": "string" }, - "stats": { - "additionalProperties": { - "additionalProperties": {}, - "type": "object" - }, - "type": "object" + "value": { + "example": "TEEN", + "type": "string" } }, "type": "object" }, - "mlb.BoxscoreResponse": { + "microsoftstore.Award": { "properties": { - "away": { - "$ref": "#/definitions/mlb.BoxscoreTeam" - }, - "fetched_at": { + "category": { + "example": "Productivity category", "type": "string" }, - "game_id": { - "type": "integer" + "description": { + "example": "The Microsoft Store Awards celebrate apps and games that emphasize exceptional experiences for their users.", + "type": "string" }, - "home": { - "$ref": "#/definitions/mlb.BoxscoreTeam" + "editorial_id": { + "example": "Editorials/Awards_2025/Global/Notion_xpdbvss44r0l9h", + "type": "string" }, - "source_url": { + "title": { + "example": "Microsoft Store Awards 2025", "type": "string" + }, + "year": { + "example": 2025, + "type": "integer" } }, "type": "object" }, - "mlb.BoxscoreTeam": { + "microsoftstore.Badge": { "properties": { - "players": { - "items": { - "$ref": "#/definitions/mlb.BoxscorePlayer" - }, - "type": "array" - }, - "team": { - "$ref": "#/definitions/mlb.TeamRef" + "icon_id": { + "example": "AI", + "type": "string" }, - "team_stats": { - "additionalProperties": { - "additionalProperties": {}, - "type": "object" - }, - "type": "object" + "text": { + "example": "Uses AI features", + "type": "string" } }, "type": "object" }, - "mlb.Decision": { + "microsoftstore.CategoriesResponse": { "properties": { - "loser": { - "$ref": "#/definitions/mlb.NamedRef" - }, - "save": { - "$ref": "#/definitions/mlb.NamedRef" + "categories": { + "items": { + "$ref": "#/definitions/microsoftstore.CategoryTaxonomy" + }, + "type": "array" }, - "winner": { - "$ref": "#/definitions/mlb.NamedRef" + "media_type": { + "example": "apps", + "type": "string" } }, "type": "object" }, - "mlb.EditorialFeedResponse": { + "microsoftstore.CategoryResponse": { "properties": { - "fetched_at": { + "category": { + "example": "Photo & video", "type": "string" }, + "count": { + "example": 20, + "type": "integer" + }, + "has_more": { + "example": true, + "type": "boolean" + }, "items": { "items": { - "additionalProperties": {}, - "type": "object" + "$ref": "#/definitions/microsoftstore.Product" }, "type": "array" }, - "language": { + "media_type": { + "example": "apps", "type": "string" }, - "limit": { - "type": "integer" - }, - "skip": { - "type": "integer" - }, - "slug": { + "next_cursor": { "type": "string" }, "source_url": { @@ -124709,1295 +126902,2587 @@ }, "type": "object" }, - "mlb.EnumValue": { + "microsoftstore.CategoryTaxonomy": { "properties": { - "description": { + "category": { + "example": "Books & reference", "type": "string" }, - "value": { - "type": "string" + "subcategories": { + "example": [ + "[\"E-reader\"", + "\"Fiction\"", + "\"Nonfiction\"", + "\"Reference\"]" + ], + "items": { + "type": "string" + }, + "type": "array" } }, "type": "object" }, - "mlb.GameResponse": { + "microsoftstore.ChartsResponse": { "properties": { - "away_boxscore": { - "$ref": "#/definitions/mlb.TeamBoxscore" + "category": { + "example": "Photo & video", + "type": "string" }, - "decisions": { - "$ref": "#/definitions/mlb.Decision" + "count": { + "example": 20, + "type": "integer" }, - "fetched_at": { + "discount_filter": { + "example": "onsale", "type": "string" }, - "game": { - "$ref": "#/definitions/mlb.GameSummary" - }, - "home_boxscore": { - "$ref": "#/definitions/mlb.TeamBoxscore" + "items": { + "items": { + "$ref": "#/definitions/microsoftstore.Product" + }, + "type": "array" }, - "linescore": { - "$ref": "#/definitions/mlb.Linescore" + "list": { + "example": "TopFree", + "type": "string" }, - "source_url": { + "media_type": { + "example": "apps", "type": "string" - } - }, - "type": "object" - }, - "mlb.GameSide": { - "properties": { - "losses": { - "type": "integer" }, - "probable_pitcher": { - "$ref": "#/definitions/mlb.NamedRef" + "num_players_filter": { + "example": "SinglePlayer", + "type": "string" }, - "score": { + "page": { + "example": 1, "type": "integer" }, - "team": { - "$ref": "#/definitions/mlb.TeamRef" - }, - "wins": { + "page_size": { + "example": 20, "type": "integer" - } - }, - "type": "object" - }, - "mlb.GameStatus": { - "properties": { - "abstract": { + }, + "source_url": { "type": "string" }, - "code": { + "subcategory": { + "example": "E-reader", "type": "string" }, - "detailed": { + "subscription_filter": { + "example": "gamepass", "type": "string" }, - "reason": { + "title": { + "example": "Must-have free apps", "type": "string" } }, "type": "object" }, - "mlb.GameSummary": { + "microsoftstore.EditorialResponse": { "properties": { - "away": { - "$ref": "#/definitions/mlb.GameSide" - }, - "day_night": { - "type": "string" - }, - "double_header": { - "type": "string" - }, - "game_date": { + "editorial_id": { + "example": "Editorials/Awards_2025/Global/Notion_xpdbvss44r0l9h", "type": "string" }, - "game_number": { - "type": "integer" - }, - "game_type": { + "header_image": { "type": "string" }, - "home": { - "$ref": "#/definitions/mlb.GameSide" + "paragraphs": { + "items": { + "type": "string" + }, + "type": "array" }, - "id": { - "type": "integer" + "relevant_products": { + "items": { + "$ref": "#/definitions/microsoftstore.Product" + }, + "type": "array" }, - "official_date": { + "source_url": { "type": "string" }, - "scheduled_innings": { - "type": "integer" - }, - "season": { - "type": "string" + "subtitle": { + "$ref": "#/definitions/microsoftstore.EditorialSubtitle" }, - "series_description": { + "title": { + "example": "Productivity category", "type": "string" - }, - "status": { - "$ref": "#/definitions/mlb.GameStatus" - }, - "venue": { - "$ref": "#/definitions/mlb.VenueRef" } }, "type": "object" }, - "mlb.ImageRef": { + "microsoftstore.EditorialSubtitle": { "properties": { - "type": { + "icon": { "type": "string" }, - "url": { + "text": { + "example": "Microsoft Store Awards 2025", "type": "string" } }, "type": "object" }, - "mlb.Inning": { + "microsoftstore.EventsResponse": { "properties": { - "away_errors": { + "count": { + "example": 7, "type": "integer" }, - "away_hits": { - "type": "integer" + "items": { + "items": { + "$ref": "#/definitions/microsoftstore.Product" + }, + "type": "array" }, - "away_runs": { - "type": "integer" + "media_type": { + "example": "apps", + "type": "string" }, - "home_errors": { + "page": { + "example": 1, "type": "integer" }, - "home_hits": { + "page_size": { + "example": 20, "type": "integer" }, - "home_runs": { - "type": "integer" + "source_url": { + "type": "string" }, - "number": { - "type": "integer" + "title": { + "example": "Special events", + "type": "string" } }, "type": "object" }, - "mlb.LeaderCategory": { + "microsoftstore.Feature": { "properties": { - "category": { - "type": "string" - }, - "game_type": { - "type": "string" - }, - "group": { + "description": { + "example": "Get answers, writing help, and image generation.", "type": "string" }, - "leaders": { - "items": { - "$ref": "#/definitions/mlb.LeaderEntry" - }, - "type": "array" - }, - "season": { + "title": { + "example": "AI assistant", "type": "string" - }, - "total": { - "type": "integer" } }, "type": "object" }, - "mlb.LeaderEntry": { + "microsoftstore.Image": { "properties": { - "league": { - "$ref": "#/definitions/mlb.NamedRef" - }, - "player": { - "$ref": "#/definitions/mlb.NamedRef" - }, - "rank": { + "height": { + "example": 1080, "type": "integer" }, - "season": { + "type": { + "example": "Screenshot", "type": "string" }, - "stats": { - "additionalProperties": {}, - "type": "object" - }, - "team": { - "$ref": "#/definitions/mlb.TeamRef" - }, - "value": { + "url": { + "example": "https://store-images.s-microsoft.com/image/apps.19060...f4dfc459-dae3-4ab8-8f40-18aa7ae9762f", "type": "string" + }, + "width": { + "example": 1920, + "type": "integer" } }, "type": "object" }, - "mlb.LeagueLeadersResponse": { + "microsoftstore.Product": { "properties": { + "average_rating": { + "example": 4.3, + "type": "number" + }, + "award": { + "$ref": "#/definitions/microsoftstore.Award" + }, "categories": { + "example": [ + "[\"Music\"]" + ], "items": { "type": "string" }, "type": "array" }, - "count": { - "type": "integer" + "description": { + "example": "Love music and podcasts? Play your favorite songs...", + "type": "string" }, - "fetched_at": { + "display_price": { + "example": "Free", "type": "string" }, - "results": { - "items": { - "$ref": "#/definitions/mlb.LeaderCategory" - }, - "type": "array" + "free": { + "example": true, + "type": "boolean" }, - "season": { - "type": "integer" + "icon_url": { + "example": "https://store-images.s-microsoft.com/image/apps.10546...", + "type": "string" }, - "source_url": { + "is_application": { + "example": true, + "type": "boolean" + }, + "is_game": { + "type": "boolean" + }, + "is_pwa": { + "type": "boolean" + }, + "is_subscription": { + "type": "boolean" + }, + "is_theme": { + "type": "boolean" + }, + "kind": { + "example": "app", "type": "string" - } - }, - "type": "object" - }, - "mlb.Linescore": { - "properties": { - "away_errors": { - "type": "integer" }, - "away_hits": { - "type": "integer" + "media_type": { + "example": "Apps", + "type": "string" }, - "away_runs": { - "type": "integer" + "poster_art_url": { + "type": "string" }, - "current_inning": { - "type": "integer" + "price": { + "example": 0, + "type": "number" }, - "home_errors": { - "type": "integer" + "product_id": { + "example": "9ncbcszsjrsb", + "type": "string" }, - "home_hits": { - "type": "integer" + "publisher": { + "example": "Spotify AB", + "type": "string" }, - "home_runs": { - "type": "integer" + "rating_count": { + "example": "34K", + "type": "string" }, - "inning_state": { + "release_date_utc": { + "example": "2017-10-24T12:04:25Z", "type": "string" }, - "innings": { - "items": { - "$ref": "#/definitions/mlb.Inning" - }, - "type": "array" + "title": { + "example": "Spotify - Music and Podcasts", + "type": "string" }, - "scheduled_innings": { - "type": "integer" + "url": { + "example": "https://apps.microsoft.com/detail/9ncbcszsjrsb", + "type": "string" } }, "type": "object" }, - "mlb.MLBDiscoveryResponse": { + "microsoftstore.ProductDetail": { "properties": { - "divisions": { + "age_ratings": { "items": { - "$ref": "#/definitions/mlb.NamedRef" + "$ref": "#/definitions/microsoftstore.AgeRating" }, "type": "array" }, - "fetched_at": { - "type": "string" - }, - "game_types": { + "allowed_platforms": { + "example": [ + "[\"Windows.Desktop\"", + "\"Windows.Xbox\"]" + ], "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "leader_categories": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "approximate_size_bytes": { + "example": 210105174, + "type": "integer" }, - "leagues": { - "items": { - "$ref": "#/definitions/mlb.NamedRef" - }, - "type": "array" + "average_rating": { + "example": 4.3, + "type": "number" }, - "prospect_date_ranges": { + "badges": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Badge" }, "type": "array" }, - "prospect_minimum_pa": { - "items": { - "type": "integer" - }, - "type": "array" + "box_art_url": { + "type": "string" }, - "prospect_positions": { + "capabilities": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "prospect_ranking_positions": { + "card_actions": { + "example": [ + "[\"Install\"", + "\"Launch\"]" + ], "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "prospect_ranking_sort_directions": { + "categories": { + "example": [ + "[\"Music\"]" + ], "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "prospect_ranking_sort_fields": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "category": { + "example": "Music", + "type": "string" }, - "prospect_ranking_teams": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "currency_code": { + "example": "USD", + "type": "string" }, - "prospect_ranking_views": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "description": { + "type": "string" }, - "prospect_ranking_years": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "display_price": { + "example": "Free", + "type": "string" }, - "roster_types": { + "features": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Feature" }, "type": "array" }, - "sections": { - "items": { - "$ref": "#/definitions/mlb.NavigationItem" - }, - "type": "array" + "free": { + "example": true, + "type": "boolean" }, - "source_url": { + "hero_image_url": { "type": "string" }, - "sports": { - "items": { - "$ref": "#/definitions/mlb.NamedRef" - }, - "type": "array" + "icon_url": { + "type": "string" }, - "standings_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "is_application": { + "type": "boolean" }, - "stat_groups": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "is_game": { + "type": "boolean" }, - "stat_hitter_positions": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "is_purchase_enabled": { + "type": "boolean" }, - "stat_player_pools": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "is_pwa": { + "type": "boolean" }, - "stat_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "is_subscription": { + "type": "boolean" }, - "statcast_abs_challenge_filters": { - "$ref": "#/definitions/mlb.StatcastABSChallengeFilters" + "is_theme": { + "type": "boolean" }, - "statcast_active_spin_hands": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "kind": { + "example": "app", + "type": "string" }, - "statcast_active_spin_minimums": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "last_update_date_utc": { + "example": "2026-09-22T14:30:28Z", + "type": "string" }, - "statcast_active_spin_seasons": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "media_type": { + "example": "Apps", + "type": "string" }, - "statcast_active_spin_sort_directions": { + "package_family_names": { + "example": [ + "[\"SpotifyAB.SpotifyMusic_zpdnekdrzrea0\"]" + ], "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "statcast_active_spin_sort_fields": { + "platforms": { + "example": [ + "[\"x86\"", + "\"x64\"]" + ], "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "statcast_arm_angle_game_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "poster_art_url": { + "type": "string" }, - "statcast_arm_angle_group_by": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "price": { + "example": 0, + "type": "number" }, - "statcast_arm_angle_group_minimum_pitches": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "privacy_url": { + "example": "https://www.spotify.com/legal/privacy-policy/", + "type": "string" }, - "statcast_arm_angle_hands": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "product_id": { + "example": "9ncbcszsjrsb", + "type": "string" }, - "statcast_arm_angle_minimums": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "product_type": { + "example": "Application", + "type": "string" }, - "statcast_arm_angle_pitch_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "publisher": { + "example": "Spotify AB", + "type": "string" }, - "statcast_arm_angle_seasons": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "publisher_address": { + "type": "string" }, - "statcast_arm_angle_sort_directions": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "publisher_id": { + "example": "10113470", + "type": "string" }, - "statcast_arm_angle_sort_fields": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "rating_count": { + "example": 34225, + "type": "integer" }, - "statcast_arm_angle_team_ids": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "rating_count_formatted": { + "example": "34.2K", + "type": "string" }, - "statcast_arm_strength_min_throws": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "release_date_utc": { + "example": "2017-10-24T12:04:25Z", + "type": "string" }, - "statcast_arm_strength_positions": { + "screenshots": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Image" }, "type": "array" }, - "statcast_arm_strength_sort_directions": { + "skus_summary": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.SkuPrice" }, "type": "array" }, - "statcast_arm_strength_sort_fields": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "source_url": { + "type": "string" }, - "statcast_arm_strength_team_ids": { + "supported_languages": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "statcast_arm_strength_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "title": { + "example": "Spotify - Music and Podcasts", + "type": "string" }, - "statcast_arm_strength_years": { + "trailers": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Image" }, "type": "array" }, - "statcast_arm_value_game_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "url": { + "example": "https://apps.microsoft.com/detail/9ncbcszsjrsb", + "type": "string" }, - "statcast_arm_value_max_year": { - "type": "integer" + "version": { + "type": "string" }, - "statcast_arm_value_min_year": { + "website": { + "example": "https://www.spotify.com", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.PublisherResponse": { + "properties": { + "count": { + "example": 3, "type": "integer" }, - "statcast_arm_value_minimum_opportunities": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "has_more": { + "example": false, + "type": "boolean" }, - "statcast_arm_value_situations": { + "items": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Product" }, "type": "array" }, - "statcast_arm_value_sort_directions": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "next_cursor": { + "type": "string" }, - "statcast_arm_value_sort_fields": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "publisher_name": { + "example": "Spotify AB", + "type": "string" }, - "statcast_arm_value_split_years": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.RecommendedProduct": { + "properties": { + "average_rating": { + "example": 4.5, + "type": "number" }, - "statcast_arm_value_team_ids": { + "categories": { + "example": [ + "[\"Action & adventure\"]" + ], "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "statcast_arm_value_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "icon_url": { + "type": "string" }, - "statcast_arm_value_with_team_only": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "product_id": { + "example": "9p4qk476j199", + "type": "string" }, - "statcast_arm_value_years": { + "title": { + "example": "Bermuda Adventures: Farm Games", + "type": "string" + }, + "url": { + "example": "https://apps.microsoft.com/detail/9p4qk476j199", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.RecommendedResponse": { + "properties": { + "items": { "items": { - "type": "integer" + "$ref": "#/definitions/microsoftstore.RecommendedProduct" }, "type": "array" }, - "statcast_baserunning_filters": { - "$ref": "#/definitions/mlb.StatcastBaserunningFilters" + "section_title": { + "example": "Recommended for you", + "type": "string" }, - "statcast_bat_tracking_attack_zones": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.RelatedResponse": { + "properties": { + "has_more_pages": { + "example": true, + "type": "boolean" }, - "statcast_bat_tracking_bat_sides": { + "items": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Product" }, "type": "array" }, - "statcast_bat_tracking_contact_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "page": { + "example": 1, + "type": "integer" }, - "statcast_bat_tracking_counts": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "page_size": { + "example": 10, + "type": "integer" }, - "statcast_bat_tracking_game_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "product_id": { + "example": "9ncbcszsjrsb", + "type": "string" }, - "statcast_bat_tracking_group_by": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "product_type": { + "example": "Application", + "type": "string" }, - "statcast_bat_tracking_hard_hit_values": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "source_url": { + "type": "string" }, - "statcast_bat_tracking_min_group_swings": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "total_count": { + "example": 50, + "type": "integer" + } + }, + "type": "object" + }, + "microsoftstore.Review": { + "properties": { + "device_family": { + "example": "Windows.Desktop", + "type": "string" }, - "statcast_bat_tracking_min_swings": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "helpful_negative": { + "example": 30, + "type": "integer" }, - "statcast_bat_tracking_pitch_hands": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "helpful_positive": { + "example": 74, + "type": "integer" }, - "statcast_bat_tracking_pitch_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "id": { + "example": "74a23681-6299-5cc4-5e83-a48d1c49ece6", + "type": "string" }, - "statcast_bat_tracking_seasons": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "is_revised": { + "type": "boolean" }, - "statcast_bat_tracking_sort_directions": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "locale": { + "example": "EN-US", + "type": "string" }, - "statcast_bat_tracking_sort_fields": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "market": { + "example": "US", + "type": "string" }, - "statcast_bat_tracking_team_ids": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "os_version": { + "example": "10.0.26200.8524", + "type": "string" }, - "statcast_bat_tracking_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "rating": { + "example": 1, + "type": "integer" }, - "statcast_batted_ball_game_types": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "reviewer_name": { + "example": "constance", + "type": "string" }, - "statcast_batted_ball_max_year": { + "submitted_at_utc": { + "example": "2026-07-12T21:41:45Z", + "type": "string" + }, + "text": { + "example": "so, the app used to be great...", + "type": "string" + }, + "title": { + "example": "spotify has fallen off. HARD.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.ReviewsResponse": { + "properties": { + "has_more_pages": { + "example": true, + "type": "boolean" + }, + "next_page": { + "example": 2, "type": "integer" }, - "statcast_batted_ball_min_splits": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "page": { + "example": 1, + "type": "integer" }, - "statcast_batted_ball_min_year": { + "page_size": { + "example": 20, "type": "integer" }, - "statcast_batted_ball_minimums": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "product_id": { + "example": "9ncbcszsjrsb", + "type": "string" }, - "statcast_batted_ball_pitch_types": { + "reviews": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Review" }, "type": "array" }, - "statcast_batted_ball_seasons": { - "items": { - "$ref": "#/definitions/mlb.EnumValue" - }, - "type": "array" + "sort": { + "example": "MostHelpful", + "type": "string" }, - "statcast_batted_ball_sides": { + "source_url": { + "type": "string" + }, + "total_count": { + "example": 307, + "type": "integer" + } + }, + "type": "object" + }, + "microsoftstore.ReviewsSummaryResponse": { + "properties": { + "average_rating": { + "example": 4.3, + "type": "number" + }, + "most_critical_review": { + "$ref": "#/definitions/microsoftstore.Review" + }, + "most_favorable_review": { + "$ref": "#/definitions/microsoftstore.Review" + }, + "product_id": { + "example": "9ncbcszsjrsb", + "type": "string" + }, + "rating_distribution": { + "type": "object" + }, + "rating_status": { + "example": "RatingAvailable", + "type": "string" + }, + "review_count": { + "example": 307, + "type": "integer" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.SearchResponse": { + "properties": { + "age": { + "example": "all", + "type": "string" + }, + "category": { + "example": "all", + "type": "string" + }, + "count": { + "example": 20, + "type": "integer" + }, + "has_more": { + "example": true, + "type": "boolean" + }, + "items": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Product" }, "type": "array" }, - "statcast_batted_ball_sort_directions": { + "media_type": { + "example": "all", + "type": "string" + }, + "next_cursor": { + "example": "bz0wJmI9OU5DQkNTWlNKUlNCLD...", + "type": "string" + }, + "price": { + "example": "all", + "type": "string" + }, + "query": { + "example": "spotify", + "type": "string" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.SkuPrice": { + "properties": { + "display_msrp": { + "example": "Free", + "type": "string" + }, + "display_price": { + "example": "Free", + "type": "string" + }, + "msrp": { + "example": 0, + "type": "number" + }, + "price": { + "example": 0, + "type": "number" + } + }, + "type": "object" + }, + "microsoftstore.SpotlightResponse": { + "properties": { + "count": { + "example": 8, + "type": "integer" + }, + "items": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.Product" }, "type": "array" }, - "statcast_batted_ball_sort_fields": { + "media_type": { + "example": "home", + "type": "string" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.SuggestResponse": { + "properties": { + "completions": { + "example": [ + "[\"spotify\"", + "\"spot\"", + "\"spotify for podcasters\"]" + ], "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "statcast_batted_ball_split_years": { + "prefix": { + "example": "spot", + "type": "string" + }, + "products": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/microsoftstore.SuggestedProduct" }, "type": "array" }, - "statcast_batted_ball_splits": { + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.SuggestedProduct": { + "properties": { + "icon_url": { + "type": "string" + }, + "is_application": { + "example": true, + "type": "boolean" + }, + "is_game": { + "type": "boolean" + }, + "media_type": { + "example": "apps", + "type": "string" + }, + "product_id": { + "example": "9ncbcszsjrsb", + "type": "string" + }, + "title": { + "example": "Spotify - Music and Podcasts", + "type": "string" + }, + "url": { + "example": "https://apps.microsoft.com/detail/9ncbcszsjrsb", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.categoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.CategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.categoryResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.CategoryResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.chartsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.ChartsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.editorialResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.EditorialResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.eventsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.EventsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.productResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.ProductDetail" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.publisherResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.PublisherResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.recommendedResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.RecommendedResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.relatedResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.RelatedResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.reviewsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.ReviewsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.reviewsSummaryResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.ReviewsSummaryResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.spotlightResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.SpotlightResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "microsoftstore.suggestResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/microsoftstore.SuggestResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "mirror.AuthorArticle": { + "properties": { + "label": { + "type": "string" + }, + "label_url": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "mirror.AuthorResponse": { + "properties": { + "articles": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mirror.AuthorArticle" }, "type": "array" }, - "statcast_batted_ball_team_ids": { + "bio": { + "type": "string" + }, + "email": { + "type": "string" + }, + "job_title": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "twitter": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.BoxscorePlayer": { + "properties": { + "batting_order": { + "type": "string" + }, + "person": { + "$ref": "#/definitions/mlb.NamedRef" + }, + "position": { + "type": "string" + }, + "stats": { + "additionalProperties": { + "additionalProperties": {}, + "type": "object" + }, + "type": "object" + } + }, + "type": "object" + }, + "mlb.BoxscoreResponse": { + "properties": { + "away": { + "$ref": "#/definitions/mlb.BoxscoreTeam" + }, + "fetched_at": { + "type": "string" + }, + "game_id": { + "type": "integer" + }, + "home": { + "$ref": "#/definitions/mlb.BoxscoreTeam" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.BoxscoreTeam": { + "properties": { + "players": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.BoxscorePlayer" }, "type": "array" }, - "statcast_batted_ball_types": { + "team": { + "$ref": "#/definitions/mlb.TeamRef" + }, + "team_stats": { + "additionalProperties": { + "additionalProperties": {}, + "type": "object" + }, + "type": "object" + } + }, + "type": "object" + }, + "mlb.Decision": { + "properties": { + "loser": { + "$ref": "#/definitions/mlb.NamedRef" + }, + "save": { + "$ref": "#/definitions/mlb.NamedRef" + }, + "winner": { + "$ref": "#/definitions/mlb.NamedRef" + } + }, + "type": "object" + }, + "mlb.EditorialFeedResponse": { + "properties": { + "fetched_at": { + "type": "string" + }, + "items": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "additionalProperties": {}, + "type": "object" }, "type": "array" }, - "statcast_catcher_blocking_game_types": { + "language": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "skip": { + "type": "integer" + }, + "slug": { + "type": "string" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.EnumValue": { + "properties": { + "description": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.GameResponse": { + "properties": { + "away_boxscore": { + "$ref": "#/definitions/mlb.TeamBoxscore" + }, + "decisions": { + "$ref": "#/definitions/mlb.Decision" + }, + "fetched_at": { + "type": "string" + }, + "game": { + "$ref": "#/definitions/mlb.GameSummary" + }, + "home_boxscore": { + "$ref": "#/definitions/mlb.TeamBoxscore" + }, + "linescore": { + "$ref": "#/definitions/mlb.Linescore" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.GameSide": { + "properties": { + "losses": { + "type": "integer" + }, + "probable_pitcher": { + "$ref": "#/definitions/mlb.NamedRef" + }, + "score": { + "type": "integer" + }, + "team": { + "$ref": "#/definitions/mlb.TeamRef" + }, + "wins": { + "type": "integer" + } + }, + "type": "object" + }, + "mlb.GameStatus": { + "properties": { + "abstract": { + "type": "string" + }, + "code": { + "type": "string" + }, + "detailed": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.GameSummary": { + "properties": { + "away": { + "$ref": "#/definitions/mlb.GameSide" + }, + "day_night": { + "type": "string" + }, + "double_header": { + "type": "string" + }, + "game_date": { + "type": "string" + }, + "game_number": { + "type": "integer" + }, + "game_type": { + "type": "string" + }, + "home": { + "$ref": "#/definitions/mlb.GameSide" + }, + "id": { + "type": "integer" + }, + "official_date": { + "type": "string" + }, + "scheduled_innings": { + "type": "integer" + }, + "season": { + "type": "string" + }, + "series_description": { + "type": "string" + }, + "status": { + "$ref": "#/definitions/mlb.GameStatus" + }, + "venue": { + "$ref": "#/definitions/mlb.VenueRef" + } + }, + "type": "object" + }, + "mlb.ImageRef": { + "properties": { + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.Inning": { + "properties": { + "away_errors": { + "type": "integer" + }, + "away_hits": { + "type": "integer" + }, + "away_runs": { + "type": "integer" + }, + "home_errors": { + "type": "integer" + }, + "home_hits": { + "type": "integer" + }, + "home_runs": { + "type": "integer" + }, + "number": { + "type": "integer" + } + }, + "type": "object" + }, + "mlb.LeaderCategory": { + "properties": { + "category": { + "type": "string" + }, + "game_type": { + "type": "string" + }, + "group": { + "type": "string" + }, + "leaders": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.LeaderEntry" }, "type": "array" }, - "statcast_catcher_blocking_minimums": { + "season": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "mlb.LeaderEntry": { + "properties": { + "league": { + "$ref": "#/definitions/mlb.NamedRef" + }, + "player": { + "$ref": "#/definitions/mlb.NamedRef" + }, + "rank": { + "type": "integer" + }, + "season": { + "type": "string" + }, + "stats": { + "additionalProperties": {}, + "type": "object" + }, + "team": { + "$ref": "#/definitions/mlb.TeamRef" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.LeagueLeadersResponse": { + "properties": { + "categories": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "string" }, "type": "array" }, - "statcast_catcher_blocking_sort_directions": { + "count": { + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "results": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.LeaderCategory" }, "type": "array" }, - "statcast_catcher_blocking_sort_fields": { + "season": { + "type": "integer" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "mlb.Linescore": { + "properties": { + "away_errors": { + "type": "integer" + }, + "away_hits": { + "type": "integer" + }, + "away_runs": { + "type": "integer" + }, + "current_inning": { + "type": "integer" + }, + "home_errors": { + "type": "integer" + }, + "home_hits": { + "type": "integer" + }, + "home_runs": { + "type": "integer" + }, + "inning_state": { + "type": "string" + }, + "innings": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.Inning" }, "type": "array" }, - "statcast_catcher_blocking_team_ids": { + "scheduled_innings": { + "type": "integer" + } + }, + "type": "object" + }, + "mlb.MLBDiscoveryResponse": { + "properties": { + "divisions": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.NamedRef" }, "type": "array" }, - "statcast_catcher_blocking_types": { + "fetched_at": { + "type": "string" + }, + "game_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_blocking_years": { + "leader_categories": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_ball_strike": { + "leagues": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.NamedRef" }, "type": "array" }, - "statcast_catcher_framing_bat_sides": { + "prospect_date_ranges": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_calls": { + "prospect_minimum_pa": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "integer" }, "type": "array" }, - "statcast_catcher_framing_game_types": { + "prospect_positions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_min_pitches": { + "prospect_ranking_positions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_min_results": { + "prospect_ranking_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_pitch_hands": { + "prospect_ranking_sort_fields": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_pitch_types": { + "prospect_ranking_teams": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_sort_directions": { + "prospect_ranking_views": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_sort_fields": { + "prospect_ranking_years": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_team_ids": { + "roster_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_framing_types": { + "sections": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.NavigationItem" }, "type": "array" }, - "statcast_catcher_framing_years": { + "source_url": { + "type": "string" + }, + "sports": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "$ref": "#/definitions/mlb.NamedRef" }, "type": "array" }, - "statcast_catcher_pop_time_min_2b_attempts": { + "standings_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_pop_time_min_3b_attempts": { + "stat_groups": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_pop_time_sort_directions": { + "stat_hitter_positions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_pop_time_sort_fields": { + "stat_player_pools": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_pop_time_team_ids": { + "stat_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_pop_time_years": { + "statcast_abs_challenge_filters": { + "$ref": "#/definitions/mlb.StatcastABSChallengeFilters" + }, + "statcast_active_spin_hands": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_game_types": { + "statcast_active_spin_minimums": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_group_by": { + "statcast_active_spin_seasons": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_knee_codes": { + "statcast_active_spin_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_min_pitches": { + "statcast_active_spin_sort_fields": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_min_results": { + "statcast_arm_angle_game_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_pitch_types": { + "statcast_arm_angle_group_by": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_seasons": { + "statcast_arm_angle_group_minimum_pitches": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_sides": { + "statcast_arm_angle_hands": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_sort_directions": { + "statcast_arm_angle_minimums": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_sort_fields": { + "statcast_arm_angle_pitch_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_team_ids": { + "statcast_arm_angle_seasons": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_stance_types": { + "statcast_arm_angle_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_game_types": { + "statcast_arm_angle_sort_fields": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_minimum_attempts": { + "statcast_arm_angle_team_ids": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_seasons": { + "statcast_arm_strength_min_throws": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_sort_directions": { + "statcast_arm_strength_positions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_sort_fields": { + "statcast_arm_strength_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_target_bases": { + "statcast_arm_strength_sort_fields": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_team_ids": { + "statcast_arm_strength_team_ids": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_catcher_throwing_types": { + "statcast_arm_strength_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_entity_types": { + "statcast_arm_strength_years": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_expected_filter_types": { + "statcast_arm_value_game_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_expected_max_year": { + "statcast_arm_value_max_year": { "type": "integer" }, - "statcast_expected_min_year": { + "statcast_arm_value_min_year": { "type": "integer" }, - "statcast_expected_minimums": { + "statcast_arm_value_minimum_opportunities": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_expected_sort_directions": { + "statcast_arm_value_situations": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_expected_sort_fields": { + "statcast_arm_value_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_expected_types": { + "statcast_arm_value_sort_fields": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_batting_minimums": { + "statcast_arm_value_split_years": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_fielding_minimums": { + "statcast_arm_value_team_ids": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_game_types": { + "statcast_arm_value_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_group_by": { + "statcast_arm_value_with_team_only": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_positions": { + "statcast_arm_value_years": { "items": { - "$ref": "#/definitions/mlb.EnumValue" + "type": "integer" }, "type": "array" }, - "statcast_fielding_run_value_seasons": { + "statcast_baserunning_filters": { + "$ref": "#/definitions/mlb.StatcastBaserunningFilters" + }, + "statcast_bat_tracking_attack_zones": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_sort_directions": { + "statcast_bat_tracking_bat_sides": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_sort_fields": { + "statcast_bat_tracking_contact_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_team_ids": { + "statcast_bat_tracking_counts": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_fielding_run_value_types": { + "statcast_bat_tracking_game_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_field_out_values": { + "statcast_bat_tracking_group_by": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_game_types": { + "statcast_bat_tracking_hard_hit_values": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_hands": { + "statcast_bat_tracking_min_group_swings": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_minimum_heights": { + "statcast_bat_tracking_min_swings": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_minimum_split_values": { + "statcast_bat_tracking_pitch_hands": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_minimums": { + "statcast_bat_tracking_pitch_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_runner_states": { + "statcast_bat_tracking_seasons": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_seasons": { + "statcast_bat_tracking_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_secondary_splits": { + "statcast_bat_tracking_sort_fields": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_sort_directions": { + "statcast_bat_tracking_team_ids": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_sort_fields": { + "statcast_bat_tracking_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_split_year_values": { + "statcast_batted_ball_game_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_throw_heights": { + "statcast_batted_ball_max_year": { + "type": "integer" + }, + "statcast_batted_ball_min_splits": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_throw_locations": { + "statcast_batted_ball_min_year": { + "type": "integer" + }, + "statcast_batted_ball_minimums": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_throw_positions": { + "statcast_batted_ball_pitch_types": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_time_bins": { + "statcast_batted_ball_seasons": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_first_base_receiving_types": { + "statcast_batted_ball_sides": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_home_runs_categories": { + "statcast_batted_ball_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_home_runs_minimum_home_runs": { + "statcast_batted_ball_sort_fields": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_home_runs_player_types": { + "statcast_batted_ball_split_years": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, "type": "array" }, - "statcast_home_runs_sort_directions": { + "statcast_batted_ball_splits": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_batted_ball_team_ids": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_batted_ball_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_blocking_game_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_blocking_minimums": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_blocking_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_blocking_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_blocking_team_ids": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_blocking_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_blocking_years": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_ball_strike": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_bat_sides": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_calls": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_game_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_min_pitches": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_min_results": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_pitch_hands": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_pitch_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_team_ids": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_framing_years": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_pop_time_min_2b_attempts": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_pop_time_min_3b_attempts": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_pop_time_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_pop_time_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_pop_time_team_ids": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_pop_time_years": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_game_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_group_by": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_knee_codes": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_min_pitches": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_min_results": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_pitch_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_seasons": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_sides": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_team_ids": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_stance_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_game_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_minimum_attempts": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_seasons": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_target_bases": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_team_ids": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_catcher_throwing_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_entity_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_expected_filter_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_expected_max_year": { + "type": "integer" + }, + "statcast_expected_min_year": { + "type": "integer" + }, + "statcast_expected_minimums": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_expected_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_expected_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_expected_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_batting_minimums": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_fielding_minimums": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_game_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_group_by": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_positions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_seasons": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_team_ids": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_fielding_run_value_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_field_out_values": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_game_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_hands": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_minimum_heights": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_minimum_split_values": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_minimums": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_runner_states": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_seasons": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_secondary_splits": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_sort_directions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_sort_fields": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_split_year_values": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_throw_heights": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_throw_locations": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_throw_positions": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_time_bins": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_first_base_receiving_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_home_runs_categories": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_home_runs_minimum_home_runs": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_home_runs_player_types": { + "items": { + "$ref": "#/definitions/mlb.EnumValue" + }, + "type": "array" + }, + "statcast_home_runs_sort_directions": { "items": { "$ref": "#/definitions/mlb.EnumValue" }, @@ -152654,6 +156139,526 @@ }, "type": "object" }, + "pricecharting.BigMover": { + "properties": { + "change": { + "description": "Change is signed: US dollars when change_unit is usd, a percentage when\nit is percent.", + "type": "number" + }, + "console": { + "type": "string" + }, + "console_slug": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "price": { + "type": "number" + }, + "slug": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.BigMoversResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/pricecharting.Category" + }, + "type": "array" + }, + "category": { + "type": "string" + }, + "change_unit": { + "type": "string" + }, + "price_label": { + "description": "PriceLabel names the price column, for example Loose Price (the\nungraded price of a card).", + "type": "string" + }, + "products": { + "items": { + "$ref": "#/definitions/pricecharting.BigMover" + }, + "type": "array" + }, + "region": { + "type": "string" + }, + "sort": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.CategoriesResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/pricecharting.Category" + }, + "type": "array" + }, + "category": { + "type": "string" + }, + "consoles": { + "items": { + "$ref": "#/definitions/pricecharting.Console" + }, + "type": "array" + } + }, + "type": "object" + }, + "pricecharting.Category": { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.Console": { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.ConsoleProduct": { + "properties": { + "complete_price": { + "type": "number" + }, + "id": { + "type": "integer" + }, + "image_url": { + "type": "string" + }, + "loose_price": { + "type": "number" + }, + "name": { + "type": "string" + }, + "new_price": { + "type": "number" + }, + "slug": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.ConsoleResponse": { + "properties": { + "console": { + "type": "string" + }, + "cursor": { + "type": "integer" + }, + "next_cursor": { + "type": "integer" + }, + "price_labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "products": { + "items": { + "$ref": "#/definitions/pricecharting.ConsoleProduct" + }, + "type": "array" + }, + "sort": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.GradeCount": { + "properties": { + "count": { + "type": "integer" + }, + "grade": { + "type": "integer" + } + }, + "type": "object" + }, + "pricecharting.Population": { + "properties": { + "cgc": { + "items": { + "$ref": "#/definitions/pricecharting.GradeCount" + }, + "type": "array" + }, + "psa": { + "items": { + "$ref": "#/definitions/pricecharting.GradeCount" + }, + "type": "array" + } + }, + "type": "object" + }, + "pricecharting.PriceCell": { + "properties": { + "change": { + "type": "number" + }, + "label": { + "type": "string" + }, + "price": { + "type": "number" + } + }, + "type": "object" + }, + "pricecharting.PriceHistoryResponse": { + "properties": { + "currency": { + "type": "string" + }, + "population": { + "$ref": "#/definitions/pricecharting.Population" + }, + "product": { + "$ref": "#/definitions/pricecharting.ProductRef" + }, + "series": { + "items": { + "$ref": "#/definitions/pricecharting.PriceSeries" + }, + "type": "array" + } + }, + "type": "object" + }, + "pricecharting.PricePoint": { + "properties": { + "date": { + "description": "Date is the first day of the month the price describes (YYYY-MM-DD).", + "type": "string" + }, + "price": { + "type": "number" + } + }, + "type": "object" + }, + "pricecharting.PriceSeries": { + "properties": { + "label": { + "description": "Label is the column's name on this product, for example Ungraded, Grade 9\nor PSA 10 on a card and Loose, Complete or New on a game.", + "type": "string" + }, + "points": { + "items": { + "$ref": "#/definitions/pricecharting.PricePoint" + }, + "type": "array" + }, + "tab": { + "description": "Tab is the column's sales tab id, the same value as recent_sales[].tab in\npricecharting-product: used, cib, new, graded, box-only or manual-only.", + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.Product": { + "properties": { + "attributes": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "console": { + "type": "string" + }, + "console_slug": { + "type": "string" + }, + "full_prices": { + "items": { + "$ref": "#/definitions/pricecharting.PriceCell" + }, + "type": "array" + }, + "id": { + "type": "integer" + }, + "image_url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "prices": { + "items": { + "$ref": "#/definitions/pricecharting.PriceCell" + }, + "type": "array" + }, + "recent_sales": { + "items": { + "$ref": "#/definitions/pricecharting.Sale" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.ProductRef": { + "properties": { + "console": { + "type": "string" + }, + "console_slug": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.ProductResponse": { + "properties": { + "product": { + "$ref": "#/definitions/pricecharting.Product" + } + }, + "type": "object" + }, + "pricecharting.Sale": { + "properties": { + "date": { + "type": "string" + }, + "grade": { + "type": "string" + }, + "item_id": { + "type": "string" + }, + "item_url": { + "type": "string" + }, + "price": { + "type": "number" + }, + "source": { + "type": "string" + }, + "tab": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.SearchProduct": { + "properties": { + "category": { + "type": "string" + }, + "complete_price": { + "type": "number" + }, + "console": { + "type": "string" + }, + "console_uid": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "image_url": { + "type": "string" + }, + "loose_price": { + "type": "number" + }, + "name": { + "type": "string" + }, + "new_price": { + "type": "number" + } + }, + "type": "object" + }, + "pricecharting.SearchResponse": { + "properties": { + "products": { + "items": { + "$ref": "#/definitions/pricecharting.SearchProduct" + }, + "type": "array" + }, + "query": { + "type": "string" + }, + "sort": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "pricecharting.bigMoversResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/pricecharting.BigMoversResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.categoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/pricecharting.CategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.consoleResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/pricecharting.ConsoleResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.priceHistoryResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/pricecharting.PriceHistoryResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.productResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/pricecharting.ProductResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "pricecharting.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/pricecharting.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "pristineauction.AuctionStatus": { "properties": { "slug": { @@ -157404,6 +161409,66 @@ }, "type": "object" }, + "psa.PriceGuideSetSummary": { + "properties": { + "category_name": { + "description": "CategoryName is the category's display name from\npsa-price-guide-categories, e.g. \"Baseball Cards\".", + "type": "string" + }, + "category_path": { + "description": "CategoryPath is the set URL's category segment -- pass as category_path\nto psa-price-guide-set.", + "type": "string" + }, + "set_id": { + "description": "SetID is PSA's own numeric set id.", + "type": "integer" + }, + "set_name": { + "description": "SetName is the set's display name as PSA's category page shows it,\ne.g. \"1974 Topps\".", + "type": "string" + }, + "set_path": { + "description": "SetPath is the set URL's own slug -- pass as set_path to\npsa-price-guide-set.", + "type": "string" + } + }, + "type": "object" + }, + "psa.PriceGuideSetsResponse": { + "properties": { + "category_path": { + "description": "CategoryPath echoes the category filter; empty when every category was\nsearched.", + "type": "string" + }, + "page": { + "type": "integer" + }, + "page_size": { + "type": "integer" + }, + "query": { + "type": "string" + }, + "sets": { + "items": { + "$ref": "#/definitions/psa.PriceGuideSetSummary" + }, + "type": "array" + }, + "total_count": { + "description": "TotalCount is every matching set across all pages.", + "type": "integer" + }, + "unavailable_categories": { + "description": "UnavailableCategories lists categories whose set list could not be\nloaded and had no earlier copy to fall back on. When present, Sets and\nTotalCount cover the other categories only.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, "psa.ProBatFactsCategoriesResponse": { "properties": { "categories": { @@ -157792,6 +161857,22 @@ }, "type": "object" }, + "psa.priceGuideSetsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/psa.PriceGuideSetsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "psa.probatFactsCategoriesResponseDoc": { "properties": { "code": { @@ -163426,6 +167507,739 @@ }, "type": "object" }, + "reelshort.Actor": { + "properties": { + "imdb_url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "photo_url": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.Book": { + "properties": { + "cover_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "episodes": { + "type": "integer" + }, + "favorites": { + "type": "integer" + }, + "first_paid_episode": { + "description": "FirstPaidEpisode is the episode number from which episodes are paid; 0\nwhen ReelShort lists none.", + "type": "integer" + }, + "has_trailer": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "language": { + "type": "string" + }, + "plays": { + "description": "Plays and Favorites are ReelShort's own read_count and collect_count.", + "type": "integer" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.Episode": { + "properties": { + "free": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "kind": { + "description": "episode or trailer", + "type": "string" + }, + "likes": { + "type": "integer" + }, + "number": { + "description": "Number is the episode number; 0 is the trailer.", + "type": "integer" + }, + "published_at": { + "type": "string" + }, + "thumbnail_url": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.FandomCategoriesResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/reelshort.FandomCategory" + }, + "type": "array" + } + }, + "type": "object" + }, + "reelshort.FandomCategory": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "posts": { + "type": "integer" + }, + "slug": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.FandomPost": { + "properties": { + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "excerpt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "image_url": { + "type": "string" + }, + "modified_at": { + "type": "string" + }, + "published_at": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.FandomPostResponse": { + "properties": { + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "content": { + "description": "Content is the article body as plain text with paragraph breaks.", + "type": "string" + }, + "excerpt": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "image_url": { + "type": "string" + }, + "modified_at": { + "type": "string" + }, + "published_at": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "title": { + "type": "string" + }, + "title_ids": { + "description": "TitleIDs are the ReelShort title ids the article links to, in order of\nfirst appearance; pass them to reelshort-movie.", + "items": { + "type": "string" + }, + "type": "array" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.FandomPostsResponse": { + "properties": { + "category": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "posts": { + "items": { + "$ref": "#/definitions/reelshort.FandomPost" + }, + "type": "array" + }, + "search": { + "type": "string" + }, + "total": { + "type": "integer" + }, + "total_pages": { + "type": "integer" + } + }, + "type": "object" + }, + "reelshort.HomeResponse": { + "properties": { + "language": { + "type": "string" + }, + "shelves": { + "items": { + "$ref": "#/definitions/reelshort.Shelf" + }, + "type": "array" + } + }, + "type": "object" + }, + "reelshort.MovieResponse": { + "properties": { + "actors": { + "items": { + "$ref": "#/definitions/reelshort.Actor" + }, + "type": "array" + }, + "ai_generated": { + "type": "boolean" + }, + "badge": { + "type": "string" + }, + "cover_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dubbed": { + "type": "boolean" + }, + "episode_count": { + "description": "EpisodeCount counts the numbered episodes; the trailer is not included\n(ReelShort's own total on its movie page does include it).", + "type": "integer" + }, + "episodes": { + "items": { + "$ref": "#/definitions/reelshort.Episode" + }, + "type": "array" + }, + "favorites": { + "type": "integer" + }, + "first_paid_episode": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "imdb_url": { + "type": "string" + }, + "language": { + "type": "string" + }, + "online_at": { + "type": "string" + }, + "original_language": { + "type": "string" + }, + "plays": { + "type": "integer" + }, + "published_at": { + "type": "string" + }, + "tags": { + "items": { + "$ref": "#/definitions/reelshort.Tag" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "update_status": { + "description": "UpdateStatus is ReelShort's raw update_status flag (1 on every title\nsampled on 2026-10-26); it is not interpreted.", + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.NewReleasesResponse": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/reelshort.Book" + }, + "type": "array" + }, + "language": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.RelatedTag": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.SearchResponse": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/reelshort.Book" + }, + "type": "array" + }, + "keywords": { + "type": "string" + }, + "language": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "total": { + "description": "Total is approximate: ReelShort's search backend reports a count that\nvaries between calls for the same query.", + "type": "integer" + }, + "total_pages": { + "type": "integer" + } + }, + "type": "object" + }, + "reelshort.Shelf": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/reelshort.Book" + }, + "type": "array" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.ShelfResponse": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/reelshort.Book" + }, + "type": "array" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "reelshort.Tag": { + "properties": { + "category_id": { + "type": "string" + }, + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.TagBooksResponse": { + "properties": { + "books": { + "items": { + "$ref": "#/definitions/reelshort.Book" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "related_tags": { + "items": { + "$ref": "#/definitions/reelshort.RelatedTag" + }, + "type": "array" + }, + "tag": { + "$ref": "#/definitions/reelshort.Tag" + }, + "top_titles": { + "items": { + "$ref": "#/definitions/reelshort.TitleRef" + }, + "type": "array" + }, + "total_items": { + "description": "TotalItems is ReelShort's total for the tag; paging can return fewer\ndistinct titles (a title can repeat across pages).", + "type": "integer" + } + }, + "type": "object" + }, + "reelshort.TagMatch": { + "properties": { + "category_id": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "image_url": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "titles": { + "description": "Titles is the number of titles ReelShort's search lists for the tag. It\nis approximate: reelshort-tag-books reports a different total for the\nsame tag.", + "type": "integer" + } + }, + "type": "object" + }, + "reelshort.TagSearchResponse": { + "properties": { + "language": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "page_size": { + "type": "integer" + }, + "tags": { + "items": { + "$ref": "#/definitions/reelshort.TagMatch" + }, + "type": "array" + }, + "total": { + "type": "integer" + }, + "word": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.TagsResponse": { + "properties": { + "category": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "language": { + "type": "string" + }, + "tags": { + "items": { + "$ref": "#/definitions/reelshort.Tag" + }, + "type": "array" + } + }, + "type": "object" + }, + "reelshort.TitleRef": { + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "reelshort.fandomCategoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.FandomCategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.fandomPostResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.FandomPostResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.fandomPostsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.FandomPostsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.homeResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.HomeResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.movieResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.MovieResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.newReleasesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.NewReleasesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.shelfResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.ShelfResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.tagBooksResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.TagBooksResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.tagSearchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.TagSearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "reelshort.tagsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/reelshort.TagsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "referrals.referralAttributionDoc": { "properties": { "campaign": { @@ -213465,6 +218279,840 @@ }, "type": "object" }, + "tcgplayer.Facet": { + "properties": { + "count": { + "type": "integer" + }, + "url_value": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.Facets": { + "properties": { + "card_types": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + }, + "energy_types": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + }, + "product_lines": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + }, + "product_types": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + }, + "rarities": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + }, + "sets": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + } + }, + "type": "object" + }, + "tcgplayer.FilterValue": { + "properties": { + "abbreviation": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.FiltersResponse": { + "properties": { + "conditions": { + "items": { + "$ref": "#/definitions/tcgplayer.FilterValue" + }, + "type": "array" + }, + "languages": { + "items": { + "$ref": "#/definitions/tcgplayer.FilterValue" + }, + "type": "array" + }, + "listing_types": { + "items": { + "type": "string" + }, + "type": "array" + }, + "product_id": { + "type": "integer" + }, + "product_line": { + "type": "string" + }, + "product_line_id": { + "type": "integer" + }, + "variants": { + "items": { + "$ref": "#/definitions/tcgplayer.FilterValue" + }, + "type": "array" + } + }, + "type": "object" + }, + "tcgplayer.Listing": { + "properties": { + "condition": { + "type": "string" + }, + "direct_seller": { + "type": "boolean" + }, + "gold_seller": { + "type": "boolean" + }, + "language": { + "type": "string" + }, + "listing_id": { + "type": "integer" + }, + "listing_type": { + "type": "string" + }, + "price": { + "type": "number" + }, + "printing": { + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "seller_city": { + "type": "string" + }, + "seller_country": { + "type": "string" + }, + "seller_name": { + "type": "string" + }, + "seller_rating": { + "type": "number" + }, + "seller_sales": { + "type": "string" + }, + "seller_state": { + "type": "string" + }, + "shipping_price": { + "type": "number" + }, + "verified_seller": { + "type": "boolean" + } + }, + "type": "object" + }, + "tcgplayer.ListingFacets": { + "properties": { + "conditions": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + }, + "languages": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + }, + "printings": { + "items": { + "$ref": "#/definitions/tcgplayer.Facet" + }, + "type": "array" + } + }, + "type": "object" + }, + "tcgplayer.ListingsResponse": { + "properties": { + "facets": { + "$ref": "#/definitions/tcgplayer.ListingFacets" + }, + "limit": { + "type": "integer" + }, + "listings": { + "items": { + "$ref": "#/definitions/tcgplayer.Listing" + }, + "type": "array" + }, + "next_offset": { + "type": "integer" + }, + "offset": { + "type": "integer" + }, + "product_id": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "tcgplayer.PriceBucket": { + "properties": { + "high_sale_price": { + "type": "number" + }, + "high_sale_price_with_shipping": { + "type": "number" + }, + "low_sale_price": { + "type": "number" + }, + "low_sale_price_with_shipping": { + "type": "number" + }, + "market_price": { + "type": "number" + }, + "quantity_sold": { + "type": "integer" + }, + "start_date": { + "type": "string" + }, + "transaction_count": { + "type": "integer" + } + }, + "type": "object" + }, + "tcgplayer.PriceGuideResponse": { + "properties": { + "game": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "next_offset": { + "type": "integer" + }, + "offset": { + "type": "integer" + }, + "rows": { + "items": { + "$ref": "#/definitions/tcgplayer.PriceGuideRow" + }, + "type": "array" + }, + "set_abbreviation": { + "type": "string" + }, + "set_id": { + "type": "integer" + }, + "set_name": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "tcgplayer.PriceGuideRow": { + "properties": { + "condition": { + "type": "string" + }, + "language": { + "type": "string" + }, + "low_price": { + "type": "number" + }, + "market_price": { + "type": "number" + }, + "name": { + "type": "string" + }, + "number": { + "type": "string" + }, + "printing": { + "type": "string" + }, + "product_id": { + "type": "integer" + }, + "rarity": { + "type": "string" + }, + "sales": { + "type": "integer" + } + }, + "type": "object" + }, + "tcgplayer.PriceHistoryResponse": { + "properties": { + "product_id": { + "type": "integer" + }, + "range": { + "type": "string" + }, + "skus": { + "items": { + "$ref": "#/definitions/tcgplayer.SKUHistory" + }, + "type": "array" + } + }, + "type": "object" + }, + "tcgplayer.PricePoint": { + "properties": { + "buylist_market_price": { + "type": "number" + }, + "listed_median_price": { + "type": "number" + }, + "market_price": { + "type": "number" + }, + "printing": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.Product": { + "properties": { + "attributes": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "description": { + "type": "string" + }, + "foil_only": { + "type": "boolean" + }, + "image_url": { + "type": "string" + }, + "lowest_price": { + "type": "number" + }, + "lowest_price_with_shipping": { + "type": "number" + }, + "market_price": { + "type": "number" + }, + "median_price": { + "type": "number" + }, + "name": { + "type": "string" + }, + "normal_only": { + "type": "boolean" + }, + "number": { + "type": "string" + }, + "price_points": { + "items": { + "$ref": "#/definitions/tcgplayer.PricePoint" + }, + "type": "array" + }, + "product_id": { + "type": "integer" + }, + "product_line": { + "type": "string" + }, + "product_line_url_name": { + "type": "string" + }, + "product_type": { + "type": "string" + }, + "rarity": { + "type": "string" + }, + "sealed": { + "type": "boolean" + }, + "set_code": { + "type": "string" + }, + "set_name": { + "type": "string" + }, + "skus": { + "items": { + "$ref": "#/definitions/tcgplayer.SKU" + }, + "type": "array" + }, + "total_listings": { + "type": "integer" + }, + "total_sellers": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.ProductLine": { + "properties": { + "direct": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "url_name": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.ProductLinesResponse": { + "properties": { + "product_lines": { + "items": { + "$ref": "#/definitions/tcgplayer.ProductLine" + }, + "type": "array" + } + }, + "type": "object" + }, + "tcgplayer.ProductResponse": { + "properties": { + "product": { + "$ref": "#/definitions/tcgplayer.Product" + } + }, + "type": "object" + }, + "tcgplayer.ProductSummary": { + "properties": { + "card_types": { + "items": { + "type": "string" + }, + "type": "array" + }, + "foil_only": { + "type": "boolean" + }, + "image_url": { + "type": "string" + }, + "lowest_price": { + "type": "number" + }, + "lowest_price_with_shipping": { + "type": "number" + }, + "market_price": { + "type": "number" + }, + "median_price": { + "type": "number" + }, + "name": { + "type": "string" + }, + "number": { + "type": "string" + }, + "product_id": { + "type": "integer" + }, + "product_line": { + "type": "string" + }, + "rarity": { + "type": "string" + }, + "sealed": { + "type": "boolean" + }, + "set_code": { + "type": "string" + }, + "set_name": { + "type": "string" + }, + "total_listings": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.SKU": { + "properties": { + "condition": { + "type": "string" + }, + "language": { + "type": "string" + }, + "sku": { + "type": "integer" + }, + "variant": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.SKUHistory": { + "properties": { + "average_daily_quantity_sold": { + "type": "number" + }, + "average_daily_transaction_count": { + "type": "number" + }, + "buckets": { + "items": { + "$ref": "#/definitions/tcgplayer.PriceBucket" + }, + "type": "array" + }, + "condition": { + "type": "string" + }, + "language": { + "type": "string" + }, + "sku": { + "type": "integer" + }, + "total_quantity_sold": { + "type": "integer" + }, + "total_transaction_count": { + "type": "integer" + }, + "variant": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.Sale": { + "properties": { + "condition": { + "type": "string" + }, + "language": { + "type": "string" + }, + "listing_type": { + "type": "string" + }, + "order_date": { + "type": "string" + }, + "purchase_price": { + "type": "number" + }, + "quantity": { + "type": "integer" + }, + "shipping_price": { + "type": "number" + }, + "variant": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.SalesResponse": { + "properties": { + "product_id": { + "type": "integer" + }, + "sales": { + "items": { + "$ref": "#/definitions/tcgplayer.Sale" + }, + "type": "array" + } + }, + "type": "object" + }, + "tcgplayer.SearchResponse": { + "properties": { + "facets": { + "$ref": "#/definitions/tcgplayer.Facets" + }, + "limit": { + "type": "integer" + }, + "next_offset": { + "type": "integer" + }, + "offset": { + "type": "integer" + }, + "products": { + "items": { + "$ref": "#/definitions/tcgplayer.ProductSummary" + }, + "type": "array" + }, + "query": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "tcgplayer.Set": { + "properties": { + "abbreviation": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "release_date": { + "type": "string" + }, + "supplemental": { + "type": "boolean" + }, + "url_name": { + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.SetsResponse": { + "properties": { + "product_line": { + "type": "string" + }, + "sets": { + "items": { + "$ref": "#/definitions/tcgplayer.Set" + }, + "type": "array" + } + }, + "type": "object" + }, + "tcgplayer.filtersResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.FiltersResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.listingsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.ListingsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.priceGuideResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.PriceGuideResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.priceHistoryResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.PriceHistoryResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.productLinesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.ProductLinesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.productResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.ProductResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.salesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.SalesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "tcgplayer.setsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/tcgplayer.SetsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "techcrunch.AuthorArticle": { "properties": { "category": { @@ -213608,6 +219256,351 @@ }, "type": "object" }, + "telegram.BotResponse": { + "properties": { + "avatar_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "monthly_users": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "username": { + "type": "string" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" + }, + "telegram.ChannelPostsResponse": { + "properties": { + "has_more": { + "type": "boolean" + }, + "next_before": { + "type": "integer" + }, + "posts": { + "items": { + "$ref": "#/definitions/telegram.Post" + }, + "type": "array" + }, + "query": { + "type": "string" + }, + "title": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object" + }, + "telegram.ChannelResponse": { + "properties": { + "avatar_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "files_count": { + "type": "integer" + }, + "links_count": { + "type": "integer" + }, + "photos_count": { + "type": "integer" + }, + "preview_url": { + "type": "string" + }, + "subscribers": { + "type": "integer" + }, + "subscribers_approximate": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "username": { + "type": "string" + }, + "verified": { + "type": "boolean" + }, + "videos_count": { + "type": "integer" + } + }, + "type": "object" + }, + "telegram.ForwardedRef": { + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "telegram.GroupResponse": { + "properties": { + "avatar_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "members": { + "type": "integer" + }, + "online": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object" + }, + "telegram.LinkPreview": { + "properties": { + "description": { + "type": "string" + }, + "image_url": { + "type": "string" + }, + "site_name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "telegram.Media": { + "properties": { + "thumbnail_url": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "telegram.Post": { + "properties": { + "author": { + "type": "string" + }, + "edited": { + "type": "boolean" + }, + "forwarded_from": { + "$ref": "#/definitions/telegram.ForwardedRef" + }, + "id": { + "type": "integer" + }, + "link_preview": { + "$ref": "#/definitions/telegram.LinkPreview" + }, + "links": { + "items": { + "type": "string" + }, + "type": "array" + }, + "media": { + "items": { + "$ref": "#/definitions/telegram.Media" + }, + "type": "array" + }, + "published_at": { + "type": "string" + }, + "reactions": { + "items": { + "$ref": "#/definitions/telegram.Reaction" + }, + "type": "array" + }, + "reply_to": { + "$ref": "#/definitions/telegram.ReplyRef" + }, + "text": { + "type": "string" + }, + "url": { + "type": "string" + }, + "username": { + "type": "string" + }, + "views": { + "type": "integer" + } + }, + "type": "object" + }, + "telegram.PostResponse": { + "properties": { + "post": { + "$ref": "#/definitions/telegram.Post" + } + }, + "type": "object" + }, + "telegram.Reaction": { + "properties": { + "count": { + "type": "integer" + }, + "custom_emoji_id": { + "type": "string" + }, + "emoji": { + "type": "string" + }, + "paid": { + "type": "boolean" + } + }, + "type": "object" + }, + "telegram.ReplyRef": { + "properties": { + "author": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "telegram.botResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/telegram.BotResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "telegram.channelPostsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/telegram.ChannelPostsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "telegram.channelResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/telegram.ChannelResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "telegram.groupResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/telegram.GroupResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "telegram.postResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/telegram.PostResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "telegraph.AuthorArticle": { "properties": { "excerpt": { @@ -235126,6 +241119,564 @@ }, "type": "object" }, + "wallapop.CategoriesResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/wallapop.Category" + }, + "type": "array" + }, + "count": { + "example": 997, + "type": "integer" + }, + "fetched_at": { + "example": "2026-10-25T00:00:00Z", + "type": "string" + }, + "max_depth": { + "example": 5, + "type": "integer" + }, + "root_count": { + "example": 18, + "type": "integer" + }, + "source_url": { + "example": "https://api.wallapop.com/api/v3/categories?context=search", + "type": "string" + } + }, + "type": "object" + }, + "wallapop.Category": { + "properties": { + "depth": { + "example": 1, + "type": "integer" + }, + "id": { + "example": 12465, + "type": "integer" + }, + "is_leaf": { + "example": false, + "type": "boolean" + }, + "name": { + "example": "Fashion & accessories", + "type": "string" + }, + "parent_id": { + "example": 11002, + "type": "integer" + }, + "path": { + "example": "fashion-and-accessories/women", + "type": "string" + }, + "root_id": { + "example": 12465, + "type": "integer" + }, + "vertical_id": { + "example": "fashion", + "type": "string" + } + }, + "type": "object" + }, + "wallapop.FilterDefinition": { + "properties": { + "format": { + "type": "string" + }, + "id": { + "type": "string" + }, + "is_search_enabled": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "options": { + "items": { + "$ref": "#/definitions/wallapop.FilterOption" + }, + "type": "array" + }, + "options_endpoint": { + "type": "string" + }, + "reload_when_changed": { + "type": "boolean" + }, + "search_params": { + "additionalProperties": { + "$ref": "#/definitions/wallapop.FilterParamBinding" + }, + "type": "object" + }, + "selection": { + "type": "string" + }, + "source": { + "type": "string" + }, + "steps": { + "items": { + "$ref": "#/definitions/wallapop.FilterRangeStep" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "unit": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.FilterOption": { + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.FilterOptionsResponse": { + "properties": { + "brand": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "filter_id": { + "type": "string" + }, + "next_cursor": { + "type": "string" + }, + "options": { + "items": { + "$ref": "#/definitions/wallapop.FilterOption" + }, + "type": "array" + }, + "options_query": { + "type": "string" + }, + "page_size": { + "type": "integer" + }, + "q": { + "type": "string" + }, + "sort": { + "type": "string" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.FilterParamBinding": { + "properties": { + "param_key": { + "type": "string" + }, + "param_value": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.FilterRangeStep": { + "properties": { + "end": { + "type": "number" + }, + "increment": { + "type": "number" + }, + "start": { + "type": "number" + } + }, + "type": "object" + }, + "wallapop.FiltersResponse": { + "properties": { + "category_id": { + "type": "integer" + }, + "count": { + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "filters": { + "items": { + "$ref": "#/definitions/wallapop.FilterDefinition" + }, + "type": "array" + }, + "query": { + "type": "string" + }, + "root_category_id": { + "type": "integer" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ItemDetailAttribute": { + "properties": { + "key": { + "type": "string" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ItemDetailCharacteristic": { + "properties": { + "attribute": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ItemDetailCondition": { + "properties": { + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ItemDetailRelatedSearch": { + "properties": { + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ItemDetailResponse": { + "properties": { + "attributes": { + "items": { + "$ref": "#/definitions/wallapop.ItemDetailAttribute" + }, + "type": "array" + }, + "category_id": { + "type": "integer" + }, + "characteristics": { + "items": { + "$ref": "#/definitions/wallapop.ItemDetailCharacteristic" + }, + "type": "array" + }, + "condition": { + "$ref": "#/definitions/wallapop.ItemDetailCondition" + }, + "currency": { + "type": "string" + }, + "description": { + "type": "string" + }, + "fetched_at": { + "type": "string" + }, + "hashtags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "images": { + "items": { + "type": "string" + }, + "type": "array" + }, + "location": { + "$ref": "#/definitions/wallapop.ListingLocation" + }, + "price": { + "type": "number" + }, + "related_searches": { + "items": { + "$ref": "#/definitions/wallapop.ItemDetailRelatedSearch" + }, + "type": "array" + }, + "shipping": { + "$ref": "#/definitions/wallapop.ListingShipping" + }, + "slug": { + "type": "string" + }, + "taxonomy": { + "items": { + "$ref": "#/definitions/wallapop.ListingTaxonomy" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ListingCard": { + "properties": { + "category_id": { + "type": "integer" + }, + "currency": { + "type": "string" + }, + "id": { + "type": "string" + }, + "images": { + "items": { + "type": "string" + }, + "type": "array" + }, + "location": { + "$ref": "#/definitions/wallapop.ListingLocation" + }, + "price": { + "type": "number" + }, + "shipping": { + "$ref": "#/definitions/wallapop.ListingShipping" + }, + "slug": { + "type": "string" + }, + "taxonomy": { + "items": { + "$ref": "#/definitions/wallapop.ListingTaxonomy" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ListingLocation": { + "properties": { + "city": { + "type": "string" + }, + "country_code": { + "type": "string" + }, + "region": { + "type": "string" + }, + "region2": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.ListingShipping": { + "properties": { + "item_is_shippable": { + "type": "boolean" + }, + "user_allows_shipping": { + "type": "boolean" + } + }, + "type": "object" + }, + "wallapop.ListingTaxonomy": { + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.SearchResponse": { + "properties": { + "category_id": { + "type": "integer" + }, + "count": { + "type": "integer" + }, + "country_code": { + "type": "string" + }, + "fetched_at": { + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/wallapop.ListingCard" + }, + "type": "array" + }, + "next_cursor": { + "type": "string" + }, + "query": { + "type": "string" + }, + "sort": { + "type": "string" + }, + "source_url": { + "type": "string" + } + }, + "type": "object" + }, + "wallapop.categoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wallapop.CategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wallapop.filterOptionsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wallapop.FilterOptionsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wallapop.filtersResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wallapop.FiltersResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wallapop.itemDetailResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wallapop.ItemDetailResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wallapop.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wallapop.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "walmart.Product": { "properties": { "attributes": { @@ -235765,511 +242316,1243 @@ }, "type": "object" }, - "wayfair.CategoriesResponse": { + "wattpad.Author": { + "properties": { + "avatar": { + "type": "string" + }, + "name": { + "type": "string" + }, + "username": { + "type": "string" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" + }, + "wattpad.CategoriesResponse": { "properties": { "categories": { "items": { - "$ref": "#/definitions/wayfair.CategoryRef" + "$ref": "#/definitions/wattpad.Category" }, "type": "array" - }, - "has_next": { - "example": true, - "type": "boolean" - }, - "page": { - "example": 1, - "type": "integer" - }, - "page_size": { - "example": 100, - "type": "integer" - }, - "total": { - "example": 1521, - "type": "integer" } }, "type": "object" }, - "wayfair.CategoryRef": { + "wattpad.Category": { "properties": { - "department": { - "example": "baby-kids", - "type": "string" - }, "id": { - "example": "1829184", - "type": "string" + "type": "integer" }, "name": { - "example": "Kids Shower Curtains", "type": "string" }, - "url": { - "example": "https://www.wayfair.com/baby-kids/sb0/kids-shower-curtains-c1829184.html", + "name_english": { "type": "string" } }, "type": "object" }, - "wayfair.CategoryResponse": { + "wattpad.Comment": { "properties": { - "category": { + "author": { "type": "string" }, - "category_id": { + "author_avatar": { "type": "string" }, - "count": { - "type": "integer" - }, - "fetched_at": { + "body": { "type": "string" }, - "has_more": { - "type": "boolean" + "created_at": { + "type": "string" }, - "page": { - "type": "integer" + "id": { + "type": "string" }, - "products": { - "items": { - "$ref": "#/definitions/wayfair.ProductSummary" - }, - "type": "array" + "is_reply": { + "type": "boolean" }, - "source_url": { + "parent_id": { "type": "string" }, - "total_count": { + "replies": { "type": "integer" + }, + "url": { + "type": "string" } }, "type": "object" }, - "wayfair.ProductDetailResponse": { + "wattpad.Language": { "properties": { - "brand_name": { - "type": "string" - }, - "currency_code": { - "type": "string" + "id": { + "type": "integer" }, - "fetched_at": { + "name": { "type": "string" - }, - "highlights": { - "description": "Highlights are Wayfair's own site-selected feature bullets (its \"Why\nWe Love It\" section), the closest available substitute for a\nmarketing description -- a distinct marketing description field was\nnot found in the page's initial data.", + } + }, + "type": "object" + }, + "wattpad.LanguagesResponse": { + "properties": { + "languages": { "items": { - "type": "string" + "$ref": "#/definitions/wattpad.Language" }, "type": "array" + } + }, + "type": "object" + }, + "wattpad.Part": { + "properties": { + "comments": { + "type": "integer" }, - "images": { - "description": "Images lists every distinct product image found on the page.", - "items": { - "type": "string" - }, - "type": "array" + "created_at": { + "type": "string" }, - "in_stock": { + "draft": { "type": "boolean" }, - "original_price": { + "id": { "type": "string" }, - "price": { + "length": { + "type": "integer" + }, + "modified_at": { "type": "string" }, - "product_id": { + "reads": { + "type": "integer" + }, + "title": { "type": "string" }, - "product_name": { + "url": { "type": "string" }, - "rating": { - "type": "number" + "votes": { + "type": "integer" }, - "rating_breakdown": { - "additionalProperties": { - "type": "integer" + "word_count": { + "type": "integer" + } + }, + "type": "object" + }, + "wattpad.PartCommentsResponse": { + "properties": { + "comments": { + "items": { + "$ref": "#/definitions/wattpad.Comment" }, - "description": "RatingBreakdown maps each star value (\"1\" through \"5\") to the number\nof reviews with that rating.", - "type": "object" + "type": "array" }, - "rating_count": { - "description": "RatingCount is the product's total review count, sourced from the\npage's own aggregate rating summary.", + "limit": { "type": "integer" }, - "selected_color": { - "description": "SelectedColor is the color variant this page rendered (from its own\nURL/piid) -- kept for backward compatibility. VariantCategories below\ncovers every variant dimension's full option list, not just the one\nselected color.", - "type": "string" - }, - "source_url": { - "type": "string" + "next_offset": { + "description": "NextOffset is the offset of the next page; absent when this page held\nfewer comments than were asked for, which means it was the last.", + "type": "integer" }, - "stock_message": { - "description": "StockMessage is Wayfair's own inventory status text (e.g. \"795 Left\nin Stock\"), surfaced verbatim since it is more informative than a\nplain boolean.", - "type": "string" + "offset": { + "type": "integer" }, - "url": { + "part_id": { "type": "string" - }, - "variant_categories": { - "description": "VariantCategories lists every variant dimension this product offers\n(e.g. \"Base Finish\", \"Upholstery Color\", \"Cord Color\") with every one\nof its options -- not just the single option SelectedColor covers.\nEach option's Available reflects both whether it can be selected\ntogether with the product's other currently-selected variant choices\nand, when known, its own stock status -- confirmed live 2026-08-11\nagainst Wayfair's own PDP data (see service.go's doc comment).", - "items": { - "$ref": "#/definitions/wayfair.VariantCategory" - }, - "type": "array" } }, "type": "object" }, - "wayfair.ProductSummary": { + "wattpad.PartDetail": { "properties": { - "brand_name": { - "type": "string" + "comments": { + "type": "integer" }, - "currency_code": { + "created_at": { "type": "string" }, - "image_url": { + "draft": { + "type": "boolean" + }, + "id": { "type": "string" }, - "original_price": { + "length": { + "type": "integer" + }, + "modified_at": { "type": "string" }, - "price": { + "reads": { + "type": "integer" + }, + "story_id": { "type": "string" }, - "product_id": { + "story_title": { "type": "string" }, - "product_name": { + "title": { "type": "string" }, "url": { "type": "string" + }, + "votes": { + "type": "integer" + }, + "word_count": { + "type": "integer" } }, "type": "object" }, - "wayfair.VariantCategory": { + "wattpad.PartResponse": { "properties": { - "name": { - "type": "string" - }, - "options": { - "items": { - "$ref": "#/definitions/wayfair.VariantOption" - }, - "type": "array" + "part": { + "$ref": "#/definitions/wattpad.PartDetail" } }, "type": "object" }, - "wayfair.VariantOption": { + "wattpad.RecommendationsResponse": { "properties": { - "available": { - "description": "Available is false when this option cannot be selected together\nwith the product's other currently-selected variant choices, or\n(when its stock status is known) when it is itself out of stock.", - "type": "boolean" - }, - "image_url": { - "type": "string" + "stories": { + "items": { + "$ref": "#/definitions/wattpad.Story" + }, + "type": "array" }, - "name": { + "story_id": { "type": "string" - }, - "selected": { - "description": "Selected is true for the option this page's own URL/piid rendered\n(the same option SelectedColor names, for whichever category it\nbelongs to).", - "type": "boolean" } }, "type": "object" }, - "wayfair.categoriesResponseDoc": { + "wattpad.SearchResponse": { "properties": { - "code": { - "example": 200, + "limit": { "type": "integer" }, - "data": { - "$ref": "#/definitions/wayfair.CategoriesResponse" + "next_offset": { + "description": "NextOffset is the offset of the next page, absent on the last one. A\npage can hold fewer than limit stories (or none) when Wattpad filters\nafter paging, so advance by next_offset rather than by the item count.", + "type": "integer" }, - "msg": { - "example": "OK", - "type": "string" + "offset": { + "type": "integer" + }, + "stories": { + "items": { + "$ref": "#/definitions/wattpad.Story" + }, + "type": "array" + }, + "total": { + "description": "Total is the number of matches Wattpad reports; browse requests (no\ntext query) are capped at 1500.", + "type": "integer" } }, "type": "object" }, - "wayfair.categoryResponseDoc": { + "wattpad.SearchUsersResponse": { "properties": { - "code": { - "example": 200, + "limit": { "type": "integer" }, - "data": { - "$ref": "#/definitions/wayfair.CategoryResponse" + "next_offset": { + "description": "NextOffset is the offset of the next page; it is absent when this page\nheld fewer users than were asked for.", + "type": "integer" }, - "msg": { - "example": "OK", - "type": "string" + "offset": { + "type": "integer" + }, + "users": { + "items": { + "$ref": "#/definitions/wattpad.UserSummary" + }, + "type": "array" } }, "type": "object" }, - "wayfair.productDetailResponseDoc": { + "wattpad.Story": { "properties": { - "code": { - "example": 200, + "author": { + "$ref": "#/definitions/wattpad.Author" + }, + "category_ids": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "comments": { "type": "integer" }, - "data": { - "$ref": "#/definitions/wayfair.ProductDetailResponse" + "completed": { + "type": "boolean" }, - "msg": { - "example": "OK", + "cover": { "type": "string" - } - }, - "type": "object" - }, - "wccftech.AuthorArticle": { - "properties": { - "image_url": { + }, + "created_at": { "type": "string" }, - "published_at": { + "description": { "type": "string" }, - "summary": { + "id": { "type": "string" }, + "language": { + "$ref": "#/definitions/wattpad.Language" + }, + "mature": { + "type": "boolean" + }, + "modified_at": { + "type": "string" + }, + "parts": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, "title": { "type": "string" }, "url": { "type": "string" + }, + "votes": { + "type": "integer" } }, "type": "object" }, - "wccftech.AuthorResponse": { + "wattpad.StoryDetail": { "properties": { - "articles": { + "author": { + "$ref": "#/definitions/wattpad.Author" + }, + "category_ids": { "items": { - "$ref": "#/definitions/wccftech.AuthorArticle" + "type": "integer" }, "type": "array" }, - "bio": { - "type": "string" + "comments": { + "type": "integer" }, - "image_url": { + "completed": { + "type": "boolean" + }, + "copyright": { + "type": "integer" + }, + "cover": { "type": "string" }, - "name": { + "created_at": { "type": "string" }, - "role": { + "description": { "type": "string" }, - "slug": { + "first_part_id": { "type": "string" }, - "url": { + "id": { "type": "string" - } - }, - "type": "object" - }, - "web.ScrapeInfo": { - "properties": { - "backend": { - "description": "headless backend that rendered, when method=browser", + }, + "language": { + "$ref": "#/definitions/wattpad.Language" + }, + "last_published_at": { "type": "string" }, - "cache_state": { - "description": "\"hit\" | \"miss\" — whether this response came from the cache", + "mature": { + "type": "boolean" + }, + "modified_at": { "type": "string" }, - "cached_at": { - "description": "RFC3339 time the served copy was fetched (cache hits only)", + "paid_model": { "type": "string" }, - "escalated": { - "description": "true when the fetch escalated from HTTP to a headless browser", + "parts": { + "type": "integer" + }, + "paywalled": { "type": "boolean" }, - "method": { - "description": "\"http\" | \"browser\"", + "rating": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { "type": "string" }, - "render_failed": { - "description": "RenderFailed is true when a browser render was requested (render=browser or a\npinned backend) but no backend produced a page, so the content is the\nHTTP-tier fallback. Such a page ran no JavaScript and is billed at the\nHTTP-tier price.", - "type": "boolean" + "url": { + "type": "string" + }, + "votes": { + "type": "integer" } }, "type": "object" }, - "web.ScrapeLink": { + "wattpad.StoryPartsResponse": { "properties": { - "href": { - "type": "string" + "parts": { + "items": { + "$ref": "#/definitions/wattpad.Part" + }, + "type": "array" }, - "rel": { + "story_id": { "type": "string" }, - "text": { + "title": { "type": "string" + }, + "total": { + "type": "integer" } }, "type": "object" }, - "web.ScrapeMetadata": { + "wattpad.StoryResponse": { "properties": { - "author": { - "type": "string" + "story": { + "$ref": "#/definitions/wattpad.StoryDetail" + } + }, + "type": "object" + }, + "wattpad.UserProfile": { + "properties": { + "ambassador": { + "type": "boolean" }, - "canonical_url": { + "avatar": { "type": "string" }, - "content_type": { + "background": { "type": "string" }, "description": { "type": "string" }, - "final_url": { - "type": "string" + "followers": { + "type": "integer" }, - "image": { + "following": { + "type": "integer" + }, + "joined_at": { "type": "string" }, - "language": { + "lists": { + "type": "integer" + }, + "location": { "type": "string" }, "modified_at": { "type": "string" }, - "published_at": { + "name": { "type": "string" }, - "section": { - "type": "string" + "stories_published": { + "type": "integer" }, - "site_name": { + "url": { "type": "string" }, - "source_url": { + "username": { "type": "string" }, - "status_code": { + "verified": { + "type": "boolean" + }, + "votes_received": { "type": "integer" }, - "title": { + "website": { "type": "string" } }, "type": "object" }, - "web.ScrapeOption": { + "wattpad.UserResponse": { "properties": { - "backend": { - "example": "", - "type": "string" + "user": { + "$ref": "#/definitions/wattpad.UserProfile" + } + }, + "type": "object" + }, + "wattpad.UserStoriesResponse": { + "properties": { + "limit": { + "type": "integer" }, - "dedicated": { - "type": "boolean" + "next_offset": { + "type": "integer" }, - "formats": { - "example": [ - "markdown" - ], + "offset": { + "type": "integer" + }, + "stories": { "items": { - "type": "string" + "$ref": "#/definitions/wattpad.Story" }, "type": "array" }, - "max_age": { - "example": 604800000, + "total": { "type": "integer" }, - "only_main_content": { - "type": "boolean" - }, - "proxy": { - "example": "", - "type": "string" - }, - "render": { - "enum": [ - "auto", - "http", - "browser", - "unblocker" - ], - "example": "auto", - "type": "string" - }, - "store_in_cache": { - "type": "boolean" - }, - "url": { - "example": "https://example.com", + "username": { "type": "string" - }, - "wait_for": { - "example": 0, - "type": "integer" } }, - "required": [ - "url" - ], "type": "object" }, - "web.ScrapeResult": { + "wattpad.UserSummary": { "properties": { - "html": { + "avatar": { "type": "string" }, - "link_details": { - "items": { - "$ref": "#/definitions/web.ScrapeLink" - }, - "type": "array" + "description": { + "type": "string" }, - "links": { - "items": { - "type": "string" - }, - "type": "array" + "followers": { + "type": "integer" }, - "markdown": { + "name": { "type": "string" }, - "metadata": { - "$ref": "#/definitions/web.ScrapeMetadata" + "stories_published": { + "type": "integer" }, - "raw_html": { + "username": { "type": "string" }, - "scrape": { - "$ref": "#/definitions/web.ScrapeInfo" + "verified": { + "type": "boolean" } }, "type": "object" }, - "web.TechStackOption": { + "wattpad.categoriesResponseDoc": { "properties": { - "render": { - "enum": [ - "browser", - "auto", - "http" + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.CategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.languagesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.LanguagesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.partCommentsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.PartCommentsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.partResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.PartResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.recommendationsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.RecommendationsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.searchUsersResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.SearchUsersResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.storyPartsResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.StoryPartsResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.storyResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.StoryResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.userResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.UserResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wattpad.userStoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wattpad.UserStoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wayfair.CategoriesResponse": { + "properties": { + "categories": { + "items": { + "$ref": "#/definitions/wayfair.CategoryRef" + }, + "type": "array" + }, + "has_next": { + "example": true, + "type": "boolean" + }, + "page": { + "example": 1, + "type": "integer" + }, + "page_size": { + "example": 100, + "type": "integer" + }, + "total": { + "example": 1521, + "type": "integer" + } + }, + "type": "object" + }, + "wayfair.CategoryRef": { + "properties": { + "department": { + "example": "baby-kids", + "type": "string" + }, + "id": { + "example": "1829184", + "type": "string" + }, + "name": { + "example": "Kids Shower Curtains", + "type": "string" + }, + "url": { + "example": "https://www.wayfair.com/baby-kids/sb0/kids-shower-curtains-c1829184.html", + "type": "string" + } + }, + "type": "object" + }, + "wayfair.CategoryResponse": { + "properties": { + "category": { + "type": "string" + }, + "category_id": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "fetched_at": { + "type": "string" + }, + "has_more": { + "type": "boolean" + }, + "page": { + "type": "integer" + }, + "products": { + "items": { + "$ref": "#/definitions/wayfair.ProductSummary" + }, + "type": "array" + }, + "source_url": { + "type": "string" + }, + "total_count": { + "type": "integer" + } + }, + "type": "object" + }, + "wayfair.ProductDetailResponse": { + "properties": { + "brand_name": { + "type": "string" + }, + "currency_code": { + "type": "string" + }, + "fetched_at": { + "type": "string" + }, + "highlights": { + "description": "Highlights are Wayfair's own site-selected feature bullets (its \"Why\nWe Love It\" section), the closest available substitute for a\nmarketing description -- a distinct marketing description field was\nnot found in the page's initial data.", + "items": { + "type": "string" + }, + "type": "array" + }, + "images": { + "description": "Images lists every distinct product image found on the page.", + "items": { + "type": "string" + }, + "type": "array" + }, + "in_stock": { + "type": "boolean" + }, + "original_price": { + "type": "string" + }, + "price": { + "type": "string" + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "rating": { + "type": "number" + }, + "rating_breakdown": { + "additionalProperties": { + "type": "integer" + }, + "description": "RatingBreakdown maps each star value (\"1\" through \"5\") to the number\nof reviews with that rating.", + "type": "object" + }, + "rating_count": { + "description": "RatingCount is the product's total review count, sourced from the\npage's own aggregate rating summary.", + "type": "integer" + }, + "selected_color": { + "description": "SelectedColor is the color variant this page rendered (from its own\nURL/piid) -- kept for backward compatibility. VariantCategories below\ncovers every variant dimension's full option list, not just the one\nselected color.", + "type": "string" + }, + "source_url": { + "type": "string" + }, + "stock_message": { + "description": "StockMessage is Wayfair's own inventory status text (e.g. \"795 Left\nin Stock\"), surfaced verbatim since it is more informative than a\nplain boolean.", + "type": "string" + }, + "url": { + "type": "string" + }, + "variant_categories": { + "description": "VariantCategories lists every variant dimension this product offers\n(e.g. \"Base Finish\", \"Upholstery Color\", \"Cord Color\") with every one\nof its options -- not just the single option SelectedColor covers.\nEach option's Available reflects both whether it can be selected\ntogether with the product's other currently-selected variant choices\nand, when known, its own stock status -- confirmed live 2026-08-11\nagainst Wayfair's own PDP data (see service.go's doc comment).", + "items": { + "$ref": "#/definitions/wayfair.VariantCategory" + }, + "type": "array" + } + }, + "type": "object" + }, + "wayfair.ProductSummary": { + "properties": { + "brand_name": { + "type": "string" + }, + "currency_code": { + "type": "string" + }, + "image_url": { + "type": "string" + }, + "original_price": { + "type": "string" + }, + "price": { + "type": "string" + }, + "product_id": { + "type": "string" + }, + "product_name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "wayfair.VariantCategory": { + "properties": { + "name": { + "type": "string" + }, + "options": { + "items": { + "$ref": "#/definitions/wayfair.VariantOption" + }, + "type": "array" + } + }, + "type": "object" + }, + "wayfair.VariantOption": { + "properties": { + "available": { + "description": "Available is false when this option cannot be selected together\nwith the product's other currently-selected variant choices, or\n(when its stock status is known) when it is itself out of stock.", + "type": "boolean" + }, + "image_url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "selected": { + "description": "Selected is true for the option this page's own URL/piid rendered\n(the same option SelectedColor names, for whichever category it\nbelongs to).", + "type": "boolean" + } + }, + "type": "object" + }, + "wayfair.categoriesResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wayfair.CategoriesResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wayfair.categoryResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wayfair.CategoryResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wayfair.productDetailResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/wayfair.ProductDetailResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "wccftech.AuthorArticle": { + "properties": { + "image_url": { + "type": "string" + }, + "published_at": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "wccftech.AuthorResponse": { + "properties": { + "articles": { + "items": { + "$ref": "#/definitions/wccftech.AuthorArticle" + }, + "type": "array" + }, + "bio": { + "type": "string" + }, + "image_url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "web.ScrapeInfo": { + "properties": { + "backend": { + "description": "headless backend that rendered, when method=browser", + "type": "string" + }, + "cache_state": { + "description": "\"hit\" | \"miss\" — whether this response came from the cache", + "type": "string" + }, + "cached_at": { + "description": "RFC3339 time the served copy was fetched (cache hits only)", + "type": "string" + }, + "escalated": { + "description": "true when the fetch escalated from HTTP to a headless browser", + "type": "boolean" + }, + "method": { + "description": "\"http\" | \"browser\"", + "type": "string" + }, + "render_failed": { + "description": "RenderFailed is true when a browser render was requested (render=browser or a\npinned backend) but no backend produced a page, so the content is the\nHTTP-tier fallback. Such a page ran no JavaScript and is billed at the\nHTTP-tier price.", + "type": "boolean" + } + }, + "type": "object" + }, + "web.ScrapeLink": { + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "type": "object" + }, + "web.ScrapeMetadata": { + "properties": { + "author": { + "type": "string" + }, + "canonical_url": { + "type": "string" + }, + "content_type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "final_url": { + "type": "string" + }, + "image": { + "type": "string" + }, + "language": { + "type": "string" + }, + "modified_at": { + "type": "string" + }, + "published_at": { + "type": "string" + }, + "section": { + "type": "string" + }, + "site_name": { + "type": "string" + }, + "source_url": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "web.ScrapeOption": { + "properties": { + "backend": { + "example": "", + "type": "string" + }, + "dedicated": { + "type": "boolean" + }, + "formats": { + "example": [ + "markdown" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "max_age": { + "example": 604800000, + "type": "integer" + }, + "only_main_content": { + "type": "boolean" + }, + "proxy": { + "example": "", + "type": "string" + }, + "render": { + "enum": [ + "auto", + "http", + "browser", + "unblocker" + ], + "example": "auto", + "type": "string" + }, + "store_in_cache": { + "type": "boolean" + }, + "url": { + "example": "https://example.com", + "type": "string" + }, + "wait_for": { + "example": 0, + "type": "integer" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "web.ScrapeResult": { + "properties": { + "html": { + "type": "string" + }, + "link_details": { + "items": { + "$ref": "#/definitions/web.ScrapeLink" + }, + "type": "array" + }, + "links": { + "items": { + "type": "string" + }, + "type": "array" + }, + "markdown": { + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/web.ScrapeMetadata" + }, + "raw_html": { + "type": "string" + }, + "scrape": { + "$ref": "#/definitions/web.ScrapeInfo" + } + }, + "type": "object" + }, + "web.TechStackOption": { + "properties": { + "render": { + "enum": [ + "browser", + "auto", + "http" ], "example": "browser", "type": "string" @@ -256474,6 +263757,203 @@ ] } }, + "/aliexpress/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns AliExpress's category navigation taxonomy. With no parameters it lists the top-level category tabs (about 24), each with its navigation id, name, numeric platform category id and icon. Pass one tab's id as category_tab to expand that tab into its second- and third-level categories; third-level categories carry the search keyword and a ready-to-use search URL, so they can be passed to the search endpoint as q. Category ids are exposed only where AliExpress's payload actually carries them: second-level categories have no numeric platform id, so none is invented for them. This is a taxonomy surface, not a product listing.", + "operationId": "aliexpress-categories", + "parameters": [ + { + "description": "Top-level tab id from an unfiltered response, e.g. electronics; omit to list top-level tabs only", + "in": "query", + "name": "category_tab", + "type": "string", + "x-example": "electronics" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/aliexpress.categoriesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List AliExpress category navigation", + "tags": [ + "AliExpress" + ] + } + }, + "/aliexpress/category-ids": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the AliExpress web category ids that its own product cards carry on one listing page, with each id's parent, depth and full category path. Pass q to discover the categories of products matching a keyword, or category_id to inspect one category listing. Pass exactly one of them. The ids are the same web category ids used in /category//.html URLs and by the search endpoint's cat_id parameter; they are NOT the platform/taxonomy ids returned by the categories endpoint. A parent category listing contains products from its descendants, so inspecting a category reveals its child ids, and every returned path names that id's ancestors: the value space is discoverable by walking from a keyword or a category id rather than guessing.", + "operationId": "aliexpress-category-ids", + "parameters": [ + { + "description": "Free-text keywords whose result cards' web category ids are returned; pass exactly one of q or category_id", + "in": "query", + "name": "q", + "type": "string", + "x-example": "wireless earbuds" + }, + { + "description": "AliExpress web category id whose listing is inspected; a parent category reveals its descendants' ids. Pass exactly one of q or category_id", + "in": "query", + "name": "category_id", + "type": "integer", + "x-example": 44 + }, + { + "description": "1-indexed listing page to inspect (1-60), defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/aliexpress.categoryIDsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Discover AliExpress web category ids", + "tags": [ + "AliExpress" + ] + } + }, + "/aliexpress/category-products": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page (up to 60 products) of a public AliExpress category listing with the same product fields as the search endpoint: product id, title, link, image, price, currency, original price, rating, sold text, discount, SKU id, ship-from country and store name when AliExpress lists them. category_id is the AliExpress web category id from a /category//.html URL (for example 5090301 for Cellphones); the slug segment is cosmetic (the listing is selected by id) and defaults to products. The listing uses the anonymous US English/USD locale. Product-detail pages are currently unavailable through the supported HTTP profiles.", + "operationId": "aliexpress-category-products", + "parameters": [ + { + "description": "AliExpress web category id: the number in a /category//.html URL (for example 5090301 for Cellphones); taxonomy ids from the categories endpoint are a different namespace and are not interchangeable", + "in": "query", + "name": "category_id", + "required": true, + "type": "integer", + "x-example": 5090301 + }, + { + "description": "Category path segment used by AliExpress's own URL (lower-case letters, digits, hyphens); cosmetic, defaults to products", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "cellphones" + }, + { + "description": "1-indexed result page (1-60), defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/aliexpress.categoryProductsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List products in an AliExpress category", + "tags": [ + "AliExpress" + ] + } + }, "/aliexpress/reviews": { "get": { "consumes": [ @@ -256555,7 +264035,7 @@ "x-example": "wireless earbuds" }, { - "description": "1-indexed result page (1-200), defaults to 1", + "description": "1-indexed result page (1-60), defaults to 1", "in": "query", "name": "page", "type": "integer", @@ -256606,6 +264086,13 @@ "name": "attr", "type": "string", "x-example": "3079-4148335" + }, + { + "description": "Search within one AliExpress web category id (the number in a /category//.html URL); taxonomy ids from the categories endpoint are a different namespace and are not interchangeable", + "in": "query", + "name": "cat_id", + "type": "integer", + "x-example": 5090301 } ], "produces": [ @@ -256705,6 +264192,126 @@ ] } }, + "/aliexpress/suggest": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns AliExpress's own search-box keyword completions for a query, with a ready-to-use search URL for each suggestion. This is a suggestion/autocomplete surface, not a product feed: the upstream payload contains keyword strings only, so no product id, title, price or seller is returned. AliExpress usually offers 10-12 suggestions; each suggestion's url is the matching AliExpress search page and can be passed to the search endpoint as q.", + "operationId": "aliexpress-suggest", + "parameters": [ + { + "description": "Partial or full search keywords to complete", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "wireless earbuds" + }, + { + "description": "Maximum suggestions to return (1-20), defaults to 10", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/aliexpress.suggestResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Suggest AliExpress search keywords", + "tags": [ + "AliExpress" + ] + } + }, + "/aliexpress/trending-searches": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns AliExpress's own discovery/trending keyword feed from its anonymous search box: the hot-search keywords it groups by category, plus its discovery and shading keyword modules. Each item carries the keyword, its display casing when different, the kind (hot, shading, discovery, history), the module's UI label, the hot-list category, and a ready-to-use search URL; keyword thumbnails are included where AliExpress supplies them. This is a keyword-discovery feed, not a product list and not a personalized recommendation: no product id, title, price or seller is returned, and AliExpress does not promise a stable order between calls. The anonymous feed carries roughly 40 hot keywords plus a few discovery/shading keywords per call; search history is empty for anonymous callers.", + "operationId": "aliexpress-trending-searches", + "parameters": [ + { + "description": "Maximum trending keywords to return (1-20), defaults to 10", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/aliexpress.trendingSearchesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List AliExpress trending searches", + "tags": [ + "AliExpress" + ] + } + }, "/aljazeera/article": { "get": { "description": "Returns an Al Jazeera article by `url`, a canonical dated `www.aljazeera.com` address such as `/news/2026/9/20/example-slug`: title, description, publication and update times, section, credited authors, lead image and body `paragraphs`. Live-blog URLs return their opening summary bullets as the body; a video page with no article text returns `503` and a malformed URL `400`.", @@ -297830,6 +305437,467 @@ ] } }, + "/datasets/apple-maps-places/facets": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns terms aggregation counts for the stored Apple Maps place directory. Facet enum: `category`, `country_code`, `state`, `city`, `price_symbol`, `catalog_country`. Accepts the same filter parameters as search to scope the aggregation. Use `facet=category` to discover the exact category names the `category` filter accepts.", + "operationId": "datasets-apple-maps-places-facets", + "parameters": [ + { + "description": "Facet enum: category, country_code, state, city, price_symbol, catalog_country", + "enum": [ + "category", + "country_code", + "state", + "city", + "price_symbol", + "catalog_country" + ], + "in": "query", + "name": "facet", + "required": true, + "type": "string", + "x-example": "category" + }, + { + "description": "Full-text search over place name, category, city and address", + "in": "query", + "name": "q", + "type": "string" + }, + { + "description": "Exact Apple category name", + "in": "query", + "name": "category", + "type": "string" + }, + { + "description": "Exact city filter", + "in": "query", + "name": "city", + "type": "string" + }, + { + "description": "Exact state/region filter", + "in": "query", + "name": "state", + "type": "string" + }, + { + "description": "ISO 3166-1 alpha-2 country filter", + "in": "query", + "name": "country_code", + "type": "string" + }, + { + "description": "Exact postal code filter", + "in": "query", + "name": "postal_code", + "type": "string" + }, + { + "description": "Minimum rating, from 0 through 5", + "in": "query", + "name": "min_rating", + "type": "number" + }, + { + "description": "Minimum number of ratings behind the rating", + "in": "query", + "name": "min_rating_count", + "type": "integer" + }, + { + "description": "Website presence filter", + "in": "query", + "name": "has_website", + "type": "boolean" + }, + { + "description": "Phone presence filter", + "in": "query", + "name": "has_phone", + "type": "boolean" + }, + { + "description": "Latitude for radius filtering, requires lon", + "in": "query", + "name": "lat", + "type": "number" + }, + { + "description": "Longitude for radius filtering, requires lat", + "in": "query", + "name": "lon", + "type": "number" + }, + { + "description": "Radius in meters, 1 through 50000; requires lat and lon", + "in": "query", + "name": "radius_m", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/datasets.applePlacesFacetResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Facet stored Apple Maps places", + "tags": [ + "Datasets" + ] + } + }, + "/datasets/apple-maps-places/items/{place_id}": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one stored Apple Maps place by Apple place id from dataset id `apple-maps-places`. Accepts either the numeric place id (the `id` field) or the external place id that appears in maps.apple.com URLs (the `place_id` field, starting with `I`). A `rating` of `null` means Apple shows no rating for the place. `catalog_country` is the Apple storefront the place was found under, not its country; `country_code` is the place's own country. `first_seen_at` is when the directory first observed the place and `last_seen_at` the latest observation. Does not trigger live scraping; for a live Apple Maps lookup use the apple-maps-place endpoint.", + "operationId": "datasets-apple-maps-places-item", + "parameters": [ + { + "description": "Apple place id: the numeric id or the external id starting with I", + "in": "path", + "name": "place_id", + "required": true, + "type": "string", + "x-example": "6435622567484707146" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/datasets.applePlaceResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a stored Apple Maps place", + "tags": [ + "Datasets" + ] + } + }, + "/datasets/apple-maps-places/nearby": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns stored Apple Maps places within a radius of a point, nearest first, from dataset id `apple-maps-places`. lat, lon and radius_m are required. Unlike the live apple-maps-search endpoint (which returns at most 25 places per call), this pages through the stored directory with `distance_m` on every item. Coverage is observed, not complete. Does not trigger live scraping. Billing: this endpoint costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).", + "operationId": "datasets-apple-maps-places-nearby", + "parameters": [ + { + "description": "Center latitude, from -90 through 90", + "in": "query", + "name": "lat", + "required": true, + "type": "number", + "x-example": 37.7749 + }, + { + "description": "Center longitude, from -180 through 180", + "in": "query", + "name": "lon", + "required": true, + "type": "number", + "x-example": -122.4194 + }, + { + "description": "Search radius in meters, 1 through 50000", + "in": "query", + "name": "radius_m", + "required": true, + "type": "integer", + "x-example": 5000 + }, + { + "description": "Exact Apple category name", + "in": "query", + "name": "category", + "type": "string" + }, + { + "description": "Minimum rating, from 0 through 5", + "in": "query", + "name": "min_rating", + "type": "number" + }, + { + "description": "Minimum number of ratings behind the rating", + "in": "query", + "name": "min_rating_count", + "type": "integer" + }, + { + "description": "Page number, defaults to 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Page size, defaults to 20 and maxes at 100", + "in": "query", + "name": "page_size", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/datasets.applePlacesSearchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Find nearby stored Apple Maps places", + "tags": [ + "Datasets" + ] + } + }, + "/datasets/apple-maps-places/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches the stored Apple Maps place directory (dataset id `apple-maps-places`), built by tiling populated areas and running category searches over each tile. Each place has its Apple place id, name, category path, address, coordinates, phone, website, opening hours, rating and price level where Apple shows them. Coverage is observed, not complete: Apple answers each search with at most 25 places, so very dense areas can hold places the directory has not reached, and a place missing from the results is not evidence that it does not exist or has closed. A `rating` of `null` means Apple shows no rating for the place (never a zero-star score); ratings and rating counts come from third-party review partners that Apple shows (for example Yelp and Foursquare), so they are not comparable across places and a few places carry a rating with no count. Supports full-text `q`, `category`/`city`/`state`/`country_code`/`postal_code` filters, `min_rating`, `min_rating_count`, `has_website`, `has_phone`, `lat`/`lon`/`radius_m` radius filtering, and `sort` (relevance, rating_desc, review_count_desc, updated_at_desc, distance_asc). Does not trigger live scraping. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).", + "operationId": "datasets-apple-maps-places-search", + "parameters": [ + { + "description": "Full-text search over place name, category, city and address; every term must match. Max 256 characters", + "in": "query", + "name": "q", + "type": "string" + }, + { + "description": "Exact Apple category name, max 128 characters, e.g. Coffee Shop; use facet=category to discover values", + "in": "query", + "name": "category", + "type": "string" + }, + { + "description": "Exact city filter, max 128 characters", + "in": "query", + "name": "city", + "type": "string" + }, + { + "description": "Exact state/region filter, max 128 characters", + "in": "query", + "name": "state", + "type": "string" + }, + { + "description": "ISO 3166-1 alpha-2 country filter, e.g. US, GB, JP", + "in": "query", + "name": "country_code", + "type": "string" + }, + { + "description": "Exact postal code filter, max 128 characters", + "in": "query", + "name": "postal_code", + "type": "string" + }, + { + "description": "Minimum rating, from 0 through 5; any value above 0 excludes unrated places", + "in": "query", + "name": "min_rating", + "type": "number" + }, + { + "description": "Minimum number of ratings behind the rating, 0 or greater", + "in": "query", + "name": "min_rating_count", + "type": "integer" + }, + { + "description": "true keeps only places with a website; false keeps only places without one", + "in": "query", + "name": "has_website", + "type": "boolean" + }, + { + "description": "true keeps only places with a phone number; false keeps only places without one", + "in": "query", + "name": "has_phone", + "type": "boolean" + }, + { + "description": "Latitude for radius filtering or distance sort, requires lon", + "in": "query", + "name": "lat", + "type": "number" + }, + { + "description": "Longitude for radius filtering or distance sort, requires lat", + "in": "query", + "name": "lon", + "type": "number" + }, + { + "description": "Radius in meters, 1 through 50000; requires lat and lon", + "in": "query", + "name": "radius_m", + "type": "integer" + }, + { + "description": "Sort enum: relevance, rating_desc, review_count_desc, updated_at_desc, distance_asc. Defaults to relevance with q, otherwise updated_at_desc", + "enum": [ + "relevance", + "rating_desc", + "review_count_desc", + "updated_at_desc", + "distance_asc" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Page number, defaults to 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000", + "in": "query", + "name": "page_size", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/datasets.applePlacesSearchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Search stored Apple Maps places", + "tags": [ + "Datasets" + ] + } + }, "/datasets/apple-podcasts-shows/facets": { "get": { "consumes": [ @@ -302714,7 +310782,7 @@ "consumes": [ "application/json" ], - "description": "Returns terms aggregation counts for Google Maps businesses. Facet enum: `category`, `country`, `state`, `state_code`, `county`, `county_code`, `city`, `town`, `website_status`. Category facet values are exact locale-specific Google Maps labels and can be localized, non-ASCII, or contain punctuation; pass a returned value unchanged to the category filter. `state` and `county` keep each country's own administrative vocabulary (e.g. `Provincia de Madrid`, `Département du Nord`); `state_code` and `county_code` are the matching ISO 3166-2 codes (e.g. `ES-MD`, `FR-59`) and are the stable cross-country grouping key. Rows not yet resolved carry no code and are absent from the code facets.", + "description": "Returns terms aggregation counts for Google Maps businesses. Facet enum: `category`, `country`, `state`, `state_code`, `county`, `county_code`, `city`, `town`, `website_status`. Category facet values are exact locale-specific Google Maps labels and can be localized, non-ASCII, or contain punctuation; pass a returned value unchanged to the category filter. `state` and `county` keep each country's own administrative vocabulary (e.g. `Provincia de Madrid`, `Département du Nord`); `state_code` and `county_code` are ISO 3166-2 codes populated today only for Canadian provinces and territories (e.g. `CA-ON`) and Irish counties (e.g. `IE-D`); every other record, including all US rows, carries no code and is absent from the code facets.", "operationId": "datasets-google-map-businesses-facets", "parameters": [ { @@ -302737,7 +310805,7 @@ "x-example": "category" }, { - "description": "Full-text business search query, max 256 characters", + "description": "Full-text business search query, max 256 characters; every term must match the name, address, headline or category (filler words such as in, near and the are ignored)", "in": "query", "name": "q", "type": "string" @@ -302767,13 +310835,13 @@ "type": "string" }, { - "description": "Exact ISO 3166-2 state/region code filter, e.g. US-CA or FR-HDF, max 128 characters; use facet=state_code to discover values", + "description": "Exact ISO 3166-2 state/region code filter, e.g. CA-ON, max 128 characters. Only Canadian provinces and territories carry a code today, so US codes such as US-NV return no rows; filter other countries by state, county or city. Use facet=state_code to list values", "in": "query", "name": "state_code", "type": "string" }, { - "description": "Exact ISO 3166-2 county/district code filter, e.g. FR-59 or IT-RM, max 128 characters; use facet=county_code to discover values", + "description": "Exact ISO 3166-2 county/district code filter, e.g. IE-D, max 128 characters. Only Irish counties carry a code today; filter other countries by county or city. Use facet=county_code to list values", "in": "query", "name": "county_code", "type": "string" @@ -303073,7 +311141,7 @@ "operationId": "datasets-google-map-businesses-search", "parameters": [ { - "description": "Full-text business search query, max 256 characters", + "description": "Full-text business search query, max 256 characters; every term must match the name, address, headline or category (filler words such as in, near and the are ignored)", "in": "query", "name": "q", "type": "string" @@ -303103,13 +311171,13 @@ "type": "string" }, { - "description": "Exact ISO 3166-2 state/region code filter, e.g. US-CA or FR-HDF, max 128 characters; use facet=state_code to discover values", + "description": "Exact ISO 3166-2 state/region code filter, e.g. CA-ON, max 128 characters. Only Canadian provinces and territories carry a code today, so US codes such as US-NV return no rows; filter other countries by state, county or city. Use facet=state_code to list values", "in": "query", "name": "state_code", "type": "string" }, { - "description": "Exact ISO 3166-2 county/district code filter, e.g. FR-59 or IT-RM, max 128 characters; use facet=county_code to discover values", + "description": "Exact ISO 3166-2 county/district code filter, e.g. IE-D, max 128 characters. Only Irish counties carry a code today; filter other countries by county or city. Use facet=county_code to list values", "in": "query", "name": "county_code", "type": "string" @@ -319462,6 +327530,1135 @@ ] } }, + "/dramabox/browse": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of 12 DramaBox short dramas, optionally within one genre: id, title, description, cover, link, episode count, tags, genres, rating, update status and displayed views, with the page and total page count. Genre ids come from dramabox-genres. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-browse", + "parameters": [ + { + "description": "Genre id from dramabox-genres; 0 or omitted browses all titles", + "in": "query", + "name": "genre_id", + "type": "integer", + "x-example": 161 + }, + { + "description": "Page number, 1 to 1000; defaults to 1. Each page holds 12 titles", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 2 + }, + { + "description": "Site locale, one of: en, ko, zhHans, zh, es, ja, de, in, th, tl, pt, fr, ar, it (in is Indonesian); defaults to en. Each locale has its own title library", + "enum": [ + "en", + "ko", + "zhHans", + "zh", + "es", + "ja", + "de", + "in", + "th", + "tl", + "pt", + "fr", + "ar", + "it" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "ja" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.browseResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Browse DramaBox short dramas by genre", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the DramaBox app's category navigation as six groups: language, production type, dub mode, two genre rows (genre_1 and genre_2) and sort order. Each group lists the selectable options as display names and the values to pass to dramabox-category-books. The \"All\" pseudo-option is dropped because omitting a filter means all. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.categoriesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List DramaBox category filters", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/category-books": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of 20 DramaBox short dramas from the app's category feed, optionally filtered by values from dramabox-categories: language, production type, dub mode, either genre row and sort order. Filters are ANDed; an omitted filter means all. Each title carries its id, title, description, cover, website link, episode count, tags with tag ids, protagonist, play count, library flag and listing times. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-category-books", + "parameters": [ + { + "description": "Language/origin value from dramabox-categories' language group, e.g. 美国 (Local) or 中国 (Chinese)", + "in": "query", + "name": "language", + "type": "string", + "x-example": "美国" + }, + { + "description": "Production-type value from dramabox-categories' production group: 3 (AI Drama), 1 (Live-Action), 2 (Anime)", + "enum": [ + "3", + "1", + "2" + ], + "in": "query", + "name": "production", + "type": "string", + "x-example": "1" + }, + { + "description": "Dub-mode value from dramabox-categories' dub group: 1 (Dubbed), 0 (Subtitles Only)", + "enum": [ + "1", + "0" + ], + "in": "query", + "name": "dub", + "type": "string", + "x-example": "1" + }, + { + "description": "Genre value from dramabox-categories' genre_1 group, e.g. 1357 (Romance) or 1361 (Strong Heroine)", + "in": "query", + "name": "genre", + "type": "string", + "x-example": "1357" + }, + { + "description": "Genre value from dramabox-categories' genre_2 group, e.g. 1392 (Second Chance) or 1359 (BL); multi-tag values such as 1324,1362 are one value", + "in": "query", + "name": "genre_2", + "type": "string", + "x-example": "1392" + }, + { + "description": "Sort value from dramabox-categories' sort group: 1 (Trending), 2 (Latest), 3 (Unwatched)", + "enum": [ + "1", + "2", + "3" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "1" + }, + { + "description": "Page number, 1 to 1000; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Titles per page, 1 to 50; defaults to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.categoryBooksResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Browse DramaBox titles by category", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/channels": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the 8 DramaBox app theater channels as ids and names: Popular, New, Rankings, Categories, Anime, Live-Action, VIP and Original+. The channel value for dramabox-theater is the lowercase name (popular, new, rankings, categories, anime, live-action, vip, original). Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-channels", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.channelsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List DramaBox theater channels", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/drama": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one DramaBox short drama: title, description, cover, link, language, episode count, lifetime views, follows, tags, genres, listing times, the languages it is available in, the episode list with each episode's number, id, duration, free flag and thumbnail, and related titles. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-drama", + "parameters": [ + { + "description": "Title id (digits) from any DramaBox list, or a dramabox.com drama URL", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "42000028173" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.dramaResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a DramaBox short drama and its episodes", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/genres": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the genres DramaBox's browse accepts (Romance, Werewolves, Revenge, Billionaire, ...) as ids and names, read live from DramaBox. Pass a genre id to dramabox-browse. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-genres", + "parameters": [ + { + "description": "Site locale, one of: en, ko, zhHans, zh, es, ja, de, in, th, tl, pt, fr, ar, it (in is Indonesian); defaults to en. Each locale has its own title library", + "enum": [ + "en", + "ko", + "zhHans", + "zh", + "es", + "ja", + "de", + "in", + "th", + "tl", + "pt", + "fr", + "ar", + "it" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "ja" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.genresResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List DramaBox genres", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/home": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns DramaBox's (dramabox.com) home page: the featured short dramas and the three curated shelves (Trending, Must-sees, Hidden gems), each title with its id, title, description, cover, DramaBox link, episode count, tags, genres and the view count as the site prints it. Use dramabox-more for a whole shelf. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-home", + "parameters": [ + { + "description": "Site locale, one of: en, ko, zhHans, zh, es, ja, de, in, th, tl, pt, fr, ar, it (in is Indonesian); defaults to en. Each locale has its own title library", + "enum": [ + "en", + "ko", + "zhHans", + "zh", + "es", + "ja", + "de", + "in", + "th", + "tl", + "pt", + "fr", + "ar", + "it" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "ja" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.homeResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List DramaBox's featured titles and shelves", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/more": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of 18 titles from a DramaBox curated shelf (trending, must-sees or hidden-gems): id, title, description, cover, link, episode count, tags, genres and displayed views, with the page and total page count. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-more", + "parameters": [ + { + "description": "Curated shelf: trending, must-sees or hidden-gems", + "enum": [ + "trending", + "must-sees", + "hidden-gems" + ], + "in": "query", + "name": "position", + "required": true, + "type": "string", + "x-example": "trending" + }, + { + "description": "Page number, 1 to 1000; defaults to 1. Each page holds 18 titles", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 2 + }, + { + "description": "Site locale, one of: en, ko, zhHans, zh, es, ja, de, in, th, tl, pt, fr, ar, it (in is Indonesian); defaults to en. Each locale has its own title library", + "enum": [ + "en", + "ko", + "zhHans", + "zh", + "es", + "ja", + "de", + "in", + "th", + "tl", + "pt", + "fr", + "ar", + "it" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "ja" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.moreResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a whole DramaBox curated shelf", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/performer": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one DramaBox performer from the Android app API: name, gender, avatar, video count, follow flag, and one page of the titles they appear in (each with id, title, description, cover, website link, episode count, tags with their tag ids, protagonist, library flag and listing times). Get performer ids from dramabox-search or dramabox-suggest's people results. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-performer", + "parameters": [ + { + "description": "Performer id from dramabox-search or dramabox-suggest's people results", + "in": "query", + "name": "performer_id", + "required": true, + "type": "integer", + "x-example": 29450 + }, + { + "description": "Page number, 1 to 1000; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Page size, 1 to 20; defaults to 10", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.performerResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a DramaBox performer and their titles", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/rank": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one DramaBox ranking list from the DramaBox Android app API: the available tabs (Most Trending, Top Searched, New Releases) and 20 ranked titles, each with its id, title, description, cover, website link, episode count, tags, protagonist, rank position, hot metric, library flag and listing times. Pass a tab's type as rank_type to read that tab. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-rank", + "parameters": [ + { + "description": "Ranking tab: 1 (Most Trending), 2 (Top Searched), 3 (New Releases); omit for the default tab", + "enum": [ + 1, + 2, + 3 + ], + "in": "query", + "name": "rank_type", + "type": "integer", + "x-example": 2 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.rankResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a DramaBox ranking list", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/recommend": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of DramaBox's own \"You Might Like\" recommendation feed from the Android app API: the feed title and its titles, each with id, title, description, cover, website link, episode count, tags with their tag ids, protagonist, library flag and listing times. The upstream page size is fixed, so page is the only paging control. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-recommend", + "parameters": [ + { + "description": "Page number, 1 to 1000; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.recommendResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a page of DramaBox's recommendation feed", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches the DramaBox Android app API and returns one page of mixed results: book rows (id, title, description, cover, website link, tags, protagonist) and performer rows (id, name, avatar, series count), plus an is_more flag for the next page. The keyword is trimmed and truncated to 80 characters like the app; sort selects one of the app's result orderings. Performer ids can be passed to dramabox-performer. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-search", + "parameters": [ + { + "description": "Search text, trimmed and truncated to 80 characters", + "in": "query", + "name": "keyword", + "required": true, + "type": "string", + "x-example": "love" + }, + { + "default": 1, + "description": "One-based result page", + "in": "query", + "maximum": 1000, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 20, + "description": "Results per page", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "limit", + "type": "integer" + }, + { + "description": "Upstream result ordering mode; omit for the app default", + "enum": [ + 1, + 2, + 3 + ], + "in": "query", + "name": "sort", + "type": "integer", + "x-example": 1 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Search DramaBox titles and performers", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/suggest": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the DramaBox Android app API's autocomplete suggestions for a partial query: book rows (kind \"book\", cover_url) and performer rows (kind \"actor\", avatar, series count). The keyword is trimmed and truncated to 80 characters like the app; a query with no match returns an empty items list. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-suggest", + "parameters": [ + { + "description": "Partial search text, trimmed and truncated to 80 characters", + "in": "query", + "name": "keyword", + "required": true, + "type": "string", + "x-example": "lov" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.suggestResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get DramaBox search-box suggestions", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/tag": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of DramaBox titles carrying a tag, as the Android app shows them: each title's id, title, description, cover, website link, episode count, tags with their tag ids, protagonist, library flag and listing times, plus the tag's own name. Get tag ids from any title result's tag_refs (dramabox-rank, dramabox-search, dramabox-category-books and the other list endpoints all expose them). An unknown tag id returns an empty list rather than an error. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-tag", + "parameters": [ + { + "description": "Tag id from any title result's tag_refs", + "in": "query", + "name": "tag_id", + "required": true, + "type": "integer", + "x-example": 1379 + }, + { + "description": "Page number, 1 to 1000; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Page size, 1 to 50; defaults to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.tagResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List the DramaBox titles carrying a tag", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/theater": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of a DramaBox app theater channel: the channel, its titled shelves (each with styles and 10 to 20 titles), poster banners and search hot words. Each title carries its id, title, description, cover, website link, episode count, tags with tag ids, protagonist, play count, library flag and listing times. Channel values are the lowercase names from dramabox-channels. An empty feed is a valid answer. Only public catalog metadata and poster images are read; no playable video is returned.", + "operationId": "dramabox-theater", + "parameters": [ + { + "description": "Theater channel: popular, new, rankings, categories, anime, live-action, vip or original", + "enum": [ + "popular", + "new", + "rankings", + "categories", + "anime", + "live-action", + "vip", + "original" + ], + "in": "query", + "name": "channel", + "required": true, + "type": "string", + "x-example": "popular" + }, + { + "description": "Page number, 1 to 1000; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Titles per paged block, 1 to 20; defaults to 10", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.theaterResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a DramaBox theater channel feed", + "tags": [ + "DramaBox" + ] + } + }, + "/dramabox/trending": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the DramaBox Android app API's search landing page: the hot, trending and new-release title lists, the ranking tabs (pass a tab's type to dramabox-rank as rank_type) and the app's preset search keyword. Takes no parameters. Only public catalog metadata is read; no playable video is returned.", + "operationId": "dramabox-trending", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dramabox.trendingResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get DramaBox's search landing feeds", + "tags": [ + "DramaBox" + ] + } + }, "/duckduckgo/image": { "get": { "consumes": [ @@ -382158,6 +391355,91 @@ ] } }, + "/jumia/reviews": { + "get": { + "description": "Returns one page of a Jumia product's written, verified customer reviews (rating, title, text, date, first name of the author) with the rating summary: average rating, total ratings, total written reviews and the count of ratings per star. Reviews are 10 per page. A product with ratings but no written reviews returns an empty list with the summary. Pass the sku returned by jumia-search, jumia-category or jumia-product. Jumia sits behind an anti-bot challenge that clears on only some connections, so a call can take up to about 50 seconds and may return 503; retry it. country is required; see jumia-countries.", + "operationId": "jumia-reviews", + "parameters": [ + { + "description": "Jumia country storefront", + "enum": [ + "ci", + "eg", + "ke", + "ma", + "ng", + "sn" + ], + "in": "query", + "name": "country", + "required": true, + "type": "string", + "x-example": "ng" + }, + { + "description": "Product sku", + "in": "query", + "name": "sku", + "required": true, + "type": "string", + "x-example": "SA948MP6Z6LPDNAFAMZ" + }, + { + "default": 1, + "description": "1-based page of reviews, 10 per page", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/jumia.reviewsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get the reviews of a Jumia product", + "tags": [ + "Jumia" + ] + } + }, "/jumia/search": { "get": { "description": "Searches a Jumia country storefront by keyword and returns one page of product cards with price in the storefront's currency, original price and discount, rating, brand, categories and badges, plus the upstream total_count and a has_next flag. Jumia serves at most 50 pages. A search with no matches returns an empty products list. Jumia sits behind an anti-bot challenge that clears on only some connections, so a call can take up to about 50 seconds and may return 503; retry it. country is required (there is no default storefront); see jumia-countries.", @@ -382237,6 +391519,173 @@ ] } }, + "/jumia/sitemap-urls": { + "get": { + "description": "Returns one page of the URLs listed in a Jumia sitemap file, each with its last-modified date and first image, plus the total number of URLs in the file. A product file holds up to 16,000 product URLs; page through it with page and page_size (up to 5000). Take the file name from jumia-sitemaps. A page past the end returns an empty list. Jumia sits behind an anti-bot challenge that clears on only some connections, so a call can take up to about 50 seconds and may return 503; retry it. country is required; see jumia-countries.", + "operationId": "jumia-sitemap-urls", + "parameters": [ + { + "description": "Jumia country storefront", + "enum": [ + "ci", + "eg", + "ke", + "ma", + "ng", + "sn" + ], + "in": "query", + "name": "country", + "required": true, + "type": "string", + "x-example": "ng" + }, + { + "description": "Sitemap file name from jumia-sitemaps", + "in": "query", + "name": "sitemap", + "required": true, + "type": "string", + "x-example": "products-sitemap-9.xml.gz" + }, + { + "default": 1, + "description": "1-based page of URLs", + "in": "query", + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 1000, + "description": "URLs per page", + "in": "query", + "maximum": 5000, + "minimum": 1, + "name": "page_size", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/jumia.sitemapURLsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Read the URLs in a Jumia sitemap file", + "tags": [ + "Jumia" + ] + } + }, + "/jumia/sitemaps": { + "get": { + "description": "Lists the sitemap files a Jumia storefront publishes: product, brand, category and curated-page (mlps) files, each with its name, type, language, last-modified date and URL. Pass a returned name to jumia-sitemap-urls to read the URLs in it. Optionally narrow to one type. Jumia sits behind an anti-bot challenge that clears on only some connections, so a call can take up to about 50 seconds and may return 503; retry it. country is required; see jumia-countries.", + "operationId": "jumia-sitemaps", + "parameters": [ + { + "description": "Jumia country storefront", + "enum": [ + "ci", + "eg", + "ke", + "ma", + "ng", + "sn" + ], + "in": "query", + "name": "country", + "required": true, + "type": "string", + "x-example": "ng" + }, + { + "description": "Only list one kind of sitemap", + "enum": [ + "products", + "brands", + "categories", + "mlps" + ], + "in": "query", + "name": "type", + "type": "string" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/jumia.sitemapsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List the sitemap files of a Jumia storefront", + "tags": [ + "Jumia" + ] + } + }, "/justeat/restaurant": { "get": { "consumes": [ @@ -386839,29 +396288,75 @@ ] } }, - "/kickstarter/comments": { + "/kick/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the first page of one Kickstarter campaign's comments feed (Kickstarter's own server-rendered initial batch, typically 40-60 comments; total_count reports the feed's real total). Each comment includes the author, whether the author is the creator (a reply), the posted timestamp, and the comment text. creator and slug are the two path segments of the project URL, e.g. lookingglass and musubi for kickstarter.com/projects/lookingglass/musubi.", - "operationId": "kickstarter-comments", + "description": "Returns Kick's top-level categories (Games, IRL, Music, Gambling, Creative, Alternative, Chat Roulette) with id, name, slug and icon. These slugs are the exact values the category parameter of kick-subcategories takes. Kick's website and its mobile app each list one parent the other omits (Gambling and Chat Roulette), so this call reads both and returns their union; icon is empty for a category only the app lists. The lists are read live from Kick.", + "operationId": "kick-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/kick.categoriesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List Kick's top-level categories", + "tags": [ + "Kick" + ] + } + }, + "/kick/category-clips": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of 20 clips made in a Kick (kick.com) game or activity category, newest first: id, title, kick.com link, thumbnail, views, likes, duration in seconds, creation time, mature flag, category, the channel it came from, with a cursor for the next page. slug is a category slug from kick-subcategories such as just-chatting; a top-level category such as games has no clip page and returns not found. Only public data is read and no playable media is returned.", + "operationId": "kick-category-clips", "parameters": [ { - "description": "Creator path segment of the project URL", + "description": "Category slug from kick-subcategories or kick-search-categories, lowercase; a kick.com/category URL is also accepted", "in": "query", - "name": "creator", + "name": "slug", "required": true, "type": "string", - "x-example": "lookingglass" + "x-example": "just-chatting" }, { - "description": "Project slug path segment of the project URL", + "description": "Previous response's next_cursor; omit for the newest page", "in": "query", - "name": "slug", - "required": true, + "name": "cursor", "type": "string", - "x-example": "musubi" + "x-example": "clip_01M5TR7FRZPCDA6BS1NP7HKV4T" } ], "produces": [ @@ -386871,7 +396366,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kickstarter.commentsResponseDoc" + "$ref": "#/definitions/kick.categoryClipsResponseDoc" } }, "400": { @@ -386904,79 +396399,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kickstarter campaign's comments", + "summary": "List the newest clips in a Kick category", "tags": [ - "Kickstarter" + "Kick" ] } }, - "/kickstarter/discover": { + "/kick/channel": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of Kickstarter's own Discover results -- browse by category id and/or a free-text search term, sorted by magic/popularity/newest/end_date/most_funded, optionally filtered by campaign state and/or restricted to staff picks. Each result includes the campaign's funding snapshot (goal, pledged, percent funded, backers), category, location, creator, and cover photo.", - "operationId": "kickstarter-discover", + "description": "Returns a Kick (kick.com) channel's public profile and, when it is live, its current broadcast: username, bio, verification and affiliate flags, follower count, linked social handles, profile and banner images, recent categories, and a live object with title, viewers, start time, language, tags and categories (omitted when the channel is offline). slug is the channel slug from its kick.com address, case-insensitive; a full kick.com URL is also accepted. Playable stream URLs are never returned. An unknown channel returns not found.", + "operationId": "kick-channel", "parameters": [ { - "description": "Kickstarter's own numeric category id (top-level or sub-category), e.g. 16 for Technology", - "in": "query", - "name": "category_id", - "type": "integer", - "x-example": 16 - }, - { - "description": "Free-text search query", + "description": "Channel slug from kick.com/{slug}, case-insensitive; a kick.com URL is also accepted", "in": "query", - "name": "term", + "name": "slug", + "required": true, "type": "string", - "x-example": "hologram" - }, - { - "default": "magic", - "description": "Result order", - "enum": [ - "magic", - "popularity", - "newest", - "end_date", - "most_funded" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": 1, - "description": "1-based page number", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "collectionFormat": "csv", - "description": "Repeatable campaign state filter", - "in": "query", - "items": { - "enum": [ - "upcoming", - "live", - "late_pledge", - "canceled", - "failed", - "successful" - ], - "type": "string" - }, - "name": "state", - "type": "array" - }, - { - "default": false, - "description": "Restrict results to Kickstarter's own \\", - "in": "query", - "name": "staff_pick_only", - "type": "boolean" + "x-example": "xqc" } ], "produces": [ @@ -386986,7 +396429,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kickstarter.discoverResponseDoc" + "$ref": "#/definitions/kick.channelResponseDoc" } }, "400": { @@ -386995,6 +396438,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -387013,35 +396462,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse or search Kickstarter's Discover surface", + "summary": "Get a Kick channel profile and live state", "tags": [ - "Kickstarter" + "Kick" ] } }, - "/kickstarter/project": { + "/kick/channel-chatroom": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Kickstarter campaign's detail: funding snapshot (goal, pledged, percent funded, backers, state, dates), category, creator, cover photo, story text, risks & challenges, update/comment/FAQ counts, and reward/pledge tiers. creator and slug are the two path segments of the project URL, e.g. lookingglass and musubi for kickstarter.com/projects/lookingglass/musubi. Reward tiers are best-effort -- see the endpoint's documentation for when they may be omitted.", - "operationId": "kickstarter-project", + "description": "Returns a Kick (kick.com) channel's chat restrictions and rules: slow mode (delay between messages), subscribers-only, followers-only (minimum follow time), emotes-only and minimum account age, whether gifts are enabled, and the channel's chat rules text. slug is the channel slug from its kick.com address, case-insensitive; a full kick.com URL is also accepted. The pinned message is not returned. This call reads two Kick pages. An unknown channel returns not found.", + "operationId": "kick-channel-chatroom", "parameters": [ { - "description": "Creator path segment of the project URL", - "in": "query", - "name": "creator", - "required": true, - "type": "string", - "x-example": "lookingglass" - }, - { - "description": "Project slug path segment of the project URL", + "description": "Channel slug from kick.com/{slug}, case-insensitive; a kick.com URL is also accepted", "in": "query", "name": "slug", "required": true, "type": "string", - "x-example": "musubi" + "x-example": "xqc" } ], "produces": [ @@ -387051,7 +396492,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kickstarter.projectResponseDoc" + "$ref": "#/definitions/kick.channelChatroomResponseDoc" } }, "400": { @@ -387084,35 +396525,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kickstarter campaign's detail", + "summary": "Get a Kick channel's chat settings and rules", "tags": [ - "Kickstarter" + "Kick" ] } }, - "/kickstarter/updates": { + "/kick/channel-clips": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Kickstarter campaign's full updates feed: for each update, its number, title, author, whether the author is the creator, publish date, body text, and comment count. creator and slug are the two path segments of the project URL, e.g. lookingglass and musubi for kickstarter.com/projects/lookingglass/musubi.", - "operationId": "kickstarter-updates", + "description": "Returns one page of 20 clips from a Kick channel, newest first: id, title, kick.com link, thumbnail, views, likes, duration in seconds, creation time, mature flag, category, the viewer who made the clip and the channel. Page onward by passing the previous response's next_cursor as cursor; next_cursor is empty on the last page. Playable clip URLs are never returned. An unknown channel returns not found.", + "operationId": "kick-channel-clips", "parameters": [ { - "description": "Creator path segment of the project URL", + "description": "Channel slug from kick.com/{slug}, case-insensitive; a kick.com URL is also accepted", "in": "query", - "name": "creator", + "name": "slug", "required": true, "type": "string", - "x-example": "lookingglass" + "x-example": "xqc" }, { - "description": "Project slug path segment of the project URL", + "description": "Previous response's next_cursor; omit for the newest page", "in": "query", - "name": "slug", - "required": true, + "name": "cursor", "type": "string", - "x-example": "musubi" + "x-example": "abc" } ], "produces": [ @@ -387122,7 +396562,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kickstarter.updatesResponseDoc" + "$ref": "#/definitions/kick.channelClipsResponseDoc" } }, "400": { @@ -387155,27 +396595,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kickstarter campaign's updates feed", + "summary": "List a Kick channel's clips", "tags": [ - "Kickstarter" + "Kick" ] } }, - "/kohls/category": { + "/kick/channel-emotes": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Kohl's category or curated campaign page's product grid (page 1 only), with products (title, image, colors, pricing, rating, availability) and facets for discovering further category values. category is Kohl's own catalog taxonomy string, e.g. \"Room:Dorm\" or \"Department:Kitchen & Dining\" -- combine multiple dimensions with a literal \"+\", percent-encoded as \"%2B\" so it survives as \"+\" rather than being decoded to a space (e.g. \"Room%3ADorm%2BDepartment%3ABedding\"). Every facets[].options[].category value in a response is a ready-to-use category string for a follow-up call, so a caller can discover the full taxonomy by starting from a known category (e.g. \"Room:Dorm\") and following facets. A category value Kohl's does not recognize returns a 404 rather than an unfiltered listing; a recognized dimension with no matching products returns a genuine zero-result response instead.", - "operationId": "kohls-category", + "description": "Returns the chat emote sets available in a Kick (kick.com) channel: the channel's own custom emotes (id, name, whether subscribers only, image link), plus the Global and Emoji sets that every channel shares. slug is the channel slug from its kick.com address, case-insensitive; a full kick.com URL is also accepted. A channel with no custom emotes returns an empty channel set. Only public data is read and no playable media is returned. An unknown channel returns not found.", + "operationId": "kick-channel-emotes", "parameters": [ { - "description": "Kohl's catalog taxonomy string, e.g. \\", + "description": "Channel slug from kick.com/{slug}, case-insensitive; a kick.com URL is also accepted", "in": "query", - "name": "category", + "name": "slug", "required": true, "type": "string", - "x-example": "Room:Dorm" + "x-example": "xqc" } ], "produces": [ @@ -387185,7 +396625,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kohls.categoryResponseDoc" + "$ref": "#/definitions/kick.channelEmotesResponseDoc" } }, "400": { @@ -387218,34 +396658,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Kohl's category or curated campaign page", + "summary": "List the chat emotes a Kick channel offers", "tags": [ - "Kohl's" + "Kick" ] } }, - "/kohls/product/reviews": { + "/kick/channel-links": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a Kohl's product's customer reviews (title, text, rating, secondary ratings such as quality/durability/value/style, reviewer name and location, submission date, and photo URLs). web_id is the same identifier a GET /kohls/category response's products[].web_id field carries. A web_id with zero reviews returns a genuine zero-result response rather than an error.", - "operationId": "kohls-product-reviews", + "description": "Returns the panels a Kick (kick.com) channel shows under its stream, in the order Kick shows them: link panels (tip pages, merch, social profiles) with title, description, URL and image, and text panels (FAQ, rules, disclaimers) that are only a title and description. slug is the channel slug from its kick.com address, case-insensitive; a full kick.com URL is also accepted. Only public data is read and no playable media is returned. An unknown channel returns not found.", + "operationId": "kick-channel-links", "parameters": [ { - "description": "Kohl's product web id, e.g. from a GET /kohls/category response's products[].web_id", + "description": "Channel slug from kick.com/{slug}, case-insensitive; a kick.com URL is also accepted", "in": "query", - "name": "web_id", + "name": "slug", "required": true, "type": "string", - "x-example": "4569328" - }, - { - "description": "Page number, 10 reviews per page (default 1)", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "xqc" } ], "produces": [ @@ -387255,7 +396688,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kohls.productReviewsResponseDoc" + "$ref": "#/definitions/kick.channelLinksResponseDoc" } }, "400": { @@ -387264,6 +396697,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -387282,27 +396721,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Kohl's product's customer reviews", + "summary": "List a Kick channel's link panels", "tags": [ - "Kohl's" + "Kick" ] } }, - "/kohls/stores": { + "/kick/channel-streams": { "get": { "consumes": [ "application/json" ], - "description": "Returns physical Kohl's store locations near a free-text location (city/state, zip code, or address): address, phone, weekly hours, distance, and store badges/services. A search with no results returns a genuine empty list rather than an error.", - "operationId": "kohls-stores", + "description": "Returns a Kick (kick.com) channel's recent broadcast history, newest first: id, title, start time, duration in milliseconds, the viewer count Kick reports for the broadcast, language, mature flag, tags, categories, thumbnail, and for broadcasts with a recording its video uuid, video views and kick.com video link. slug is the channel slug from its kick.com address, case-insensitive; a full kick.com URL is also accepted. Kick keeps between none and about thirty broadcasts. Only public data is read and no playable media is returned. An unknown channel returns not found.", + "operationId": "kick-channel-streams", "parameters": [ { - "description": "Free-text location: city/state, zip code, or address", + "description": "Channel slug from kick.com/{slug}, case-insensitive; a kick.com URL is also accepted", "in": "query", - "name": "search", + "name": "slug", "required": true, "type": "string", - "x-example": "Seattle, WA" + "x-example": "xqc" } ], "produces": [ @@ -387312,7 +396751,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kohls.storesResponseDoc" + "$ref": "#/definitions/kick.channelStreamsResponseDoc" } }, "400": { @@ -387321,6 +396760,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -387339,27 +396784,27 @@ "ApiKeyAuth": [] } ], - "summary": "Find nearby Kohl's store locations", + "summary": "List a Kick channel's recent broadcast history", "tags": [ - "Kohl's" + "Kick" ] } }, - "/kohls/suggest": { + "/kick/channel-videos": { "get": { "consumes": [ "application/json" ], - "description": "Returns Kohl's own search-box typeahead result for a partial query: a flat list of suggested search phrases (no product data). A nonsense query returns a genuine, well-formed empty list rather than an error.", - "operationId": "kohls-suggest", + "description": "Returns a Kick channel's recent past broadcasts (VODs), newest first: id, uuid, title, start time, duration in milliseconds, views, language, mature flag, tags, categories, thumbnail and the kick.com video link. Kick returns a fixed window of recent videos (26 at the time of writing) with no paging, so this call takes only the channel slug. Playable stream sources are never returned. An unknown channel returns not found.", + "operationId": "kick-channel-videos", "parameters": [ { - "description": "Partial search text, e.g. \\", + "description": "Channel slug from kick.com/{slug}, case-insensitive; a kick.com URL is also accepted", "in": "query", - "name": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "coff" + "x-example": "xqc" } ], "produces": [ @@ -387369,7 +396814,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kohls.suggestResponseDoc" + "$ref": "#/definitions/kick.channelVideosResponseDoc" } }, "400": { @@ -387378,6 +396823,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -387396,24 +396847,27 @@ "ApiKeyAuth": [] } ], - "summary": "Kohl's search-box typeahead suggestions", + "summary": "List a Kick channel's recent past broadcasts", "tags": [ - "Kohl's" + "Kick" ] } }, - "/kotaku/article": { + "/kick/clip": { "get": { - "description": "Returns public Kotaku article metadata and body paragraphs from a canonical article URL. Kotaku articles are free to read, so the full body is returned.", - "operationId": "kotaku-article", + "consumes": [ + "application/json" + ], + "description": "Returns one Kick clip by id: title, kick.com link, thumbnail, views, duration, creation time, the moment it starts inside the source broadcast, mature flag, category and channel. id is a clip id such as clip_01M5SKVA6GGAAAT5YPJ7J43WE4, from the id field of kick-channel-clips or kick-clips. A malformed id returns a 400 and an unknown clip returns not found. Playable clip URLs are never returned.", + "operationId": "kick-clip", "parameters": [ { - "description": "Canonical Kotaku article URL", + "description": "Clip id from kick-clips' or kick-channel-clips' own clips[].id field", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://kotaku.com/dressmaker-indie-hours-character-creators-2000736522" + "x-example": "clip_01M5SKVA6GGAAAT5YPJ7J43WE4" } ], "produces": [ @@ -387423,7 +396877,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/kick.clipResponseDoc" } }, "400": { @@ -387438,6 +396892,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -387450,24 +396910,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kotaku article content", + "summary": "Get one Kick clip", "tags": [ - "Kotaku" + "Kick" ] } }, - "/kotaku/author": { + "/kick/clips": { "get": { - "description": "Returns a Kotaku author profile by `url`, a canonical `https://kotaku.com/author/` link. The response has the `name`, `biography`, `image_url`, `social_links` (a `type` label and URL) and recent articles. The article `published_at` is the page's own date text, such as `Published September 23, 2026 at 11:20 am`, not a timestamp.", - "operationId": "kotaku-author", + "consumes": [ + "application/json" + ], + "description": "Returns one page of 20 clips from across all of Kick, either newest first (sort=date, the default) or ranked by views inside a time window (sort=views with time=day, week, month or all). Each clip has its id, title, kick.com link, thumbnail, views, duration, category and channel. Page onward by passing the previous response's next_cursor as cursor. Playable clip URLs are never returned. Use kick-channel-clips for one channel's clips.", + "operationId": "kick-clips", "parameters": [ { - "description": "Canonical Kotaku author URL", + "description": "Ordering: date is newest first (default), views ranks by views inside the time window", + "enum": [ + "date", + "views" + ], "in": "query", - "name": "url", - "required": true, + "name": "sort", "type": "string", - "x-example": "https://kotaku.com/author/ethangach" + "x-example": "views" + }, + { + "description": "Window that views ranks within; omit for Kick's default window", + "enum": [ + "day", + "week", + "month", + "all" + ], + "in": "query", + "name": "time", + "type": "string", + "x-example": "week" + }, + { + "description": "Previous response's next_cursor; omit for the first page", + "in": "query", + "name": "cursor", + "type": "string", + "x-example": "abc" } ], "produces": [ @@ -387477,7 +396963,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.kotakuAuthorResponseDoc" + "$ref": "#/definitions/kick.clipsResponseDoc" } }, "400": { @@ -387486,8 +396972,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -387504,43 +396990,31 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kotaku author profile", + "summary": "List Kick's site-wide clips", "tags": [ - "Kotaku" + "Kick" ] } }, - "/kotaku/headlines": { + "/kick/drops": { "get": { - "description": "Returns recent Kotaku headlines for one section. `section` is required and takes one of 17 slugs such as `news`, `reviews`, `games`, `game-tips`, `retro`, `horror` or `deals`. Each item has its title, URL, summary, author, publication time and image.", - "operationId": "kotaku-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns Kick (kick.com) Drops campaigns, publisher-sponsored rewards that viewers earn by watching, newest first: id, name, status, start and end time, campaign page, the rule (for example Watch to redeem), the publisher with its logo, the game or activity category, every reward with the watch threshold that earns it and its image, and the channels taking part. status is active (the default), expired or all. Only public campaign information is read; no account or progress data.", + "operationId": "kick-drops", "parameters": [ { - "description": "Kotaku section slug", + "description": "Which campaigns to return: active (default), expired or all", "enum": [ - "entertainment", - "action", - "fantasy", - "horror", - "sci-fi", - "superhero", - "reviews", - "news", - "retro", - "kotaku-game-diary", - "youtube", - "odds-and-ends", - "feature", - "fine-art", - "game-tips", - "games", - "deals" + "active", + "expired", + "all" ], "in": "query", - "name": "section", - "required": true, + "name": "status", "type": "string", - "x-example": "entertainment" + "x-example": "active" } ], "produces": [ @@ -387550,7 +397024,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/kick.dropsResponseDoc" } }, "400": { @@ -387559,6 +397033,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -387571,16 +397051,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kotaku section headlines", + "summary": "List Kick Drops campaigns", "tags": [ - "Kotaku" + "Kick" ] } }, - "/kotaku/news": { + "/kick/gifts": { "get": { - "description": "Returns Kotaku's current top gaming stories, with no parameters. Each item has its title, URL, summary, author, publication time and image where Kotaku provides them. Use `kotaku-headlines` for a single section instead.", - "operationId": "kotaku-news", + "consumes": [ + "application/json" + ], + "description": "Returns the catalog of gifts viewers can send on Kick (kick.com) with Kicks, Kick's virtual currency: gift id, name, price in Kicks, tier (BASIC, MID or HIGHER), type (BASIC or LEVEL_UP), and for level-up gifts the message length they allow and how long they pin the message in chat. This call takes no parameters.", + "operationId": "kick-gifts", "produces": [ "application/json" ], @@ -387588,7 +397071,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/kick.giftsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -387609,16 +397098,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kotaku top stories", + "summary": "List the gifts viewers can send on Kick", "tags": [ - "Kotaku" + "Kick" ] } }, - "/kotaku/sections": { + "/kick/languages": { "get": { - "description": "Returns the Kotaku section inventory: Entertainment (with its Action, Fantasy, Horror, Sci-Fi, and Superhero sub-topics), Reviews, the Culture umbrella's own sub-topics (News, Retro, Kotaku Game Diary, YouTube, Odds and Ends, Feature, Fine Art), Tips & Guides, Games, and Deals, each linking to its public RSS feed. Every slug is accepted by the headlines endpoint.", - "operationId": "kotaku-sections", + "consumes": [ + "application/json" + ], + "description": "Returns the stream languages Kick shows in its own language picker, each with its code and display name (67 at the time of writing). These codes are all accepted by the language parameter of kick-livestreams, which also accepts further ISO-style codes the picker does not list. The list is read live from Kick, so it follows any language Kick adds.", + "operationId": "kick-languages", "produces": [ "application/json" ], @@ -387626,7 +397118,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/kick.languagesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -387635,19 +397145,60 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kotaku sections", + "summary": "List Kick stream languages", "tags": [ - "Kotaku" + "Kick" ] } }, - "/kroger/categories": { + "/kick/livestreams": { "get": { "consumes": [ "application/json" ], - "description": "Returns Kroger's full product-browse category taxonomy: every slug/category_id pair kroger-search and kroger-category accept, each with its department and full breadcrumb. This is how to discover valid slug/category_id values -- previously the only way was to already have one from a search response's facet group. Sourced from Kroger's own site navigation menu; covers every category a shopper can browse to from Kroger's site menu (321 at time of writing across 7 departments). Takes no parameters.", - "operationId": "kroger-categories", + "description": "Returns one page of Kick's live-stream directory: title, viewer count, start time, language, mature flag, tags, category, thumbnail and the channel for each live broadcast. sort is viewer_count_desc (the default, most viewers first) or featured. language filters to one stream language by code (kick-languages lists the languages Kick shows in its own picker; the directory accepts a wider range of codes than that list, and an unrecognized code returns a 400), and category_id filters to one category by the numeric id from kick-subcategories or kick-search-categories. limit is 1 to 100 (default 24). Page onward by passing the previous response's next_cursor as after; next_cursor is empty on the last page.", + "operationId": "kick-livestreams", + "parameters": [ + { + "description": "Ordering: viewer_count_desc is most viewers first (default), featured is Kick's featured order", + "enum": [ + "viewer_count_desc", + "featured" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "viewer_count_desc" + }, + { + "description": "Stream language code such as en, ja, es, pt-BR, optionally with a region (2 to 3 letters, then an optional 2 to 4 letter region); see kick-languages for the codes Kick lists", + "in": "query", + "name": "language", + "type": "string", + "x-example": "ja" + }, + { + "description": "Category id from kick-subcategories' or kick-search-categories' own id field", + "in": "query", + "name": "category_id", + "type": "integer", + "x-example": 15 + }, + { + "description": "Page size, 1 to 100; defaults to 24", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 24 + }, + { + "description": "Previous response's next_cursor; omit for the first page", + "in": "query", + "name": "after", + "type": "string", + "x-example": "eyJvIjoxfQ" + } + ], "produces": [ "application/json" ], @@ -387655,7 +397206,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.categoriesResponseDoc" + "$ref": "#/definitions/kick.livestreamsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -387676,111 +397233,105 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kroger's product-browse category taxonomy", + "summary": "List live broadcasts on Kick", "tags": [ - "Kroger" + "Kick" ] } }, - "/kroger/category": { + "/kick/search-categories": { "get": { "consumes": [ "application/json" ], - "description": "Browses a Kroger product category and returns product cards plus facet groups, in the same shape as kroger-search. slug and category_id together identify the category (e.g. \"pet\" and \"27\" for kroger.com/pl/pet/27) -- call kroger-categories to discover every valid slug/category_id pair. It uses category_id as a taxonomy filter, with real pagination, and the source field reports which path answered. Facet filters and sort apply to the primary path only: when any of them is set, a failure of that path returns an error rather than silently falling back to unfiltered results.", - "operationId": "kroger-category", + "description": "Searches Kick's game and activity categories by name and returns each match's id, name, slug, tags, mature flag, current viewers, thumbnail and kick.com link. query is required and at most 100 characters; limit is 1 to 100 (default 10). Use this to find categories outside the first pages that kick-subcategories can reach. A search with no matches returns an empty list.", + "operationId": "kick-search-categories", "parameters": [ { - "description": "Category URL slug segment. Obtain valid slug/category_id pairs from kroger-categories", - "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "pet" - }, - { - "description": "Category numeric taxonomy id. Obtain valid slug/category_id pairs from kroger-categories", + "description": "Category name to search for, up to 100 characters", "in": "query", - "name": "category_id", + "name": "query", "required": true, "type": "string", - "x-example": "27" - }, - { - "default": 1, - "description": "One-based result page", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": "relevance", - "description": "Result order. One of: relevance, name_asc, popularity_desc", - "enum": [ - "relevance", - "name_asc", - "popularity_desc" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Comma-separated brand names to filter by, taken verbatim from a previous response's facets", - "in": "query", - "name": "brands", - "type": "string", - "x-example": "Halo Top,Rebel" + "x-example": "chat" }, { - "description": "Comma-separated nutrition/dietary facet values", + "description": "Maximum results, 1 to 100; defaults to 10", "in": "query", - "name": "nutrition", - "type": "string", - "x-example": "Gluten Free" + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/kick.searchCategoriesResponseDoc" + } }, - { - "description": "Comma-separated flavor facet values", - "in": "query", - "name": "flavor", - "type": "string", - "x-example": "Chocolate" + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } }, - { - "description": "Comma-separated scent facet values", - "in": "query", - "name": "scent", - "type": "string", - "x-example": "Bergamot" + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Comma-separated savings facet values", - "in": "query", - "name": "savings", - "type": "string", - "x-example": "On Sale" - }, + "ApiKeyAuth": [] + } + ], + "summary": "Search Kick categories", + "tags": [ + "Kick" + ] + } + }, + "/kick/search-channels": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches Kick channels by name and returns each match's id, slug, username, follower count, live flag, verification and kick.com link, most relevant first. query is required and at most 100 characters. live=true restricts to channels that are broadcasting now. limit is 1 to 100 (default 10). A search with no matches returns an empty list.", + "operationId": "kick-search-channels", + "parameters": [ { - "description": "Comma-separated more-options facet values", + "description": "Channel name to search for, up to 100 characters", "in": "query", - "name": "more_options", + "name": "query", + "required": true, "type": "string", - "x-example": "SNAP EBT Eligible" + "x-example": "xqc" }, { - "description": "Lower bound of the price filter; defaults to 0", + "description": "Only channels live now", "in": "query", - "name": "price_min", - "type": "number", - "x-example": 0 + "name": "live", + "type": "boolean", + "x-example": true }, { - "description": "Upper bound of the price filter; required to filter on price", + "description": "Maximum results, 1 to 100; defaults to 10", "in": "query", - "name": "price_max", - "type": "number", - "x-example": 8 + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -387790,7 +397341,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.categoryResponseDoc" + "$ref": "#/definitions/kick.searchChannelsResponseDoc" } }, "400": { @@ -387817,57 +397368,49 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Kroger category", + "summary": "Search Kick channels", "tags": [ - "Kroger" + "Kick" ] } }, - "/kroger/coupons": { + "/kick/subcategories": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Kroger's public digital coupons: savings value, requirement text and quantity, brand, categories, redemption modalities, promotional tags, image, and start/end/expiry dates. Optionally narrow to one product (upc) or brand. This is the anonymous public coupon catalog -- per-account clipping state is not returned.", - "operationId": "kroger-coupons", + "description": "Returns one page of Kick's game and activity categories (Just Chatting, Grand Theft Auto V, ...) ordered by current viewers: id, name, slug, parent category, tags, viewers, mature flag, banner and kick.com link. category restricts to one top-level category by slug from kick-categories (a parent Kick adds later is accepted too). page is 1 to 20 and limit is 1 to 32 (default 24) because Kick silently caps both; total is the size of the whole catalog (over 18,000) while reachable is how many entries these limits can reach, so use kick-search-categories to find a category outside the first pages.", + "operationId": "kick-subcategories", "parameters": [ { - "description": "Narrow to coupons applying to one Kroger product", - "in": "query", - "name": "upc", - "type": "string", - "x-example": "0001111060933" - }, - { - "description": "Narrow to one brand's coupons", - "in": "query", - "name": "brand", - "type": "string", - "x-example": "Pillsbury" - }, - { - "description": "Kroger store/location id that scopes coupons", + "description": "Top-level category slug from kick-categories; a parent Kick adds later is also accepted once it appears there", + "enum": [ + "games", + "irl", + "music", + "gambling", + "creative", + "alternative", + "chat-roulette" + ], "in": "query", - "name": "location_id", + "name": "category", "type": "string", - "x-example": "03500917" + "x-example": "irl" }, { - "default": 1, - "description": "One-based result page", + "description": "Page number, 1 to 20; defaults to 1", "in": "query", - "minimum": 1, "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 }, { - "default": 50, - "description": "Coupons per page, 1-200", + "description": "Page size, 1 to 32; defaults to 24", "in": "query", - "maximum": 200, - "minimum": 1, - "name": "page_size", - "type": "integer" + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -387877,7 +397420,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.couponsResponseDoc" + "$ref": "#/definitions/kick.subcategoriesResponseDoc" } }, "400": { @@ -387904,27 +397447,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kroger digital coupons", + "summary": "List Kick's game and activity categories", "tags": [ - "Kroger" + "Kick" ] } }, - "/kroger/product": { + "/kick/subcategory": { "get": { "consumes": [ "application/json" ], - "description": "Returns product detail for one Kroger item: title, description, image, brand, category trail, price/availability, and rating.", - "operationId": "kroger-product", + "description": "Returns one Kick game or activity category by slug: id, name, parent category, tags, description, current viewers, follower count, mature flag, banner and kick.com link. slug comes from kick-subcategories or kick-search-categories. An unknown slug returns not found.", + "operationId": "kick-subcategory", "parameters": [ { - "description": "Kroger product UPC/id (the last path segment of the product page URL)", + "description": "Category slug from kick-subcategories' or kick-search-categories' own slug field", "in": "query", - "name": "upc", + "name": "slug", "required": true, "type": "string", - "x-example": "0064519402151" + "x-example": "just-chatting" } ], "produces": [ @@ -387934,7 +397477,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.productResponseDoc" + "$ref": "#/definitions/kick.subcategoryResponseDoc" } }, "400": { @@ -387967,46 +397510,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kroger product", + "summary": "Get one Kick category", "tags": [ - "Kroger" + "Kick" ] } }, - "/kroger/product/reviews": { + "/kick/top-channels": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a Kroger product's customer reviews -- review text, star rating, recommendation flag, helpful-vote counts, and customer photo URLs -- alongside the product's full star histogram. Customer display names are deliberately not returned.", - "operationId": "kroger-product-reviews", - "parameters": [ - { - "description": "Kroger product UPC/id", - "in": "query", - "name": "upc", - "required": true, - "type": "string", - "x-example": "0007120200411" - }, - { - "default": 1, - "description": "One-based review page", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 16, - "description": "Reviews per page, 1-100", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page_size", - "type": "integer" - } - ], + "description": "Returns Kick's top-channels list (30 at the time of writing) ranked by followers: id, slug, username, follower count, live flag, verification, profile picture and kick.com link. The list takes no parameters.", + "operationId": "kick-top-channels", "produces": [ "application/json" ], @@ -388014,7 +397530,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.reviewsResponseDoc" + "$ref": "#/definitions/kick.topChannelsResponseDoc" } }, "400": { @@ -388041,34 +397557,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kroger product's customer reviews", + "summary": "List Kick's top channels", "tags": [ - "Kroger" + "Kick" ] } }, - "/kroger/products": { + "/kick/video": { "get": { "consumes": [ "application/json" ], - "description": "Returns full detail for up to 50 Kroger products in one call. Carries materially more than kroger-product: a nutrition-facts panel with ingredients, allergens and dietary flags; store-specific price and stock level; a full star-rating histogram; the merchandising hierarchy; and every image perspective. location_id scopes price and stock to one store.", - "operationId": "kroger-products", + "description": "Returns one Kick (kick.com) past broadcast looked up by its recording's uuid, without needing the channel: uuid, title, start time, duration in milliseconds, the viewer count Kick reports, views, status, language, mature flag, tags, categories, thumbnail, the owning channel and the kick.com video link. id is the uuid from kick-channel-videos or kick-channel-streams, or a kick.com video URL. Only public data is read and no playable media is returned. An unknown video returns not found.", + "operationId": "kick-video", "parameters": [ { - "description": "Comma-separated Kroger product UPCs, up to 50", + "description": "Video uuid (36 characters) from kick-channel-videos or kick-channel-streams, or a kick.com video URL", "in": "query", - "name": "upcs", + "name": "id", "required": true, "type": "string", - "x-example": "0007465324996,0005100027014" - }, - { - "description": "Kroger store/location id that scopes price and stock", - "in": "query", - "name": "location_id", - "type": "string", - "x-example": "03500917" + "x-example": "eb707c31-208b-4737-8bcf-a5c9fd187e82" } ], "produces": [ @@ -388078,7 +397587,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.productsResponseDoc" + "$ref": "#/definitions/kick.videoResponseDoc" } }, "400": { @@ -388087,6 +397596,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -388105,34 +397620,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get full Kroger product detail in bulk", + "summary": "Get a Kick video by its uuid", "tags": [ - "Kroger" + "Kick" ] } }, - "/kroger/related-tags": { + "/kickstarter/comments": { "get": { "consumes": [ "application/json" ], - "description": "Returns the search-refinement chips Kroger shows above its own results for a query (e.g. \"chips ahoy\" returns \"chewy\", \"chunky\", \"thins\"). Each tag carries the full follow-on query it maps to, so results feed straight back into kroger-search.", - "operationId": "kroger-related-tags", + "description": "Returns the first page of one Kickstarter campaign's comments feed (Kickstarter's own server-rendered initial batch, typically 40-60 comments; total_count reports the feed's real total). Each comment includes the author, whether the author is the creator (a reply), the posted timestamp, and the comment text. creator and slug are the two path segments of the project URL, e.g. lookingglass and musubi for kickstarter.com/projects/lookingglass/musubi.", + "operationId": "kickstarter-comments", "parameters": [ { - "description": "Search term to get refinement tags for", + "description": "Creator path segment of the project URL", "in": "query", - "name": "query", + "name": "creator", "required": true, "type": "string", - "x-example": "chips ahoy" + "x-example": "lookingglass" }, { - "description": "Kroger store/location id that scopes results", + "description": "Project slug path segment of the project URL", "in": "query", - "name": "location_id", + "name": "slug", + "required": true, "type": "string", - "x-example": "03500917" + "x-example": "musubi" } ], "produces": [ @@ -388142,7 +397658,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.relatedTagsResponseDoc" + "$ref": "#/definitions/kickstarter.commentsResponseDoc" } }, "400": { @@ -388151,6 +397667,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -388169,103 +397691,79 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kroger search-refinement tags", + "summary": "Get a Kickstarter campaign's comments", "tags": [ - "Kroger" + "Kickstarter" ] } }, - "/kroger/search": { + "/kickstarter/discover": { "get": { "consumes": [ "application/json" ], - "description": "Searches Kroger products by keyword and returns product cards (price, unit price, brand, size, stock level) plus the facet groups Kroger offers for the query (brands, nutrition, savings, price range and more). It supports real pagination, and the source field reports which path answered. Facet filters and sort apply to the primary path only: when any of them is set, a failure of that path returns an error rather than silently falling back to unfiltered results.", - "operationId": "kroger-search", + "description": "Returns one page of Kickstarter's own Discover results -- browse by category id and/or a free-text search term, sorted by magic/popularity/newest/end_date/most_funded, optionally filtered by campaign state and/or restricted to staff picks. Each result includes the campaign's funding snapshot (goal, pledged, percent funded, backers), category, location, creator, and cover photo.", + "operationId": "kickstarter-discover", "parameters": [ { - "description": "Search keyword", + "description": "Kickstarter's own numeric category id (top-level or sub-category), e.g. 16 for Technology", "in": "query", - "name": "query", - "required": true, - "type": "string", - "x-example": "milk" + "name": "category_id", + "type": "integer", + "x-example": 16 }, { - "default": 1, - "description": "One-based result page", + "description": "Free-text search query", "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" + "name": "term", + "type": "string", + "x-example": "hologram" }, { - "default": "relevance", - "description": "Result order. One of: relevance, name_asc, popularity_desc", + "default": "magic", + "description": "Result order", "enum": [ - "relevance", - "name_asc", - "popularity_desc" + "magic", + "popularity", + "newest", + "end_date", + "most_funded" ], "in": "query", "name": "sort", "type": "string" }, { - "description": "Comma-separated brand names to filter by, taken verbatim from a previous response's facets", - "in": "query", - "name": "brands", - "type": "string", - "x-example": "Halo Top,Rebel" - }, - { - "description": "Comma-separated nutrition/dietary facet values", - "in": "query", - "name": "nutrition", - "type": "string", - "x-example": "Gluten Free" - }, - { - "description": "Comma-separated flavor facet values", - "in": "query", - "name": "flavor", - "type": "string", - "x-example": "Chocolate" - }, - { - "description": "Comma-separated scent facet values", - "in": "query", - "name": "scent", - "type": "string", - "x-example": "Bergamot" - }, - { - "description": "Comma-separated savings facet values", - "in": "query", - "name": "savings", - "type": "string", - "x-example": "On Sale" - }, - { - "description": "Comma-separated more-options facet values", + "default": 1, + "description": "1-based page number", "in": "query", - "name": "more_options", - "type": "string", - "x-example": "SNAP EBT Eligible" + "name": "page", + "type": "integer" }, { - "description": "Lower bound of the price filter; defaults to 0", + "collectionFormat": "csv", + "description": "Repeatable campaign state filter", "in": "query", - "name": "price_min", - "type": "number", - "x-example": 0 + "items": { + "enum": [ + "upcoming", + "live", + "late_pledge", + "canceled", + "failed", + "successful" + ], + "type": "string" + }, + "name": "state", + "type": "array" }, { - "description": "Upper bound of the price filter; required to filter on price", + "default": false, + "description": "Restrict results to Kickstarter's own \\", "in": "query", - "name": "price_max", - "type": "number", - "x-example": 8 + "name": "staff_pick_only", + "type": "boolean" } ], "produces": [ @@ -388275,7 +397773,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.searchResponseDoc" + "$ref": "#/definitions/kickstarter.discoverResponseDoc" } }, "400": { @@ -388302,27 +397800,35 @@ "ApiKeyAuth": [] } ], - "summary": "Search Kroger products", + "summary": "Browse or search Kickstarter's Discover surface", "tags": [ - "Kroger" + "Kickstarter" ] } }, - "/kroger/store": { + "/kickstarter/project": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Kroger store's public detail: postal address, geographic coordinates, phone number, displayed opening hours (including any daily break hours), and whether it has a drive-thru. store_id is the same store/location id kroger-products and kroger-suggest accept.", - "operationId": "kroger-store", + "description": "Returns one Kickstarter campaign's detail: funding snapshot (goal, pledged, percent funded, backers, state, dates), category, creator, cover photo, story text, risks & challenges, update/comment/FAQ counts, and reward/pledge tiers. creator and slug are the two path segments of the project URL, e.g. lookingglass and musubi for kickstarter.com/projects/lookingglass/musubi. Reward tiers are best-effort -- see the endpoint's documentation for when they may be omitted.", + "operationId": "kickstarter-project", "parameters": [ { - "description": "Kroger store/location id", + "description": "Creator path segment of the project URL", "in": "query", - "name": "store_id", + "name": "creator", "required": true, "type": "string", - "x-example": "01600531" + "x-example": "lookingglass" + }, + { + "description": "Project slug path segment of the project URL", + "in": "query", + "name": "slug", + "required": true, + "type": "string", + "x-example": "musubi" } ], "produces": [ @@ -388332,7 +397838,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.storeResponseDoc" + "$ref": "#/definitions/kickstarter.projectResponseDoc" } }, "400": { @@ -388365,33 +397871,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Kroger store's detail", + "summary": "Get a Kickstarter campaign's detail", "tags": [ - "Kroger" + "Kickstarter" ] } }, - "/kroger/suggest": { + "/kickstarter/updates": { "get": { "consumes": [ "application/json" ], - "description": "Returns Kroger's own search-box suggestions for a (possibly empty) query, sourced directly from Kroger's public suggestions API rather than the rendered search page. An empty query returns Kroger's default \"trending\" shopping shortcuts instead of an error. location_id scopes results to one Kroger store and defaults to a confirmed-working store id when omitted.", - "operationId": "kroger-suggest", + "description": "Returns one Kickstarter campaign's full updates feed: for each update, its number, title, author, whether the author is the creator, publish date, body text, and comment count. creator and slug are the two path segments of the project URL, e.g. lookingglass and musubi for kickstarter.com/projects/lookingglass/musubi.", + "operationId": "kickstarter-updates", "parameters": [ { - "description": "Partial search text; omit for trending default suggestions", + "description": "Creator path segment of the project URL", "in": "query", - "name": "query", + "name": "creator", + "required": true, "type": "string", - "x-example": "rin" + "x-example": "lookingglass" }, { - "description": "Kroger store/location id", + "description": "Project slug path segment of the project URL", "in": "query", - "name": "location_id", + "name": "slug", + "required": true, "type": "string", - "x-example": "03500917" + "x-example": "musubi" } ], "produces": [ @@ -388401,7 +397909,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/kroger.suggestResponseDoc" + "$ref": "#/definitions/kickstarter.updatesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -388422,33 +397942,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kroger search-box suggestions", + "summary": "Get a Kickstarter campaign's updates feed", "tags": [ - "Kroger" + "Kickstarter" ] } }, - "/kyliecosmetics/collections": { + "/kohls/category": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", - "operationId": "kyliecosmetics-collections", + "description": "Returns a Kohl's category or curated campaign page's product grid (page 1 only), with products (title, image, colors, pricing, rating, availability) and facets for discovering further category values. category is Kohl's own catalog taxonomy string, e.g. \"Room:Dorm\" or \"Department:Kitchen & Dining\" -- combine multiple dimensions with a literal \"+\", percent-encoded as \"%2B\" so it survives as \"+\" rather than being decoded to a space (e.g. \"Room%3ADorm%2BDepartment%3ABedding\"). Every facets[].options[].category value in a response is a ready-to-use category string for a follow-up call, so a caller can discover the full taxonomy by starting from a known category (e.g. \"Room:Dorm\") and following facets. A category value Kohl's does not recognize returns a 404 rather than an unfiltered listing; a recognized dimension with no matching products returns a genuine zero-result response instead.", + "operationId": "kohls-category", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Kohl's catalog taxonomy string, e.g. \\", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "category", + "required": true, + "type": "string", + "x-example": "Room:Dorm" } ], "produces": [ @@ -388458,7 +397972,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/kohls.categoryResponseDoc" } }, "400": { @@ -388467,6 +397981,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -388485,41 +398005,34 @@ "ApiKeyAuth": [] } ], - "summary": "List Kylie Cosmetics collections", + "summary": "Browse a Kohl's category or curated campaign page", "tags": [ - "Kylie Cosmetics" + "Kohl's" ] } }, - "/kyliecosmetics/collections/{handle}/products": { + "/kohls/product/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one Kylie Cosmetics (https://www.kyliecosmetics.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", - "operationId": "kyliecosmetics-collection-products", + "description": "Returns one page of a Kohl's product's customer reviews (title, text, rating, secondary ratings such as quality/durability/value/style, reviewer name and location, submission date, and photo URLs). web_id is the same identifier a GET /kohls/category response's products[].web_id field carries. A web_id with zero reviews returns a genuine zero-result response rather than an error.", + "operationId": "kohls-product-reviews", "parameters": [ { - "description": "Collection handle", - "in": "path", - "name": "handle", + "description": "Kohl's product web id, e.g. from a GET /kohls/category response's products[].web_id", + "in": "query", + "name": "web_id", "required": true, "type": "string", - "x-example": "collection-handle" + "x-example": "4569328" }, { - "description": "1-based page, defaults to 1", + "description": "Page number, 10 reviews per page (default 1)", "in": "query", "name": "page", "type": "integer", "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 } ], "produces": [ @@ -388529,7 +398042,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/kohls.productReviewsResponseDoc" } }, "400": { @@ -388538,12 +398051,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -388562,33 +398069,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Kylie Cosmetics collection products", + "summary": "Browse a Kohl's product's customer reviews", "tags": [ - "Kylie Cosmetics" + "Kohl's" ] } }, - "/kyliecosmetics/pages": { + "/kohls/stores": { "get": { "consumes": [ "application/json" ], - "description": "Lists static pages from the Kylie Cosmetics store, paged with `page` (default 1) and `limit` (default 50, max 250). Each page has its id, handle, title, URL, plain-text content and timestamps. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", - "operationId": "kyliecosmetics-pages", + "description": "Returns physical Kohl's store locations near a free-text location (city/state, zip code, or address): address, phone, weekly hours, distance, and store badges/services. A search with no results returns a genuine empty list rather than an error.", + "operationId": "kohls-stores", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Free-text location: city/state, zip code, or address", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "search", + "required": true, + "type": "string", + "x-example": "Seattle, WA" } ], "produces": [ @@ -388598,7 +398099,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/kohls.storesResponseDoc" } }, "400": { @@ -388625,27 +398126,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Kylie Cosmetics static pages", + "summary": "Find nearby Kohl's store locations", "tags": [ - "Kylie Cosmetics" + "Kohl's" ] } }, - "/kyliecosmetics/pages/{handle}": { + "/kohls/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns one static page from the Kylie Cosmetics store by `handle`. The response has the page id, title, URL, handle, plain-text content, and created, updated and published times. Content is text, not HTML. In some cases `transport_mode` is `ssr_embedded` and `id` is omitted. An unknown handle returns `404`.", - "operationId": "kyliecosmetics-page", + "description": "Returns Kohl's own search-box typeahead result for a partial query: a flat list of suggested search phrases (no product data). A nonsense query returns a genuine, well-formed empty list rather than an error.", + "operationId": "kohls-suggest", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", + "description": "Partial search text, e.g. \\", + "in": "query", + "name": "query", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "coff" } ], "produces": [ @@ -388655,7 +398156,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/kohls.suggestResponseDoc" } }, "400": { @@ -388664,12 +398165,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -388688,33 +398183,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kylie Cosmetics static page", + "summary": "Kohl's search-box typeahead suggestions", "tags": [ - "Kylie Cosmetics" + "Kohl's" ] } }, - "/kyliecosmetics/products": { + "/kotaku/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns products from Kylie Cosmetics's (https://www.kyliecosmetics.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "kyliecosmetics-products", + "description": "Returns public Kotaku article metadata and body paragraphs from a canonical article URL. Kotaku articles are free to read, so the full body is returned.", + "operationId": "kotaku-article", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Canonical Kotaku article URL", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "url", + "required": true, + "type": "string", + "x-example": "https://kotaku.com/dressmaker-indie-hours-character-creators-2000736522" } ], "produces": [ @@ -388724,7 +398210,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -388733,8 +398219,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -388751,27 +398237,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Kylie Cosmetics products", + "summary": "Get Kotaku article content", "tags": [ - "Kylie Cosmetics" + "Kotaku" ] } }, - "/kyliecosmetics/products/{handle}": { + "/kotaku/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns product detail for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "kyliecosmetics-product", + "description": "Returns a Kotaku author profile by `url`, a canonical `https://kotaku.com/author/` link. The response has the `name`, `biography`, `image_url`, `social_links` (a `type` label and URL) and recent articles. The article `published_at` is the page's own date text, such as `Published September 23, 2026 at 11:20 am`, not a timestamp.", + "operationId": "kotaku-author", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Canonical Kotaku author URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "https://kotaku.com/author/ethangach" } ], "produces": [ @@ -388781,7 +398264,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" + "$ref": "#/definitions/publicnews.kotakuAuthorResponseDoc" } }, "400": { @@ -388796,12 +398279,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -388814,45 +398291,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Kylie Cosmetics product", + "summary": "Get a Kotaku author profile", "tags": [ - "Kylie Cosmetics" + "Kotaku" ] } }, - "/kyliecosmetics/products/{handle}/recommendations": { + "/kotaku/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns recommended products for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The storefront URL is fixed server-side.", - "operationId": "kyliecosmetics-product-recommendations", + "description": "Returns recent Kotaku headlines for one section. `section` is required and takes one of 17 slugs such as `news`, `reviews`, `games`, `game-tips`, `retro`, `horror` or `deals`. Each item has its title, URL, summary, author, publication time and image.", + "operationId": "kotaku-headlines", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" - }, - { - "description": "Maximum products, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Recommendation intent. Allowed values: related, complementary", + "description": "Kotaku section slug", "enum": [ - "related", - "complementary" + "entertainment", + "action", + "fantasy", + "horror", + "sci-fi", + "superhero", + "reviews", + "news", + "retro", + "kotaku-game-diary", + "youtube", + "odds-and-ends", + "feature", + "fine-art", + "game-tips", + "games", + "deals" ], "in": "query", - "name": "intent", + "name": "section", + "required": true, "type": "string", - "x-example": "related" + "x-example": "entertainment" } ], "produces": [ @@ -388862,7 +398337,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -388871,11 +398346,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Kotaku section headlines", + "tags": [ + "Kotaku" + ] + } + }, + "/kotaku/news": { + "get": { + "description": "Returns Kotaku's current top gaming stories, with no parameters. Each item has its title, URL, summary, author, publication time and image where Kotaku provides them. Use `kotaku-headlines` for a single section instead.", + "operationId": "kotaku-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -388895,43 +398396,45 @@ "ApiKeyAuth": [] } ], - "summary": "List Kylie Cosmetics product recommendations", + "summary": "Get Kotaku top stories", "tags": [ - "Kylie Cosmetics" + "Kotaku" ] } }, - "/kyliecosmetics/search/suggest": { + "/kotaku/sections": { "get": { - "consumes": [ + "description": "Returns the Kotaku section inventory: Entertainment (with its Action, Fantasy, Horror, Sci-Fi, and Superhero sub-topics), Reviews, the Culture umbrella's own sub-topics (News, Retro, Kotaku Game Diary, YouTube, Odds and Ends, Feature, Fine Art), Tips & Guides, Games, and Deals, each linking to its public RSS feed. Every slug is accepted by the headlines endpoint.", + "operationId": "kotaku-sections", + "produces": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from Kylie Cosmetics's (https://www.kyliecosmetics.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "kyliecosmetics-search-suggest", - "parameters": [ - { - "description": "Search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "wool" - }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" - }, + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ { - "description": "Maximum results per type, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "ApiKeyAuth": [] } ], + "summary": "Get Kotaku sections", + "tags": [ + "Kotaku" + ] + } + }, + "/kroger/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns Kroger's full product-browse category taxonomy: every slug/category_id pair kroger-search and kroger-category accept, each with its department and full breadcrumb. This is how to discover valid slug/category_id values -- previously the only way was to already have one from a search response's facet group. Sourced from Kroger's own site navigation menu; covers every category a shopper can browse to from Kroger's site menu (321 at time of writing across 7 departments). Takes no parameters.", + "operationId": "kroger-categories", "produces": [ "application/json" ], @@ -388939,13 +398442,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/kroger.categoriesResponseDoc" } }, "429": { @@ -388966,42 +398463,111 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kylie Cosmetics search suggestions", + "summary": "Get Kroger's product-browse category taxonomy", "tags": [ - "Kylie Cosmetics" + "Kroger" ] } }, - "/kyliecosmetics/sitemap/urls": { + "/kroger/category": { "get": { "consumes": [ "application/json" ], - "description": "Returns capped URL entries from Kylie Cosmetics's (https://www.kyliecosmetics.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", - "operationId": "kyliecosmetics-sitemap-urls", + "description": "Browses a Kroger product category and returns product cards plus facet groups, in the same shape as kroger-search. slug and category_id together identify the category (e.g. \"pet\" and \"27\" for kroger.com/pl/pet/27) -- call kroger-categories to discover every valid slug/category_id pair. It uses category_id as a taxonomy filter, with real pagination, and the source field reports which path answered. Facet filters and sort apply to the primary path only: when any of them is set, a failure of that path returns an error rather than silently falling back to unfiltered results.", + "operationId": "kroger-category", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "description": "Category URL slug segment. Obtain valid slug/category_id pairs from kroger-categories", + "in": "query", + "name": "slug", + "required": true, + "type": "string", + "x-example": "pet" + }, + { + "description": "Category numeric taxonomy id. Obtain valid slug/category_id pairs from kroger-categories", + "in": "query", + "name": "category_id", + "required": true, + "type": "string", + "x-example": "27" + }, + { + "default": 1, + "description": "One-based result page", + "in": "query", + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": "relevance", + "description": "Result order. One of: relevance, name_asc, popularity_desc", "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" + "relevance", + "name_asc", + "popularity_desc" ], "in": "query", - "name": "type", + "name": "sort", + "type": "string" + }, + { + "description": "Comma-separated brand names to filter by, taken verbatim from a previous response's facets", + "in": "query", + "name": "brands", "type": "string", - "x-example": "products" + "x-example": "Halo Top,Rebel" }, { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "description": "Comma-separated nutrition/dietary facet values", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "nutrition", + "type": "string", + "x-example": "Gluten Free" + }, + { + "description": "Comma-separated flavor facet values", + "in": "query", + "name": "flavor", + "type": "string", + "x-example": "Chocolate" + }, + { + "description": "Comma-separated scent facet values", + "in": "query", + "name": "scent", + "type": "string", + "x-example": "Bergamot" + }, + { + "description": "Comma-separated savings facet values", + "in": "query", + "name": "savings", + "type": "string", + "x-example": "On Sale" + }, + { + "description": "Comma-separated more-options facet values", + "in": "query", + "name": "more_options", + "type": "string", + "x-example": "SNAP EBT Eligible" + }, + { + "description": "Lower bound of the price filter; defaults to 0", + "in": "query", + "name": "price_min", + "type": "number", + "x-example": 0 + }, + { + "description": "Upper bound of the price filter; required to filter on price", + "in": "query", + "name": "price_max", + "type": "number", + "x-example": 8 } ], "produces": [ @@ -389011,7 +398577,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/kroger.categoryResponseDoc" } }, "400": { @@ -389038,19 +398604,59 @@ "ApiKeyAuth": [] } ], - "summary": "List Kylie Cosmetics sitemap URLs", + "summary": "Browse a Kroger category", "tags": [ - "Kylie Cosmetics" + "Kroger" ] } }, - "/kyliecosmetics/sitemaps": { + "/kroger/coupons": { "get": { "consumes": [ "application/json" ], - "description": "Returns child sitemap URLs from Kylie Cosmetics's (https://www.kyliecosmetics.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", - "operationId": "kyliecosmetics-sitemaps", + "description": "Returns a page of Kroger's public digital coupons: savings value, requirement text and quantity, brand, categories, redemption modalities, promotional tags, image, and start/end/expiry dates. Optionally narrow to one product (upc) or brand. This is the anonymous public coupon catalog -- per-account clipping state is not returned.", + "operationId": "kroger-coupons", + "parameters": [ + { + "description": "Narrow to coupons applying to one Kroger product", + "in": "query", + "name": "upc", + "type": "string", + "x-example": "0001111060933" + }, + { + "description": "Narrow to one brand's coupons", + "in": "query", + "name": "brand", + "type": "string", + "x-example": "Pillsbury" + }, + { + "description": "Kroger store/location id that scopes coupons", + "in": "query", + "name": "location_id", + "type": "string", + "x-example": "03500917" + }, + { + "default": 1, + "description": "One-based result page", + "in": "query", + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 50, + "description": "Coupons per page, 1-200", + "in": "query", + "maximum": 200, + "minimum": 1, + "name": "page_size", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -389058,7 +398664,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/kroger.couponsResponseDoc" } }, "400": { @@ -389085,19 +398691,29 @@ "ApiKeyAuth": [] } ], - "summary": "List Kylie Cosmetics sitemaps", + "summary": "Get Kroger digital coupons", "tags": [ - "Kylie Cosmetics" + "Kroger" ] } }, - "/kyliecosmetics/store": { + "/kroger/product": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "kyliecosmetics-store", + "description": "Returns product detail for one Kroger item: title, description, image, brand, category trail, price/availability, and rating.", + "operationId": "kroger-product", + "parameters": [ + { + "description": "Kroger product UPC/id (the last path segment of the product page URL)", + "in": "query", + "name": "upc", + "required": true, + "type": "string", + "x-example": "0064519402151" + } + ], "produces": [ "application/json" ], @@ -389105,7 +398721,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/kroger.productResponseDoc" } }, "400": { @@ -389114,6 +398730,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -389132,24 +398754,44 @@ "ApiKeyAuth": [] } ], - "summary": "Get Kylie Cosmetics store metadata", + "summary": "Get a Kroger product", "tags": [ - "Kylie Cosmetics" + "Kroger" ] } }, - "/latimes/article": { + "/kroger/product/reviews": { "get": { - "description": "Returns a Los Angeles Times article's public metadata and body paragraphs from a canonical article URL, read from the page's NewsArticle structured data.", - "operationId": "latimes-article", + "consumes": [ + "application/json" + ], + "description": "Returns one page of a Kroger product's customer reviews -- review text, star rating, recommendation flag, helpful-vote counts, and customer photo URLs -- alongside the product's full star histogram. Customer display names are deliberately not returned.", + "operationId": "kroger-product-reviews", "parameters": [ { - "description": "Canonical Los Angeles Times article URL", + "description": "Kroger product UPC/id", "in": "query", - "name": "url", + "name": "upc", "required": true, "type": "string", - "x-example": "https://www.latimes.com/environment/story/2026-09-18/newsom-rejects-roll-back-of-ceqa-exemptions-for-advanced-manufacturing" + "x-example": "0007120200411" + }, + { + "default": 1, + "description": "One-based review page", + "in": "query", + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 16, + "description": "Reviews per page, 1-100", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -389159,7 +398801,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/latimes.articleResponseDoc" + "$ref": "#/definitions/kroger.reviewsResponseDoc" } }, "400": { @@ -389168,12 +398810,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -389192,24 +398828,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Los Angeles Times article content", + "summary": "Get a Kroger product's customer reviews", "tags": [ - "Los Angeles Times" + "Kroger" ] } }, - "/latimes/author": { + "/kroger/products": { "get": { - "description": "Returns a Los Angeles Times author profile by `url`, a canonical `https://www.latimes.com/people/` link; other hosts or paths return a bad-request error. The response has the `name`, `job_title`, `bio`, `email`, `image_url`, `social_accounts` and recent articles with title, URL, summary, publication time and lead image. Accounts the page does not list are absent.", - "operationId": "latimes-author", - "parameters": [ - { - "description": "Canonical Los Angeles Times author URL", + "consumes": [ + "application/json" + ], + "description": "Returns full detail for up to 50 Kroger products in one call. Carries materially more than kroger-product: a nutrition-facts panel with ingredients, allergens and dietary flags; store-specific price and stock level; a full star-rating histogram; the merchandising hierarchy; and every image perspective. location_id scopes price and stock to one store.", + "operationId": "kroger-products", + "parameters": [ + { + "description": "Comma-separated Kroger product UPCs, up to 50", "in": "query", - "name": "url", + "name": "upcs", "required": true, "type": "string", - "x-example": "https://www.latimes.com/people/anita-chabria" + "x-example": "0007465324996,0005100027014" + }, + { + "description": "Kroger store/location id that scopes price and stock", + "in": "query", + "name": "location_id", + "type": "string", + "x-example": "03500917" } ], "produces": [ @@ -389219,7 +398865,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/latimes.authorResponseDoc" + "$ref": "#/definitions/kroger.productsResponseDoc" } }, "400": { @@ -389228,12 +398874,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -389252,67 +398892,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Los Angeles Times author profile", + "summary": "Get full Kroger product detail in bulk", "tags": [ - "Los Angeles Times" + "Kroger" ] } }, - "/latimes/headlines": { + "/kroger/related-tags": { "get": { - "description": "Returns fresh headlines from a public Los Angeles Times section RSS feed: title, canonical URL, summary, author, publication time, and lead image. section defaults to main.", - "operationId": "latimes-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns the search-refinement chips Kroger shows above its own results for a query (e.g. \"chips ahoy\" returns \"chewy\", \"chunky\", \"thins\"). Each tag carries the full follow-on query it maps to, so results feed straight back into kroger-search.", + "operationId": "kroger-related-tags", "parameters": [ { - "description": "Section slug from latimes-sections, defaults to main", - "enum": [ - "main", - "business", - "business/autos", - "business/real-estate", - "business/technology", - "california", - "california/orange-county", - "entertainment-arts", - "entertainment-arts/awards", - "entertainment-arts/books", - "entertainment-arts/business", - "entertainment-arts/movies", - "entertainment-arts/music", - "entertainment-arts/tv", - "environment", - "espanol/comida", - "espanol/deportes", - "espanol/eeuu", - "espanol/entretenimiento", - "espanol/internacional", - "espanol/mexico", - "espanol/politica", - "espanol/vida-y-estilo", - "food", - "lifestyle", - "obituaries", - "opinion", - "politics", - "science", - "sports", - "sports/angels", - "sports/chargers", - "sports/clippers", - "sports/dodgers", - "sports/highschool", - "sports/hockey", - "sports/lakers", - "sports/rams", - "sports/soccer", - "sports/ucla", - "sports/usc", - "travel", - "world-nation" - ], + "description": "Search term to get refinement tags for", "in": "query", - "name": "section", - "type": "string" + "name": "query", + "required": true, + "type": "string", + "x-example": "chips ahoy" + }, + { + "description": "Kroger store/location id that scopes results", + "in": "query", + "name": "location_id", + "type": "string", + "x-example": "03500917" } ], "produces": [ @@ -389322,7 +398929,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/latimes.headlinesResponseDoc" + "$ref": "#/definitions/kroger.relatedTagsResponseDoc" } }, "400": { @@ -389331,12 +398938,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -389355,16 +398956,105 @@ "ApiKeyAuth": [] } ], - "summary": "Get Los Angeles Times section headlines", + "summary": "Get Kroger search-refinement tags", "tags": [ - "Los Angeles Times" + "Kroger" ] } }, - "/latimes/sections": { + "/kroger/search": { "get": { - "description": "Returns the complete set of section slugs accepted by latimes-headlines, each with its display name and public RSS feed URL.", - "operationId": "latimes-sections", + "consumes": [ + "application/json" + ], + "description": "Searches Kroger products by keyword and returns product cards (price, unit price, brand, size, stock level) plus the facet groups Kroger offers for the query (brands, nutrition, savings, price range and more). It supports real pagination, and the source field reports which path answered. Facet filters and sort apply to the primary path only: when any of them is set, a failure of that path returns an error rather than silently falling back to unfiltered results.", + "operationId": "kroger-search", + "parameters": [ + { + "description": "Search keyword", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "milk" + }, + { + "default": 1, + "description": "One-based result page", + "in": "query", + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": "relevance", + "description": "Result order. One of: relevance, name_asc, popularity_desc", + "enum": [ + "relevance", + "name_asc", + "popularity_desc" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Comma-separated brand names to filter by, taken verbatim from a previous response's facets", + "in": "query", + "name": "brands", + "type": "string", + "x-example": "Halo Top,Rebel" + }, + { + "description": "Comma-separated nutrition/dietary facet values", + "in": "query", + "name": "nutrition", + "type": "string", + "x-example": "Gluten Free" + }, + { + "description": "Comma-separated flavor facet values", + "in": "query", + "name": "flavor", + "type": "string", + "x-example": "Chocolate" + }, + { + "description": "Comma-separated scent facet values", + "in": "query", + "name": "scent", + "type": "string", + "x-example": "Bergamot" + }, + { + "description": "Comma-separated savings facet values", + "in": "query", + "name": "savings", + "type": "string", + "x-example": "On Sale" + }, + { + "description": "Comma-separated more-options facet values", + "in": "query", + "name": "more_options", + "type": "string", + "x-example": "SNAP EBT Eligible" + }, + { + "description": "Lower bound of the price filter; defaults to 0", + "in": "query", + "name": "price_min", + "type": "number", + "x-example": 0 + }, + { + "description": "Upper bound of the price filter; required to filter on price", + "in": "query", + "name": "price_max", + "type": "number", + "x-example": 8 + } + ], "produces": [ "application/json" ], @@ -389372,7 +399062,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/latimes.sectionsResponseDoc" + "$ref": "#/definitions/kroger.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -389393,33 +399089,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Los Angeles Times section feeds", + "summary": "Search Kroger products", "tags": [ - "Los Angeles Times" + "Kroger" ] } }, - "/lazada/categories": { + "/kroger/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Lazada country storefront's public category directory from the server-rendered LazMall navigation menu. The response includes top-level groups, categories, and subcategory links; it does not include product listings.", - "operationId": "lazada-categories", + "description": "Returns one Kroger store's public detail: postal address, geographic coordinates, phone number, displayed opening hours (including any daily break hours), and whether it has a drive-thru. store_id is the same store/location id kroger-products and kroger-suggest accept.", + "operationId": "kroger-store", "parameters": [ { - "description": "Lazada country storefront. Defaults to id.", - "enum": [ - "id", - "ph", - "th", - "my", - "vn", - "sg" - ], + "description": "Kroger store/location id", "in": "query", - "name": "country", - "type": "string" + "name": "store_id", + "required": true, + "type": "string", + "x-example": "01600531" } ], "produces": [ @@ -389429,7 +399119,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/lazada.categoriesResponseDoc" + "$ref": "#/definitions/kroger.storeResponseDoc" } }, "400": { @@ -389438,8 +399128,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -389456,64 +399152,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Lazada country storefront's category directory", + "summary": "Get one Kroger store's detail", "tags": [ - "Lazada" + "Kroger" ] } }, - "/lazada/category-products": { + "/kroger/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Lazada country storefront's product listing for one category, optionally filtered to one brand within it. Product cards include item ids, canonical product URLs, images, prices, ratings, and review counts, with pagination and sort. The category (and optional brand) value is the raw Lazada path slug, not a display name -- use the categories endpoint's own returned URLs to discover a category's slug.", - "operationId": "lazada-category-products", + "description": "Returns Kroger's own search-box suggestions for a (possibly empty) query, sourced directly from Kroger's public suggestions API rather than the rendered search page. An empty query returns Kroger's default \"trending\" shopping shortcuts instead of an error. location_id scopes results to one Kroger store and defaults to a confirmed-working store id when omitted.", + "operationId": "kroger-suggest", "parameters": [ { - "description": "Lazada country storefront. Defaults to id.", - "enum": [ - "id", - "ph", - "th", - "my", - "vn", - "sg" - ], - "in": "query", - "name": "country", - "type": "string" - }, - { - "description": "Lazada category path slug, e.g. \\", + "description": "Partial search text; omit for trending default suggestions", "in": "query", - "name": "category", - "required": true, + "name": "query", "type": "string", - "x-example": "shop-mobiles" - }, - { - "description": "Optional brand path slug to filter within the category.", - "in": "query", - "name": "brand", - "type": "string" - }, - { - "description": "Result page, 1-indexed. Defaults to 1.", - "in": "query", - "name": "page", - "type": "integer" + "x-example": "rin" }, { - "description": "Sort order. Defaults to popularity.", - "enum": [ - "popularity", - "priceasc", - "pricedesc" - ], + "description": "Kroger store/location id", "in": "query", - "name": "sort", - "type": "string" + "name": "location_id", + "type": "string", + "x-example": "03500917" } ], "produces": [ @@ -389523,17 +399188,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/lazada.categoryProductsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/kroger.suggestResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -389550,33 +399209,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Lazada country storefront's product listing for one category", + "summary": "Get Kroger search-box suggestions", "tags": [ - "Lazada" + "Kroger" ] } }, - "/lazada/home": { + "/kyliecosmetics/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Lazada country storefront's anonymous homepage feed: current flash-sale product cards, featured category links, and (where shown) an official-stores carousel. Product-detail and free-text catalog pages are not included because Lazada's stateless routes currently return an anti-bot challenge on every country domain.", - "operationId": "lazada-home", + "description": "Returns collections from Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", + "operationId": "kyliecosmetics-collections", "parameters": [ { - "description": "Lazada country storefront. Defaults to id.", - "enum": [ - "id", - "ph", - "th", - "my", - "vn", - "sg" - ], + "description": "1-based page, defaults to 1", "in": "query", - "name": "country", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum collections, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -389586,7 +399245,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/lazada.homeResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, "400": { @@ -389595,8 +399254,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -389613,47 +399272,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Lazada country storefront's homepage feed", + "summary": "List Kylie Cosmetics collections", "tags": [ - "Lazada" + "Kylie Cosmetics" ] } }, - "/lazada/product": { + "/kyliecosmetics/collections/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Lazada country storefront's product-detail page: title, brand, full description, image gallery, category breadcrumb, and selectable variant properties. item_id (and, for a specific variant, sku_id) are the same ids the search, category-products, and home endpoints already return as item_id. Price is best-effort, read from the page's own display-tracking data rather than a dedicated pricing field; rating and review count are not available on this endpoint because Lazada fetches them client-side after the initial page load.", - "operationId": "lazada-product", + "description": "Returns products from one Kylie Cosmetics (https://www.kyliecosmetics.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", + "operationId": "kyliecosmetics-collection-products", "parameters": [ { - "description": "Lazada country storefront. Defaults to id.", - "enum": [ - "id", - "ph", - "th", - "my", - "vn", - "sg" - ], - "in": "query", - "name": "country", - "type": "string" + "description": "Collection handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "collection-handle" }, { - "description": "Lazada item id.", + "description": "1-based page, defaults to 1", "in": "query", - "name": "item_id", - "required": true, + "name": "page", "type": "integer", - "x-example": 159992555 + "x-example": 1 }, { - "description": "Optional Lazada sku id, for a specific variant.", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "sku_id", - "type": "integer" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -389663,7 +399316,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/lazada.productResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { @@ -389678,8 +399331,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -389696,58 +399349,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Lazada country storefront's product-detail page", + "summary": "List Kylie Cosmetics collection products", "tags": [ - "Lazada" + "Kylie Cosmetics" ] } }, - "/lazada/search": { + "/kyliecosmetics/pages": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Lazada country storefront's free-text catalog search results: product cards with item ids, canonical product URLs, images, prices in the storefront's own currency, ratings, and review counts, with pagination and sort. Lazada's own search always substitutes generic or trending items rather than returning a genuinely empty result set, so an empty items list or a low total_results is not by itself a reliable \"no matches\" signal.", - "operationId": "lazada-search", + "description": "Lists static pages from the Kylie Cosmetics store, paged with `page` (default 1) and `limit` (default 50, max 250). Each page has its id, handle, title, URL, plain-text content and timestamps. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", + "operationId": "kyliecosmetics-pages", "parameters": [ { - "description": "Lazada country storefront. Defaults to id.", - "enum": [ - "id", - "ph", - "th", - "my", - "vn", - "sg" - ], - "in": "query", - "name": "country", - "type": "string" - }, - { - "description": "Free-text search query.", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "karaoke" - }, - { - "description": "Result page, 1-indexed. Defaults to 1.", + "description": "1-based page, defaults to 1", "in": "query", "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 }, { - "description": "Sort order. Defaults to popularity.", - "enum": [ - "popularity", - "priceasc", - "pricedesc" - ], + "description": "Maximum static pages, defaults to 50 and supports up to 250", "in": "query", - "name": "sort", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -389757,7 +399385,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/lazada.searchResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { @@ -389766,8 +399394,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -389784,24 +399412,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search a Lazada country storefront's catalog by keyword", + "summary": "List Kylie Cosmetics static pages", "tags": [ - "Lazada" + "Kylie Cosmetics" ] } }, - "/leboncoin/listing": { + "/kyliecosmetics/pages/{handle}": { "get": { - "description": "Returns public metadata for one supplied Leboncoin ad URL. It excludes seller identity and contacts, precise location, payment, delivery, and account data.", - "operationId": "leboncoin-listing", + "consumes": [ + "application/json" + ], + "description": "Returns one static page from the Kylie Cosmetics store by `handle`. The response has the page id, title, URL, handle, plain-text content, and created, updated and published times. Content is text, not HTML. In some cases `transport_mode` is `ssr_embedded` and `id` is omitted. An unknown handle returns `404`.", + "operationId": "kyliecosmetics-page", "parameters": [ { - "description": "Canonical public ad URL returned by leboncoin-search", - "in": "query", - "name": "url", + "description": "Page handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "https://www.leboncoin.fr/ad/ordinateurs/1946831025" + "x-example": "page-handle" } ], "produces": [ @@ -389811,7 +399442,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/leboncoin.listingResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, "400": { @@ -389844,24 +399475,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Leboncoin public listing", + "summary": "Get a Kylie Cosmetics static page", "tags": [ - "Leboncoin" + "Kylie Cosmetics" ] } }, - "/leboncoin/search": { + "/kyliecosmetics/products": { "get": { - "description": "Returns public listing cards from one Leboncoin location page. This endpoint excludes contacts, seller profiles, accounts, and transaction data.", - "operationId": "leboncoin-search", + "consumes": [ + "application/json" + ], + "description": "Returns products from Kylie Cosmetics's (https://www.kyliecosmetics.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "kyliecosmetics-products", "parameters": [ { - "description": "Public Leboncoin location slug", + "description": "1-based page, defaults to 1", "in": "query", - "name": "location", - "required": true, - "type": "string", - "x-example": "cp_paris_75016" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -389871,7 +399511,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/leboncoin.searchResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" } }, "400": { @@ -389898,27 +399538,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Leboncoin public listings", + "summary": "List Kylie Cosmetics products", "tags": [ - "Leboncoin" + "Kylie Cosmetics" ] } }, - "/letterboxd/film/{slug}": { + "/kyliecosmetics/products/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Letterboxd film: synopsis, director, cast, genres, countries, languages, runtime, and aggregate member rating.", - "operationId": "letterboxd-film", + "description": "Returns product detail for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "kyliecosmetics-product", "parameters": [ { - "description": "Letterboxd film slug", + "description": "Product handle", "in": "path", - "name": "slug", + "name": "handle", "required": true, "type": "string", - "x-example": "parasite-2019" + "x-example": "product-handle" } ], "produces": [ @@ -389928,7 +399568,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.filmResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { @@ -389943,8 +399583,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -389961,27 +399601,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Letterboxd film", + "summary": "Get a Kylie Cosmetics product", "tags": [ - "Letterboxd" + "Kylie Cosmetics" ] } }, - "/letterboxd/film/{slug}/rating-histogram": { + "/kyliecosmetics/products/{handle}/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Returns a film's full star-rating distribution (0.5 to 5.0 in half-star buckets) with counts and percentages.", - "operationId": "letterboxd-film-rating-histogram", + "description": "Returns recommended products for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The storefront URL is fixed server-side.", + "operationId": "kyliecosmetics-product-recommendations", "parameters": [ { - "description": "Letterboxd film slug", + "description": "Product handle", "in": "path", - "name": "slug", + "name": "handle", "required": true, "type": "string", - "x-example": "parasite-2019" + "x-example": "product-handle" + }, + { + "description": "Maximum products, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", + "enum": [ + "related", + "complementary" + ], + "in": "query", + "name": "intent", + "type": "string", + "x-example": "related" } ], "produces": [ @@ -389991,7 +399649,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.ratingHistogramResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -390000,8 +399658,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -390018,33 +399682,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Letterboxd film's rating distribution", + "summary": "List Kylie Cosmetics product recommendations", "tags": [ - "Letterboxd" + "Kylie Cosmetics" ] } }, - "/letterboxd/film/{slug}/reviews": { + "/kyliecosmetics/search/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns popular reviews for a Letterboxd film by `slug`, up to `limit` (default 10, max 50). Each review has the username, display name, rating from 0.5 to 5.0 when the reviewer gave one, liked flag, date, text, spoiler flag, and like and comment counts.", - "operationId": "letterboxd-film-reviews", + "description": "Returns products, collections, and query suggestions from Kylie Cosmetics's (https://www.kyliecosmetics.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "kyliecosmetics-search-suggest", "parameters": [ { - "description": "Letterboxd film slug", - "in": "path", - "name": "slug", + "description": "Search query", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "parasite-2019" + "x-example": "wool" }, { - "description": "Max reviews, default 10, max 50", + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "in": "query", + "name": "types", + "type": "string", + "x-example": "product,collection,query" + }, + { + "description": "Maximum results per type, defaults to 10 and supports up to 20", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -390054,7 +399726,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.reviewsResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { @@ -390063,8 +399735,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -390081,33 +399753,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Letterboxd film's popular reviews", + "summary": "Get Kylie Cosmetics search suggestions", "tags": [ - "Letterboxd" + "Kylie Cosmetics" ] } }, - "/letterboxd/film/{slug}/similar": { + "/kyliecosmetics/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "Lists films Letterboxd recommends as similar to the film given by `slug`, up to `limit` (default 10, max 50). Each film has its `slug`, title and Letterboxd URL. Use the slug to look up that film's details.", - "operationId": "letterboxd-film-similar", + "description": "Returns capped URL entries from Kylie Cosmetics's (https://www.kyliecosmetics.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", + "operationId": "kyliecosmetics-sitemap-urls", "parameters": [ { - "description": "Letterboxd film slug", - "in": "path", - "name": "slug", - "required": true, + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], + "in": "query", + "name": "type", "type": "string", - "x-example": "parasite-2019" + "x-example": "products" }, { - "description": "Max films, default 10, max 50", + "description": "Maximum URL entries, defaults to 50 and supports up to 250", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -390117,7 +399798,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.similarResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" } }, "400": { @@ -390126,8 +399807,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -390144,29 +399825,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get films similar to a Letterboxd film", + "summary": "List Kylie Cosmetics sitemap URLs", "tags": [ - "Letterboxd" + "Kylie Cosmetics" ] } }, - "/letterboxd/member/{username}": { + "/kyliecosmetics/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Returns a member's public profile stats (films watched, lists, following/followers). No private data — everything is visible to a logged-out visitor.", - "operationId": "letterboxd-member", - "parameters": [ - { - "description": "Letterboxd username", - "in": "path", - "name": "username", - "required": true, - "type": "string", - "x-example": "dave" - } - ], + "description": "Returns child sitemap URLs from Kylie Cosmetics's (https://www.kyliecosmetics.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", + "operationId": "kyliecosmetics-sitemaps", "produces": [ "application/json" ], @@ -390174,7 +399845,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.memberResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" } }, "400": { @@ -390183,14 +399854,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -390207,45 +399872,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Letterboxd member's public profile stats", + "summary": "List Kylie Cosmetics sitemaps", "tags": [ - "Letterboxd" + "Kylie Cosmetics" ] } }, - "/letterboxd/person/{slug}": { + "/kyliecosmetics/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns a person's Letterboxd filmography by `slug`, ranked by popularity for one credit role. `role` is `actor` (default) or `director`, and `limit` defaults to 10 with a max of 50. The response has the person's name, role, and films with `slug`, title and Letterboxd URL.", - "operationId": "letterboxd-person", - "parameters": [ - { - "description": "Letterboxd person slug", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "bong-joon-ho" - }, - { - "description": "Credit role, default actor", - "enum": [ - "actor", - "director" - ], - "in": "query", - "name": "role", - "type": "string" - }, - { - "description": "Max films, default 10, max 50", - "in": "query", - "name": "limit", - "type": "integer" - } - ], + "description": "Returns storefront metadata for Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "kyliecosmetics-store", "produces": [ "application/json" ], @@ -390253,7 +399892,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.personResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, "400": { @@ -390262,8 +399901,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -390280,51 +399919,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Letterboxd person's filmography", + "summary": "Get Kylie Cosmetics store metadata", "tags": [ - "Letterboxd" + "Kylie Cosmetics" ] } }, - "/letterboxd/popular": { + "/latimes/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Letterboxd film chart ranked by popularity. Omit `period` for all-time, or set `day`, `week`, `month` or `year`. `genre` takes a genre slug, `decade` a value like `2010s`, and `limit` defaults to 10 with a max of 50. Each film has its `slug`, title and Letterboxd URL.", - "operationId": "letterboxd-popular", + "description": "Returns a Los Angeles Times article's public metadata and body paragraphs from a canonical article URL, read from the page's NewsArticle structured data.", + "operationId": "latimes-article", "parameters": [ { - "description": "Popularity window, omit for all-time", - "enum": [ - "day", - "week", - "month", - "year" - ], - "in": "query", - "name": "period", - "type": "string" - }, - { - "description": "Genre slug filter", - "in": "query", - "name": "genre", - "type": "string", - "x-example": "mystery" - }, - { - "description": "Decade filter, e.g. 2010s", + "description": "Canonical Los Angeles Times article URL", "in": "query", - "name": "decade", + "name": "url", + "required": true, "type": "string", - "x-example": "2010s" - }, - { - "description": "Max films, default 10, max 50", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "https://www.latimes.com/environment/story/2026-09-18/newsom-rejects-roll-back-of-ceqa-exemptions-for-advanced-manufacturing" } ], "produces": [ @@ -390334,7 +399946,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.popularResponseDoc" + "$ref": "#/definitions/latimes.articleResponseDoc" } }, "400": { @@ -390343,8 +399955,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -390361,42 +399979,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Letterboxd popularity-ranked film chart", + "summary": "Get Los Angeles Times article content", "tags": [ - "Letterboxd" + "Los Angeles Times" ] } }, - "/letterboxd/search": { + "/latimes/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Letterboxd for films, people, lists and tags by `q`, required. `type` can be set to `film` to return films only; `limit` defaults to 10 with a max of 50. Fields vary by result type: films carry `slug` and `year`, people carry `slug` and `role`, lists carry `owner`, and tags carry only a title and URL.", - "operationId": "letterboxd-search", + "description": "Returns a Los Angeles Times author profile by `url`, a canonical `https://www.latimes.com/people/` link; other hosts or paths return a bad-request error. The response has the `name`, `job_title`, `bio`, `email`, `image_url`, `social_accounts` and recent articles with title, URL, summary, publication time and lead image. Accounts the page does not list are absent.", + "operationId": "latimes-author", "parameters": [ { - "description": "Search query", + "description": "Canonical Los Angeles Times author URL", "in": "query", - "name": "q", + "name": "url", "required": true, "type": "string", - "x-example": "Parasite" - }, - { - "description": "Optional result type filter", - "enum": [ - "film" - ], - "in": "query", - "name": "type", - "type": "string" - }, - { - "description": "Max results, default 10, max 50", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "https://www.latimes.com/people/anita-chabria" } ], "produces": [ @@ -390406,7 +400006,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/letterboxd.searchResponseDoc" + "$ref": "#/definitions/latimes.authorResponseDoc" } }, "400": { @@ -390415,8 +400015,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -390433,27 +400039,67 @@ "ApiKeyAuth": [] } ], - "summary": "Search Letterboxd", + "summary": "Get a Los Angeles Times author profile", "tags": [ - "Letterboxd" + "Los Angeles Times" ] } }, - "/linkedin/company/{id}": { + "/latimes/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a LinkedIn company page by its company `id`. The response has the name, headline, about text, industry, company size, employee count on LinkedIn, follower count, founding year, headquarters, locations, specialties, website, logo, Products section cards, affiliated and similar pages, and recent updates with reactions and comment counts.", - "operationId": "linkedin-company", + "description": "Returns fresh headlines from a public Los Angeles Times section RSS feed: title, canonical URL, summary, author, publication time, and lead image. section defaults to main.", + "operationId": "latimes-headlines", "parameters": [ { - "description": "LinkedIn Company ID", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "googledeepmind" + "description": "Section slug from latimes-sections, defaults to main", + "enum": [ + "main", + "business", + "business/autos", + "business/real-estate", + "business/technology", + "california", + "california/orange-county", + "entertainment-arts", + "entertainment-arts/awards", + "entertainment-arts/books", + "entertainment-arts/business", + "entertainment-arts/movies", + "entertainment-arts/music", + "entertainment-arts/tv", + "environment", + "espanol/comida", + "espanol/deportes", + "espanol/eeuu", + "espanol/entretenimiento", + "espanol/internacional", + "espanol/mexico", + "espanol/politica", + "espanol/vida-y-estilo", + "food", + "lifestyle", + "obituaries", + "opinion", + "politics", + "science", + "sports", + "sports/angels", + "sports/chargers", + "sports/clippers", + "sports/dodgers", + "sports/highschool", + "sports/hockey", + "sports/lakers", + "sports/rams", + "sports/soccer", + "sports/ucla", + "sports/usc", + "travel", + "world-nation" + ], + "in": "query", + "name": "section", + "type": "string" } ], "produces": [ @@ -390463,23 +400109,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/linkedin.companyResponseDoc" + "$ref": "#/definitions/latimes.headlinesResponseDoc" } }, "400": { - "description": "Invalid company ID", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -390490,27 +400142,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get LinkedIn Company info by ID", + "summary": "Get Los Angeles Times section headlines", "tags": [ - "LinkedIn" + "Los Angeles Times" ] } }, - "/linkedin/product/categories": { + "/latimes/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the standardized product categories accepted by the products/search endpoint's category_id filter. With a keyword, returns matching categories from LinkedIn's own category search. Without one, returns every known category.", - "operationId": "linkedin-product-categories", - "parameters": [ - { - "description": "Narrow results to categories matching this term. Omit to return every known category.", - "in": "query", - "name": "keyword", - "type": "string" - } - ], + "description": "Returns the complete set of section slugs accepted by latimes-headlines, each with its display name and public RSS feed URL.", + "operationId": "latimes-sections", "produces": [ "application/json" ], @@ -390518,23 +400159,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/linkedin.productCategoriesResponseDoc" + "$ref": "#/definitions/latimes.sectionsResponseDoc" } }, "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "LinkedIn upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -390545,27 +400180,33 @@ "ApiKeyAuth": [] } ], - "summary": "Discover LinkedIn product categories", + "summary": "List Los Angeles Times section feeds", "tags": [ - "LinkedIn" + "Los Angeles Times" ] } }, - "/linkedin/product/{id}": { + "/lazada/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns a LinkedIn product page by its product `id`. The response has the name, about text, category, owning organization, external link, logo, cover image, media items, featured customers with industry and follower count, and lists of other and similar products.", - "operationId": "linkedin-product", + "description": "Returns one Lazada country storefront's public category directory from the server-rendered LazMall navigation menu. The response includes top-level groups, categories, and subcategory links; it does not include product listings.", + "operationId": "lazada-categories", "parameters": [ { - "description": "LinkedIn Product ID", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "microsoft-dynamics-microsoft-dynamics-365-business-central" + "description": "Lazada country storefront. Defaults to id.", + "enum": [ + "id", + "ph", + "th", + "my", + "vn", + "sg" + ], + "in": "query", + "name": "country", + "type": "string" } ], "produces": [ @@ -390575,23 +400216,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/linkedin.productResponseDoc" + "$ref": "#/definitions/lazada.categoriesResponseDoc" } }, "400": { - "description": "Invalid Params", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -390602,42 +400243,64 @@ "ApiKeyAuth": [] } ], - "summary": "Get LinkedIn Product info by ID", + "summary": "Get a Lazada country storefront's category directory", "tags": [ - "LinkedIn" + "Lazada" ] } }, - "/linkedin/products/search": { + "/lazada/category-products": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of LinkedIn's public product directory search results, optionally scoped to a keyword and/or category. Keyword matching is on word prefixes. start is an upstream card offset advanced by the previous response's next_start; LinkedIn's guest search stops returning results at offset 1200.", - "operationId": "linkedin-products-search", + "description": "Returns one Lazada country storefront's product listing for one category, optionally filtered to one brand within it. Product cards include item ids, canonical product URLs, images, prices, ratings, and review counts, with pagination and sort. The category (and optional brand) value is the raw Lazada path slug, not a display name -- use the categories endpoint's own returned URLs to discover a category's slug.", + "operationId": "lazada-category-products", "parameters": [ { - "description": "Search keyword, matched on word prefixes", + "description": "Lazada country storefront. Defaults to id.", + "enum": [ + "id", + "ph", + "th", + "my", + "vn", + "sg" + ], "in": "query", - "name": "keyword", - "type": "string", - "x-example": "crm" + "name": "country", + "type": "string" }, { - "description": "Numeric category id from /linkedin/product/categories", + "description": "Lazada category path slug, e.g. \\", "in": "query", - "name": "category_id", + "name": "category", + "required": true, "type": "string", - "x-example": "1620" + "x-example": "shop-mobiles" }, { - "default": 0, - "description": "Upstream card offset, 0 to 1199", + "description": "Optional brand path slug to filter within the category.", "in": "query", - "maximum": 1199, - "minimum": 0, - "name": "start", + "name": "brand", + "type": "string" + }, + { + "description": "Result page, 1-indexed. Defaults to 1.", + "in": "query", + "name": "page", "type": "integer" + }, + { + "description": "Sort order. Defaults to popularity.", + "enum": [ + "popularity", + "priceasc", + "pricedesc" + ], + "in": "query", + "name": "sort", + "type": "string" } ], "produces": [ @@ -390647,29 +400310,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/linkedin.productsSearchResponseDoc" + "$ref": "#/definitions/lazada.categoryProductsResponseDoc" } }, "400": { - "description": "Invalid Params", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "LinkedIn upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -390680,27 +400337,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search the LinkedIn product directory", + "summary": "Get a Lazada country storefront's product listing for one category", "tags": [ - "LinkedIn" + "Lazada" ] } }, - "/linkedin/showcase/{id}": { + "/lazada/home": { "get": { "consumes": [ "application/json" ], - "description": "Returns a LinkedIn showcase page by its showcase page `id`. The response has the name, headline, about text, industry, follower count, employees on LinkedIn, headquarters, locations, specialties, website, logo, Products section cards when present, affiliated and similar pages, and recent updates with reactions and comment counts.", - "operationId": "linkedin-showcase", + "description": "Returns one Lazada country storefront's anonymous homepage feed: current flash-sale product cards, featured category links, and (where shown) an official-stores carousel. Product-detail and free-text catalog pages are not included because Lazada's stateless routes currently return an anti-bot challenge on every country domain.", + "operationId": "lazada-home", "parameters": [ { - "description": "LinkedIn Showcase Page ID", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "think-with-google" + "description": "Lazada country storefront. Defaults to id.", + "enum": [ + "id", + "ph", + "th", + "my", + "vn", + "sg" + ], + "in": "query", + "name": "country", + "type": "string" } ], "produces": [ @@ -390710,23 +400373,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/linkedin.showcaseResponseDoc" + "$ref": "#/definitions/lazada.homeResponseDoc" } }, "400": { - "description": "Invalid Params", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -390737,24 +400400,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get Linkedin Showcase Page Info", + "summary": "Get a Lazada country storefront's homepage feed", "tags": [ - "LinkedIn" + "Lazada" ] } }, - "/livemint/article": { + "/lazada/product": { "get": { - "description": "Returns public Mint article metadata and body paragraphs from a canonical article URL. A story Mint marks \"Mint Premium\" returns a permission error instead of a body.", - "operationId": "livemint-article", + "consumes": [ + "application/json" + ], + "description": "Returns one Lazada country storefront's product-detail page: title, brand, full description, image gallery, category breadcrumb, and selectable variant properties. item_id (and, for a specific variant, sku_id) are the same ids the search, category-products, and home endpoints already return as item_id. Price is best-effort, read from the page's own display-tracking data rather than a dedicated pricing field; rating and review count are not available on this endpoint because Lazada fetches them client-side after the initial page load.", + "operationId": "lazada-product", "parameters": [ { - "description": "Canonical Mint article URL", + "description": "Lazada country storefront. Defaults to id.", + "enum": [ + "id", + "ph", + "th", + "my", + "vn", + "sg" + ], "in": "query", - "name": "url", + "name": "country", + "type": "string" + }, + { + "description": "Lazada item id.", + "in": "query", + "name": "item_id", "required": true, - "type": "string", - "x-example": "https://www.livemint.com/companies/news/example-article-slug-11790258702207.html" + "type": "integer", + "x-example": 159992555 + }, + { + "description": "Optional Lazada sku id, for a specific variant.", + "in": "query", + "name": "sku_id", + "type": "integer" } ], "produces": [ @@ -390764,7 +400450,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/lazada.productResponseDoc" } }, "400": { @@ -390773,14 +400459,14 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -390797,24 +400483,58 @@ "ApiKeyAuth": [] } ], - "summary": "Get Mint article content", + "summary": "Get a Lazada country storefront's product-detail page", "tags": [ - "Mint" + "Lazada" ] } }, - "/livemint/author": { + "/lazada/search": { "get": { - "description": "Returns a Mint author profile from a required `url` in the form `https://www.livemint.com/authors/`. The response has `name`, `job_title`, `biography`, `image_url` and Twitter, Facebook, LinkedIn and Instagram links, each present only when the profile carries it. It does not list the author's articles.", - "operationId": "livemint-author", + "consumes": [ + "application/json" + ], + "description": "Returns one Lazada country storefront's free-text catalog search results: product cards with item ids, canonical product URLs, images, prices in the storefront's own currency, ratings, and review counts, with pagination and sort. Lazada's own search always substitutes generic or trending items rather than returning a genuinely empty result set, so an empty items list or a low total_results is not by itself a reliable \"no matches\" signal.", + "operationId": "lazada-search", "parameters": [ { - "description": "Canonical Mint author URL", + "description": "Lazada country storefront. Defaults to id.", + "enum": [ + "id", + "ph", + "th", + "my", + "vn", + "sg" + ], "in": "query", - "name": "url", + "name": "country", + "type": "string" + }, + { + "description": "Free-text search query.", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "https://www.livemint.com/authors/sheetal-goel" + "x-example": "karaoke" + }, + { + "description": "Result page, 1-indexed. Defaults to 1.", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Sort order. Defaults to popularity.", + "enum": [ + "popularity", + "priceasc", + "pricedesc" + ], + "in": "query", + "name": "sort", + "type": "string" } ], "produces": [ @@ -390824,7 +400544,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.livemintAuthorResponseDoc" + "$ref": "#/definitions/lazada.searchResponseDoc" } }, "400": { @@ -390833,8 +400553,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -390851,41 +400571,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Mint author profile", + "summary": "Search a Lazada country storefront's catalog by keyword", "tags": [ - "Mint" + "Lazada" ] } }, - "/livemint/headlines": { + "/leboncoin/listing": { "get": { - "description": "Returns recent Mint headlines for one section. `section` is required and takes one of 15 slugs, including `companies`, `markets`, `money`, `ai` and `videos`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "livemint-headlines", + "description": "Returns public metadata for one supplied Leboncoin ad URL. It excludes seller identity and contacts, precise location, payment, delivery, and account data.", + "operationId": "leboncoin-listing", "parameters": [ { - "description": "Mint section slug", - "enum": [ - "companies", - "opinion", - "money", - "politics", - "science", - "industry", - "education", - "sports", - "technology", - "markets", - "ai", - "insurance", - "budget", - "elections", - "videos" - ], + "description": "Canonical public ad URL returned by leboncoin-search", "in": "query", - "name": "section", + "name": "url", "required": true, "type": "string", - "x-example": "companies" + "x-example": "https://www.leboncoin.fr/ad/ordinateurs/1946831025" } ], "produces": [ @@ -390895,7 +400598,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/leboncoin.listingResponseDoc" } }, "400": { @@ -390904,6 +400607,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -390916,16 +400631,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get Mint section headlines", + "summary": "Get a Leboncoin public listing", "tags": [ - "Mint" + "Leboncoin" ] } }, - "/livemint/news": { + "/leboncoin/search": { "get": { - "description": "Returns the current Mint (livemint.com) top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. For one topic area, use `livemint-headlines` with a `section`.", - "operationId": "livemint-news", + "description": "Returns public listing cards from one Leboncoin location page. This endpoint excludes contacts, seller profiles, accounts, and transaction data.", + "operationId": "leboncoin-search", + "parameters": [ + { + "description": "Public Leboncoin location slug", + "in": "query", + "name": "location", + "required": true, + "type": "string", + "x-example": "cp_paris_75016" + } + ], "produces": [ "application/json" ], @@ -390933,7 +400658,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/leboncoin.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -390954,50 +400685,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Mint top stories", + "summary": "Search Leboncoin public listings", "tags": [ - "Mint" + "Leboncoin" ] } }, - "/livemint/sections": { + "/letterboxd/film/{slug}": { "get": { - "description": "Lists the 15 Mint section slugs accepted by `livemint-headlines`, such as `companies`, `markets`, `money`, `budget` and `videos`. Each entry has its `slug`, display `name` and page `url`.", - "operationId": "livemint-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Mint sections", - "tags": [ - "Mint" - ] - } - }, - "/liverpoolecho/article": { - "get": { - "description": "Returns public Liverpool Echo article metadata (including the section) and body paragraphs from a canonical article URL. Photo-gallery URLs are rejected.", - "operationId": "liverpoolecho-article", + "description": "Returns a Letterboxd film: synopsis, director, cast, genres, countries, languages, runtime, and aggregate member rating.", + "operationId": "letterboxd-film", "parameters": [ { - "description": "Canonical Liverpool Echo article URL", - "in": "query", - "name": "url", + "description": "Letterboxd film slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.liverpoolecho.co.uk/news/liverpool-news/oxton-mans-vile-campaign-harassment-34666610" + "x-example": "parasite-2019" } ], "produces": [ @@ -391007,7 +400715,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/letterboxd.filmResponseDoc" } }, "400": { @@ -391022,8 +400730,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391040,37 +400748,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Liverpool Echo article content", + "summary": "Get a Letterboxd film", "tags": [ - "Liverpool Echo" + "Letterboxd" ] } }, - "/liverpoolecho/author": { + "/letterboxd/film/{slug}/rating-histogram": { "get": { - "description": "Returns one Liverpool Echo author's public profile: name, job title, bio, email, X/Twitter handle, and one page of their recent articles.", - "operationId": "liverpoolecho-author", + "consumes": [ + "application/json" + ], + "description": "Returns a film's full star-rating distribution (0.5 to 5.0 in half-star buckets) with counts and percentages.", + "operationId": "letterboxd-film-rating-histogram", "parameters": [ { - "description": "Author slug, e.g. wesley-holmes", - "in": "query", + "description": "Letterboxd film slug", + "in": "path", "name": "slug", + "required": true, "type": "string", - "x-example": "wesley-holmes" - }, - { - "description": "Canonical liverpoolecho.co.uk/authors// URL; alternative to slug", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.liverpoolecho.co.uk/authors/wesley-holmes/" - }, - { - "default": 1, - "description": "1-based page number of the author's article list (1 to 100); overrides any pageNumber in url", - "in": "query", - "name": "page", - "type": "integer" + "x-example": "parasite-2019" } ], "produces": [ @@ -391080,7 +400778,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.reachAuthorResponseDoc" + "$ref": "#/definitions/letterboxd.ratingHistogramResponseDoc" } }, "400": { @@ -391089,14 +400787,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391113,54 +400805,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Liverpool Echo author profile", + "summary": "Get a Letterboxd film's rating distribution", "tags": [ - "Liverpool Echo" + "Letterboxd" ] } }, - "/liverpoolecho/headlines": { + "/letterboxd/film/{slug}/reviews": { "get": { - "description": "Returns fresh headlines from one public Liverpool Echo section. Photo galleries are omitted because they have no readable article body.", - "operationId": "liverpoolecho-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns popular reviews for a Letterboxd film by `slug`, up to `limit` (default 10, max 50). Each review has the username, display name, rating from 0.5 to 5.0 when the reviewer gave one, liked flag, date, text, spoiler flag, and like and comment counts.", + "operationId": "letterboxd-film-reviews", "parameters": [ { - "description": "Liverpool Echo section slug", - "enum": [ - "news", - "news/liverpool-news", - "news/uk-world-news", - "news/showbiz-news", - "news/tv", - "news/nostalgia", - "news/property", - "news/motoring", - "news/cost-of-living", - "news/health", - "sport", - "sport/football", - "sport/football/football-news", - "sport/football/transfer-news", - "sport/boxing", - "sport/other-sport", - "sport/other-sport/horse-racing", - "sport/sport-opinion", - "whats-on", - "whats-on/whats-on-news", - "whats-on/family-kids-news", - "whats-on/food-drink-news", - "whats-on/music-nightlife-news", - "whats-on/shopping", - "whats-on/theatre-news", - "travel", - "special-features", - "in-your-area" - ], - "in": "query", - "name": "section", + "description": "Letterboxd film slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "news" + "x-example": "parasite-2019" + }, + { + "description": "Max reviews, default 10, max 50", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -391170,7 +400841,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/letterboxd.reviewsResponseDoc" } }, "400": { @@ -391179,8 +400850,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391197,16 +400868,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get Liverpool Echo section headlines", + "summary": "Get a Letterboxd film's popular reviews", "tags": [ - "Liverpool Echo" + "Letterboxd" ] } }, - "/liverpoolecho/news": { + "/letterboxd/film/{slug}/similar": { "get": { - "description": "Returns fresh Liverpool Echo top stories from the public home RSS feed. Photo galleries are omitted because they have no readable article body.", - "operationId": "liverpoolecho-news", + "consumes": [ + "application/json" + ], + "description": "Lists films Letterboxd recommends as similar to the film given by `slug`, up to `limit` (default 10, max 50). Each film has its `slug`, title and Letterboxd URL. Use the slug to look up that film's details.", + "operationId": "letterboxd-film-similar", + "parameters": [ + { + "description": "Letterboxd film slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "parasite-2019" + }, + { + "description": "Max films, default 10, max 50", + "in": "query", + "name": "limit", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -391214,11 +400904,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/letterboxd.similarResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391235,50 +400931,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Liverpool Echo top stories", + "summary": "Get films similar to a Letterboxd film", "tags": [ - "Liverpool Echo" + "Letterboxd" ] } }, - "/liverpoolecho/sections": { + "/letterboxd/member/{username}": { "get": { - "description": "Lists the Liverpool Echo sections accepted by `liverpoolecho-headlines`, such as `news/liverpool-news`, `sport/football/transfer-news`, `whats-on/theatre-news` and `in-your-area`. Each entry has a `slug`, display `name` and feed `url`. Each listed section had at least one current entry when last checked, and feeds hold up to about 25 entries.", - "operationId": "liverpoolecho-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Liverpool Echo sections", - "tags": [ - "Liverpool Echo" - ] - } - }, - "/livescience/article": { - "get": { - "description": "Returns a Live Science article by `url`, a canonical HTTPS `livescience.com` article link. The response has the title, description, section, authors, lead image, publish and update times, body `paragraphs` and a `paywalled` flag.", - "operationId": "livescience-article", + "description": "Returns a member's public profile stats (films watched, lists, following/followers). No private data — everything is visible to a logged-out visitor.", + "operationId": "letterboxd-member", "parameters": [ { - "description": "Canonical Live Science article URL", - "in": "query", - "name": "url", + "description": "Letterboxd username", + "in": "path", + "name": "username", "required": true, "type": "string", - "x-example": "https://www.livescience.com/space/comets/example-comet-story" + "x-example": "dave" } ], "produces": [ @@ -391288,7 +400961,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/letterboxd.memberResponseDoc" } }, "400": { @@ -391303,6 +400976,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -391315,36 +400994,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get Live Science article content", + "summary": "Get a Letterboxd member's public profile stats", "tags": [ - "Live Science" + "Letterboxd" ] } }, - "/livescience/author": { + "/letterboxd/person/{slug}": { "get": { - "description": "Returns one Live Science author's public profile: name, job title, biography, social links, and one page of their recent articles.", - "operationId": "livescience-author", + "consumes": [ + "application/json" + ], + "description": "Returns a person's Letterboxd filmography by `slug`, ranked by popularity for one credit role. `role` is `actor` (default) or `director`, and `limit` defaults to 10 with a max of 50. The response has the person's name, role, and films with `slug`, title and Letterboxd URL.", + "operationId": "letterboxd-person", "parameters": [ { - "description": "Author slug, e.g. ben-turner", - "in": "query", + "description": "Letterboxd person slug", + "in": "path", "name": "slug", + "required": true, "type": "string", - "x-example": "ben-turner" + "x-example": "bong-joon-ho" }, { - "description": "Canonical livescience.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "description": "Credit role, default actor", + "enum": [ + "actor", + "director" + ], "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.livescience.com/author/ben-turner" + "name": "role", + "type": "string" }, { - "default": 1, - "description": "1-based page number of the author's article list; overrides any page number embedded in url", + "description": "Max films, default 10, max 50", "in": "query", - "name": "page", + "name": "limit", "type": "integer" } ], @@ -391355,7 +401040,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.livescienceAuthorResponseDoc" + "$ref": "#/definitions/letterboxd.personResponseDoc" } }, "400": { @@ -391364,8 +401049,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391382,40 +401067,51 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Live Science author profile", + "summary": "Get a Letterboxd person's filmography", "tags": [ - "Live Science" + "Letterboxd" ] } }, - "/livescience/headlines": { + "/letterboxd/popular": { "get": { - "description": "Returns current Live Science headlines for one section. `section` is required and takes one of 14 slugs: `animals`, `archaeology`, `chemistry`, `features`, `health`, `human-behavior`, `interviews`, `news`, `opinion`, `physics-mathematics`, `planet-earth`, `products`, `space` or `technology`. Each item has a title and URL, plus author, publication time and image when the section page shows them.", - "operationId": "livescience-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a Letterboxd film chart ranked by popularity. Omit `period` for all-time, or set `day`, `week`, `month` or `year`. `genre` takes a genre slug, `decade` a value like `2010s`, and `limit` defaults to 10 with a max of 50. Each film has its `slug`, title and Letterboxd URL.", + "operationId": "letterboxd-popular", "parameters": [ { - "description": "Live Science section slug", + "description": "Popularity window, omit for all-time", "enum": [ - "animals", - "archaeology", - "chemistry", - "features", - "health", - "human-behavior", - "interviews", - "news", - "opinion", - "physics-mathematics", - "planet-earth", - "products", - "space", - "technology" + "day", + "week", + "month", + "year" ], "in": "query", - "name": "section", - "required": true, + "name": "period", + "type": "string" + }, + { + "description": "Genre slug filter", + "in": "query", + "name": "genre", "type": "string", - "x-example": "animals" + "x-example": "mystery" + }, + { + "description": "Decade filter, e.g. 2010s", + "in": "query", + "name": "decade", + "type": "string", + "x-example": "2010s" + }, + { + "description": "Max films, default 10, max 50", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -391425,7 +401121,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/letterboxd.popularResponseDoc" } }, "400": { @@ -391434,6 +401130,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -391446,16 +401148,44 @@ "ApiKeyAuth": [] } ], - "summary": "Get Live Science section headlines", + "summary": "Get a Letterboxd popularity-ranked film chart", "tags": [ - "Live Science" + "Letterboxd" ] } }, - "/livescience/news": { + "/letterboxd/search": { "get": { - "description": "Returns Live Science's current top stories across the site, with no parameters. Each item has its title, URL, summary, author, publication time and image where available. Use `livescience-headlines` to narrow to one section.", - "operationId": "livescience-news", + "consumes": [ + "application/json" + ], + "description": "Searches Letterboxd for films, people, lists and tags by `q`, required. `type` can be set to `film` to return films only; `limit` defaults to 10 with a max of 50. Fields vary by result type: films carry `slug` and `year`, people carry `slug` and `role`, lists carry `owner`, and tags carry only a title and URL.", + "operationId": "letterboxd-search", + "parameters": [ + { + "description": "Search query", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "Parasite" + }, + { + "description": "Optional result type filter", + "enum": [ + "film" + ], + "in": "query", + "name": "type", + "type": "string" + }, + { + "description": "Max results, default 10, max 50", + "in": "query", + "name": "limit", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -391463,11 +401193,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/letterboxd.searchResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391484,16 +401220,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get Live Science top stories", + "summary": "Search Letterboxd", "tags": [ - "Live Science" + "Letterboxd" ] } }, - "/livescience/sections": { + "/linkedin/company/{id}": { "get": { - "description": "Lists the 14 top-level Live Science sections accepted by `livescience-headlines`, including `animals`, `archaeology`, `human-behavior`, `physics-mathematics`, `planet-earth` and `space`. Each entry has a `slug`, display `name` and section `url`.", - "operationId": "livescience-sections", + "consumes": [ + "application/json" + ], + "description": "Returns a LinkedIn company page by its company `id`. The response has the name, headline, about text, industry, company size, employee count on LinkedIn, follower count, founding year, headquarters, locations, specialties, website, logo, Products section cards, affiliated and similar pages, and recent updates with reactions and comment counts.", + "operationId": "linkedin-company", + "parameters": [ + { + "description": "LinkedIn Company ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "googledeepmind" + } + ], "produces": [ "application/json" ], @@ -391501,7 +401250,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/linkedin.companyResponseDoc" + } + }, + "400": { + "description": "Invalid company ID", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -391510,27 +401277,25 @@ "ApiKeyAuth": [] } ], - "summary": "Get Live Science sections", + "summary": "Get LinkedIn Company info by ID", "tags": [ - "Live Science" + "LinkedIn" ] } }, - "/livescore/competition": { + "/linkedin/product/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns public competition or stage page data and its visible sections. Competition ids and tabs vary by sport; discover English sitemap-listed paths, including cricket stage pages, with /livescore/competitions.", - "operationId": "livescore-competition", + "description": "Returns the standardized product categories accepted by the products/search endpoint's category_id filter. With a keyword, returns matching categories from LinkedIn's own category search. Without one, returns every known category.", + "operationId": "linkedin-product-categories", "parameters": [ { - "description": "Three to five lowercase path segments following /en/, such as football/england/premier-league or football/england/premier-league/standings", + "description": "Narrow results to categories matching this term. Omit to return every known category.", "in": "query", - "name": "path", - "required": true, - "type": "string", - "x-example": "football/england/premier-league" + "name": "keyword", + "type": "string" } ], "produces": [ @@ -391540,23 +401305,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.responseDoc" + "$ref": "#/definitions/linkedin.productCategoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "LinkedIn upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -391567,19 +401332,29 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore competition page and section data", + "summary": "Discover LinkedIn product categories", "tags": [ - "LiveScore" + "LinkedIn" ] } }, - "/livescore/competitions": { + "/linkedin/product/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns English competition pages listed in LiveScore's public competition sitemaps plus competition-shaped pages listed in the English cricket sport sitemap. The sitemap index has dedicated competition sitemaps for soccer, hockey, basketball, and tennis; cricket discovery remains partial and dynamic.", - "operationId": "livescore-competitions", + "description": "Returns a LinkedIn product page by its product `id`. The response has the name, about text, category, owning organization, external link, logo, cover image, media items, featured customers with industry and follower count, and lists of other and similar products.", + "operationId": "linkedin-product", + "parameters": [ + { + "description": "LinkedIn Product ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "microsoft-dynamics-microsoft-dynamics-365-business-central" + } + ], "produces": [ "application/json" ], @@ -391587,11 +401362,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.responseDoc" + "$ref": "#/definitions/linkedin.productResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "400": { + "description": "Invalid Params", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391602,65 +401389,42 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore competition page directory", + "summary": "Get LinkedIn Product info by ID", "tags": [ - "LiveScore" + "LinkedIn" ] } }, - "/livescore/live-scores": { + "/linkedin/products/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns current live sections for a supported sport. Empty Sctns is a valid result when there are no live events. Use Nav and the final section Id for cursor paging.", - "operationId": "livescore-live-scores", + "description": "Returns one page of LinkedIn's public product directory search results, optionally scoped to a keyword and/or category. Keyword matching is on word prefixes. start is an upstream card offset advanced by the previous response's next_start; LinkedIn's guest search stops returning results at offset 1200.", + "operationId": "linkedin-products-search", "parameters": [ { - "description": "LiveScore sport id", - "enum": [ - "soccer", - "hockey", - "basketball", - "tennis", - "cricket" - ], + "description": "Search keyword, matched on word prefixes", "in": "query", - "name": "sport", - "required": true, + "name": "keyword", "type": "string", - "x-example": "soccer" - }, - { - "description": "UTC offset in hours from -12 through 14; defaults to 0", - "in": "query", - "maximum": 14, - "minimum": -12, - "name": "timezone_offset", - "type": "integer" - }, - { - "description": "Request a paged live feed; defaults to false", - "in": "query", - "name": "paging", - "type": "boolean" + "x-example": "crm" }, { - "description": "Section Id from the prior paged response, e.g. s-26031", + "description": "Numeric category id from /linkedin/product/categories", "in": "query", - "name": "cursor", + "name": "category_id", "type": "string", - "x-example": "s-26031" + "x-example": "1620" }, { - "description": "Page direction in paged mode", - "enum": [ - "down", - "up" - ], + "default": 0, + "description": "Upstream card offset, 0 to 1199", "in": "query", - "name": "direction", - "type": "string" + "maximum": 1199, + "minimum": 0, + "name": "start", + "type": "integer" } ], "produces": [ @@ -391670,23 +401434,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.responseDoc" + "$ref": "#/definitions/linkedin.productsSearchResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid Params", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "LinkedIn upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -391697,27 +401467,27 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore live scores by sport", + "summary": "Search the LinkedIn product directory", "tags": [ - "LiveScore" + "LinkedIn" ] } }, - "/livescore/match": { + "/linkedin/showcase/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the event data embedded in a public LiveScore match page. Data uses LiveScore's event payload shape; available fields vary by event and stage.", - "operationId": "livescore-match", + "description": "Returns a LinkedIn showcase page by its showcase page `id`. The response has the name, headline, about text, industry, follower count, employees on LinkedIn, headquarters, locations, specialties, website, logo, Products section cards when present, affiliated and similar pages, and recent updates with reactions and comment counts.", + "operationId": "linkedin-showcase", "parameters": [ { - "description": "Five path segments following /en/ in a LiveScore match URL", - "in": "query", - "name": "path", + "description": "LinkedIn Showcase Page ID", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "football/uefa-nations-league/league-b-group-3/austria-vs-israel/1738267" + "x-example": "think-with-google" } ], "produces": [ @@ -391727,23 +401497,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.responseDoc" + "$ref": "#/definitions/linkedin.showcaseResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid Params", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -391754,27 +401524,24 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore match details", + "summary": "Get Linkedin Showcase Page Info", "tags": [ - "LiveScore" + "LinkedIn" ] } }, - "/livescore/match-stats": { + "/livemint/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the statistics section for a LiveScore match when the source exposes it.", - "operationId": "livescore-match-stats", + "description": "Returns public Mint article metadata and body paragraphs from a canonical article URL. A story Mint marks \"Mint Premium\" returns a permission error instead of a body.", + "operationId": "livemint-article", "parameters": [ { - "description": "Five-segment path after /en/ from a LiveScore match URL", + "description": "Canonical Mint article URL", "in": "query", - "name": "path", + "name": "url", "required": true, "type": "string", - "x-example": "football/uefa-nations-league/league-b-group-3/austria-vs-israel/1738267" + "x-example": "https://www.livemint.com/companies/news/example-article-slug-11790258702207.html" } ], "produces": [ @@ -391784,7 +401551,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.responseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -391793,6 +401560,12 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { @@ -391811,27 +401584,24 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore match statistics", + "summary": "Get Mint article content", "tags": [ - "LiveScore" + "Mint" ] } }, - "/livescore/news": { + "/livemint/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the article cards for one LiveScore news route. `category` is required: `all` for the home feed, or a lowercase route path of up to six segments, such as `football/premier-league`, found via `livescore-news-categories`. The response carries `source_url` and the page `data`. Some articles link to third-party publishers, article bodies are not returned, and unknown paths return not found or an upstream error.", - "operationId": "livescore-news", + "description": "Returns a Mint author profile from a required `url` in the form `https://www.livemint.com/authors/`. The response has `name`, `job_title`, `biography`, `image_url` and Twitter, Facebook, LinkedIn and Instagram links, each present only when the profile carries it. It does not list the author's articles.", + "operationId": "livemint-author", "parameters": [ { - "description": "all or a lowercase path from /livescore/news-categories; up to six segments", + "description": "Canonical Mint author URL", "in": "query", - "name": "category", + "name": "url", "required": true, "type": "string", - "x-example": "football/premier-league" + "x-example": "https://www.livemint.com/authors/sheetal-goel" } ], "produces": [ @@ -391841,7 +401611,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.responseDoc" + "$ref": "#/definitions/publicnews.livemintAuthorResponseDoc" } }, "400": { @@ -391868,27 +401638,41 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore news by category or topic", + "summary": "Get a Mint author profile", "tags": [ - "LiveScore" + "Mint" ] } }, - "/livescore/news-article": { + "/livemint/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the public full article record, including the article's structured content when supplied by LiveScore. Copy the path following /en/news/ from an article slug in /livescore/news.", - "operationId": "livescore-news-article", + "description": "Returns recent Mint headlines for one section. `section` is required and takes one of 15 slugs, including `companies`, `markets`, `money`, `ai` and `videos`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "livemint-headlines", "parameters": [ { - "description": "Two to eight lowercase path segments after /en/news/, copied from an article slug", + "description": "Mint section slug", + "enum": [ + "companies", + "opinion", + "money", + "politics", + "science", + "industry", + "education", + "sports", + "technology", + "markets", + "ai", + "insurance", + "budget", + "elections", + "videos" + ], "in": "query", - "name": "path", + "name": "section", "required": true, "type": "string", - "x-example": "football/man-city-guilty-of-114-charges-what-happens-next-man-city-square" + "x-example": "companies" } ], "produces": [ @@ -391898,7 +401682,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.responseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -391907,12 +401691,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -391925,19 +401703,16 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore news article", + "summary": "Get Mint section headlines", "tags": [ - "LiveScore" + "Mint" ] } }, - "/livescore/news-categories": { + "/livemint/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns all current public news routes from LiveScore's own category sitemap files, including sports, competitions, tips, daily team feeds, and teams. The values update with the source sitemap.", - "operationId": "livescore-news-categories", + "description": "Returns the current Mint (livemint.com) top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. For one topic area, use `livemint-headlines` with a `section`.", + "operationId": "livemint-news", "produces": [ "application/json" ], @@ -391945,7 +401720,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.newsCategoriesResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -391960,28 +401741,16 @@ "ApiKeyAuth": [] } ], - "summary": "LiveScore news categories", + "summary": "Get Mint top stories", "tags": [ - "LiveScore" + "Mint" ] } }, - "/livescore/news-feed": { + "/livemint/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns latest public news items from LiveScore's global RSS feed. The source feed may include multiple sports and has no verified category filter. Set include_content=true to include each RSS item's full content:encoded body.", - "operationId": "livescore-news-feed", - "parameters": [ - { - "default": false, - "description": "Include full RSS article content when available", - "in": "query", - "name": "include_content", - "type": "boolean" - } - ], + "description": "Lists the 15 Mint section slugs accepted by `livemint-headlines`, such as `companies`, `markets`, `money`, `budget` and `videos`. Each entry has its `slug`, display `name` and page `url`.", + "operationId": "livemint-sections", "produces": [ "application/json" ], @@ -391989,13 +401758,1031 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/livescore.livescoreNewsFeedResponseDoc" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Mint sections", + "tags": [ + "Mint" + ] + } + }, + "/liverpoolecho/article": { + "get": { + "description": "Returns public Liverpool Echo article metadata (including the section) and body paragraphs from a canonical article URL. Photo-gallery URLs are rejected.", + "operationId": "liverpoolecho-article", + "parameters": [ + { + "description": "Canonical Liverpool Echo article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.liverpoolecho.co.uk/news/liverpool-news/oxton-mans-vile-campaign-harassment-34666610" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Liverpool Echo article content", + "tags": [ + "Liverpool Echo" + ] + } + }, + "/liverpoolecho/author": { + "get": { + "description": "Returns one Liverpool Echo author's public profile: name, job title, bio, email, X/Twitter handle, and one page of their recent articles.", + "operationId": "liverpoolecho-author", + "parameters": [ + { + "description": "Author slug, e.g. wesley-holmes", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "wesley-holmes" + }, + { + "description": "Canonical liverpoolecho.co.uk/authors// URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.liverpoolecho.co.uk/authors/wesley-holmes/" + }, + { + "default": 1, + "description": "1-based page number of the author's article list (1 to 100); overrides any pageNumber in url", + "in": "query", + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.reachAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Liverpool Echo author profile", + "tags": [ + "Liverpool Echo" + ] + } + }, + "/liverpoolecho/headlines": { + "get": { + "description": "Returns fresh headlines from one public Liverpool Echo section. Photo galleries are omitted because they have no readable article body.", + "operationId": "liverpoolecho-headlines", + "parameters": [ + { + "description": "Liverpool Echo section slug", + "enum": [ + "news", + "news/liverpool-news", + "news/uk-world-news", + "news/showbiz-news", + "news/tv", + "news/nostalgia", + "news/property", + "news/motoring", + "news/cost-of-living", + "news/health", + "sport", + "sport/football", + "sport/football/football-news", + "sport/football/transfer-news", + "sport/boxing", + "sport/other-sport", + "sport/other-sport/horse-racing", + "sport/sport-opinion", + "whats-on", + "whats-on/whats-on-news", + "whats-on/family-kids-news", + "whats-on/food-drink-news", + "whats-on/music-nightlife-news", + "whats-on/shopping", + "whats-on/theatre-news", + "travel", + "special-features", + "in-your-area" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "news" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Liverpool Echo section headlines", + "tags": [ + "Liverpool Echo" + ] + } + }, + "/liverpoolecho/news": { + "get": { + "description": "Returns fresh Liverpool Echo top stories from the public home RSS feed. Photo galleries are omitted because they have no readable article body.", + "operationId": "liverpoolecho-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Liverpool Echo top stories", + "tags": [ + "Liverpool Echo" + ] + } + }, + "/liverpoolecho/sections": { + "get": { + "description": "Lists the Liverpool Echo sections accepted by `liverpoolecho-headlines`, such as `news/liverpool-news`, `sport/football/transfer-news`, `whats-on/theatre-news` and `in-your-area`. Each entry has a `slug`, display `name` and feed `url`. Each listed section had at least one current entry when last checked, and feeds hold up to about 25 entries.", + "operationId": "liverpoolecho-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Liverpool Echo sections", + "tags": [ + "Liverpool Echo" + ] + } + }, + "/livescience/article": { + "get": { + "description": "Returns a Live Science article by `url`, a canonical HTTPS `livescience.com` article link. The response has the title, description, section, authors, lead image, publish and update times, body `paragraphs` and a `paywalled` flag.", + "operationId": "livescience-article", + "parameters": [ + { + "description": "Canonical Live Science article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.livescience.com/space/comets/example-comet-story" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Live Science article content", + "tags": [ + "Live Science" + ] + } + }, + "/livescience/author": { + "get": { + "description": "Returns one Live Science author's public profile: name, job title, biography, social links, and one page of their recent articles.", + "operationId": "livescience-author", + "parameters": [ + { + "description": "Author slug, e.g. ben-turner", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "ben-turner" + }, + { + "description": "Canonical livescience.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.livescience.com/author/ben-turner" + }, + { + "default": 1, + "description": "1-based page number of the author's article list; overrides any page number embedded in url", + "in": "query", + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.livescienceAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Live Science author profile", + "tags": [ + "Live Science" + ] + } + }, + "/livescience/headlines": { + "get": { + "description": "Returns current Live Science headlines for one section. `section` is required and takes one of 14 slugs: `animals`, `archaeology`, `chemistry`, `features`, `health`, `human-behavior`, `interviews`, `news`, `opinion`, `physics-mathematics`, `planet-earth`, `products`, `space` or `technology`. Each item has a title and URL, plus author, publication time and image when the section page shows them.", + "operationId": "livescience-headlines", + "parameters": [ + { + "description": "Live Science section slug", + "enum": [ + "animals", + "archaeology", + "chemistry", + "features", + "health", + "human-behavior", + "interviews", + "news", + "opinion", + "physics-mathematics", + "planet-earth", + "products", + "space", + "technology" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "animals" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Live Science section headlines", + "tags": [ + "Live Science" + ] + } + }, + "/livescience/news": { + "get": { + "description": "Returns Live Science's current top stories across the site, with no parameters. Each item has its title, URL, summary, author, publication time and image where available. Use `livescience-headlines` to narrow to one section.", + "operationId": "livescience-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Live Science top stories", + "tags": [ + "Live Science" + ] + } + }, + "/livescience/sections": { + "get": { + "description": "Lists the 14 top-level Live Science sections accepted by `livescience-headlines`, including `animals`, `archaeology`, `human-behavior`, `physics-mathematics`, `planet-earth` and `space`. Each entry has a `slug`, display `name` and section `url`.", + "operationId": "livescience-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Live Science sections", + "tags": [ + "Live Science" + ] + } + }, + "/livescore/competition": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns public competition or stage page data and its visible sections. Competition ids and tabs vary by sport; discover English sitemap-listed paths, including cricket stage pages, with /livescore/competitions.", + "operationId": "livescore-competition", + "parameters": [ + { + "description": "Three to five lowercase path segments following /en/, such as football/england/premier-league or football/england/premier-league/standings", + "in": "query", + "name": "path", + "required": true, + "type": "string", + "x-example": "football/england/premier-league" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.responseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore competition page and section data", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/competitions": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns English competition pages listed in LiveScore's public competition sitemaps plus competition-shaped pages listed in the English cricket sport sitemap. The sitemap index has dedicated competition sitemaps for soccer, hockey, basketball, and tennis; cricket discovery remains partial and dynamic.", + "operationId": "livescore-competitions", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.responseDoc" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore competition page directory", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/live-scores": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns current live sections for a supported sport. Empty Sctns is a valid result when there are no live events. Use Nav and the final section Id for cursor paging.", + "operationId": "livescore-live-scores", + "parameters": [ + { + "description": "LiveScore sport id", + "enum": [ + "soccer", + "hockey", + "basketball", + "tennis", + "cricket" + ], + "in": "query", + "name": "sport", + "required": true, + "type": "string", + "x-example": "soccer" + }, + { + "description": "UTC offset in hours from -12 through 14; defaults to 0", + "in": "query", + "maximum": 14, + "minimum": -12, + "name": "timezone_offset", + "type": "integer" + }, + { + "description": "Request a paged live feed; defaults to false", + "in": "query", + "name": "paging", + "type": "boolean" + }, + { + "description": "Section Id from the prior paged response, e.g. s-26031", + "in": "query", + "name": "cursor", + "type": "string", + "x-example": "s-26031" + }, + { + "description": "Page direction in paged mode", + "enum": [ + "down", + "up" + ], + "in": "query", + "name": "direction", + "type": "string" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.responseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore live scores by sport", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/match": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the event data embedded in a public LiveScore match page. Data uses LiveScore's event payload shape; available fields vary by event and stage.", + "operationId": "livescore-match", + "parameters": [ + { + "description": "Five path segments following /en/ in a LiveScore match URL", + "in": "query", + "name": "path", + "required": true, + "type": "string", + "x-example": "football/uefa-nations-league/league-b-group-3/austria-vs-israel/1738267" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.responseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore match details", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/match-stats": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the statistics section for a LiveScore match when the source exposes it.", + "operationId": "livescore-match-stats", + "parameters": [ + { + "description": "Five-segment path after /en/ from a LiveScore match URL", + "in": "query", + "name": "path", + "required": true, + "type": "string", + "x-example": "football/uefa-nations-league/league-b-group-3/austria-vs-israel/1738267" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.responseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore match statistics", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/news": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the article cards for one LiveScore news route. `category` is required: `all` for the home feed, or a lowercase route path of up to six segments, such as `football/premier-league`, found via `livescore-news-categories`. The response carries `source_url` and the page `data`. Some articles link to third-party publishers, article bodies are not returned, and unknown paths return not found or an upstream error.", + "operationId": "livescore-news", + "parameters": [ + { + "description": "all or a lowercase path from /livescore/news-categories; up to six segments", + "in": "query", + "name": "category", + "required": true, + "type": "string", + "x-example": "football/premier-league" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.responseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore news by category or topic", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/news-article": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the public full article record, including the article's structured content when supplied by LiveScore. Copy the path following /en/news/ from an article slug in /livescore/news.", + "operationId": "livescore-news-article", + "parameters": [ + { + "description": "Two to eight lowercase path segments after /en/news/, copied from an article slug", + "in": "query", + "name": "path", + "required": true, + "type": "string", + "x-example": "football/man-city-guilty-of-114-charges-what-happens-next-man-city-square" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.responseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore news article", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/news-categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns all current public news routes from LiveScore's own category sitemap files, including sports, competitions, tips, daily team feeds, and teams. The values update with the source sitemap.", + "operationId": "livescore-news-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.newsCategoriesResponseDoc" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "LiveScore news categories", + "tags": [ + "LiveScore" + ] + } + }, + "/livescore/news-feed": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns latest public news items from LiveScore's global RSS feed. The source feed may include multiple sports and has no verified category filter. Set include_content=true to include each RSS item's full content:encoded body.", + "operationId": "livescore-news-feed", + "parameters": [ + { + "default": false, + "description": "Include full RSS article content when available", + "in": "query", + "name": "include_content", + "type": "boolean" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/livescore.livescoreNewsFeedResponseDoc" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -412059,159 +422846,4956 @@ "ApiKeyAuth": [] } ], - "summary": "Get an MLB team roster", + "summary": "Get an MLB team roster", + "tags": [ + "MLB" + ] + } + }, + "/mlb/team-stats": { + "get": { + "description": "Returns one MLB team's statistics. `team_id` and `group` (`hitting`, `pitching`, `fielding`, `catching`, `running`, `game`, `team` or `streak`) are required. `season` defaults to the current year and `stat_type` to `season`. Other `stat_type` values cover splits and logs. Use `start_date` with `end_date` for date ranges.", + "operationId": "mlb-team-stats", + "parameters": [ + { + "description": "Numeric MLB team id", + "in": "query", + "name": "team_id", + "required": true, + "type": "string", + "x-example": "147" + }, + { + "description": "Four-digit season", + "in": "query", + "name": "season", + "type": "integer" + }, + { + "description": "Statistics group", + "enum": [ + "hitting", + "pitching", + "fielding", + "catching", + "running", + "game", + "team", + "streak" + ], + "in": "query", + "name": "group", + "required": true, + "type": "string", + "x-example": "hitting" + }, + { + "default": "season", + "description": "Stats API stat type; defaults to season", + "enum": [ + "projected", + "projectedRos", + "yearByYear", + "yearByYearAdvanced", + "yearByYearPlayoffs", + "season", + "standard", + "advanced", + "career", + "careerRegularSeason", + "careerAdvanced", + "seasonAdvanced", + "careerStatSplits", + "careerPlayoffs", + "gameLog", + "playLog", + "pitchLog", + "pitchArsenal", + "outsAboveAverage", + "expectedStatistics", + "sabermetrics", + "sprayChart", + "tracking", + "vsPlayer", + "vsPlayerTotal", + "vsPlayer5Y", + "vsTeam", + "vsTeam5Y", + "vsTeamTotal", + "lastXGames", + "byDateRange", + "byDateRangeAdvanced", + "byMonth", + "byMonthPlayoffs", + "byDayOfWeek", + "byDayOfWeekPlayoffs", + "homeAndAway", + "homeAndAwayPlayoffs", + "winLoss", + "winLossPlayoffs", + "rankings", + "rankingsByYear", + "statsSingleSeason", + "statsSingleSeasonAdvanced", + "hotColdZones", + "availableStats", + "opponentsFaced", + "gameTypeStats", + "firstYearStats", + "lastYearStats", + "statSplits", + "statSplitsAdvanced", + "atGameStart", + "vsOpponents", + "sabermetricsMultiTeam", + "projected_Zips", + "projected_ZipsRos", + "projected_Zips2YR", + "projected_Zips3YR" + ], + "in": "query", + "name": "stat_type", + "type": "string" + }, + { + "description": "MLB game type", + "enum": [ + "S", + "R", + "F", + "D", + "L", + "W", + "C", + "P", + "A", + "I", + "E" + ], + "in": "query", + "name": "game_type", + "type": "string" + }, + { + "description": "Start date for byDateRange stat types; requires end_date", + "in": "query", + "name": "start_date", + "type": "string" + }, + { + "description": "End date for byDateRange stat types; requires start_date", + "in": "query", + "name": "end_date", + "type": "string" + }, + { + "description": "Required by vsTeam stat types", + "in": "query", + "name": "opponent_team_id", + "type": "string" + }, + { + "description": "Required by vsPlayer stat types", + "in": "query", + "name": "opponent_player_id", + "type": "string" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/mlb.statsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get MLB team season statistics", + "tags": [ + "MLB" + ] + } + }, + "/mlb/teams": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Lists the 30 MLB clubs for a `season` (four-digit year, default the current year). Each team has its id, name, club name, location, abbreviation, league, division, venue, first year of play and active flag.", + "operationId": "mlb-teams", + "parameters": [ + { + "description": "Four-digit season; defaults to current year", + "in": "query", + "name": "season", + "type": "integer", + "x-example": 2026 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/mlb.teamsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List MLB teams", + "tags": [ + "MLB" + ] + } + }, + "/mlb/transactions": { + "get": { + "description": "Lists MLB transactions between `start_date` and `end_date`, both required in `YYYY-MM-DD` format. Covers signings, trades, options, assignments, injured-list moves and releases. Narrow with `team_id` or `player_id`. Each entry has the date, effective date, type, description, player, and from and to teams, with a total `count`.", + "operationId": "mlb-transactions", + "parameters": [ + { + "description": "Range start in YYYY-MM-DD format", + "in": "query", + "name": "start_date", + "required": true, + "type": "string", + "x-example": "2026-07-25" + }, + { + "description": "Range end in YYYY-MM-DD format", + "in": "query", + "name": "end_date", + "required": true, + "type": "string", + "x-example": "2026-08-01" + }, + { + "description": "Numeric MLB team id", + "in": "query", + "name": "team_id", + "type": "string" + }, + { + "description": "Numeric MLB player id", + "in": "query", + "name": "player_id", + "type": "string" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/mlb.transactionsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List MLB transactions", + "tags": [ + "MLB" + ] + } + }, + "/mlive/news": { + "get": { + "description": "Returns current MLive top stories, including title, canonical URL, brief summary, author, publication time, and image where available. Article pages are not currently available, and category endpoints are deferred.", + "operationId": "mlive-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get MLive top stories", + "tags": [ + "MLive" + ] + } + }, + "/modaoperandi/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the live category tree, designer, color, size, availability, and sort values discovered from Moda Operandi's public catalog. Returned category and designer slugs are valid for modaoperandi-search.", + "operationId": "modaoperandi-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/modaoperandi.categoriesDoc" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List Moda Operandi categories and facets", + "tags": [ + "Moda Operandi" + ] + } + }, + "/modaoperandi/designers": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Lists the designers currently available in one Moda Operandi department, chosen with the required `gender` (`women` or `men`). Each designer has its name, slug and item count, and each slug can be passed as `designer` to `modaoperandi-search`. The response also carries the `count` of designers.", + "operationId": "modaoperandi-designers", + "parameters": [ + { + "description": "Department", + "enum": [ + "women", + "men" + ], + "in": "query", + "name": "gender", + "required": true, + "type": "string", + "x-example": "women" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/modaoperandi.designersDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List Moda Operandi designers", + "tags": [ + "Moda Operandi" + ] + } + }, + "/modaoperandi/product": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one Moda Operandi product by its product page `url`: id, name, designer, color, price and currency, description, details, images, and the available sizes. It also reports `availability` and an `in_stock` flag for the product.", + "operationId": "modaoperandi-product", + "parameters": [ + { + "description": "Moda Operandi product URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.modaoperandi.com/women/p/melisse/the-minuit-knot-bag-in-black-taffeta/752807" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/modaoperandi.productDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Moda Operandi product", + "tags": [ + "Moda Operandi" + ] + } + }, + "/modaoperandi/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches or browses the Moda Operandi catalogue for one department, with `gender` (`women` or `men`) required and either `q` or `category` needed as well. Filter by `designer`, `color`, `size`, `availability`, price range or `on_sale`, and sort with `sort`. `limit` is 1 to 180 per page. Returns products plus facet counts and the `total`.", + "operationId": "modaoperandi-search", + "parameters": [ + { + "description": "Department", + "enum": [ + "women", + "men" + ], + "in": "query", + "name": "gender", + "required": true, + "type": "string", + "x-example": "women" + }, + { + "description": "Free-text search", + "in": "query", + "name": "q", + "type": "string" + }, + { + "description": "Category slug from modaoperandi-categories", + "in": "query", + "name": "category", + "type": "string" + }, + { + "description": "Designer slug from modaoperandi-designers", + "in": "query", + "name": "designer", + "type": "string" + }, + { + "description": "Color facet value", + "in": "query", + "name": "color", + "type": "string" + }, + { + "description": "Size facet value", + "in": "query", + "name": "size", + "type": "string" + }, + { + "description": "Attribute facet value", + "in": "query", + "name": "attribute", + "type": "string" + }, + { + "description": "Availability", + "enum": [ + "available_now", + "preorder", + "trunkshow" + ], + "in": "query", + "name": "availability", + "type": "string" + }, + { + "description": "Minimum price", + "in": "query", + "name": "price_min", + "type": "number" + }, + { + "description": "Maximum price", + "in": "query", + "name": "price_max", + "type": "number" + }, + { + "description": "Sale items only", + "in": "query", + "name": "on_sale", + "type": "boolean" + }, + { + "description": "Sort", + "enum": [ + "default", + "price_low_to_high", + "price_high_to_low", + "newest" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": 1, + "description": "1-based page", + "in": "query", + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 60, + "description": "Results per page", + "in": "query", + "maximum": 180, + "minimum": 1, + "name": "limit", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/modaoperandi.searchDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Search Moda Operandi products", + "tags": [ + "Moda Operandi" + ] + } + }, + "/moncler/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns Moncler's full category tree (id, name, description, and subcategories). Every id is a valid value for moncler-category's own category_id parameter. levels controls how many levels of subcategories are included.", + "operationId": "moncler-categories", + "parameters": [ + { + "default": 2, + "description": "How many levels of the category tree to return", + "in": "query", + "maximum": 3, + "minimum": 1, + "name": "levels", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/moncler.categoriesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List Moncler categories", + "tags": [ + "Moncler" + ] + } + }, + "/moncler/category": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Lists products within one category. category_id must be a value returned by moncler-categories' own category_id field -- a closed set the upstream defines. Returns the same result and facet shape as moncler-search. Narrow the same results with the filter param below.", + "operationId": "moncler-category", + "parameters": [ + { + "description": "Category id, from moncler-categories", + "in": "query", + "name": "category_id", + "required": true, + "type": "string", + "x-example": "men-outerwear-all-down-jackets" + }, + { + "description": "Sort order", + "enum": [ + "price-high-to-low", + "price-low-to-high" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "price-low-to-high" + }, + { + "collectionFormat": "csv", + "description": "Repeatable, up to 10. Each value is \\", + "in": "query", + "items": { + "type": "string" + }, + "name": "filter", + "type": "array", + "x-example": "c_refinementColor:Black" + }, + { + "default": 24, + "description": "Max results to return", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer" + }, + { + "default": 0, + "description": "Result offset for pagination", + "in": "query", + "minimum": 0, + "name": "offset", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/moncler.categoryResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Browse a Moncler category", + "tags": [ + "Moncler" + ] + } + }, + "/moncler/product": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one product's full detail: name, brand, price, descriptions, color, composition and care instructions, size availability, live stock, variation attributes (color/size options), every orderable variant SKU, product images, \"styled with\" related products, and a size guide (per-size body measurements and/or a cross-region size conversion table) when the upstream provides one. product_id accepts either a variant-level id or a master/style-level id, both as returned by moncler-search/moncler-category's own result ids.", + "operationId": "moncler-product", + "parameters": [ + { + "description": "Product or master id", + "in": "query", + "name": "product_id", + "required": true, + "type": "string", + "x-example": "L20911A53600689509990" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/moncler.productResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Moncler product's detail", + "tags": [ + "Moncler" + ] + } + }, + "/moncler/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches Moncler's product catalog by keyword. Returns product results (name, price, image, orderable color/size variant ids, and live stock level) plus the search index's own sort options and facets (gender, category, color, size, and others) with live per-option result counts. Narrow the same results with the filter param below.", + "operationId": "moncler-search", + "parameters": [ + { + "description": "Search keyword", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "down jacket" + }, + { + "description": "Sort order", + "enum": [ + "price-high-to-low", + "price-low-to-high" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "price-low-to-high" + }, + { + "collectionFormat": "csv", + "description": "Repeatable, up to 10. Each value is \\", + "in": "query", + "items": { + "type": "string" + }, + "name": "filter", + "type": "array", + "x-example": "c_refinementColor:Black" + }, + { + "default": 24, + "description": "Max results to return", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer" + }, + { + "default": 0, + "description": "Result offset for pagination", + "in": "query", + "minimum": 0, + "name": "offset", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/moncler.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Search Moncler products", + "tags": [ + "Moncler" + ] + } + }, + "/moncler/stores": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns Moncler's full worldwide boutique list: name, coordinates, address, phone, email, opening hours, store type, and in-store service flags. This is the full list, not geo-filtered -- filter by country_code or proximity to coordinates client-side over the returned list.", + "operationId": "moncler-stores", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/moncler.storesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List Moncler boutiques", + "tags": [ + "Moncler" + ] + } + }, + "/moncler/suggest": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the storefront's own search-box suggestions (typeahead) for a partial query: completed/corrected search terms, suggested full phrases, and matching categories. Not product data.", + "operationId": "moncler-suggest", + "parameters": [ + { + "description": "Partial search query", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "jack" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/moncler.suggestResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Moncler search-box suggestions", + "tags": [ + "Moncler" + ] + } + }, + "/moneycontrol/article": { + "get": { + "description": "Returns public Moneycontrol article metadata and body paragraphs from a canonical article URL. Moneycontrol Pro subscriber stories are refused with a 403 permission error because no free content is available. Live blogs return one paragraph per update.", + "operationId": "moneycontrol-article", + "parameters": [ + { + "description": "Canonical Moneycontrol article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.moneycontrol.com/news/business/markets/example-article-slug-14037252.html" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Moneycontrol article content", + "tags": [ + "Moneycontrol" + ] + } + }, + "/moneycontrol/author": { + "get": { + "description": "Returns a Moneycontrol author's name, job title, biography (when present), social links, and recent articles from a canonical author URL.", + "operationId": "moneycontrol-author", + "parameters": [ + { + "description": "Canonical Moneycontrol author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.moneycontrol.com/author/jane-doe-12345/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.moneycontrolAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Moneycontrol author profile", + "tags": [ + "Moneycontrol" + ] + } + }, + "/moneycontrol/headlines": { + "get": { + "description": "Returns the current front page of one Moneycontrol section: 25 or 50 stories, each with `title`, `url`, a short `summary` and `image_url`. `section` is required and takes one of 52 slugs such as `markets`, `ipo` or `cricket`; other values return `400`. Publication time and author are omitted, and only the first page is available.", + "operationId": "moneycontrol-headlines", + "parameters": [ + { + "description": "Moneycontrol section slug", + "enum": [ + "business", + "markets", + "economy", + "companies", + "personal-finance", + "ipo", + "startup", + "commodities", + "earnings", + "insurance", + "banks", + "stocks", + "mutual-funds", + "real-estate", + "funding", + "information-technology", + "india", + "politics", + "trends", + "interview", + "opinion", + "currency", + "telecom", + "world", + "city", + "banking", + "explainers", + "technology", + "automobile", + "sports", + "cricket", + "football", + "entertainment", + "bollywood", + "hollywood", + "ott", + "tv", + "regional", + "music", + "lifestyle", + "beauty", + "parenting", + "relationship", + "home-garden", + "health-and-fitness", + "education", + "science", + "astrology", + "religion", + "travel", + "artificial-intelligence", + "books" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "business" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Moneycontrol section headlines", + "tags": [ + "Moneycontrol" + ] + } + }, + "/moneycontrol/news": { + "get": { + "description": "Returns the 50 newest Moneycontrol stories across all sections, newest first, with no parameters. Each item has `title`, `url`, `published_at` (RFC3339 UTC) and `image_url`. Videos, podcasts, photo galleries and sponsored brand-connect posts are left out.", + "operationId": "moneycontrol-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Moneycontrol latest news", + "tags": [ + "Moneycontrol" + ] + } + }, + "/moneycontrol/sections": { + "get": { + "description": "Lists the 52 Moneycontrol news section slugs accepted by `moneycontrol-headlines`, such as `markets`, `economy`, `ipo` and `cricket`. Each entry has its `slug`, display `name` and page `url`. Moneycontrol Pro-only research, video, podcast and photo hubs are not sections.", + "operationId": "moneycontrol-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Moneycontrol sections", + "tags": [ + "Moneycontrol" + ] + } + }, + "/monitors": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Lists the website-change monitors on your account, most recently created first, up to 100. Each monitor has its `target_type` (`page` or `sitemap`), URL, name, cadence in minutes, enabled flag, last checked and last changed times, next check time, failure count, last error, and notification and sitemap settings.", + "operationId": "monitors-list", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Monitors", + "schema": { + "$ref": "#/definitions/webmonitor.monitorListResponseDoc" + } + }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List website-change monitors", + "tags": [ + "Monitors" + ] + }, + "post": { + "consumes": [ + "application/json" + ], + "description": "Creates a monitor that periodically checks a page or sitemap for changes and can notify a webhook. Free to call -- only completed check runs consume credits, at 1 credit per completed run regardless of target type or whether a change was detected. `target_type` defaults to \"page\" (exact-fingerprint diff of the page). \"sitemap\" watches the sitemap at `url` for added/removed entries instead, honoring `sitemap.include_patterns`/`exclude_patterns` (shell-style globs matched against each URL's path) and `sitemap.max_urls` (default 5000, hard cap 10000).", + "operationId": "monitors-create", + "parameters": [ + { + "description": "Monitor definition", + "in": "body", + "name": "request", + "required": true, + "schema": { + "$ref": "#/definitions/webmonitor.createMonitorBodyDoc" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Created monitor", + "schema": { + "$ref": "#/definitions/webmonitor.monitorResponseDoc" + } + }, + "400": { + "description": "Invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Create a website-change monitor", + "tags": [ + "Monitors" + ] + } + }, + "/monitors/{id}": { + "delete": { + "consumes": [ + "application/json" + ], + "description": "Deletes one website-change monitor by its `id`, which must belong to the calling account. Returns `deleted: true` on success. The monitor's past check history is not removed.", + "operationId": "monitors-delete", + "parameters": [ + { + "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Deleted", + "schema": { + "$ref": "#/definitions/webmonitor.monitorDeleteResponseDoc" + } + }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Monitor not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Delete a website-change monitor", + "tags": [ + "Monitors" + ] + }, + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one of your website-change monitors by `id`. The monitor includes its `target_type` (`page` or `sitemap`), URL, name, check cadence in minutes, enabled flag, last and next check times, failure count and last error, plus notification and sitemap settings.", + "operationId": "monitors-get", + "parameters": [ + { + "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Monitor", + "schema": { + "$ref": "#/definitions/webmonitor.monitorResponseDoc" + } + }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Monitor not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a website-change monitor", + "tags": [ + "Monitors" + ] + }, + "patch": { + "consumes": [ + "application/json" + ], + "description": "Partially updates one of the caller's own monitors. Free to call. Changing `target_type` or `sitemap` resets the stored diff baseline (fingerprint, snapshot, or URL set), so the next check establishes a fresh baseline instead of comparing against a now-meaningless prior state.", + "operationId": "monitors-update", + "parameters": [ + { + "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" + }, + { + "description": "Fields to update", + "in": "body", + "name": "request", + "required": true, + "schema": { + "$ref": "#/definitions/webmonitor.updateMonitorBodyDoc" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Updated monitor", + "schema": { + "$ref": "#/definitions/webmonitor.monitorResponseDoc" + } + }, + "400": { + "description": "Invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Monitor not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Update a website-change monitor", + "tags": [ + "Monitors" + ] + } + }, + "/monitors/{id}/checks": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the caller's own monitor's most recent check runs (most recent first, capped at 50), including webhook delivery status per run.", + "operationId": "monitors-checks", + "parameters": [ + { + "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Check history", + "schema": { + "$ref": "#/definitions/webmonitor.checkListResponseDoc" + } + }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Monitor not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List a monitor's check history", + "tags": [ + "Monitors" + ] + } + }, + "/motleyfool/article": { + "get": { + "description": "Returns one Motley Fool investing article by `url`, which must look like `https://www.fool.com/investing/YYYY/MM/DD/slug/`; only public `/investing/` URLs are accepted. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", + "operationId": "motleyfool-article", + "parameters": [ + { + "description": "Canonical The Motley Fool investing article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.fool.com/investing/2026/09/28/example-story/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Motley Fool article", + "tags": [ + "The Motley Fool" + ] + } + }, + "/motleyfool/author": { + "get": { + "description": "Returns a Motley Fool author's name, biography when published, image when available and recent investing articles from their author page. `url` is required, for example `https://www.fool.com/author/2104/`. Each article has a title, URL, summary, author, image, `type` and publication time.", + "operationId": "motleyfool-author", + "parameters": [ + { + "description": "Canonical The Motley Fool author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.fool.com/author/2104/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.motleyfoolAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Motley Fool author profile", + "tags": [ + "The Motley Fool" + ] + } + }, + "/motleyfool/headlines": { + "get": { + "description": "Returns the article cards of one Motley Fool investing-news section. `section` is required: `trending-news`, `news`, `market-movers`, `tech-stock-news`, `market-trends`, `crypto-news`, `markets`, `most-active-stocks`, `top-stock-gainers` or `top-stock-losers`. Other values return a 400. Items carry the title, URL and, where present, summary, author and publication time.", + "operationId": "motleyfool-headlines", + "parameters": [ + { + "description": "The Motley Fool section slug", + "enum": [ + "trending-news", + "news", + "market-movers", + "tech-stock-news", + "market-trends", + "crypto-news", + "markets", + "most-active-stocks", + "top-stock-gainers", + "top-stock-losers" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "trending-news" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The Motley Fool section headlines", + "tags": [ + "The Motley Fool" + ] + } + }, + "/motleyfool/news": { + "get": { + "description": "Returns up to 50 recent Motley Fool investing stories, newest first, each with its title, URL and publication time. Only stories at `/investing/YYYY/MM/DD/slug/` URLs are included. It takes no parameters; use the headlines endpoint for a named section.", + "operationId": "motleyfool-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The Motley Fool top investing stories", + "tags": [ + "The Motley Fool" + ] + } + }, + "/motleyfool/sections": { + "get": { + "description": "Lists the 10 Motley Fool Stock Market News section slugs that the headlines endpoint accepts, from `trending-news` and `news` to `most-active-stocks`, `top-stock-gainers` and `top-stock-losers`. Each entry has a `slug`, a display `name` (`news` is named Stock News) and a section `url`.", + "operationId": "motleyfool-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List The Motley Fool news sections", + "tags": [ + "The Motley Fool" + ] + } + }, + "/nationafrica/article": { + "get": { + "description": "Returns public Nation Africa article metadata and body paragraphs from a canonical article URL. paywalled is true for a Premium story: the publisher serves an anonymous reader only the opening paragraph(s), so paragraphs is a partial teaser and nothing is bypassed. Video, photo, audio, puzzle and cartoon URLs are rejected with a 400.", + "operationId": "nationafrica-article", + "parameters": [ + { + "description": "Canonical Nation Africa article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://nation.africa/kenya/news/rex-masai-inquest-verdict-on-killers-delayed-5608166" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Nation Africa article content", + "tags": [ + "Nation Africa" + ] + } + }, + "/nationafrica/author": { + "get": { + "description": "Returns one Nation Africa author's public profile: name, bio, portrait and the latest stories the profile page itself lists (a handful; the site loads the full list separately and it is not read).", + "operationId": "nationafrica-author", + "parameters": [ + { + "description": "Author slug, e.g. richard-munguti-11590", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "richard-munguti-11590" + }, + { + "description": "Canonical nation.africa/kenya/ URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://nation.africa/kenya/richard-munguti-11590" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.nationAfricaAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Nation Africa author profile", + "tags": [ + "Nation Africa" + ] + } + }, + "/nationafrica/headlines": { + "get": { + "description": "Returns the current story teasers of one public Nation Africa section page. Subscriber-only stories carry type \"premium\". Teasers show only a relative age, so published_at is omitted.", + "operationId": "nationafrica-headlines", + "parameters": [ + { + "description": "Nation Africa section slug", + "enum": [ + "news", + "politics", + "world", + "gender", + "education", + "business", + "companies", + "enterprise", + "finance-and-markets", + "seeds-of-gold", + "sports", + "football", + "athletics", + "rugby", + "motorsports", + "other-sports", + "talkup", + "counties", + "coast", + "lake-region", + "mountain", + "nairobi-metro", + "northern", + "rift-valley", + "blogs-opinion", + "opinion", + "editorials", + "letters", + "blogs", + "cutting-edge", + "life-and-style", + "wellness", + "travel", + "relationships", + "motoring", + "family", + "culture", + "art-books", + "health", + "healthy-nation", + "elections", + "elections-news", + "presidential", + "governor-race", + "constituencies", + "explainers", + "fact-checks" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "news" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Nation Africa section headlines", + "tags": [ + "Nation Africa" + ] + } + }, + "/nationafrica/news": { + "get": { + "description": "Returns the newest Nation Africa (Daily Nation, Kenya) stories from its public news sitemap: headline, publication time and lead image. If the sitemap returns 404, it falls back to the public News section hub, whose relative timestamps may omit publication time. Video pages are excluded.", + "operationId": "nationafrica-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Nation Africa top stories", + "tags": [ + "Nation Africa" + ] + } + }, + "/nationafrica/sections": { + "get": { + "description": "Lists the 47 section slugs of Nation Africa's Kenya edition accepted by `nationafrica-headlines`, such as `news`, `politics`, `counties`, `football` and `fact-checks`. Each entry has its `slug`, display `name` and section page `url`. Photo, video, audio, puzzle, newsletter and cartoon pages are not included.", + "operationId": "nationafrica-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Nation Africa sections", + "tags": [ + "Nation Africa" + ] + } + }, + "/national/article": { + "get": { + "description": "Returns article metadata and the body served to an anonymous visitor for one canonical The National story URL. The endpoint does not bypass subscriber or access gates and reports paywalled when the page marks content as restricted.", + "operationId": "national-article", + "parameters": [ + { + "description": "Canonical thenationalnews.com article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.thenationalnews.com/future/technology/2026/09/29/ai-trump-midterm-poll-democrats/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The National article content", + "tags": [ + "The National" + ] + } + }, + "/national/author": { + "get": { + "description": "Returns one public author topic page, its name, optional author image and the latest article cards listed on that page.", + "operationId": "national-author", + "parameters": [ + { + "description": "The National author slug, e.g. cody-combs", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "cody-combs" + }, + { + "description": "Canonical thenationalnews.com/topics/Author/ URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.thenationalnews.com/topics/Author/cody-combs/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.nationalAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a The National author profile", + "tags": [ + "The National" + ] + } + }, + "/national/headlines": { + "get": { + "description": "Returns current The National stories for a category. Pass one of the editorial section slugs from national_sections. A valid category with no current stories returns an empty items list.", + "operationId": "national-headlines", + "parameters": [ + { + "description": "The National editorial section slug", + "enum": [ + "news", + "news/uae", + "news/gulf", + "news/mena", + "mena/arab-showcase", + "news/us", + "news/uk", + "news/europe", + "news/asia", + "business", + "business/aviation", + "business/economy", + "business/energy", + "business/money", + "business/property", + "business/banking", + "business/uk", + "business/markets", + "in-focus", + "opinion", + "opinion/comment", + "opinion/editorial", + "opinion/obituaries", + "opinion/cartoon", + "opinion/feedback", + "future", + "future/science", + "future/space", + "future/technology", + "climate", + "climate/environment", + "climate/road-to-net-zero", + "health", + "arts-culture", + "arts-culture/art-design", + "arts-culture/books", + "arts-culture/film-tv", + "arts-culture/music-stage", + "arts-culture/pop-culture", + "lifestyle", + "travel", + "lifestyle/fashion-beauty", + "lifestyle/food", + "lifestyle/motoring", + "magazine", + "lifestyle/luxury", + "lifestyle/home-garden", + "lifestyle/wellbeing", + "lifestyle/things-to-do", + "sport", + "sport/football", + "sport/cricket", + "sport/f1", + "sport/tennis", + "sport/combat-sports", + "sport/cycling", + "weekend" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "news" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The National section headlines", + "tags": [ + "The National" + ] + } + }, + "/national/news": { + "get": { + "description": "Returns current The National UAE stories.", + "operationId": "national-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The National top stories", + "tags": [ + "The National" + ] + } + }, + "/national/sections": { + "get": { + "description": "Returns all 57 editorial categories in The National's section taxonomy that are accepted by national_headlines. Podcast, newsletter, puzzle, partner and promotional surfaces are excluded.", + "operationId": "national-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The National sections", + "tags": [ + "The National" + ] + } + }, + "/nationalpost/article": { + "get": { + "description": "Returns public National Post article metadata and body paragraphs from a canonical article URL. paywalled is true when the publisher marks the story subscriber-only or registration-gated; National Post gates these stories in the reader's browser but still serves the complete text to an anonymous request, so paragraphs is the whole body and nothing is bypassed. Category, tag, author and Sponsored URLs are rejected with a 400.", + "operationId": "nationalpost-article", + "parameters": [ + { + "description": "Canonical National Post article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://nationalpost.com/news/politics/carney-will-miss-target-balancing-operating-budget-pbo-says" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get National Post article content", + "tags": [ + "National Post" + ] + } + }, + "/nationalpost/author": { + "get": { + "description": "Returns one National Post author's public profile: name, bio when the author has one, the total number of stories the page attributes to them, and their latest stories (first page).", + "operationId": "nationalpost-author", + "parameters": [ + { + "description": "Author slug, e.g. stuckpostmedia-com", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "stuckpostmedia-com" + }, + { + "description": "Canonical nationalpost.com/author// URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://nationalpost.com/author/stuckpostmedia-com/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.nationalPostAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a National Post author profile", + "tags": [ + "National Post" + ] + } + }, + "/nationalpost/headlines": { + "get": { + "description": "Returns National Post headlines for one section; `section` is required and takes one of 45 slugs such as `canada`, `hockey` or `deals`. The top-level sections `health`, `opinion`, `longreads`, `modern-life`, `travel`, `entertainment`, `shopping-essentials` and `sports` return 10 stories with publication time and byline. Others return up to about 45 without either. Sponsored stories are left out.", + "operationId": "nationalpost-headlines", + "parameters": [ + { + "description": "National Post section slug", + "enum": [ + "canada", + "true-crime", + "politics", + "health", + "world", + "israel-middle-east", + "opinion", + "longreads", + "modern-life", + "food", + "horoscopes", + "style-beauty", + "travel", + "travel-canada", + "travel-usa", + "travel-international", + "travel-cruises", + "travel-guide", + "entertainment", + "books", + "celebrity", + "movies", + "music", + "theatre", + "television", + "business-essentials", + "shopping-essentials", + "buy-canadian", + "home-living", + "outdoor-living", + "kitchen-dining", + "tech", + "personal-care", + "entertainment-hobbies", + "gift-guide", + "deals", + "sports", + "hockey", + "baseball", + "basketball", + "football", + "soccer", + "golf", + "tennis", + "driving" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "canada" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get National Post section headlines", + "tags": [ + "National Post" + ] + } + }, + "/nationalpost/news": { + "get": { + "description": "Returns the latest 10 National Post stories across all sections, with no parameters. Each item has a title, canonical article URL, one-line summary, publication time and byline. Use `nationalpost-headlines` to read a single section.", + "operationId": "nationalpost-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get National Post top stories", + "tags": [ + "National Post" + ] + } + }, + "/nationalpost/sections": { + "get": { + "description": "Lists the 45 National Post section slugs accepted by `nationalpost-headlines`, such as `canada`, `opinion`, `hockey` and `gift-guide`, each with its display `name` and category page `url`. Links that leave nationalpost.com (Financial Post, Driving.ca, puzzles, classifieds, e-paper) and the paid Sponsored categories are not included.", + "operationId": "nationalpost-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get National Post sections", + "tags": [ + "National Post" + ] + } + }, + "/nbc/article": { + "get": { + "description": "Returns public NBC News article metadata and body paragraphs from a canonical article URL. This does not bypass login, subscription, or other access controls.", + "operationId": "nbc-article", + "parameters": [ + { + "description": "Canonical www.nbcnews.com article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.nbcnews.com/news/us-news/ice-shooting-austin-texas-rcna598870" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/nbc.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NBC News article content", + "tags": [ + "NBC News" + ] + } + }, + "/nbc/author": { + "get": { + "description": "Returns an NBC News author's byline metadata (job title, bio, social links) and their recent articles from a canonical author URL.", + "operationId": "nbc-author", + "parameters": [ + { + "description": "Canonical NBC News author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.nbcnews.com/author/daniella-silva-ncpn211" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/nbc.authorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get an NBC News author profile", + "tags": [ + "NBC News" + ] + } + }, + "/nbc/headlines": { + "get": { + "description": "Returns recent NBC News stories for one section. `section` is required and must be one of `news`, `world`, `us-news`, `politics`, `business`, `science` or `health`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "nbc-headlines", + "parameters": [ + { + "description": "NBC News RSS section slug: news, world, us-news, politics, business, science, or health", + "enum": [ + "news", + "world", + "us-news", + "politics", + "business", + "science", + "health" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "news" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/nbc.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NBC News section headlines", + "tags": [ + "NBC News" + ] + } + }, + "/nbc/news": { + "get": { + "description": "Returns the current NBC News top stories across the site, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nbc-headlines` to read one section.", + "operationId": "nbc-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/nbc.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NBC News top stories", + "tags": [ + "NBC News" + ] + } + }, + "/nbc/sections": { + "get": { + "description": "Lists the seven NBC News section slugs accepted by `nbc-headlines`: `news`, `world`, `us-news`, `politics`, `business`, `science` and `health`. Each entry has its `slug`, display `name` and `url`.", + "operationId": "nbc-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/nbc.sectionsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NBC News RSS sections", + "tags": [ + "NBC News" + ] + } + }, + "/ndtv/article": { + "get": { + "description": "Returns public NDTV article metadata and body paragraphs from a canonical article URL. premium is true for NDTV Premium stories; paragraphs are always the text NDTV serves on its public page.", + "operationId": "ndtv-article", + "parameters": [ + { + "description": "Canonical NDTV article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.ndtv.com/india-news/indias-power-shortage-tops-summer-levels-as-el-nino-dries-up-hydropower-12091489" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvArticleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV article content", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/author": { + "get": { + "description": "Returns an NDTV author's or news agency's byline profile (name, role, biography, image) and one page of authored news stories from a canonical author URL. Request sequential pages until articles is empty; NDTV does not expose a total count.", + "operationId": "ndtv-author", + "parameters": [ + { + "description": "Canonical NDTV author or agency URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.ndtv.com/authors/ritu-singh-6082" + }, + { + "default": 1, + "description": "1-based authored news story page; request sequentially until articles is empty", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get an NDTV author profile", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/headlines": { + "get": { + "description": "Returns the current story cards from one NDTV section page: title, canonical URL, and, where the section shows them, summary, publication time, byline, and image.", + "operationId": "ndtv-headlines", + "parameters": [ + { + "description": "NDTV section slug from ndtv-sections", + "enum": [ + "latest", + "india", + "world", + "world-india-global", + "world-diaspora", + "opinion", + "spotlight", + "business-news", + "south", + "cities", + "bangalore-news", + "chennai-news", + "delhi-news", + "mumbai-news", + "others-news", + "ahmedabad-news", + "allahabad-news", + "amritsar-news", + "bhopal-news", + "bhubaneshwar-news", + "chandigarh-news", + "ghaziabad-news", + "goa-news", + "gurgaon-news", + "guwahati-news", + "hyderabad-news", + "jaipur-news", + "kanpur-news", + "kolkata-news", + "lucknow-news", + "noida-news", + "patna-news", + "pune-news", + "srinagar-news", + "thiruvananthapuram-news", + "andhra-pradesh-news", + "karnataka-news", + "kerala-news", + "tamil-nadu-news", + "telangana-news", + "education", + "education-exams-news", + "education-school-news", + "education-campus-news", + "education-study-abroad", + "education-latest", + "health", + "entertainment", + "lifestyle", + "food", + "travel", + "auto", + "science", + "offbeat", + "trends", + "feature" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "latest" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV section headlines", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/latest-videos": { + "get": { + "description": "Returns one page from NDTV's separate latest-videos feed. This feed is not a category slug; use page sequentially. Results contain metadata only, with no media bytes or player URLs.", + "operationId": "ndtv-latest-videos", + "parameters": [ + { + "default": 1, + "description": "1-based latest-video page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvLatestVideosResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV latest videos", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/live-blog": { + "get": { + "description": "Returns the metadata and ordered updates of an NDTV live blog, given its canonical article `url`. The blog carries title, description, section, authors, image and publish and update times. Each update has its title, URL, body text, timestamps, authors and image when NDTV gives them. A regular article URL is rejected with an error.", + "operationId": "ndtv-live-blog", + "parameters": [ + { + "description": "Canonical NDTV live-blog article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.ndtv.com/business-news/stock-market-live-updates-12112191" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvLiveBlogResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get structured updates from an NDTV live blog", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/live-blogs": { + "get": { + "description": "Returns one page of public NDTV live-blog cards. Pages include only www.ndtv.com live blogs; sister-site cards are excluded. NDTV does not expose a total count or continuation marker; request sequential pages until the upstream reports not found.", + "operationId": "ndtv-live-blogs", + "parameters": [ + { + "default": 1, + "description": "1-based index page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvLiveBlogsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV live-blog index", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/news": { + "get": { + "description": "Returns the stories NDTV published in roughly the last two days, newest first, from its public news sitemap: title, canonical URL, publication time, keywords, and lead image.", + "operationId": "ndtv-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV latest stories", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/search": { + "get": { + "description": "Returns one page of NDTV's public news topic results (15 story cards per page). Unknown topics return 404. The result page supports no sort or filter parameters.", + "operationId": "ndtv-search", + "parameters": [ + { + "description": "Search terms", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "climate change" + }, + { + "default": 1, + "description": "1-based result page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvSearchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Search NDTV news stories", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/sections": { + "get": { + "description": "Lists the NDTV section slugs accepted by `ndtv-headlines`, each with its display name and page URL. They cover national and world news (`latest`, `india`, `world`), city and state pages such as `mumbai-news` and `kerala-news`, and topics such as `education` and `food`. `spotlight` is NDTV's Premium hub; video, podcasts and sister sites are excluded.", + "operationId": "ndtv-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV sections", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/video": { + "get": { + "description": "Returns title, description, publication time, duration, and thumbnail metadata from one canonical NDTV video page. It does not fetch or return video media or player URLs.", + "operationId": "ndtv-video", + "parameters": [ + { + "description": "Canonical NDTV video URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.ndtv.com/video/revanth-reddy-under-bjp-fire-over-ram-god-of-rich-shiva-of-poor-remarks-1166049" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvVideoResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV video metadata", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/video-categories": { + "get": { + "description": "Returns the live-verified NDTV-hosted category slugs accepted by ndtv-videos. Categories hosted on sister domains, Shorts, and unavailable Faith are excluded.", + "operationId": "ndtv-video-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvVideoCategoriesResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get NDTV video categories", + "tags": [ + "NDTV" + ] + } + }, + "/ndtv/videos": { + "get": { + "description": "Returns one page of metadata cards from a supported NDTV-hosted video category. Use ndtv-video-categories to discover the complete supported category set; request pages sequentially. This returns no media bytes or player URLs.", + "operationId": "ndtv-videos", + "parameters": [ + { + "description": "NDTV video category slug from ndtv-video-categories", + "enum": [ + "news", + "business", + "entertainment", + "auto", + "exclusive", + "features", + "environment", + "fashion", + "travel", + "elections", + "comedy", + "property", + "art", + "beauty", + "lifestyle", + "tech360" + ], + "in": "query", + "name": "category", + "required": true, + "type": "string", + "x-example": "news" + }, + { + "default": 1, + "description": "1-based category result page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ndtvVideosResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get videos from an NDTV category", + "tags": [ + "NDTV" + ] + } + }, + "/news18/article": { + "get": { + "description": "Returns a News18 article by canonical `url` in the form `/
/-.html`, optionally with a subsection. The response has title, description, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`. `section` is the article's own category, so it can be a subsection such as `business/markets` that `news18-sections` does not list.", + "operationId": "news18-article", + "parameters": [ + { + "description": "Canonical News18 article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.news18.com/india/example-article-slug-10350678.html" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News18 article content", + "tags": [ + "News18" + ] + } + }, + "/news18/author": { + "get": { + "description": "Returns a News18 author profile from a required `url` in the form `https://www.news18.com/byline/.html`. The response has `name`, `biography`, `image_url`, `social_links` (whichever of website, X/Twitter, Facebook, Instagram, YouTube and LinkedIn are set) and recent articles with `published_at` in RFC3339 UTC. Wire and staff bylines often have no bio or links.", + "operationId": "news18-author", + "parameters": [ + { + "description": "Canonical News18 author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.news18.com/byline/jane-doe-12345.html" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.news18AuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a News18 author profile", + "tags": [ + "News18" + ] + } + }, + "/news18/headlines": { + "get": { + "description": "Returns recent News18 stories for one section. `section` is required and takes one of 18 slugs, such as `india`, `cricket`, `elections`, `viral` or `breaking-news`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "news18-headlines", + "parameters": [ + { + "description": "News18 RSS section slug", + "enum": [ + "india", + "world", + "cricket", + "business", + "sports", + "movies", + "lifestyle", + "tech", + "auto", + "opinion", + "elections", + "politics", + "viral", + "explainers", + "education-career", + "astrology", + "cities", + "breaking-news" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "india" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News18 section headlines", + "tags": [ + "News18" + ] + } + }, + "/news18/news": { + "get": { + "description": "Returns the current News18 top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `news18-headlines` to read one section.", + "operationId": "news18-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News18 top stories", + "tags": [ + "News18" + ] + } + }, + "/news18/sections": { + "get": { + "description": "Lists the 18 News18 section slugs accepted by `news18-headlines`, such as `india`, `world`, `cricket`, `explainers` and `education-career`. Each entry has its `slug`, display `name` and `url`.", + "operationId": "news18-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News18 RSS sections", + "tags": [ + "News18" + ] + } + }, + "/news24/article": { + "get": { + "description": "Returns public News24 article metadata and body paragraphs from a canonical article URL. Subscriber-only articles return the standfirst as the only paragraph with paywalled set to true.", + "operationId": "news24-article", + "parameters": [ + { + "description": "Canonical News24 article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.news24.com/world/untangling-the-meth-mexican-cartels-set-up-huge-labs-in-sa-to-service-demand-in-australia-20260924-0692" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News24 article content", + "tags": [ + "News24" + ] + } + }, + "/news24/headlines": { + "get": { + "description": "Returns News24 headlines for one section. `section` is required and takes a path such as `business/markets`, `sport/rugby/springboks` or `politics`, from the 73 listed by `news24-sections`. Each item has a title and URL, and `type` is `subscriber` on cards News24 marks subscriber-only. Summary, author, publication time and image appear when available.", + "operationId": "news24-headlines", + "parameters": [ + { + "description": "News24 section path", + "enum": [ + "business", + "business/climate-future", + "business/climate-future/energy", + "business/climate-future/environment", + "business/climate-future/news", + "business/climate-future/solutions", + "business/companies", + "business/consumer-lookout", + "business/economy", + "business/markets", + "business/money", + "business/opinion", + "business/tech", + "investigations", + "investigations/eskomfiles", + "investigations/phala-phala", + "investigations/silenced", + "life", + "life/arts-and-entertainment", + "life/books", + "life/food", + "life/lifestyle-trends", + "life/motoring", + "life/relationships", + "life/travel", + "life/wellness", + "life/wine", + "opinions", + "opinions/analysis", + "opinions/cartoons", + "opinions/columnists", + "opinions/explainers", + "opinions/fridaybriefing/editions", + "opinions/letters", + "opinions/reader-hub", + "politics", + "southafrica", + "southafrica/crime-and-courts", + "southafrica/debunking", + "southafrica/education", + "southafrica/good-news", + "southafrica/good-news/outdoor", + "southafrica/health-news", + "southafrica/schools-hub", + "southafrica/weather", + "specialreports", + "sport", + "sport/columnists", + "sport/cricket", + "sport/cricket/proteas", + "sport/cricket/sa20", + "sport/golf", + "sport/motorsport", + "sport/motorsport/formula-one", + "sport/other-sport", + "sport/rugby", + "sport/rugby/bulls", + "sport/rugby/cheetahs", + "sport/rugby/lions", + "sport/rugby/pnpgoldcup", + "sport/rugby/sharks", + "sport/rugby/springboks", + "sport/rugby/stormers", + "sport/rugby/urc", + "sport/soccer", + "sport/soccer/bafana-bafana-and-banyana-banyana", + "sport/soccer/english-premier-league", + "sport/soccer/psl", + "sport/soccer/worldcup", + "sport/tennis", + "sunday", + "world", + "world/africa" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "business" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News24 section headlines", + "tags": [ + "News24" + ] + } + }, + "/news24/news": { + "get": { + "description": "Returns the current News24 top stories, with no parameters. Each item has a title, canonical URL and image. `type` is `subscriber` when News24 marks the story subscriber-only and is omitted for freely readable stories.", + "operationId": "news24-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News24 top stories", + "tags": [ + "News24" + ] + } + }, + "/news24/sections": { + "get": { + "description": "Lists the 73 News24 sections accepted by `news24-headlines`. Each entry has a `slug` (the URL path under news24.com, which may contain `/`, as in `sport/rugby/springboks`), a display `name` and a page `url`. Top-level groups include `business`, `life`, `opinions`, `southafrica`, `sport` and `world`.", + "operationId": "news24-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News24 sections", + "tags": [ + "News24" + ] + } + }, + "/newscomau/article": { + "get": { + "description": "Returns a News.com.au article by canonical `url`, which must be a `www.news.com.au` link ending in `/news-story/<32-character-id>`. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`. `authors` is empty for wire or agency pieces with no byline.", + "operationId": "newscomau-article", + "parameters": [ + { + "description": "Canonical News.com.au article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.news.com.au/national/example-headline/news-story/0123456789abcdef0123456789abcdef" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News.com.au article content", + "tags": [ + "News.com.au" + ] + } + }, + "/newscomau/author": { + "get": { + "description": "Returns a News.com.au staff writer's profile (name, job title, headshot, biography, social links) and recent articles from a canonical author URL.", + "operationId": "newscomau-author", + "parameters": [ + { + "description": "Canonical News.com.au author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.news.com.au/the-team/example-writer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newscomauAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a News.com.au author profile", + "tags": [ + "News.com.au" + ] + } + }, + "/newscomau/headlines": { + "get": { + "description": "Returns fresh headlines from one News.com.au section or category listing page. section accepts any slug returned by GET /newscomau/sections (236 values, too many to enumerate inline -- see that endpoint for the full, current list), for example \"national\" or the nested \"national/nsw-act/politics\".", + "operationId": "newscomau-headlines", + "parameters": [ + { + "description": "News.com.au section slug, from GET /newscomau/sections", + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "national" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News.com.au section headlines", + "tags": [ + "News.com.au" + ] + } + }, + "/newscomau/news": { + "get": { + "description": "Returns the current News.com.au top stories, with no parameters and no section filter. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "newscomau-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News.com.au top stories", + "tags": [ + "News.com.au" + ] + } + }, + "/newscomau/sections": { + "get": { + "description": "Returns the full News.com.au section/category navigation inventory (236 entries as of 2026-09-23), each with a slug, display name, and public listing URL. Use a returned slug as the section parameter on GET /newscomau/headlines.", + "operationId": "newscomau-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get News.com.au sections", + "tags": [ + "News.com.au" + ] + } + }, + "/newsmax/article": { + "get": { + "description": "Returns a Newsmax article by canonical `url` in the form `/
//YYYY/MM/DD/id/`: title, description, section, authors, lead image, publication and update times, and body `paragraphs`. `authors` may be empty for wire or staff-aggregated stories. Paywalled Platinum URLs are not accepted.", + "operationId": "newsmax-article", + "parameters": [ + { + "description": "Canonical Newsmax article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.newsmax.com/newsfront/example-article-slug/2026/09/23/id/1270487/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsmax article content", + "tags": [ + "Newsmax" + ] + } + }, + "/newsmax/author": { + "get": { + "description": "Returns a Newsmax Insiders (opinion columnist) profile from a required `url` such as `https://www.newsmax.com/insiders//id-/`. The response has `name`, `biography`, `image_url` and recent columns. `biography` is omitted when Newsmax's separate profile page is unavailable, and article `published_at` is date text such as `Sep 23, 2026`.", + "operationId": "newsmax-author", + "parameters": [ + { + "description": "Canonical Newsmax Insiders author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.newsmax.com/insiders/janedoe/id-1234/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsmaxAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Newsmax Insiders author profile", + "tags": [ + "Newsmax" + ] + } + }, + "/newsmax/headlines": { + "get": { + "description": "Returns recent Newsmax stories for one section. `section` is required and takes one of 20 slugs, such as `newsfront`, `politics`, `health-news`, `finance-news` or `insiders`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "newsmax-headlines", + "parameters": [ + { + "description": "Newsmax RSS section slug", + "enum": [ + "newsfront", + "us", + "politics", + "thewire", + "scitech", + "health-news", + "cancer", + "brain-health", + "diet-and-fitness", + "diabetes", + "natural-health", + "anti-aging", + "finance-headlines", + "street-talk", + "finance-news", + "economy", + "companies", + "investing-analysis", + "global-talk", + "insiders" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "newsfront" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsmax section headlines", + "tags": [ + "Newsmax" + ] + } + }, + "/newsmax/news": { + "get": { + "description": "Returns the current Newsmax top stories from the Newsfront section, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `newsmax-headlines` for other sections.", + "operationId": "newsmax-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsmax top stories", + "tags": [ + "Newsmax" + ] + } + }, + "/newsmax/sections": { + "get": { + "description": "Lists the 20 Newsmax section slugs accepted by `newsmax-headlines`, such as `newsfront`, `scitech`, `street-talk` and `global-talk`. Each entry has its `slug`, display `name` and `url`. `insiders` is the combined opinion section, and `finance-headlines` is the finance section's Headlines listing.", + "operationId": "newsmax-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsmax RSS sections", + "tags": [ + "Newsmax" + ] + } + }, + "/newsweek/article": { + "get": { + "description": "Returns a Newsweek article by canonical `url`, which must be a `newsweek.com` link ending in a numeric article id. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`.", + "operationId": "newsweek-article", + "parameters": [ + { + "description": "Canonical Newsweek article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.newsweek.com/example-article-1234567" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsweek article content", + "tags": [ + "Newsweek" + ] + } + }, + "/newsweek/author": { + "get": { + "description": "Returns a Newsweek author profile by `slug` (for example `jennifer-fink`) or a newsweek.com authors `url`; supply exactly one. `page` selects the 1-based page of recent articles (default 1) and overrides any page in `url`. The response has `name`, `job_title`, `bio`, `email`, `image_url`, articles and `has_next_page`; a page past the end gives an empty `articles` list, not an error.", + "operationId": "newsweek-author", + "parameters": [ + { + "description": "Author slug, e.g. jennifer-fink", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "jennifer-fink" + }, + { + "description": "Canonical newsweek.com/authors/ URL, optionally with a ?page= query; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.newsweek.com/authors/jennifer-fink" + }, + { + "default": 1, + "description": "1-based page number; overrides any page number in url", + "in": "query", + "name": "page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsweekAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a Newsweek author profile", + "tags": [ + "Newsweek" + ] + } + }, + "/newsweek/headlines": { + "get": { + "description": "Returns recent Newsweek stories for one section. `section` is required and takes one of 21 slugs, such as `politics`, `fact-check`, `better-planet`, `personal-finance` or `my-turn`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "newsweek-headlines", + "parameters": [ + { + "description": "Newsweek section slug", + "enum": [ + "news", + "opinion", + "politics", + "world", + "us", + "business", + "technology", + "health", + "entertainment", + "sports", + "fact-check", + "better-planet", + "life", + "travel", + "pets", + "autos", + "relationships", + "tech-science", + "personal-finance", + "better-workplaces", + "my-turn" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "news" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsweek section headlines", + "tags": [ + "Newsweek" + ] + } + }, + "/newsweek/news": { + "get": { + "description": "Returns the current Newsweek top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `newsweek-headlines` to read one section.", + "operationId": "newsweek-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsweek top stories", + "tags": [ + "Newsweek" + ] + } + }, + "/newsweek/sections": { + "get": { + "description": "Lists the 21 Newsweek section slugs accepted by `newsweek-headlines`, such as `news`, `world`, `us`, `fact-check` and `pets`. Each entry has its `slug`, display `name` and section page `url`.", + "operationId": "newsweek-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Newsweek sections", + "tags": [ + "Newsweek" + ] + } + }, + "/newyorker/article": { + "get": { + "description": "Returns public The New Yorker article metadata and body paragraphs from a canonical article URL. The New Yorker uses a metered paywall: when a page marks itself as gated, only the publicly served text is returned and is_truncated is true; is_accessible_for_free reports the page's own access flag.", + "operationId": "newyorker-article", + "parameters": [ + { + "description": "Canonical The New Yorker article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.newyorker.com/news/the-lede/example-article-slug" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newyorkerArticleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The New Yorker article content", "tags": [ - "MLB" + "The New Yorker" ] } }, - "/mlb/team-stats": { + "/newyorker/author": { "get": { - "description": "Returns one MLB team's statistics. `team_id` and `group` (`hitting`, `pitching`, `fielding`, `catching`, `running`, `game`, `team` or `streak`) are required. `season` defaults to the current year and `stat_type` to `season`. Other `stat_type` values cover splits and logs. Use `start_date` with `end_date` for date ranges.", - "operationId": "mlb-team-stats", + "description": "Returns a The New Yorker contributor's name, photo, biography, external profile links, and the first page of their recent articles from a canonical contributor URL.", + "operationId": "newyorker-author", "parameters": [ { - "description": "Numeric MLB team id", - "in": "query", - "name": "team_id", - "required": true, - "type": "string", - "x-example": "147" - }, - { - "description": "Four-digit season", - "in": "query", - "name": "season", - "type": "integer" - }, - { - "description": "Statistics group", - "enum": [ - "hitting", - "pitching", - "fielding", - "catching", - "running", - "game", - "team", - "streak" - ], + "description": "Canonical The New Yorker contributor URL", "in": "query", - "name": "group", + "name": "url", "required": true, "type": "string", - "x-example": "hitting" - }, - { - "default": "season", - "description": "Stats API stat type; defaults to season", - "enum": [ - "projected", - "projectedRos", - "yearByYear", - "yearByYearAdvanced", - "yearByYearPlayoffs", - "season", - "standard", - "advanced", - "career", - "careerRegularSeason", - "careerAdvanced", - "seasonAdvanced", - "careerStatSplits", - "careerPlayoffs", - "gameLog", - "playLog", - "pitchLog", - "pitchArsenal", - "outsAboveAverage", - "expectedStatistics", - "sabermetrics", - "sprayChart", - "tracking", - "vsPlayer", - "vsPlayerTotal", - "vsPlayer5Y", - "vsTeam", - "vsTeam5Y", - "vsTeamTotal", - "lastXGames", - "byDateRange", - "byDateRangeAdvanced", - "byMonth", - "byMonthPlayoffs", - "byDayOfWeek", - "byDayOfWeekPlayoffs", - "homeAndAway", - "homeAndAwayPlayoffs", - "winLoss", - "winLossPlayoffs", - "rankings", - "rankingsByYear", - "statsSingleSeason", - "statsSingleSeasonAdvanced", - "hotColdZones", - "availableStats", - "opponentsFaced", - "gameTypeStats", - "firstYearStats", - "lastYearStats", - "statSplits", - "statSplitsAdvanced", - "atGameStart", - "vsOpponents", - "sabermetricsMultiTeam", - "projected_Zips", - "projected_ZipsRos", - "projected_Zips2YR", - "projected_Zips3YR" - ], - "in": "query", - "name": "stat_type", - "type": "string" - }, - { - "description": "MLB game type", - "enum": [ - "S", - "R", - "F", - "D", - "L", - "W", - "C", - "P", - "A", - "I", - "E" - ], - "in": "query", - "name": "game_type", - "type": "string" - }, - { - "description": "Start date for byDateRange stat types; requires end_date", - "in": "query", - "name": "start_date", - "type": "string" - }, - { - "description": "End date for byDateRange stat types; requires start_date", - "in": "query", - "name": "end_date", - "type": "string" - }, - { - "description": "Required by vsTeam stat types", - "in": "query", - "name": "opponent_team_id", - "type": "string" - }, - { - "description": "Required by vsPlayer stat types", - "in": "query", - "name": "opponent_player_id", - "type": "string" + "x-example": "https://www.newyorker.com/contributors/casey-cep" } ], "produces": [ @@ -412221,7 +427805,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/mlb.statsResponseDoc" + "$ref": "#/definitions/publicnews.newyorkerAuthorResponseDoc" } }, "400": { @@ -412230,6 +427814,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -412242,26 +427838,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get MLB team season statistics", + "summary": "Get a The New Yorker contributor profile", "tags": [ - "MLB" + "The New Yorker" ] } }, - "/mlb/teams": { + "/newyorker/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the 30 MLB clubs for a `season` (four-digit year, default the current year). Each team has its id, name, club name, location, abbreviation, league, division, venue, first year of play and active flag.", - "operationId": "mlb-teams", + "description": "Returns fresh headlines from one public The New Yorker section feed. Section must be one of the slugs returned by the sections endpoint.", + "operationId": "newyorker-headlines", "parameters": [ { - "description": "Four-digit season; defaults to current year", + "description": "The New Yorker section slug", + "enum": [ + "everything", + "news", + "culture", + "humor", + "magazine", + "business", + "tech", + "daily-comment", + "news-desk", + "cultural-comment", + "photo-booth", + "page-turner", + "borowitz-report" + ], "in": "query", - "name": "season", - "type": "integer", - "x-example": 2026 + "name": "section", + "required": true, + "type": "string", + "x-example": "everything" } ], "produces": [ @@ -412271,7 +427880,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/mlb.teamsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -412298,46 +427907,16 @@ "ApiKeyAuth": [] } ], - "summary": "List MLB teams", + "summary": "Get The New Yorker section headlines", "tags": [ - "MLB" + "The New Yorker" ] } }, - "/mlb/transactions": { + "/newyorker/news": { "get": { - "description": "Lists MLB transactions between `start_date` and `end_date`, both required in `YYYY-MM-DD` format. Covers signings, trades, options, assignments, injured-list moves and releases. Narrow with `team_id` or `player_id`. Each entry has the date, effective date, type, description, player, and from and to teams, with a total `count`.", - "operationId": "mlb-transactions", - "parameters": [ - { - "description": "Range start in YYYY-MM-DD format", - "in": "query", - "name": "start_date", - "required": true, - "type": "string", - "x-example": "2026-07-25" - }, - { - "description": "Range end in YYYY-MM-DD format", - "in": "query", - "name": "end_date", - "required": true, - "type": "string", - "x-example": "2026-08-01" - }, - { - "description": "Numeric MLB team id", - "in": "query", - "name": "team_id", - "type": "string" - }, - { - "description": "Numeric MLB player id", - "in": "query", - "name": "player_id", - "type": "string" - } - ], + "description": "Returns fresh The New Yorker top stories from its public RSS feed: title, canonical URL, summary, author, publication time, lead image, and the department label (for example \"News / The Lede\").", + "operationId": "newyorker-news", "produces": [ "application/json" ], @@ -412345,11 +427924,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/mlb.transactionsResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -412366,16 +427945,16 @@ "ApiKeyAuth": [] } ], - "summary": "List MLB transactions", + "summary": "Get The New Yorker top stories", "tags": [ - "MLB" + "The New Yorker" ] } }, - "/mlive/news": { + "/newyorker/sections": { "get": { - "description": "Returns current MLive top stories, including title, canonical URL, brief summary, author, publication time, and image where available. Article pages are not currently available, and category endpoints are deferred.", - "operationId": "mlive-news", + "description": "Lists every The New Yorker section accepted by the headlines endpoint, with slug, display name, and feed URL. This is the complete set of public text-article feeds the publisher serves; cartoon, podcast, video, and puzzle feeds are not included.", + "operationId": "newyorker-sections", "produces": [ "application/json" ], @@ -412383,7 +427962,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } }, "429": { @@ -412404,19 +427983,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get MLive top stories", + "summary": "List The New Yorker sections", "tags": [ - "MLive" + "The New Yorker" ] } }, - "/modaoperandi/categories": { + "/nike/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the live category tree, designer, color, size, availability, and sort values discovered from Moda Operandi's public catalog. Returned category and designer slugs are valid for modaoperandi-search.", - "operationId": "modaoperandi-categories", + "description": "Returns Nike's full Men/Women/Kids/Jordan category and subcategory taxonomy tree, sourced directly from Nike.com's own nav mega-menu. Each top-level entry (Men, Women, Kids, Jordan) breaks down into named groups (e.g. Shoes, Clothing, Accessories, Shop By Sport -- Women additionally carries a Shop by Color group, and Jordan is organized by Men/Women/Kids instead of by product type), each with its own subcategory entries. Every subcategory (and most groups) carries a slug usable as a future category-browse endpoint's path/slug input, and is directly browsable today at https://www.nike.com/w/. This mirrors the live nav exactly, including its seasonal/promotional groups (e.g. Limited Time, New & Featured) alongside the stable structural ones -- Nike's own markup does not distinguish the two.", + "operationId": "nike-categories", "produces": [ "application/json" ], @@ -412424,7 +428003,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/modaoperandi.categoriesDoc" + "$ref": "#/definitions/nike.categoriesResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -412439,31 +428024,35 @@ "ApiKeyAuth": [] } ], - "summary": "List Moda Operandi categories and facets", + "summary": "List Nike's category and subcategory taxonomy", "tags": [ - "Moda Operandi" + "Nike" ] } }, - "/modaoperandi/designers": { + "/nike/product": { "get": { "consumes": [ "application/json" ], - "description": "Lists the designers currently available in one Moda Operandi department, chosen with the required `gender` (`women` or `men`). Each designer has its name, slug and item count, and each slug can be passed as `designer` to `modaoperandi-search`. The response also carries the `count` of designers.", - "operationId": "modaoperandi-designers", + "description": "Returns product-detail data for one color variant: title, description, pricing, images, every offered size, and every other available color. slug and style_color together reproduce Nike's own product page URL (nike.com/t//) and are both returned by nike-search's product colors[].slug and colors[].style_color fields.", + "operationId": "nike-product", "parameters": [ { - "description": "Department", - "enum": [ - "women", - "men" - ], + "description": "Product-detail URL slug, from a search result's colors[].slug field", "in": "query", - "name": "gender", + "name": "slug", "required": true, "type": "string", - "x-example": "women" + "x-example": "vomero-premium-mens-road-running-shoes-l11miwwa" + }, + { + "description": "Style-color id, from a search result's colors[].style_color field", + "in": "query", + "name": "style_color", + "required": true, + "type": "string", + "x-example": "HQ2050-102" } ], "produces": [ @@ -412473,7 +428062,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/modaoperandi.designersDoc" + "$ref": "#/definitions/nike.productResponseDoc" } }, "400": { @@ -412482,6 +428071,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -412494,27 +428095,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Moda Operandi designers", + "summary": "Get a Nike product", "tags": [ - "Moda Operandi" + "Nike" ] } }, - "/modaoperandi/product": { + "/nike/product/availability": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Moda Operandi product by its product page `url`: id, name, designer, color, price and currency, description, details, images, and the available sizes. It also reports `availability` and an `in_stock` flag for the product.", - "operationId": "modaoperandi-product", + "description": "Returns per-size shipping availability for one product, sourced from the same anonymous mobile backend Nike's own app uses. group_key is the product's rollup key (from a search result's products[].group_key field). Each size carries its label, localized label, the color variant it belongs to, a GTIN, an available flag, Nike's own shipping-availability level (HIGH/LOW/MEDIUM/OOS), and the width grouping (Regular/Wide). Per-store pickup availability is not included -- this reflects online shipping availability.", + "operationId": "nike-product-availability", "parameters": [ { - "description": "Moda Operandi product URL", + "description": "Product rollup key, from a search result's products[].group_key field", "in": "query", - "name": "url", + "name": "group_key", "required": true, "type": "string", - "x-example": "https://www.modaoperandi.com/women/p/melisse/the-minuit-knot-bag-in-black-taffeta/752807" + "x-example": "5npsVBwT" } ], "produces": [ @@ -412524,7 +428125,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/modaoperandi.productDoc" + "$ref": "#/definitions/nike.availabilityResponseDoc" } }, "400": { @@ -412539,6 +428140,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -412551,125 +428158,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Moda Operandi product", + "summary": "Get Nike product size availability", "tags": [ - "Moda Operandi" + "Nike" ] } }, - "/modaoperandi/search": { + "/nike/product/details": { "get": { "consumes": [ "application/json" ], - "description": "Searches or browses the Moda Operandi catalogue for one department, with `gender` (`women` or `men`) required and either `q` or `category` needed as well. Filter by `designer`, `color`, `size`, `availability`, price range or `on_sale`, and sort with `sort`. `limit` is 1 to 180 per page. Returns products plus facet counts and the `total`.", - "operationId": "modaoperandi-search", + "description": "Returns full product-group detail for one product's rollup key, sourced from the same anonymous mobile backend Nike's own app uses: shared product copy plus every purchasable color variant (across width groupings), each with its own pricing, sizes, and images. group_key is the product's rollup key, the same value nike-search returns as a products[].group_key field. Unlike nike-product (which returns one color variant by slug/style_color), this returns every color of the product in one response.", + "operationId": "nike-product-details", "parameters": [ { - "description": "Department", - "enum": [ - "women", - "men" - ], + "description": "Product rollup key, from a search result's products[].group_key field", "in": "query", - "name": "gender", + "name": "group_key", "required": true, "type": "string", - "x-example": "women" - }, - { - "description": "Free-text search", - "in": "query", - "name": "q", - "type": "string" - }, - { - "description": "Category slug from modaoperandi-categories", - "in": "query", - "name": "category", - "type": "string" - }, - { - "description": "Designer slug from modaoperandi-designers", - "in": "query", - "name": "designer", - "type": "string" - }, - { - "description": "Color facet value", - "in": "query", - "name": "color", - "type": "string" - }, - { - "description": "Size facet value", - "in": "query", - "name": "size", - "type": "string" - }, - { - "description": "Attribute facet value", - "in": "query", - "name": "attribute", - "type": "string" - }, - { - "description": "Availability", - "enum": [ - "available_now", - "preorder", - "trunkshow" - ], - "in": "query", - "name": "availability", - "type": "string" - }, - { - "description": "Minimum price", - "in": "query", - "name": "price_min", - "type": "number" - }, - { - "description": "Maximum price", - "in": "query", - "name": "price_max", - "type": "number" - }, - { - "description": "Sale items only", - "in": "query", - "name": "on_sale", - "type": "boolean" - }, - { - "description": "Sort", - "enum": [ - "default", - "price_low_to_high", - "price_high_to_low", - "newest" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": 1, - "description": "1-based page", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 60, - "description": "Results per page", - "in": "query", - "maximum": 180, - "minimum": 1, - "name": "limit", - "type": "integer" + "x-example": "5npsVBwT" } ], "produces": [ @@ -412679,7 +428188,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/modaoperandi.searchDoc" + "$ref": "#/definitions/nike.productDetailsResponseDoc" } }, "400": { @@ -412688,6 +428197,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -412700,28 +428221,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Moda Operandi products", + "summary": "Get full Nike product details", "tags": [ - "Moda Operandi" + "Nike" ] } }, - "/moncler/categories": { + "/nike/product/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Returns Moncler's full category tree (id, name, description, and subcategories). Every id is a valid value for moncler-category's own category_id parameter. levels controls how many levels of subcategories are included.", - "operationId": "moncler-categories", + "description": "Returns Nike's own related-product (\"Shop Similar\") recommendations for one product, sourced from the same anonymous mobile backend Nike's own app uses. style_color is the anchor product's style-color id (from a search result's colors[].style_color field). Each recommendation carries the product's style-color, rank, title/subtitle, image, PDP URL, and current pricing. Recommendations are Nike's own ranking, not a guaranteed keyword match: an unrecognized style_color returns Nike's fallback recommendations rather than an empty list or an error.", + "operationId": "nike-product-recommendations", "parameters": [ { - "default": 2, - "description": "How many levels of the category tree to return", + "description": "Anchor product's style-color id, from a search result's colors[].style_color field", "in": "query", - "maximum": 3, - "minimum": 1, - "name": "levels", - "type": "integer" + "name": "style_color", + "required": true, + "type": "string", + "x-example": "HQ2050-102" } ], "produces": [ @@ -412731,7 +428251,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/moncler.categoriesResponseDoc" + "$ref": "#/definitions/nike.recommendationsResponseDoc" } }, "400": { @@ -412758,66 +428278,42 @@ "ApiKeyAuth": [] } ], - "summary": "List Moncler categories", + "summary": "Get Nike product recommendations", "tags": [ - "Moncler" + "Nike" ] } }, - "/moncler/category": { + "/nike/product/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Lists products within one category. category_id must be a value returned by moncler-categories' own category_id field -- a closed set the upstream defines. Returns the same result and facet shape as moncler-search. Narrow the same results with the filter param below.", - "operationId": "moncler-category", + "description": "Returns one page of a Nike product's customer reviews, plus an aggregate rating summary (average rating and a per-star rating breakdown) that Nike's own product-detail endpoint does not otherwise expose. slug and style_color are the same values nike-product accepts (from a search result's colors[].slug/colors[].style_color fields). A product with no reviews yet returns a well-formed empty result rather than an error. Requesting a page beyond the available result pages returns a not-found error.", + "operationId": "nike-product-reviews", "parameters": [ { - "description": "Category id, from moncler-categories", + "description": "Product-detail URL slug, from a search result's colors[].slug field", "in": "query", - "name": "category_id", + "name": "slug", "required": true, "type": "string", - "x-example": "men-outerwear-all-down-jackets" + "x-example": "vomero-premium-mens-road-running-shoes-l11miwwa" }, { - "description": "Sort order", - "enum": [ - "price-high-to-low", - "price-low-to-high" - ], + "description": "Style-color id, from a search result's colors[].style_color field", "in": "query", - "name": "sort", + "name": "style_color", + "required": true, "type": "string", - "x-example": "price-low-to-high" - }, - { - "collectionFormat": "csv", - "description": "Repeatable, up to 10. Each value is \\", - "in": "query", - "items": { - "type": "string" - }, - "name": "filter", - "type": "array", - "x-example": "c_refinementColor:Black" - }, - { - "default": 24, - "description": "Max results to return", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "limit", - "type": "integer" + "x-example": "HQ2050-102" }, { - "default": 0, - "description": "Result offset for pagination", + "description": "One-based page number, defaults to 1", "in": "query", - "minimum": 0, - "name": "offset", - "type": "integer" + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -412827,7 +428323,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/moncler.categoryResponseDoc" + "$ref": "#/definitions/nike.productReviewsResponseDoc" } }, "400": { @@ -412860,27 +428356,40 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Moncler category", + "summary": "Get Nike product reviews", "tags": [ - "Moncler" + "Nike" ] } }, - "/moncler/product": { + "/nike/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one product's full detail: name, brand, price, descriptions, color, composition and care instructions, size availability, live stock, variation attributes (color/size options), every orderable variant SKU, product images, \"styled with\" related products, and a size guide (per-size body measurements and/or a cross-region size conversion table) when the upstream provides one. product_id accepts either a variant-level id or a master/style-level id, both as returned by moncler-search/moncler-category's own result ids.", - "operationId": "moncler-product", + "description": "Searches Nike.com product listings by keyword, or browses a category/subcategory listing by slug, with real pagination. Exactly one of keyword or category is required. Returns product groups with pricing, colorway images, and every purchasable color variant, plus filter and subcategory navigation data (facet_nav) already present on the same response -- both keyword search and a category listing's first page include filter groups (Gender, Color, Price, Size, and similar); only a category listing includes a breadcrumb trail and subcategory drill-down options, and only its first page (a category listing's later pages do not repeat navigation data). Keyword search is best-effort relevance, not a guaranteed keyword match: for an obscure or nonsense keyword, Nike's own search index falls back to its own recommended results instead of returning an empty list, and there is currently no reliable signal in the response to distinguish a true keyword match from that fallback behavior. A keyword Nike's own search router treats as structurally empty (for example a punctuation-only query) does return a genuine empty result. Category values come from nike-categories' own slug field, or from a prior response's own facet_nav navigation paths (with the leading /w/ stripped). Requesting a page beyond the available result pages returns a not-found error.", + "operationId": "nike-search", "parameters": [ { - "description": "Product or master id", + "description": "Search keyword. Exactly one of keyword or category is required.", "in": "query", - "name": "product_id", - "required": true, + "name": "keyword", "type": "string", - "x-example": "L20911A53600689509990" + "x-example": "running shoes" + }, + { + "description": "Category/subcategory browse slug, from nike-categories' own slug field or a prior response's facet_nav navigation. Exactly one of keyword or category is required.", + "in": "query", + "name": "category", + "type": "string", + "x-example": "mens-jordan-shoes-37eefznik1zy7ok" + }, + { + "description": "One-based page number, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -412890,7 +428399,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/moncler.productResponseDoc" + "$ref": "#/definitions/nike.searchResponseDoc" } }, "400": { @@ -412923,66 +428432,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Moncler product's detail", + "summary": "Search or browse Nike products", "tags": [ - "Moncler" + "Nike" ] } }, - "/moncler/search": { + "/nike/stores": { "get": { "consumes": [ "application/json" ], - "description": "Searches Moncler's product catalog by keyword. Returns product results (name, price, image, orderable color/size variant ids, and live stock level) plus the search index's own sort options and facets (gender, category, color, size, and others) with live per-option result counts. Narrow the same results with the filter param below.", - "operationId": "moncler-search", + "description": "Searches Nike's physical retail store locator by coordinates and radius. Returns each nearby store's name, address, phone, coordinates, distance, and store page URL. A location with no nearby stores within the given radius returns a well-formed empty result.", + "operationId": "nike-stores", "parameters": [ { - "description": "Search keyword", + "description": "Latitude, -90 to 90", "in": "query", - "name": "q", + "name": "lat", "required": true, - "type": "string", - "x-example": "down jacket" - }, - { - "description": "Sort order", - "enum": [ - "price-high-to-low", - "price-low-to-high" - ], - "in": "query", - "name": "sort", - "type": "string", - "x-example": "price-low-to-high" + "type": "number", + "x-example": 40.75 }, { - "collectionFormat": "csv", - "description": "Repeatable, up to 10. Each value is \\", + "description": "Longitude, -180 to 180", "in": "query", - "items": { - "type": "string" - }, - "name": "filter", - "type": "array", - "x-example": "c_refinementColor:Black" + "name": "lng", + "required": true, + "type": "number", + "x-example": -73.99 }, { - "default": 24, - "description": "Max results to return", + "description": "Search radius in miles, defaults to 50", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "limit", - "type": "integer" + "name": "radius_miles", + "type": "integer", + "x-example": 50 }, { - "default": 0, - "description": "Result offset for pagination", + "description": "One-based page number, defaults to 1", "in": "query", - "minimum": 0, - "name": "offset", - "type": "integer" + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -412992,7 +428484,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/moncler.searchResponseDoc" + "$ref": "#/definitions/nike.storesResponseDoc" } }, "400": { @@ -413001,6 +428493,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -413019,19 +428517,29 @@ "ApiKeyAuth": [] } ], - "summary": "Search Moncler products", + "summary": "Find nearby Nike stores", "tags": [ - "Moncler" + "Nike" ] } }, - "/moncler/stores": { + "/nike/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns Moncler's full worldwide boutique list: name, coordinates, address, phone, email, opening hours, store type, and in-store service flags. This is the full list, not geo-filtered -- filter by country_code or proximity to coordinates client-side over the returned list.", - "operationId": "moncler-stores", + "description": "Returns Nike's own search-box suggestions (typeahead) for a partial query, the same \"Top Suggestions\" list shown while typing into Nike's search box: a flat list of suggested search phrases, no product data.", + "operationId": "nike-suggest", + "parameters": [ + { + "description": "Partial search query", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "running shoes" + } + ], "produces": [ "application/json" ], @@ -413039,7 +428547,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/moncler.storesResponseDoc" + "$ref": "#/definitions/nike.suggestResponseDoc" } }, "400": { @@ -413066,27 +428574,78 @@ "ApiKeyAuth": [] } ], - "summary": "List Moncler boutiques", + "summary": "Get Nike search-box suggestions", "tags": [ - "Moncler" + "Nike" ] } }, - "/moncler/suggest": { + "/ninetofivegoogle/article": { "get": { - "consumes": [ + "description": "Returns public 9to5Google article metadata and readable body paragraphs from a canonical dated article URL. Audio-first podcast archive slugs are excluded from the sections list; podcast episodes that appear in the main feed can still be read when their page exposes metadata and paragraphs.", + "operationId": "ninetofivegoogle-article", + "parameters": [ + { + "description": "Canonical 9to5Google article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://9to5google.com/2026/09/29/pixel-11-hilight-messages-qpr2/" + } + ], + "produces": [ "application/json" ], - "description": "Returns the storefront's own search-box suggestions (typeahead) for a partial query: completed/corrected search terms, suggested full phrases, and matching categories. Not product data.", - "operationId": "moncler-suggest", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.articleResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a 9to5Google article", + "tags": [ + "9to5Google" + ] + } + }, + "/ninetofivegoogle/author": { + "get": { + "description": "Returns a 9to5Google author profile from `url`, a canonical `https://9to5google.com/author//` address. The response has the author's `name`, avatar, `biography`, `social_links` and the first page of recent articles, each with title, URL, summary and image. Social-link types and dates are as the author's page shows them.", + "operationId": "ninetofivegoogle-author", "parameters": [ { - "description": "Partial search query", + "description": "Canonical 9to5Google author URL", "in": "query", - "name": "q", + "name": "url", "required": true, "type": "string", - "x-example": "jack" + "x-example": "https://9to5google.com/author/technacity/" } ], "produces": [ @@ -413096,7 +428655,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/moncler.suggestResponseDoc" + "$ref": "#/definitions/publicnews.ninetofivegoogleAuthorResponseDoc" } }, "400": { @@ -413105,8 +428664,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -413123,24 +428682,89 @@ "ApiKeyAuth": [] } ], - "summary": "Get Moncler search-box suggestions", + "summary": "Get a 9to5Google author profile", "tags": [ - "Moncler" + "9to5Google" ] } }, - "/moneycontrol/article": { + "/ninetofivegoogle/headlines": { "get": { - "description": "Returns public Moneycontrol article metadata and body paragraphs from a canonical article URL. Moneycontrol Pro subscriber stories are refused with a 403 permission error because no free content is available. Live blogs return one paragraph per update.", - "operationId": "moneycontrol-article", + "description": "Returns recent 9to5Google headlines for one guide or editorial archive. `section` is required and takes a slug such as `gemini`, `google-pixel-9` or `wear-os`; an unknown or missing value returns an invalid-params error. There are 58 guide feeds and five editorial archives, and some hold fewer than 100 entries.", + "operationId": "ninetofivegoogle-headlines", "parameters": [ { - "description": "Canonical Moneycontrol article URL", + "description": "Slug returned by ninetofivegoogle_sections", + "enum": [ + "gemini", + "google-pixel-9-pro-fold", + "google-pixel-9-pro-xl", + "google-pixel-9-pro", + "google-pixel-9", + "google-pixel-8-pro", + "google-pixel-8", + "google-pixel-watch-3", + "google-pixel-watch", + "google-pixel-buds-pro-2", + "google-pixel-buds-pro", + "google-nest-hub", + "google-nest-hub-max", + "google-nest-mini", + "google-nest-audio", + "nest-thermostat", + "nest-cam", + "google-nest-doorbell", + "android-17", + "android-auto", + "wear-os", + "samsung", + "oneplus", + "oppo", + "xiaomi", + "google-chrome", + "chrome-os", + "google-tv", + "android-tv", + "chromecast", + "chromecast-with-google-tv", + "gmail", + "google-meet", + "google-chat", + "google-calendar", + "google-keep", + "google-drive", + "google-docs", + "youtube", + "youtube-music", + "youtube-tv", + "android", + "android-14", + "android-15", + "android-15-beta", + "apk-insight", + "apps-and-updates-2", + "exclusives", + "fitbit", + "google", + "google-apps", + "google-assistant", + "google-home", + "google-pixel", + "pixel-11-buyers-guide", + "google-play", + "google-search", + "made-by-google", + "feature-exclusives", + "feature-review", + "feature-newsletter", + "feature-videos", + "feature-sponsored-post" + ], "in": "query", - "name": "url", + "name": "section", "required": true, "type": "string", - "x-example": "https://www.moneycontrol.com/news/business/markets/example-article-slug-14037252.html" + "x-example": "gemini" } ], "produces": [ @@ -413150,7 +428774,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -413159,14 +428783,40 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get 9to5Google section headlines", + "tags": [ + "9to5Google" + ] + } + }, + "/ninetofivegoogle/news": { + "get": { + "description": "Returns recent 9to5Google stories with no input needed. Each item has a title, canonical URL, summary, publication time and author. Cross-network links are filtered out, so returned items use canonical 9to5Google story URLs.", + "operationId": "ninetofivegoogle-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -413183,24 +428833,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get Moneycontrol article content", + "summary": "Get 9to5Google top stories", "tags": [ - "Moneycontrol" + "9to5Google" ] } }, - "/moneycontrol/author": { + "/ninetofivegoogle/sections": { "get": { - "description": "Returns a Moneycontrol author's name, job title, biography (when present), social links, and recent articles from a canonical author URL.", - "operationId": "moneycontrol-author", + "description": "Returns the 58 topic guides linked by the current first-party Guides directory and five separately navigable editorial feeds. Use each slug with the headlines endpoint.", + "operationId": "ninetofivegoogle-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Discover 9to5Google sections", + "tags": [ + "9to5Google" + ] + } + }, + "/ninetofivemac/article": { + "get": { + "description": "Returns a 9to5Mac article by `url`, a canonical `9to5mac.com` address in the form `/YYYY/MM/DD//`: title, description, publication and update times, `authors`, `section`, image and the body `paragraphs`. The affiliate FTC disclaimer and embedded-tweet text are left out, and `paywalled` is never set because the articles are free.", + "operationId": "ninetofivemac-article", "parameters": [ { - "description": "Canonical Moneycontrol author URL", + "description": "Canonical 9to5Mac article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.moneycontrol.com/author/jane-doe-12345/" + "x-example": "https://9to5mac.com/2026/09/24/heres-everything-new-for-apple-maps-in-ios-27/" } ], "produces": [ @@ -413210,7 +428886,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.moneycontrolAuthorResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -413237,78 +428913,115 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Moneycontrol author profile", + "summary": "Get 9to5Mac article content", "tags": [ - "Moneycontrol" + "9to5Mac" ] } }, - "/moneycontrol/headlines": { + "/ninetofivemac/author": { "get": { - "description": "Returns the current front page of one Moneycontrol section: 25 or 50 stories, each with `title`, `url`, a short `summary` and `image_url`. `section` is required and takes one of 52 slugs such as `markets`, `ipo` or `cricket`; other values return `400`. Publication time and author are omitted, and only the first page is available.", - "operationId": "moneycontrol-headlines", + "description": "Returns a 9to5Mac author profile from `url`, a canonical `https://9to5mac.com/author//` address: name, avatar, `biography`, `social_links` and the first page of recent articles. Each social link's `type` comes from the page's icon, and each article's `published_at` is the page's own text, such as `9 hours ago`, not a timestamp.", + "operationId": "ninetofivemac-author", "parameters": [ { - "description": "Moneycontrol section slug", - "enum": [ - "business", - "markets", - "economy", - "companies", - "personal-finance", - "ipo", - "startup", - "commodities", - "earnings", - "insurance", - "banks", - "stocks", - "mutual-funds", - "real-estate", - "funding", - "information-technology", - "india", - "politics", - "trends", - "interview", - "opinion", - "currency", - "telecom", - "world", - "city", - "banking", - "explainers", - "technology", - "automobile", - "sports", - "cricket", - "football", - "entertainment", - "bollywood", - "hollywood", - "ott", - "tv", - "regional", - "music", - "lifestyle", - "beauty", - "parenting", - "relationship", - "home-garden", - "health-and-fitness", - "education", - "science", - "astrology", - "religion", - "travel", - "artificial-intelligence", - "books" + "description": "Canonical 9to5Mac author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://9to5mac.com/author/chmiller44/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.ninetofivemacAuthorResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a 9to5Mac author profile", + "tags": [ + "9to5Mac" + ] + } + }, + "/ninetofivemac/headlines": { + "get": { + "description": "Returns the newest posts from one 9to5Mac topic guide, up to 100. `section` is required and takes a guide slug such as `iphone`, `macbook-pro`, `vision-pro` or `how-to`; an unknown or missing value returns an invalid-params error. Smaller guides, such as `apple-watch-se`, return fewer. Items carry title, URL, summary, time and author.", + "operationId": "ninetofivemac-headlines", + "parameters": [ + { + "description": "9to5Mac guide slug", + "enum": [ + "iphone", + "mac", + "macbook-pro", + "macbook-air", + "imac", + "mac-mini", + "mac-studio", + "mac-pro", + "ipad-pro", + "ipad-air", + "ipad-mini", + "ipad", + "ipados", + "apple-watch", + "apple-watch-ultra", + "apple-health", + "apple-watch-se", + "vision-pro", + "visionos", + "apple-music", + "airpods", + "homepod", + "apple-tv", + "review", + "how-to", + "aapl", + "apple-store", + "apple-arcade", + "apple-card", + "apple-silicon", + "apple-one", + "apple-fitness", + "carplay", + "siri", + "homekit" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "business" + "x-example": "iphone" } ], "produces": [ @@ -413339,16 +429052,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Moneycontrol section headlines", + "summary": "Get 9to5Mac section headlines", "tags": [ - "Moneycontrol" + "9to5Mac" ] } }, - "/moneycontrol/news": { + "/ninetofivemac/news": { "get": { - "description": "Returns the 50 newest Moneycontrol stories across all sections, newest first, with no parameters. Each item has `title`, `url`, `published_at` (RFC3339 UTC) and `image_url`. Videos, podcasts, photo galleries and sponsored brand-connect posts are left out.", - "operationId": "moneycontrol-news", + "description": "Returns the latest 9to5Mac Apple news stories with no input needed. Each item has a title, canonical article URL, summary, publication time, author and image when present. The list can include podcast episode posts, such as Happy Hour and 9to5Mac Daily, alongside news articles.", + "operationId": "ninetofivemac-news", "produces": [ "application/json" ], @@ -413377,16 +429090,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Moneycontrol latest news", + "summary": "Get 9to5Mac top stories", "tags": [ - "Moneycontrol" + "9to5Mac" ] } }, - "/moneycontrol/sections": { + "/ninetofivemac/sections": { "get": { - "description": "Lists the 52 Moneycontrol news section slugs accepted by `moneycontrol-headlines`, such as `markets`, `economy`, `ipo` and `cricket`. Each entry has its `slug`, display `name` and page `url`. Moneycontrol Pro-only research, video, podcast and photo hubs are not sections.", - "operationId": "moneycontrol-sections", + "description": "Lists the 35 9to5Mac topic guides that the headlines endpoint accepts as `section`. Each has a `slug` (for example `iphone`, `mac-studio` or `carplay`), a display `name` and the guide's feed `url`.", + "operationId": "ninetofivemac-sections", "produces": [ "application/json" ], @@ -413403,37 +429116,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Moneycontrol sections", + "summary": "Get 9to5Mac sections", "tags": [ - "Moneycontrol" + "9to5Mac" ] } }, - "/monitors": { + "/njcom/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the website-change monitors on your account, most recently created first, up to 100. Each monitor has its `target_type` (`page` or `sitemap`), URL, name, cadence in minutes, enabled flag, last checked and last changed times, next check time, failure count, last error, and notification and sitemap settings.", - "operationId": "monitors-list", + "description": "Returns current NJ.com top stories, including title, canonical URL, short summary, author, publication time, and image where available. Category discovery, section headlines, and article and author routes are not available.", + "operationId": "njcom-news", "produces": [ "application/json" ], "responses": { "200": { - "description": "Monitors", + "description": "OK", "schema": { - "$ref": "#/definitions/webmonitor.monitorListResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "401": { - "description": "Authentication required", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -413444,26 +429154,24 @@ "ApiKeyAuth": [] } ], - "summary": "List website-change monitors", + "summary": "Get NJ.com top stories", "tags": [ - "Monitors" + "NJ.com" ] - }, - "post": { - "consumes": [ - "application/json" - ], - "description": "Creates a monitor that periodically checks a page or sitemap for changes and can notify a webhook. Free to call -- only completed check runs consume credits, at 1 credit per completed run regardless of target type or whether a change was detected. `target_type` defaults to \"page\" (exact-fingerprint diff of the page). \"sitemap\" watches the sitemap at `url` for added/removed entries instead, honoring `sitemap.include_patterns`/`exclude_patterns` (shell-style globs matched against each URL's path) and `sitemap.max_urls` (default 5000, hard cap 10000).", - "operationId": "monitors-create", + } + }, + "/npr/article": { + "get": { + "description": "Returns an NPR article by canonical `url` in the form `https://www.npr.org/YYYY/MM/DD/...`: title, description, section, authors, lead image, publication and update times, and body `paragraphs`. Tracking query strings and fragments are ignored; other hosts, encoded paths and non-article paths are rejected.", + "operationId": "npr-article", "parameters": [ { - "description": "Monitor definition", - "in": "body", - "name": "request", + "description": "Canonical www.npr.org article URL", + "in": "query", + "name": "url", "required": true, - "schema": { - "$ref": "#/definitions/webmonitor.createMonitorBodyDoc" - } + "type": "string", + "x-example": "https://www.npr.org/2026/09/19/nx-s1-5974980/saudi-arabia-houthis-attempted-attack-capital" } ], "produces": [ @@ -413471,25 +429179,31 @@ ], "responses": { "200": { - "description": "Created monitor", + "description": "OK", "schema": { - "$ref": "#/definitions/webmonitor.monitorResponseDoc" + "$ref": "#/definitions/npr.articleResponseDoc" } }, "400": { - "description": "Invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Authentication required", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -413500,27 +429214,24 @@ "ApiKeyAuth": [] } ], - "summary": "Create a website-change monitor", + "summary": "Get NPR article content", "tags": [ - "Monitors" + "NPR" ] } }, - "/monitors/{id}": { - "delete": { - "consumes": [ - "application/json" - ], - "description": "Deletes one website-change monitor by its `id`, which must belong to the calling account. Returns `deleted: true` on success. The monitor's past check history is not removed.", - "operationId": "monitors-delete", + "/npr/author": { + "get": { + "description": "Returns an NPR author profile from a required `url` in the form `https://www.npr.org/people//`. The response has `name`, `job_title`, `bio` and the recent stories listed under Stories By, each with title, URL, summary, publication date and a lead image where the card has one. Other hosts or paths return a bad-request error.", + "operationId": "npr-author", "parameters": [ { - "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", - "in": "path", - "name": "id", + "description": "Canonical www.npr.org author URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" + "x-example": "https://www.npr.org/people/14562108/bill-chappell" } ], "produces": [ @@ -413528,25 +429239,31 @@ ], "responses": { "200": { - "description": "Deleted", + "description": "OK", "schema": { - "$ref": "#/definitions/webmonitor.monitorDeleteResponseDoc" + "$ref": "#/definitions/npr.authorResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Monitor not found", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -413557,51 +429274,34 @@ "ApiKeyAuth": [] } ], - "summary": "Delete a website-change monitor", + "summary": "Get an NPR author profile", "tags": [ - "Monitors" + "NPR" ] - }, + } + }, + "/npr/categories": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one of your website-change monitors by `id`. The monitor includes its `target_type` (`page` or `sitemap`), URL, name, check cadence in minutes, enabled flag, last and next check times, failure count and last error, plus notification and sitemap settings.", - "operationId": "monitors-get", - "parameters": [ - { - "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" - } - ], + "description": "Lists the sections in NPR's current navigation, each with its name, slug and URL. Pass a returned `slug` as the `topic` parameter of `npr-topic`. The list is not a fixed set, so it follows whatever sections NPR currently shows.", + "operationId": "npr-categories", "produces": [ "application/json" ], "responses": { "200": { - "description": "Monitor", - "schema": { - "$ref": "#/definitions/webmonitor.monitorResponseDoc" - } - }, - "401": { - "description": "Authentication required", + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/npr.categoriesResponseDoc" } }, - "404": { - "description": "Monitor not found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -413612,66 +429312,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a website-change monitor", + "summary": "Get NPR section navigation", "tags": [ - "Monitors" + "NPR" ] - }, - "patch": { - "consumes": [ - "application/json" - ], - "description": "Partially updates one of the caller's own monitors. Free to call. Changing `target_type` or `sitemap` resets the stored diff baseline (fingerprint, snapshot, or URL set), so the next check establishes a fresh baseline instead of comparing against a now-meaningless prior state.", - "operationId": "monitors-update", - "parameters": [ - { - "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" - }, - { - "description": "Fields to update", - "in": "body", - "name": "request", - "required": true, - "schema": { - "$ref": "#/definitions/webmonitor.updateMonitorBodyDoc" - } - } - ], + } + }, + "/npr/headlines": { + "get": { + "description": "Returns the current NPR headlines across the site, with no parameters and no section filter. Each item has a title, canonical URL, summary, publication time and author when one is given.", + "operationId": "npr-headlines", "produces": [ "application/json" ], "responses": { "200": { - "description": "Updated monitor", - "schema": { - "$ref": "#/definitions/webmonitor.monitorResponseDoc" - } - }, - "400": { - "description": "Invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "401": { - "description": "Authentication required", + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/npr.headlinesResponseDoc" } }, - "404": { - "description": "Monitor not found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -413682,27 +429350,24 @@ "ApiKeyAuth": [] } ], - "summary": "Update a website-change monitor", + "summary": "Get NPR site-wide headlines", "tags": [ - "Monitors" + "NPR" ] } }, - "/monitors/{id}/checks": { + "/npr/topic": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the caller's own monitor's most recent check runs (most recent first, capped at 50), including webhook delivery status per run.", - "operationId": "monitors-checks", + "description": "Returns the newest public NPR stories from one section archive page. topic is a section slug; use npr-categories for the current value space.", + "operationId": "npr-topic", "parameters": [ { - "description": "Monitor ID returned by your account monitor create/list response; replace the illustrative example with your own ID", - "in": "path", - "name": "id", + "description": "NPR section slug", + "in": "query", + "name": "topic", "required": true, "type": "string", - "x-example": "66d2f0b1c2a4e5f6a7b8c9d0" + "x-example": "politics" } ], "produces": [ @@ -413710,25 +429375,31 @@ ], "responses": { "200": { - "description": "Check history", + "description": "OK", "schema": { - "$ref": "#/definitions/webmonitor.checkListResponseDoc" + "$ref": "#/definitions/npr.topicResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Monitor not found", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -413739,24 +429410,27 @@ "ApiKeyAuth": [] } ], - "summary": "List a monitor's check history", + "summary": "Get NPR section headlines", "tags": [ - "Monitors" + "NPR" ] } }, - "/motleyfool/article": { + "/numbeo/cost-of-living/city/{slug}": { "get": { - "description": "Returns one Motley Fool investing article by `url`, which must look like `https://www.fool.com/investing/YYYY/MM/DD/slug/`; only public `/investing/` URLs are accepted. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", - "operationId": "motleyfool-article", + "consumes": [ + "application/json" + ], + "description": "Returns itemized cost-of-living prices for one city (restaurants, markets, transportation, utilities, rent, and more), grouped by category.", + "operationId": "numbeo-cost-of-living-city", "parameters": [ { - "description": "Canonical The Motley Fool investing article URL", - "in": "query", - "name": "url", + "description": "Numbeo city slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.fool.com/investing/2026/09/28/example-story/" + "x-example": "Los-Angeles" } ], "produces": [ @@ -413766,7 +429440,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/numbeo.costOfLivingCityResponseDoc" } }, "400": { @@ -413781,6 +429455,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -413793,24 +429473,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Motley Fool article", + "summary": "Get a Numbeo city's cost-of-living prices", "tags": [ - "The Motley Fool" + "Numbeo" ] } }, - "/motleyfool/author": { + "/numbeo/cost-of-living/country": { "get": { - "description": "Returns a Motley Fool author's name, biography when published, image when available and recent investing articles from their author page. `url` is required, for example `https://www.fool.com/author/2104/`. Each article has a title, URL, summary, author, image, `type` and publication time.", - "operationId": "motleyfool-author", + "consumes": [ + "application/json" + ], + "description": "Returns aggregate itemized cost-of-living prices for a country, plus the headline cost-of-living indices for every city Numbeo tracks there.", + "operationId": "numbeo-cost-of-living-country", "parameters": [ { - "description": "Canonical The Motley Fool author URL", + "description": "Country name as Numbeo spells it", "in": "query", - "name": "url", + "name": "country", "required": true, "type": "string", - "x-example": "https://www.fool.com/author/2104/" + "x-example": "Vietnam" } ], "produces": [ @@ -413820,7 +429503,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.motleyfoolAuthorResponseDoc" + "$ref": "#/definitions/numbeo.costOfLivingCountryResponseDoc" } }, "400": { @@ -413835,6 +429518,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -413847,36 +429536,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Motley Fool author profile", + "summary": "Get a Numbeo country's cost-of-living prices", "tags": [ - "The Motley Fool" + "Numbeo" ] } }, - "/motleyfool/headlines": { + "/numbeo/cost-of-living/rankings": { "get": { - "description": "Returns the article cards of one Motley Fool investing-news section. `section` is required: `trending-news`, `news`, `market-movers`, `tech-stock-news`, `market-trends`, `crypto-news`, `markets`, `most-active-stocks`, `top-stock-gainers` or `top-stock-losers`. Other values return a 400. Items carry the title, URL and, where present, summary, author and publication time.", - "operationId": "motleyfool-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns the global cost-of-living city ranking (Cost of Living, Rent, Cost of Living Plus Rent, Groceries, Restaurant Price, and Local Purchasing Power indices), either the continuously-updated current index or a historical periodic snapshot.", + "operationId": "numbeo-cost-of-living-rankings", "parameters": [ { - "description": "The Motley Fool section slug", + "description": "current (default) or historical", "enum": [ - "trending-news", - "news", - "market-movers", - "tech-stock-news", - "market-trends", - "crypto-news", - "markets", - "most-active-stocks", - "top-stock-gainers", - "top-stock-losers" + "current", + "historical" ], "in": "query", - "name": "section", - "required": true, + "name": "scope", + "type": "string" + }, + { + "description": "Required when scope=historical, e.g. 2026-mid or 2025", + "in": "query", + "name": "period", "type": "string", - "x-example": "trending-news" + "x-example": "2026-mid" } ], "produces": [ @@ -413886,7 +429575,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/numbeo.rankingsResponseDoc" } }, "400": { @@ -413895,6 +429584,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -413907,16 +429602,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Motley Fool section headlines", + "summary": "Get the global Numbeo cost-of-living city ranking", "tags": [ - "The Motley Fool" + "Numbeo" ] } }, - "/motleyfool/news": { + "/numbeo/cost-of-living/rankings-by-country": { "get": { - "description": "Returns up to 50 recent Motley Fool investing stories, newest first, each with its title, URL and publication time. Only stories at `/investing/YYYY/MM/DD/slug/` URLs are included. It takes no parameters; use the headlines endpoint for a named section.", - "operationId": "motleyfool-news", + "consumes": [ + "application/json" + ], + "description": "Returns the global country-level cost-of-living ranking (Cost of Living, Rent, Cost of Living Plus Rent, Groceries, Restaurant Price, and Local Purchasing Power indices).", + "operationId": "numbeo-cost-of-living-rankings-by-country", "produces": [ "application/json" ], @@ -413924,11 +429622,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/numbeo.rankingsByCountryResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -413945,50 +429643,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Motley Fool top investing stories", + "summary": "Get the global Numbeo cost-of-living country ranking", "tags": [ - "The Motley Fool" + "Numbeo" ] } }, - "/motleyfool/sections": { + "/numbeo/indices/city/{slug}": { "get": { - "description": "Lists the 10 Motley Fool Stock Market News section slugs that the headlines endpoint accepts, from `trending-news` and `news` to `most-active-stocks`, `top-stock-gainers` and `top-stock-losers`. Each entry has a `slug`, a display `name` (`news` is named Stock News) and a section `url`.", - "operationId": "motleyfool-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List The Motley Fool news sections", - "tags": [ - "The Motley Fool" - ] - } - }, - "/nationafrica/article": { - "get": { - "description": "Returns public Nation Africa article metadata and body paragraphs from a canonical article URL. paywalled is true for a Premium story: the publisher serves an anonymous reader only the opening paragraph(s), so paragraphs is a partial teaser and nothing is bypassed. Video, photo, audio, puzzle and cartoon URLs are rejected with a 400.", - "operationId": "nationafrica-article", + "description": "Returns one city's data for a Numbeo index family (quality of life, crime, health care, pollution, traffic, or property investment): headline indices, and (depending on the family) titled sub-index sections and/or itemized prices.", + "operationId": "numbeo-indices-city", "parameters": [ { - "description": "Canonical Nation Africa article URL", + "description": "Numbeo city slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "Los-Angeles" + }, + { + "description": "Index family", + "enum": [ + "quality-of-life", + "crime", + "health-care", + "pollution", + "traffic", + "property-investment" + ], "in": "query", - "name": "url", + "name": "index", "required": true, "type": "string", - "x-example": "https://nation.africa/kenya/news/rex-masai-inquest-verdict-on-killers-delayed-5608166" + "x-example": "quality-of-life" } ], "produces": [ @@ -413998,7 +429689,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/numbeo.indicesCityResponseDoc" } }, "400": { @@ -414013,6 +429704,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -414025,30 +429722,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get Nation Africa article content", + "summary": "Get a Numbeo city's data for an index family", "tags": [ - "Nation Africa" + "Numbeo" ] } }, - "/nationafrica/author": { + "/numbeo/indices/country": { "get": { - "description": "Returns one Nation Africa author's public profile: name, bio, portrait and the latest stories the profile page itself lists (a handful; the site loads the full list separately and it is not read).", - "operationId": "nationafrica-author", + "consumes": [ + "application/json" + ], + "description": "Returns one country's aggregate data for a Numbeo index family, plus every city Numbeo tracks there with its index breakdown.", + "operationId": "numbeo-indices-country", "parameters": [ { - "description": "Author slug, e.g. richard-munguti-11590", + "description": "Country name as Numbeo spells it", "in": "query", - "name": "slug", + "name": "country", + "required": true, "type": "string", - "x-example": "richard-munguti-11590" + "x-example": "Vietnam" }, { - "description": "Canonical nation.africa/kenya/ URL; alternative to slug", + "description": "Index family", + "enum": [ + "quality-of-life", + "crime", + "health-care", + "pollution", + "traffic", + "property-investment" + ], "in": "query", - "name": "url", + "name": "index", + "required": true, "type": "string", - "x-example": "https://nation.africa/kenya/richard-munguti-11590" + "x-example": "quality-of-life" } ], "produces": [ @@ -414058,7 +429768,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.nationAfricaAuthorResponseDoc" + "$ref": "#/definitions/numbeo.indicesCountryResponseDoc" } }, "400": { @@ -414073,6 +429783,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -414085,73 +429801,52 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Nation Africa author profile", + "summary": "Get a Numbeo country's data for an index family", "tags": [ - "Nation Africa" + "Numbeo" ] } }, - "/nationafrica/headlines": { + "/numbeo/indices/rankings": { "get": { - "description": "Returns the current story teasers of one public Nation Africa section page. Subscriber-only stories carry type \"premium\". Teasers show only a relative age, so published_at is omitted.", - "operationId": "nationafrica-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns the global city ranking for a Numbeo index family, either the continuously-updated current index or a historical periodic snapshot.", + "operationId": "numbeo-indices-rankings", "parameters": [ { - "description": "Nation Africa section slug", + "description": "Index family", "enum": [ - "news", - "politics", - "world", - "gender", - "education", - "business", - "companies", - "enterprise", - "finance-and-markets", - "seeds-of-gold", - "sports", - "football", - "athletics", - "rugby", - "motorsports", - "other-sports", - "talkup", - "counties", - "coast", - "lake-region", - "mountain", - "nairobi-metro", - "northern", - "rift-valley", - "blogs-opinion", - "opinion", - "editorials", - "letters", - "blogs", - "cutting-edge", - "life-and-style", - "wellness", - "travel", - "relationships", - "motoring", - "family", - "culture", - "art-books", - "health", - "healthy-nation", - "elections", - "elections-news", - "presidential", - "governor-race", - "constituencies", - "explainers", - "fact-checks" + "quality-of-life", + "crime", + "health-care", + "pollution", + "traffic", + "property-investment" ], "in": "query", - "name": "section", + "name": "index", "required": true, "type": "string", - "x-example": "news" + "x-example": "quality-of-life" + }, + { + "description": "current (default) or historical", + "enum": [ + "current", + "historical" + ], + "in": "query", + "name": "scope", + "type": "string" + }, + { + "description": "Required when scope=historical, e.g. 2026-mid or 2025", + "in": "query", + "name": "period", + "type": "string", + "x-example": "2026-mid" } ], "produces": [ @@ -414161,7 +429856,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/numbeo.indicesRankingsResponseDoc" } }, "400": { @@ -414170,6 +429865,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -414182,16 +429883,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get Nation Africa section headlines", + "summary": "Get the global Numbeo city ranking for an index family", "tags": [ - "Nation Africa" + "Numbeo" ] } }, - "/nationafrica/news": { + "/numbeo/indices/rankings-by-country": { "get": { - "description": "Returns the newest Nation Africa (Daily Nation, Kenya) stories from its public news sitemap: headline, publication time and lead image. If the sitemap returns 404, it falls back to the public News section hub, whose relative timestamps may omit publication time. Video pages are excluded.", - "operationId": "nationafrica-news", + "consumes": [ + "application/json" + ], + "description": "Returns the global Numbeo ranking of countries for one index family, selected by the required `index`: `quality-of-life`, `crime`, `health-care`, `pollution`, `traffic` or `property-investment`. Each row has its `rank`, country and a list of named index values, such as the Crime Index and Safety Index for `crime`.", + "operationId": "numbeo-indices-rankings-by-country", + "parameters": [ + { + "description": "Index family", + "enum": [ + "quality-of-life", + "crime", + "health-care", + "pollution", + "traffic", + "property-investment" + ], + "in": "query", + "name": "index", + "required": true, + "type": "string", + "x-example": "quality-of-life" + } + ], "produces": [ "application/json" ], @@ -414199,39 +429921,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/numbeo.indicesRankingsByCountryResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Nation Africa top stories", - "tags": [ - "Nation Africa" - ] - } - }, - "/nationafrica/sections": { - "get": { - "description": "Lists the 47 section slugs of Nation Africa's Kenya edition accepted by `nationafrica-headlines`, such as `news`, `politics`, `counties`, `football` and `fact-checks`. Each entry has its `slug`, display `name` and section page `url`. Photo, video, audio, puzzle, newsletter and cartoon pages are not included.", - "operationId": "nationafrica-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -414240,24 +429948,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Nation Africa sections", + "summary": "Get the global Numbeo country ranking for an index family", "tags": [ - "Nation Africa" + "Numbeo" ] } }, - "/national/article": { + "/nydailynews/article": { "get": { - "description": "Returns article metadata and the body served to an anonymous visitor for one canonical The National story URL. The endpoint does not bypass subscriber or access gates and reports paywalled when the page marks content as restricted.", - "operationId": "national-article", + "description": "Returns public New York Daily News article metadata and body paragraphs from a canonical article URL. For subscriber-only articles the response carries the free lead-in with paywalled set to true.", + "operationId": "nydailynews-article", "parameters": [ { - "description": "Canonical thenationalnews.com article URL", + "description": "Canonical New York Daily News article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.thenationalnews.com/future/technology/2026/09/29/ai-trump-midterm-poll-democrats/" + "x-example": "https://www.nydailynews.com/2026/09/24/city-hall-must-explain-why-they-broke-disclosure-rules/" } ], "produces": [ @@ -414294,30 +430002,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get The National article content", + "summary": "Get New York Daily News article content", "tags": [ - "The National" + "New York Daily News" ] } }, - "/national/author": { + "/nydailynews/author": { "get": { - "description": "Returns one public author topic page, its name, optional author image and the latest article cards listed on that page.", - "operationId": "national-author", + "description": "Returns one New York Daily News author's public profile: name, job title, bio, public email and X/Twitter handle, and their recent articles.", + "operationId": "nydailynews-author", "parameters": [ { - "description": "The National author slug, e.g. cody-combs", + "description": "Author slug, e.g. rocco-parascandola", "in": "query", "name": "slug", "type": "string", - "x-example": "cody-combs" + "x-example": "rocco-parascandola" }, { - "description": "Canonical thenationalnews.com/topics/Author/ URL; alternative to slug", + "description": "Canonical nydailynews.com/author// URL; alternative to slug", "in": "query", "name": "url", "type": "string", - "x-example": "https://www.thenationalnews.com/topics/Author/cody-combs/" + "x-example": "https://www.nydailynews.com/author/rocco-parascandola/" } ], "produces": [ @@ -414327,7 +430035,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.nationalAuthorResponseDoc" + "$ref": "#/definitions/publicnews.nyDailyNewsAuthorResponseDoc" } }, "400": { @@ -414354,77 +430062,56 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The National author profile", + "summary": "Get a New York Daily News author profile", "tags": [ - "The National" + "New York Daily News" ] } }, - "/national/headlines": { + "/nydailynews/headlines": { "get": { - "description": "Returns current The National stories for a category. Pass one of the editorial section slugs from national_sections. A valid category with no current stories returns an empty items list.", - "operationId": "national-headlines", + "description": "Returns New York Daily News headlines for one section, newest first, up to about 100 stories. `section` is required and takes one of 36 slugs such as `crime-public-safety`, `new-york-yankees` or `opinion`; other values return an invalid-params error. Items carry a title and URL, plus publication time, byline, excerpt and lead image where shown. Team pages can list fewer stories out of season.", + "operationId": "nydailynews-headlines", "parameters": [ { - "description": "The National editorial section slug", + "description": "New York Daily News section slug", "enum": [ "news", - "news/uae", - "news/gulf", - "news/mena", - "mena/arab-showcase", - "news/us", - "news/uk", - "news/europe", - "news/asia", + "crime-public-safety", + "politics", + "new-york-politics", "business", - "business/aviation", - "business/economy", - "business/energy", - "business/money", - "business/property", - "business/banking", - "business/uk", - "business/markets", - "in-focus", - "opinion", - "opinion/comment", - "opinion/editorial", - "opinion/obituaries", - "opinion/cartoon", - "opinion/feedback", - "future", - "future/science", - "future/space", - "future/technology", - "climate", - "climate/environment", - "climate/road-to-net-zero", "health", - "arts-culture", - "arts-culture/art-design", - "arts-culture/books", - "arts-culture/film-tv", - "arts-culture/music-stage", - "arts-culture/pop-culture", - "lifestyle", - "travel", - "lifestyle/fashion-beauty", - "lifestyle/food", - "lifestyle/motoring", - "magazine", - "lifestyle/luxury", - "lifestyle/home-garden", - "lifestyle/wellbeing", - "lifestyle/things-to-do", - "sport", - "sport/football", - "sport/cricket", - "sport/f1", - "sport/tennis", - "sport/combat-sports", - "sport/cycling", - "weekend" + "national", + "world", + "local-news", + "new-york-news", + "education", + "transportation", + "news-obituaries", + "sports", + "mlb", + "new-york-yankees", + "new-york-mets", + "nfl", + "new-york-giants", + "new-york-jets", + "nba", + "new-york-knicks", + "brooklyn-nets", + "wnba", + "new-york-liberty", + "nhl", + "new-york-rangers", + "new-york-islanders", + "soccer", + "opinion", + "editorials", + "viva", + "things-to-do", + "restaurants-food-drink", + "horoscopes", + "best-reviews" ], "in": "query", "name": "section", @@ -414461,16 +430148,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The National section headlines", + "summary": "Get New York Daily News section headlines", "tags": [ - "The National" + "New York Daily News" ] } }, - "/national/news": { + "/nydailynews/news": { "get": { - "description": "Returns current The National UAE stories.", - "operationId": "national-news", + "description": "Returns the current New York Daily News top stories, with no parameters. Each item has a title and canonical article URL, plus publication time, byline, excerpt and lead image where the story card shows them. Use `nydailynews-headlines` for a single section.", + "operationId": "nydailynews-news", "produces": [ "application/json" ], @@ -414481,12 +430168,6 @@ "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -414499,16 +430180,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The National top stories", + "summary": "Get New York Daily News top stories", "tags": [ - "The National" + "New York Daily News" ] } }, - "/national/sections": { + "/nydailynews/sections": { "get": { - "description": "Returns all 57 editorial categories in The National's section taxonomy that are accepted by national_headlines. Podcast, newsletter, puzzle, partner and promotional surfaces are excluded.", - "operationId": "national-sections", + "description": "Lists the 36 New York Daily News section slugs accepted by `nydailynews-headlines`, such as `crime-public-safety`, `new-york-mets`, `nfl` and `things-to-do`. Each entry has its `slug` (the last path segment of the section URL), display `name` and `url`. Topic (`/tag/...`) pages and off-site properties are not sections.", + "operationId": "nydailynews-sections", "produces": [ "application/json" ], @@ -414525,24 +430206,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The National sections", + "summary": "Get New York Daily News sections", "tags": [ - "The National" + "New York Daily News" ] } }, - "/nationalpost/article": { + "/nymag/article": { "get": { - "description": "Returns public National Post article metadata and body paragraphs from a canonical article URL. paywalled is true when the publisher marks the story subscriber-only or registration-gated; National Post gates these stories in the reader's browser but still serves the complete text to an anonymous request, so paragraphs is the whole body and nothing is bypassed. Category, tag, author and Sponsored URLs are rejected with a 400.", - "operationId": "nationalpost-article", + "description": "Returns a New York Magazine article by its canonical `url`: title, description, section, authors, lead image, publication and update times, a `paywalled` flag and the body `paragraphs`. Subscriber-only or blocked articles return an upstream error.", + "operationId": "nymag-article", "parameters": [ { - "description": "Canonical National Post article URL", + "description": "Canonical New York Magazine article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://nationalpost.com/news/politics/carney-will-miss-target-balancing-operating-budget-pbo-says" + "x-example": "https://nymag.com/intelligencer/example.html" } ], "produces": [ @@ -414579,30 +430260,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get National Post article content", + "summary": "Get New York Magazine article content", "tags": [ - "National Post" + "New York Magazine" ] } }, - "/nationalpost/author": { + "/nymag/author": { "get": { - "description": "Returns one National Post author's public profile: name, bio when the author has one, the total number of stories the page attributes to them, and their latest stories (first page).", - "operationId": "nationalpost-author", + "description": "Returns a New York Magazine author profile from a required `url` in the form `https://nymag.com/author//`. The response has `name`, `job_title` (empty for some contributors), `bio` and recent articles with title, URL, `excerpt` and a `section` label. Each article's `published_at` is the page's date text, such as `Sept. 20, 2026`, not a timestamp.", + "operationId": "nymag-author", "parameters": [ { - "description": "Author slug, e.g. stuckpostmedia-com", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "stuckpostmedia-com" - }, - { - "description": "Canonical nationalpost.com/author// URL; alternative to slug", + "description": "Canonical New York Magazine author URL", "in": "query", "name": "url", + "required": true, "type": "string", - "x-example": "https://nationalpost.com/author/stuckpostmedia-com/" + "x-example": "https://nymag.com/author/john-herrman/" } ], "produces": [ @@ -414612,7 +430287,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.nationalPostAuthorResponseDoc" + "$ref": "#/definitions/publicnews.nymagAuthorResponseDoc" } }, "400": { @@ -414639,71 +430314,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get a National Post author profile", + "summary": "Get a New York Magazine author profile", "tags": [ - "National Post" + "New York Magazine" ] } }, - "/nationalpost/headlines": { + "/nymag/headlines": { "get": { - "description": "Returns National Post headlines for one section; `section` is required and takes one of 45 slugs such as `canada`, `hockey` or `deals`. The top-level sections `health`, `opinion`, `longreads`, `modern-life`, `travel`, `entertainment`, `shopping-essentials` and `sports` return 10 stories with publication time and byline. Others return up to about 45 without either. Sponsored stories are left out.", - "operationId": "nationalpost-headlines", + "description": "Returns recent New York Magazine stories for one site section. `section` is required and takes one of nine slugs: `intelligencer`, `thecut`, `vulture`, `grub-street`, `curbed`, `strategist`, `select-all`, `science` or `daily`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "nymag-headlines", "parameters": [ { - "description": "National Post section slug", + "description": "New York Magazine section slug", "enum": [ - "canada", - "true-crime", - "politics", - "health", - "world", - "israel-middle-east", - "opinion", - "longreads", - "modern-life", - "food", - "horoscopes", - "style-beauty", - "travel", - "travel-canada", - "travel-usa", - "travel-international", - "travel-cruises", - "travel-guide", - "entertainment", - "books", - "celebrity", - "movies", - "music", - "theatre", - "television", - "business-essentials", - "shopping-essentials", - "buy-canadian", - "home-living", - "outdoor-living", - "kitchen-dining", - "tech", - "personal-care", - "entertainment-hobbies", - "gift-guide", - "deals", - "sports", - "hockey", - "baseball", - "basketball", - "football", - "soccer", - "golf", - "tennis", - "driving" + "intelligencer", + "thecut", + "vulture", + "grub-street", + "curbed", + "strategist", + "select-all", + "science", + "daily" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "canada" + "x-example": "intelligencer" } ], "produces": [ @@ -414734,16 +430373,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get National Post section headlines", + "summary": "Get New York Magazine section headlines", "tags": [ - "National Post" + "New York Magazine" ] } }, - "/nationalpost/news": { + "/nymag/news": { "get": { - "description": "Returns the latest 10 National Post stories across all sections, with no parameters. Each item has a title, canonical article URL, one-line summary, publication time and byline. Use `nationalpost-headlines` to read a single section.", - "operationId": "nationalpost-news", + "description": "Returns the current New York Magazine top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nymag-headlines` to read one of its sections.", + "operationId": "nymag-news", "produces": [ "application/json" ], @@ -414766,16 +430405,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get National Post top stories", + "summary": "Get New York Magazine top stories", "tags": [ - "National Post" + "New York Magazine" ] } }, - "/nationalpost/sections": { + "/nymag/sections": { "get": { - "description": "Lists the 45 National Post section slugs accepted by `nationalpost-headlines`, such as `canada`, `opinion`, `hockey` and `gift-guide`, each with its display `name` and category page `url`. Links that leave nationalpost.com (Financial Post, Driving.ca, puzzles, classifieds, e-paper) and the paid Sponsored categories are not included.", - "operationId": "nationalpost-sections", + "description": "Lists the New York Magazine section slugs accepted by `nymag-headlines`, such as `intelligencer`, `thecut`, `vulture` and `grub-street`. Each entry has its stable `slug`, display `name` and section `url`.", + "operationId": "nymag-sections", "produces": [ "application/json" ], @@ -414792,24 +430431,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get National Post sections", + "summary": "Get New York Magazine sections", "tags": [ - "National Post" + "New York Magazine" ] } }, - "/nbc/article": { + "/nypost/article": { "get": { - "description": "Returns public NBC News article metadata and body paragraphs from a canonical article URL. This does not bypass login, subscription, or other access controls.", - "operationId": "nbc-article", + "description": "Returns a New York Post article by canonical `url` in the form `https://nypost.com/YYYY/MM/DD/
//`: title, description, section, authors, lead image, publication and update times, a `paywalled` flag and the body `paragraphs`.", + "operationId": "nypost-article", "parameters": [ { - "description": "Canonical www.nbcnews.com article URL", + "description": "Canonical New York Post article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.nbcnews.com/news/us-news/ice-shooting-austin-texas-rcna598870" + "x-example": "https://nypost.com/2026/09/23/us-news/example-article-slug/" } ], "produces": [ @@ -414819,7 +430458,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nbc.articleResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -414834,12 +430473,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -414852,24 +430485,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get NBC News article content", + "summary": "Get New York Post article content", "tags": [ - "NBC News" + "New York Post" ] } }, - "/nbc/author": { + "/nypost/author": { "get": { - "description": "Returns an NBC News author's byline metadata (job title, bio, social links) and their recent articles from a canonical author URL.", - "operationId": "nbc-author", + "description": "Returns a New York Post author profile from a required `url` in the form `https://nypost.com/author//`. The response has `name`, `biography`, `image_url`, `social_links` and recent articles. Staff and wire bylines often have no headshot or bio, and each article's `published_at` is the page's date text such as `September 20, 2026 | 10:06pm`.", + "operationId": "nypost-author", "parameters": [ { - "description": "Canonical NBC News author URL", + "description": "Canonical New York Post author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.nbcnews.com/author/daniella-silva-ncpn211" + "x-example": "https://nypost.com/author/jane-doe/" } ], "produces": [ @@ -414879,7 +430512,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nbc.authorResponseDoc" + "$ref": "#/definitions/publicnews.nypostAuthorResponseDoc" } }, "400": { @@ -414894,12 +430527,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -414912,33 +430539,80 @@ "ApiKeyAuth": [] } ], - "summary": "Get an NBC News author profile", + "summary": "Get a New York Post author profile", "tags": [ - "NBC News" + "New York Post" ] } }, - "/nbc/headlines": { + "/nypost/headlines": { "get": { - "description": "Returns recent NBC News stories for one section. `section` is required and must be one of `news`, `world`, `us-news`, `politics`, `business`, `science` or `health`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "nbc-headlines", + "description": "Returns recent New York Post stories for one section. `section` is required and takes one of 54 slugs, such as `us-news`, `metro`, `nfl`, `business`, `real-estate` or `astrology`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "nypost-headlines", "parameters": [ { - "description": "NBC News RSS section slug: news, world, us-news, politics, business, science, or health", + "description": "New York Post RSS section slug", "enum": [ - "news", - "world", "us-news", + "metro", + "long-island", "politics", + "world-news", + "sports", + "nfl", + "mlb", + "olympics", + "nba", + "nhl", + "college-football", + "college-basketball", + "wnba", + "sports-plus", + "betting", "business", + "opinion", + "entertainment", + "tv", + "movies", + "music", + "celebrities", + "awards", + "theater", + "shopping", + "lifestyle", + "weird-but-true", + "sex-and-relationships", + "viral-trends", + "human-interest", + "parenting", + "fashion-and-beauty", + "food-and-drink", + "travel", + "health", + "wellness", + "fitness", + "health-care", + "medicine", + "mens-health", + "womens-health", + "mental-health", + "nutrition", + "real-estate", + "alexa", + "media", + "tech", "science", - "health" + "space", + "environment", + "wildlife", + "archaeology", + "astrology" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "news" + "x-example": "us-news" } ], "produces": [ @@ -414948,7 +430622,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nbc.headlinesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -414957,18 +430631,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -414981,16 +430643,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get NBC News section headlines", + "summary": "Get New York Post section headlines", "tags": [ - "NBC News" + "New York Post" ] } }, - "/nbc/news": { + "/nypost/news": { "get": { - "description": "Returns the current NBC News top stories across the site, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nbc-headlines` to read one section.", - "operationId": "nbc-news", + "description": "Returns the current New York Post top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nypost-headlines` to read a single section.", + "operationId": "nypost-news", "produces": [ "application/json" ], @@ -414998,7 +430660,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nbc.newsResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -415019,16 +430681,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get NBC News top stories", + "summary": "Get New York Post top stories", "tags": [ - "NBC News" + "New York Post" ] } }, - "/nbc/sections": { + "/nypost/sections": { "get": { - "description": "Lists the seven NBC News section slugs accepted by `nbc-headlines`: `news`, `world`, `us-news`, `politics`, `business`, `science` and `health`. Each entry has its `slug`, display `name` and `url`.", - "operationId": "nbc-sections", + "description": "Lists the 54 New York Post section slugs accepted by `nypost-headlines`, such as `us-news`, `politics`, `nfl`, `celebrities` and `mental-health`. Each entry has its `slug`, display `name` and `url`.", + "operationId": "nypost-sections", "produces": [ "application/json" ], @@ -415036,13 +430698,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nbc.sectionsResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -415051,24 +430707,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get NBC News RSS sections", + "summary": "Get New York Post RSS sections", "tags": [ - "NBC News" + "New York Post" ] } }, - "/ndtv/article": { + "/nyt/article": { "get": { - "description": "Returns public NDTV article metadata and body paragraphs from a canonical article URL. premium is true for NDTV Premium stories; paragraphs are always the text NDTV serves on its public page.", - "operationId": "ndtv-article", + "description": "Returns a New York Times article by canonical `url`, with `title`, `description`, `published_at`, `updated_at`, `section`, `authors`, `keywords`, `image_url` and the body `paragraphs` in order. Query strings and fragments are stripped. A subscription barrier returns `403`, and non-article or non-NYT URLs return `400`.", + "operationId": "nyt-article", "parameters": [ { - "description": "Canonical NDTV article URL", + "description": "Canonical NYT article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.ndtv.com/india-news/indias-power-shortage-tops-summer-levels-as-el-nino-dries-up-hydropower-12091489" + "x-example": "https://www.nytimes.com/2026/09/20/us/politics/example-story.html" } ], "produces": [ @@ -415078,7 +430734,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvArticleResponseDoc" + "$ref": "#/definitions/nyt.articleResponseDoc" } }, "400": { @@ -415087,12 +430743,24 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -415105,33 +430773,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get NDTV article content", + "summary": "Get a New York Times article's content", "tags": [ - "NDTV" + "New York Times" ] } }, - "/ndtv/author": { + "/nyt/author": { "get": { - "description": "Returns an NDTV author's or news agency's byline profile (name, role, biography, image) and one page of authored news stories from a canonical author URL. Request sequential pages until articles is empty; NDTV does not expose a total count.", - "operationId": "ndtv-author", + "description": "Returns one New York Times contributor's public byline page: name, tagline, About/Contact panels, and their recent articles from a canonical author URL.", + "operationId": "nyt-author", "parameters": [ { - "description": "Canonical NDTV author or agency URL", + "description": "Canonical NYT author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.ndtv.com/authors/ritu-singh-6082" - }, - { - "default": 1, - "description": "1-based authored news story page; request sequentially until articles is empty", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" + "x-example": "https://www.nytimes.com/by/maggie-haberman" } ], "produces": [ @@ -415141,7 +430800,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvAuthorResponseDoc" + "$ref": "#/definitions/nyt.authorResponseDoc" } }, "400": { @@ -415150,12 +430809,24 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -415168,84 +430839,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get an NDTV author profile", + "summary": "Get a New York Times contributor profile", "tags": [ - "NDTV" + "New York Times" ] } }, - "/ndtv/headlines": { + "/nyt/categories": { "get": { - "description": "Returns the current story cards from one NDTV section page: title, canonical URL, and, where the section shows them, summary, publication time, byline, and image.", - "operationId": "ndtv-headlines", - "parameters": [ - { - "description": "NDTV section slug from ndtv-sections", - "enum": [ - "latest", - "india", - "world", - "world-india-global", - "world-diaspora", - "opinion", - "spotlight", - "business-news", - "south", - "cities", - "bangalore-news", - "chennai-news", - "delhi-news", - "mumbai-news", - "others-news", - "ahmedabad-news", - "allahabad-news", - "amritsar-news", - "bhopal-news", - "bhubaneshwar-news", - "chandigarh-news", - "ghaziabad-news", - "goa-news", - "gurgaon-news", - "guwahati-news", - "hyderabad-news", - "jaipur-news", - "kanpur-news", - "kolkata-news", - "lucknow-news", - "noida-news", - "patna-news", - "pune-news", - "srinagar-news", - "thiruvananthapuram-news", - "andhra-pradesh-news", - "karnataka-news", - "kerala-news", - "tamil-nadu-news", - "telangana-news", - "education", - "education-exams-news", - "education-school-news", - "education-campus-news", - "education-study-abroad", - "education-latest", - "health", - "entertainment", - "lifestyle", - "food", - "travel", - "auto", - "science", - "offbeat", - "trends", - "feature" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "latest" - } - ], + "description": "Lists the public New York Times editorial navigation taxonomy, including top-level categories and nested destinations. Use /nyt/sections for the separately verified RSS-backed section values accepted by /nyt/headlines; product links, newsletters, and podcasts are not included as article categories.", + "operationId": "nyt-categories", "produces": [ "application/json" ], @@ -415253,11 +430856,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/nyt.categoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -415274,25 +430877,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get NDTV section headlines", + "summary": "List New York Times navigation categories", "tags": [ - "NDTV" + "New York Times" ] } }, - "/ndtv/latest-videos": { + "/nyt/headlines": { "get": { - "description": "Returns one page from NDTV's separate latest-videos feed. This feed is not a category slug; use page sequentially. Results contain metadata only, with no media bytes or player URLs.", - "operationId": "ndtv-latest-videos", + "description": "Returns a New York Times section RSS feed: each story's title, canonical URL, description, author, publication time, and lead image. Section must be a slug returned by /nyt/sections.", + "operationId": "nyt-headlines", "parameters": [ { - "default": 1, - "description": "1-based latest-video page", + "description": "Section slug from /nyt/sections", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "section", + "required": true, + "type": "string", + "x-example": "World" } ], "produces": [ @@ -415302,7 +430904,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvLatestVideosResponseDoc" + "$ref": "#/definitions/nyt.headlinesResponseDoc" } }, "400": { @@ -415317,6 +430919,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -415329,26 +430937,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get NDTV latest videos", + "summary": "Get the latest stories in a New York Times section", "tags": [ - "NDTV" + "New York Times" ] } }, - "/ndtv/live-blog": { + "/nyt/sections": { "get": { - "description": "Returns the metadata and ordered updates of an NDTV live blog, given its canonical article `url`. The blog carries title, description, section, authors, image and publish and update times. Each update has its title, URL, body text, timestamps, authors and image when NDTV gives them. A regular article URL is rejected with an error.", - "operationId": "ndtv-live-blog", - "parameters": [ - { - "description": "Canonical NDTV live-blog article URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.ndtv.com/business-news/stock-market-live-updates-12112191" - } - ], + "description": "Lists the New York Times section slugs accepted by `nyt-headlines`, such as `World` and `Business`, each with its display `name` and `url`. It covers only the sections that endpoint takes; use `nyt-categories` for the broader site navigation, including Politics, DealBook and Wirecutter.", + "operationId": "nyt-sections", "produces": [ "application/json" ], @@ -415356,7 +430954,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvLiveBlogResponseDoc" + "$ref": "#/definitions/nyt.sectionsResponseDoc" } }, "400": { @@ -415365,8 +430963,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -415383,25 +430981,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get structured updates from an NDTV live blog", + "summary": "List New York Times sections", "tags": [ - "NDTV" + "New York Times" ] } }, - "/ndtv/live-blogs": { + "/nzherald/article": { "get": { - "description": "Returns one page of public NDTV live-blog cards. Pages include only www.ndtv.com live blogs; sister-site cards are excluded. NDTV does not expose a total count or continuation marker; request sequential pages until the upstream reports not found.", - "operationId": "ndtv-live-blogs", + "description": "Returns public NZ Herald article metadata and body paragraphs from a canonical article URL. A premium (subscriber-only) article URL returns a permission error instead of a partial or fabricated body.", + "operationId": "nzherald-article", "parameters": [ { - "default": 1, - "description": "1-based index page", + "description": "Canonical NZ Herald article URL", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.nzherald.co.nz/nz/example-article-slug/ABCDEFGHIJKLMNOPQRST1234/" } ], "produces": [ @@ -415411,7 +431008,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvLiveBlogsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -415420,6 +431017,12 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { @@ -415438,16 +431041,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get NDTV live-blog index", + "summary": "Get NZ Herald article content", "tags": [ - "NDTV" + "NZ Herald" ] } }, - "/ndtv/news": { + "/nzherald/author": { "get": { - "description": "Returns the stories NDTV published in roughly the last two days, newest first, from its public news sitemap: title, canonical URL, publication time, keywords, and lead image.", - "operationId": "ndtv-news", + "description": "Returns an NZ Herald author profile from a required `url` in the form `https://www.nzherald.co.nz/author//`. The response has `name`, `job_title`, `location`, `email`, `biography`, `image_url` and recent articles. Each field reflects what the author's page shows, and article `published_at` is RFC3339 where the page gives a machine-readable timestamp.", + "operationId": "nzherald-author", + "parameters": [ + { + "description": "Canonical NZ Herald author URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.nzherald.co.nz/author/jane-doe/" + } + ], "produces": [ "application/json" ], @@ -415455,11 +431068,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/publicnews.nzheraldAuthorResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -415476,33 +431095,70 @@ "ApiKeyAuth": [] } ], - "summary": "Get NDTV latest stories", + "summary": "Get an NZ Herald author profile", "tags": [ - "NDTV" + "NZ Herald" ] } }, - "/ndtv/search": { + "/nzherald/headlines": { "get": { - "description": "Returns one page of NDTV's public news topic results (15 story cards per page). Unknown topics return 404. The result page supports no sort or filter parameters.", - "operationId": "ndtv-search", + "description": "Returns recent NZ Herald headlines for one section. `section` is required and takes a slug listed by `nzherald-sections`, such as `nz`, `business`, `rugby`, `politics` or `world`. Each item has a title and URL. A URL may point at a premium article, which `nzherald-article` rejects with a permission error.", + "operationId": "nzherald-headlines", "parameters": [ { - "description": "Search terms", + "description": "NZ Herald section slug", + "enum": [ + "business", + "markets-with-madison", + "media-insider", + "business-reports", + "small-business", + "personal-finance", + "economy", + "companies", + "markets", + "entertainment", + "lifestyle", + "society-insider", + "nz", + "crime", + "education", + "politics", + "trailblazers", + "property", + "sport", + "commonwealth-games", + "cricket", + "olympics", + "paralympics", + "rugby", + "rugby-league", + "football", + "basketball", + "golf", + "boxing", + "netball", + "athletics", + "cycling", + "motorsport", + "racing", + "sailing", + "tennis", + "ufc", + "technology", + "travel", + "travel-news", + "world", + "kahu", + "talanoa", + "the-selection" + ], "in": "query", - "name": "query", + "name": "section", "required": true, "type": "string", - "x-example": "climate change" - }, - { - "default": 1, - "description": "1-based result page", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" + "x-example": "business" } ], "produces": [ @@ -415512,7 +431168,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvSearchResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -415521,12 +431177,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -415539,52 +431189,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search NDTV news stories", - "tags": [ - "NDTV" - ] - } - }, - "/ndtv/sections": { - "get": { - "description": "Lists the NDTV section slugs accepted by `ndtv-headlines`, each with its display name and page URL. They cover national and world news (`latest`, `india`, `world`), city and state pages such as `mumbai-news` and `kerala-news`, and topics such as `education` and `food`. `spotlight` is NDTV's Premium hub; video, podcasts and sister sites are excluded.", - "operationId": "ndtv-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get NDTV sections", + "summary": "Get NZ Herald section headlines", "tags": [ - "NDTV" + "NZ Herald" ] } }, - "/ndtv/video": { + "/nzherald/news": { "get": { - "description": "Returns title, description, publication time, duration, and thumbnail metadata from one canonical NDTV video page. It does not fetch or return video media or player URLs.", - "operationId": "ndtv-video", - "parameters": [ - { - "description": "Canonical NDTV video URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.ndtv.com/video/revanth-reddy-under-bjp-fire-over-ram-god-of-rich-shiva-of-poor-remarks-1166049" - } - ], + "description": "Returns the current New Zealand Herald top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nzherald-headlines` to read one section.", + "operationId": "nzherald-news", "produces": [ "application/json" ], @@ -415592,17 +431206,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvVideoResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -415619,16 +431227,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get NDTV video metadata", + "summary": "Get NZ Herald top stories", "tags": [ - "NDTV" + "NZ Herald" ] } }, - "/ndtv/video-categories": { + "/nzherald/sections": { "get": { - "description": "Returns the live-verified NDTV-hosted category slugs accepted by ndtv-videos. Categories hosted on sister domains, Shorts, and unavailable Faith are excluded.", - "operationId": "ndtv-video-categories", + "description": "Lists the NZ Herald section slugs accepted by `nzherald-headlines`, such as `nz`, `business`, `rugby`, `technology` and `world`. Each entry has its `slug`, a display `name` (for example `New Zealand` for `nz`) and a `url`.", + "operationId": "nzherald-sections", "produces": [ "application/json" ], @@ -415636,7 +431244,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvVideoCategoriesResponseDoc" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -415645,51 +431253,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get NDTV video categories", + "summary": "Get NZ Herald sections", "tags": [ - "NDTV" + "NZ Herald" ] } }, - "/ndtv/videos": { + "/ohpolly/collections": { "get": { - "description": "Returns one page of metadata cards from a supported NDTV-hosted video category. Use ndtv-video-categories to discover the complete supported category set; request pages sequentially. This returns no media bytes or player URLs.", - "operationId": "ndtv-videos", + "consumes": [ + "application/json" + ], + "description": "Returns collections from Oh Polly (https://www.ohpolly.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", + "operationId": "ohpolly-collections", "parameters": [ { - "description": "NDTV video category slug from ndtv-video-categories", - "enum": [ - "news", - "business", - "entertainment", - "auto", - "exclusive", - "features", - "environment", - "fashion", - "travel", - "elections", - "comedy", - "property", - "art", - "beauty", - "lifestyle", - "tech360" - ], + "description": "1-based page, defaults to 1", "in": "query", - "name": "category", - "required": true, - "type": "string", - "x-example": "news" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "default": 1, - "description": "1-based category result page", + "description": "Maximum collections, defaults to 50 and supports up to 250", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -415699,7 +431289,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ndtvVideosResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, "400": { @@ -415708,8 +431298,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -415726,24 +431316,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get videos from an NDTV category", + "summary": "List Oh Polly collections", "tags": [ - "NDTV" + "Oh Polly" ] } }, - "/news18/article": { + "/ohpolly/collections/{handle}/products": { "get": { - "description": "Returns a News18 article by canonical `url` in the form `/
/-.html`, optionally with a subsection. The response has title, description, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`. `section` is the article's own category, so it can be a subsection such as `business/markets` that `news18-sections` does not list.", - "operationId": "news18-article", + "consumes": [ + "application/json" + ], + "description": "Returns products from one Oh Polly (https://www.ohpolly.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", + "operationId": "ohpolly-collection-products", "parameters": [ { - "description": "Canonical News18 article URL", - "in": "query", - "name": "url", + "description": "Collection handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "https://www.news18.com/india/example-article-slug-10350678.html" + "x-example": "collection-handle" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -415753,7 +431360,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { @@ -415768,6 +431375,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -415780,24 +431393,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get News18 article content", + "summary": "List Oh Polly collection products", "tags": [ - "News18" + "Oh Polly" ] } }, - "/news18/author": { + "/ohpolly/pages": { "get": { - "description": "Returns a News18 author profile from a required `url` in the form `https://www.news18.com/byline/.html`. The response has `name`, `biography`, `image_url`, `social_links` (whichever of website, X/Twitter, Facebook, Instagram, YouTube and LinkedIn are set) and recent articles with `published_at` in RFC3339 UTC. Wire and staff bylines often have no bio or links.", - "operationId": "news18-author", + "consumes": [ + "application/json" + ], + "description": "Lists Oh Polly's static pages, paged with `page` (default 1) and `limit` (default 50, max 250). Each page has its handle, title, URL, plain-text content and timestamps. In some responses `transport_mode` is `ssr_embedded` and items carry only `handle`, `url` and `updated_at`, so fetch a single page for its content.", + "operationId": "ohpolly-pages", "parameters": [ { - "description": "Canonical News18 author URL", + "description": "1-based page, defaults to 1", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.news18.com/byline/jane-doe-12345.html" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum static pages, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -415807,7 +431429,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.news18AuthorResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { @@ -415816,8 +431438,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -415834,44 +431456,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a News18 author profile", + "summary": "List Oh Polly static pages", "tags": [ - "News18" + "Oh Polly" ] } }, - "/news18/headlines": { + "/ohpolly/pages/{handle}": { "get": { - "description": "Returns recent News18 stories for one section. `section` is required and takes one of 18 slugs, such as `india`, `cricket`, `elections`, `viral` or `breaking-news`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "news18-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one Oh Polly static page by its `handle`: title, page URL, plain-text content, and created, published and updated times. Content is cleaned text, not HTML. An unknown handle returns 404. The store is fixed to Oh Polly, so no store URL is needed. Some responses include `transport_mode` set to `ssr_embedded` and omit `id`.", + "operationId": "ohpolly-page", "parameters": [ { - "description": "News18 RSS section slug", - "enum": [ - "india", - "world", - "cricket", - "business", - "sports", - "movies", - "lifestyle", - "tech", - "auto", - "opinion", - "elections", - "politics", - "viral", - "explainers", - "education-career", - "astrology", - "cities", - "breaking-news" - ], - "in": "query", - "name": "section", + "description": "Page handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "india" + "x-example": "page-handle" } ], "produces": [ @@ -415881,7 +431486,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, "400": { @@ -415890,6 +431495,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -415902,16 +431519,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get News18 section headlines", + "summary": "Get a Oh Polly static page", "tags": [ - "News18" + "Oh Polly" ] } }, - "/news18/news": { + "/ohpolly/products": { "get": { - "description": "Returns the current News18 top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `news18-headlines` to read one section.", - "operationId": "news18-news", + "consumes": [ + "application/json" + ], + "description": "Returns products from Oh Polly's (https://www.ohpolly.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "ohpolly-products", + "parameters": [ + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + } + ], "produces": [ "application/json" ], @@ -415919,7 +431555,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -415940,50 +431582,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get News18 top stories", + "summary": "List Oh Polly products", "tags": [ - "News18" + "Oh Polly" ] } }, - "/news18/sections": { + "/ohpolly/products/{handle}": { "get": { - "description": "Lists the 18 News18 section slugs accepted by `news18-headlines`, such as `india`, `world`, `cricket`, `explainers` and `education-career`. Each entry has its `slug`, display `name` and `url`.", - "operationId": "news18-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get News18 RSS sections", - "tags": [ - "News18" - ] - } - }, - "/news24/article": { - "get": { - "description": "Returns public News24 article metadata and body paragraphs from a canonical article URL. Subscriber-only articles return the standfirst as the only paragraph with paywalled set to true.", - "operationId": "news24-article", + "description": "Returns product detail for one Oh Polly (https://www.ohpolly.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "ohpolly-product", "parameters": [ { - "description": "Canonical News24 article URL", - "in": "query", - "name": "url", + "description": "Product handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "https://www.news24.com/world/untangling-the-meth-mexican-cartels-set-up-huge-labs-in-sa-to-service-demand-in-australia-20260924-0692" + "x-example": "product-handle" } ], "produces": [ @@ -415993,7 +431612,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { @@ -416008,6 +431627,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -416020,99 +431645,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get News24 article content", + "summary": "Get a Oh Polly product", "tags": [ - "News24" + "Oh Polly" ] } }, - "/news24/headlines": { + "/ohpolly/products/{handle}/recommendations": { "get": { - "description": "Returns News24 headlines for one section. `section` is required and takes a path such as `business/markets`, `sport/rugby/springboks` or `politics`, from the 73 listed by `news24-sections`. Each item has a title and URL, and `type` is `subscriber` on cards News24 marks subscriber-only. Summary, author, publication time and image appear when available.", - "operationId": "news24-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns recommended products for one Oh Polly (https://www.ohpolly.com) product handle. The storefront URL is fixed server-side.", + "operationId": "ohpolly-product-recommendations", "parameters": [ { - "description": "News24 section path", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "product-handle" + }, + { + "description": "Maximum products, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", "enum": [ - "business", - "business/climate-future", - "business/climate-future/energy", - "business/climate-future/environment", - "business/climate-future/news", - "business/climate-future/solutions", - "business/companies", - "business/consumer-lookout", - "business/economy", - "business/markets", - "business/money", - "business/opinion", - "business/tech", - "investigations", - "investigations/eskomfiles", - "investigations/phala-phala", - "investigations/silenced", - "life", - "life/arts-and-entertainment", - "life/books", - "life/food", - "life/lifestyle-trends", - "life/motoring", - "life/relationships", - "life/travel", - "life/wellness", - "life/wine", - "opinions", - "opinions/analysis", - "opinions/cartoons", - "opinions/columnists", - "opinions/explainers", - "opinions/fridaybriefing/editions", - "opinions/letters", - "opinions/reader-hub", - "politics", - "southafrica", - "southafrica/crime-and-courts", - "southafrica/debunking", - "southafrica/education", - "southafrica/good-news", - "southafrica/good-news/outdoor", - "southafrica/health-news", - "southafrica/schools-hub", - "southafrica/weather", - "specialreports", - "sport", - "sport/columnists", - "sport/cricket", - "sport/cricket/proteas", - "sport/cricket/sa20", - "sport/golf", - "sport/motorsport", - "sport/motorsport/formula-one", - "sport/other-sport", - "sport/rugby", - "sport/rugby/bulls", - "sport/rugby/cheetahs", - "sport/rugby/lions", - "sport/rugby/pnpgoldcup", - "sport/rugby/sharks", - "sport/rugby/springboks", - "sport/rugby/stormers", - "sport/rugby/urc", - "sport/soccer", - "sport/soccer/bafana-bafana-and-banyana-banyana", - "sport/soccer/english-premier-league", - "sport/soccer/psl", - "sport/soccer/worldcup", - "sport/tennis", - "sunday", - "world", - "world/africa" + "related", + "complementary" ], "in": "query", - "name": "section", - "required": true, + "name": "intent", "type": "string", - "x-example": "business" + "x-example": "related" } ], "produces": [ @@ -416122,7 +431693,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -416131,37 +431702,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get News24 section headlines", - "tags": [ - "News24" - ] - } - }, - "/news24/news": { - "get": { - "description": "Returns the current News24 top stories, with no parameters. Each item has a title, canonical URL and image. `type` is `subscriber` when News24 marks the story subscriber-only and is omitted for freely readable stories.", - "operationId": "news24-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -416181,56 +431726,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get News24 top stories", + "summary": "List Oh Polly product recommendations", "tags": [ - "News24" + "Oh Polly" ] } }, - "/news24/sections": { + "/ohpolly/search/suggest": { "get": { - "description": "Lists the 73 News24 sections accepted by `news24-headlines`. Each entry has a `slug` (the URL path under news24.com, which may contain `/`, as in `sport/rugby/springboks`), a display `name` and a page `url`. Top-level groups include `business`, `life`, `opinions`, `southafrica`, `sport` and `world`.", - "operationId": "news24-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } + "description": "Returns products, collections, and query suggestions from Oh Polly's (https://www.ohpolly.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "ohpolly-search-suggest", + "parameters": [ + { + "description": "Search query", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "wool" }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Get News24 sections", - "tags": [ - "News24" - ] - } - }, - "/newscomau/article": { - "get": { - "description": "Returns a News.com.au article by canonical `url`, which must be a `www.news.com.au` link ending in `/news-story/<32-character-id>`. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`. `authors` is empty for wire or agency pieces with no byline.", - "operationId": "newscomau-article", - "parameters": [ + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "in": "query", + "name": "types", + "type": "string", + "x-example": "product,collection,query" + }, { - "description": "Canonical News.com.au article URL", + "description": "Maximum results per type, defaults to 10 and supports up to 20", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.news.com.au/national/example-headline/news-story/0123456789abcdef0123456789abcdef" + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -416240,7 +431770,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { @@ -416249,8 +431779,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -416267,24 +431797,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get News.com.au article content", + "summary": "Get Oh Polly search suggestions", "tags": [ - "News.com.au" + "Oh Polly" ] } }, - "/newscomau/author": { + "/ohpolly/sitemap/urls": { "get": { - "description": "Returns a News.com.au staff writer's profile (name, job title, headshot, biography, social links) and recent articles from a canonical author URL.", - "operationId": "newscomau-author", + "consumes": [ + "application/json" + ], + "description": "Returns capped URL entries from Oh Polly's (https://www.ohpolly.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", + "operationId": "ohpolly-sitemap-urls", "parameters": [ { - "description": "Canonical News.com.au author URL", + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], "in": "query", - "name": "url", - "required": true, + "name": "type", "type": "string", - "x-example": "https://www.news.com.au/the-team/example-writer" + "x-example": "products" + }, + { + "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -416294,7 +431842,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newscomauAuthorResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" } }, "400": { @@ -416303,8 +431851,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -416321,26 +431869,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a News.com.au author profile", + "summary": "List Oh Polly sitemap URLs", "tags": [ - "News.com.au" + "Oh Polly" ] } }, - "/newscomau/headlines": { + "/ohpolly/sitemaps": { "get": { - "description": "Returns fresh headlines from one News.com.au section or category listing page. section accepts any slug returned by GET /newscomau/sections (236 values, too many to enumerate inline -- see that endpoint for the full, current list), for example \"national\" or the nested \"national/nsw-act/politics\".", - "operationId": "newscomau-headlines", - "parameters": [ - { - "description": "News.com.au section slug, from GET /newscomau/sections", - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "national" - } + "consumes": [ + "application/json" ], + "description": "Returns child sitemap URLs from Oh Polly's (https://www.ohpolly.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", + "operationId": "ohpolly-sitemaps", "produces": [ "application/json" ], @@ -416348,7 +431889,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" } }, "400": { @@ -416357,6 +431898,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -416369,16 +431916,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get News.com.au section headlines", + "summary": "List Oh Polly sitemaps", "tags": [ - "News.com.au" + "Oh Polly" ] } }, - "/newscomau/news": { + "/ohpolly/store": { "get": { - "description": "Returns the current News.com.au top stories, with no parameters and no section filter. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "newscomau-news", + "consumes": [ + "application/json" + ], + "description": "Returns storefront metadata for Oh Polly (https://www.ohpolly.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "ohpolly-store", "produces": [ "application/json" ], @@ -416386,7 +431936,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -416407,16 +431963,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get News.com.au top stories", + "summary": "Get Oh Polly store metadata", "tags": [ - "News.com.au" + "Oh Polly" ] } }, - "/newscomau/sections": { + "/oldnavy/categories": { "get": { - "description": "Returns the full News.com.au section/category navigation inventory (236 entries as of 2026-09-23), each with a slug, display name, and public listing URL. Use a returned slug as the section parameter on GET /newscomau/headlines.", - "operationId": "newscomau-sections", + "consumes": [ + "application/json" + ], + "description": "Lists Old Navy's own storefront navigation as name/cid pairs, resolving the cid-discovery gap oldnavy-search, oldnavy-product, and oldnavy-category all document. Omit cid to list Old Navy's top-level divisions (e.g. Women, Men, Boys, Toddler). Pass a cid (a division's own, or any deeper category's) to list the related categories for that part of the storefront instead, in the same order the live storefront menu shows them -- this is section-level, not necessarily unique per leaf category. Currently only available for brand=on (Old Navy).", + "operationId": "oldnavy-categories", + "parameters": [ + { + "default": "on", + "description": "Storefront to list -- only on (Old Navy) is currently supported", + "enum": [ + "on" + ], + "in": "query", + "name": "brand", + "type": "string" + }, + { + "description": "Category id to list related categories for; omit to list the top-level divisions", + "in": "query", + "name": "cid", + "type": "string", + "x-example": "1185232" + } + ], "produces": [ "application/json" ], @@ -416424,7 +432002,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/oldnavy.categoriesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -416433,24 +432029,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get News.com.au sections", + "summary": "List Old Navy storefront categories", "tags": [ - "News.com.au" + "Old Navy" ] } }, - "/newsmax/article": { + "/oldnavy/category": { "get": { - "description": "Returns a Newsmax article by canonical `url` in the form `/
//YYYY/MM/DD/id/`: title, description, section, authors, lead image, publication and update times, and body `paragraphs`. `authors` may be empty for wire or staff-aggregated stories. Paywalled Platinum URLs are not accepted.", - "operationId": "newsmax-article", + "consumes": [ + "application/json" + ], + "description": "Returns a category/browse listing for one storefront category id (cid). cid is an opaque Gap Inc category id assigned by the storefront's own navigation -- neither oldnavy-search nor oldnavy-category currently surface a category-id list, so find one from the storefront's own category page URLs (the cid query parameter on a /browse/... page) for now. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the cid was found under. Returns the category's subcategory breakdown, product summaries with per-color inventory data, and available search facets with live counts.", + "operationId": "oldnavy-category", "parameters": [ { - "description": "Canonical Newsmax article URL", + "description": "Category id, from a storefront category page's own cid query parameter", "in": "query", - "name": "url", + "name": "cid", "required": true, "type": "string", - "x-example": "https://www.newsmax.com/newsfront/example-article-slug/2026/09/23/id/1270487/" + "x-example": "85729" + }, + { + "default": "on", + "description": "Storefront to browse", + "enum": [ + "on", + "gap", + "br", + "at" + ], + "in": "query", + "name": "brand", + "type": "string" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" } ], "produces": [ @@ -416460,7 +432081,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/oldnavy.categoryResponseDoc" } }, "400": { @@ -416475,6 +432096,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -416487,24 +432114,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get Newsmax article content", + "summary": "Browse an Old Navy, Gap, Banana Republic, or Athleta category", "tags": [ - "Newsmax" + "Old Navy" ] } }, - "/newsmax/author": { + "/oldnavy/product": { "get": { - "description": "Returns a Newsmax Insiders (opinion columnist) profile from a required `url` such as `https://www.newsmax.com/insiders//id-/`. The response has `name`, `biography`, `image_url` and recent columns. `biography` is omitted when Newsmax's separate profile page is unavailable, and article `published_at` is date text such as `Sep 23, 2026`.", - "operationId": "newsmax-author", + "consumes": [ + "application/json" + ], + "description": "Returns product-detail data for one color variant: name, description, images, aggregate rating, and every size offered in that color as a separate priced offer. pid is a color-specific product id, as returned by oldnavy-search's product colors[].id field (not the bare base product id). Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the pid was found under.", + "operationId": "oldnavy-product", "parameters": [ { - "description": "Canonical Newsmax Insiders author URL", + "description": "Color-specific product id, from a search result's colors[].id field", "in": "query", - "name": "url", + "name": "pid", "required": true, "type": "string", - "x-example": "https://www.newsmax.com/insiders/janedoe/id-1234/" + "x-example": "907290012" + }, + { + "default": "on", + "description": "Storefront the pid belongs to", + "enum": [ + "on", + "gap", + "br", + "at" + ], + "in": "query", + "name": "brand", + "type": "string" } ], "produces": [ @@ -416514,7 +432157,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsmaxAuthorResponseDoc" + "$ref": "#/definitions/oldnavy.productResponseDoc" } }, "400": { @@ -416529,6 +432172,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -416541,46 +432190,68 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Newsmax Insiders author profile", + "summary": "Get an Old Navy, Gap, Banana Republic, or Athleta product", "tags": [ - "Newsmax" + "Old Navy" ] } }, - "/newsmax/headlines": { + "/oldnavy/product/availability": { "get": { - "description": "Returns recent Newsmax stories for one section. `section` is required and takes one of 20 slugs, such as `newsfront`, `politics`, `health-news`, `finance-news` or `insiders`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "newsmax-headlines", + "consumes": [ + "application/json" + ], + "description": "Checks per-size, in-store pickup stock status for one color (pid) at one or more physical stores. pid matches oldnavy-product's own color-level id. Give store location either directly with store_id (one or more comma-separated store ids, e.g. from a prior call to this endpoint or a value you already have) or with zip or both lat and lng, which resolves the nearest stores automatically. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Each returned store lists every offered size's stock status: `in_stock`, `out_of_stock`, or `low_stock`.", + "operationId": "oldnavy-product-availability", "parameters": [ { - "description": "Newsmax RSS section slug", + "description": "Color-level Old Navy/Gap/Banana Republic/Athleta product id", + "in": "query", + "name": "pid", + "required": true, + "type": "string", + "x-example": "907290012" + }, + { + "default": "on", + "description": "Storefront to check", "enum": [ - "newsfront", - "us", - "politics", - "thewire", - "scitech", - "health-news", - "cancer", - "brain-health", - "diet-and-fitness", - "diabetes", - "natural-health", - "anti-aging", - "finance-headlines", - "street-talk", - "finance-news", - "economy", - "companies", - "investing-analysis", - "global-talk", - "insiders" + "on", + "gap", + "br", + "at" ], "in": "query", - "name": "section", - "required": true, + "name": "brand", + "type": "string" + }, + { + "description": "One or more comma-separated numeric store ids", + "in": "query", + "name": "store_id", "type": "string", - "x-example": "newsfront" + "x-example": "3444" + }, + { + "description": "Zip code to resolve the nearest stores from", + "in": "query", + "name": "zip", + "type": "string", + "x-example": "10001" + }, + { + "description": "Latitude to resolve the nearest stores from (must be given together with lng)", + "in": "query", + "name": "lat", + "type": "number", + "x-example": 40.7128 + }, + { + "description": "Longitude to resolve the nearest stores from (must be given together with lat)", + "in": "query", + "name": "lng", + "type": "number", + "x-example": -74.006 } ], "produces": [ @@ -416590,7 +432261,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/oldnavy.availabilityResponseDoc" } }, "400": { @@ -416599,6 +432270,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -416611,16 +432294,51 @@ "ApiKeyAuth": [] } ], - "summary": "Get Newsmax section headlines", + "summary": "Check in-store pickup stock for an Old Navy, Gap, Banana Republic, or Athleta product", "tags": [ - "Newsmax" + "Old Navy" ] } }, - "/newsmax/news": { + "/oldnavy/product/reviews": { "get": { - "description": "Returns the current Newsmax top stories from the Newsfront section, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `newsmax-headlines` for other sections.", - "operationId": "newsmax-news", + "consumes": [ + "application/json" + ], + "description": "Returns one page of a product's customer reviews (author, date, rating, headline, body, and verified-purchase flag), plus the product's overall rating summary (average rating, rating count, per-star histogram, and recommended ratio). pid is a color-specific product id, as returned by oldnavy-search's product colors[].id field (not the bare base product id) -- the same pid oldnavy-product accepts. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the pid was found under. A product with no reviews yet returns a well-formed empty result, not an error.", + "operationId": "oldnavy-product-reviews", + "parameters": [ + { + "description": "Color-specific product id, from a search result's colors[].id field", + "in": "query", + "name": "pid", + "required": true, + "type": "string", + "x-example": "907290012" + }, + { + "default": "on", + "description": "Storefront the pid belongs to", + "enum": [ + "on", + "gap", + "br", + "at" + ], + "in": "query", + "name": "brand", + "type": "string" + }, + { + "default": 1, + "description": "One-based page, 10 reviews per page", + "in": "query", + "maximum": 1000, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -416628,7 +432346,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/oldnavy.productReviewsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -416649,50 +432379,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get Newsmax top stories", + "summary": "Get reviews for an Old Navy, Gap, Banana Republic, or Athleta product", "tags": [ - "Newsmax" + "Old Navy" ] } }, - "/newsmax/sections": { + "/oldnavy/search": { "get": { - "description": "Lists the 20 Newsmax section slugs accepted by `newsmax-headlines`, such as `newsfront`, `scitech`, `street-talk` and `global-talk`. Each entry has its `slug`, display `name` and `url`. `insiders` is the combined opinion section, and `finance-headlines` is the finance section's Headlines listing.", - "operationId": "newsmax-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Newsmax RSS sections", - "tags": [ - "Newsmax" - ] - } - }, - "/newsweek/article": { - "get": { - "description": "Returns a Newsweek article by canonical `url`, which must be a `newsweek.com` link ending in a numeric article id. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`.", - "operationId": "newsweek-article", + "description": "Searches product listings across Old Navy, Gap, Banana Republic, and Athleta -- select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Returns product summaries with pricing, review scores, and every purchasable color variant. This search is best-effort relevance, not a guaranteed keyword match: for an obscure or nonsense keyword the upstream search index falls back to its own recommended results instead of returning an empty list, and there is currently no reliable signal in the response to distinguish a true keyword match from that fallback behavior.", + "operationId": "oldnavy-search", "parameters": [ { - "description": "Canonical Newsweek article URL", + "description": "Search keyword", "in": "query", - "name": "url", + "name": "keyword", "required": true, "type": "string", - "x-example": "https://www.newsweek.com/example-article-1234567" + "x-example": "jeans" + }, + { + "default": "on", + "description": "Storefront to search", + "enum": [ + "on", + "gap", + "br", + "at" + ], + "in": "query", + "name": "brand", + "type": "string" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" } ], "produces": [ @@ -416702,7 +432431,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/oldnavy.searchResponseDoc" } }, "400": { @@ -416717,6 +432446,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -416729,37 +432464,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get Newsweek article content", + "summary": "Search Old Navy, Gap, Banana Republic, or Athleta products", "tags": [ - "Newsweek" + "Old Navy" ] } }, - "/newsweek/author": { + "/oldnavy/stores": { "get": { - "description": "Returns a Newsweek author profile by `slug` (for example `jennifer-fink`) or a newsweek.com authors `url`; supply exactly one. `page` selects the 1-based page of recent articles (default 1) and overrides any page in `url`. The response has `name`, `job_title`, `bio`, `email`, `image_url`, articles and `has_next_page`; a page past the end gives an empty `articles` list, not an error.", - "operationId": "newsweek-author", + "consumes": [ + "application/json" + ], + "description": "Searches physical store locations for one storefront by free-text search (zip code or city) and/or coordinates. Provide search, or both lat and lng. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Returns each nearby store's name, full address, phone number, coordinates, distance, and specialties (e.g. \"In-Store Shopping\", \"Outlet\"). This is location search only -- it does not report per-item, per-store stock levels; use oldnavy-product-availability for that.", + "operationId": "oldnavy-stores", "parameters": [ { - "description": "Author slug, e.g. jennifer-fink", + "description": "Zip code or city to search near", "in": "query", - "name": "slug", + "name": "search", "type": "string", - "x-example": "jennifer-fink" + "x-example": "10001" }, { - "description": "Canonical newsweek.com/authors/ URL, optionally with a ?page= query; alternative to slug", + "description": "Latitude (must be given together with lng)", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.newsweek.com/authors/jennifer-fink" + "name": "lat", + "type": "number", + "x-example": 40.7128 }, { - "default": 1, - "description": "1-based page number; overrides any page number in url", + "description": "Longitude (must be given together with lat)", "in": "query", - "name": "page", - "type": "integer" + "name": "lng", + "type": "number", + "x-example": -74.006 + }, + { + "default": "on", + "description": "Storefront to search", + "enum": [ + "on", + "gap", + "br", + "at" + ], + "in": "query", + "name": "brand", + "type": "string" } ], "produces": [ @@ -416769,7 +432520,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsweekAuthorResponseDoc" + "$ref": "#/definitions/oldnavy.storesResponseDoc" } }, "400": { @@ -416778,8 +432529,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -416796,47 +432547,44 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Newsweek author profile", + "summary": "Find Old Navy, Gap, Banana Republic, or Athleta store locations", "tags": [ - "Newsweek" + "Old Navy" ] } }, - "/newsweek/headlines": { + "/opensea/activity": { "get": { - "description": "Returns recent Newsweek stories for one section. `section` is required and takes one of 21 slugs, such as `politics`, `fact-check`, `better-planet`, `personal-finance` or `my-turn`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "newsweek-headlines", + "description": "Returns the live cross-collection activity feed — every sale, listing, offer, transfer, and mint OpenSea indexes, newest first, with the collection each event belongs to. Filter with `event_types` for a marketplace-wide trade tape.", + "operationId": "opensea-activity", "parameters": [ { - "description": "Newsweek section slug", + "default": 20, + "description": "Events per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "description": "Comma-separated event types", "enum": [ - "news", - "opinion", - "politics", - "world", - "us", - "business", - "technology", - "health", - "entertainment", - "sports", - "fact-check", - "better-planet", - "life", - "travel", - "pets", - "autos", - "relationships", - "tech-science", - "personal-finance", - "better-workplaces", - "my-turn" + "SALE", + "LISTING", + "OFFER", + "TRANSFER", + "MINT", + "COLLECTION_OFFER", + "TRAIT_OFFER" ], "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "news" + "name": "event_types", + "type": "string" } ], "produces": [ @@ -416846,7 +432594,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/opensea.activityResponseDoc" } }, "400": { @@ -416855,6 +432603,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -416867,16 +432621,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Newsweek section headlines", + "summary": "List marketplace-wide OpenSea activity", "tags": [ - "Newsweek" + "OpenSea" ] } }, - "/newsweek/news": { + "/opensea/categories": { "get": { - "description": "Returns the current Newsweek top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `newsweek-headlines` to read one section.", - "operationId": "newsweek-news", + "description": "Returns OpenSea's category taxonomy as top-level groups and their child categories, with display names. The child slugs are the canonical category identifiers used across the marketplace.", + "operationId": "opensea-categories", "produces": [ "application/json" ], @@ -416884,7 +432638,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/opensea.categoriesResponseDoc" } }, "429": { @@ -416905,16 +432659,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Newsweek top stories", + "summary": "List OpenSea's browse categories", "tags": [ - "Newsweek" + "OpenSea" ] } }, - "/newsweek/sections": { + "/opensea/chains": { "get": { - "description": "Lists the 21 Newsweek section slugs accepted by `newsweek-headlines`, such as `news`, `world`, `us`, `fact-check` and `pets`. Each entry has its `slug`, display `name` and section page `url`.", - "operationId": "newsweek-sections", + "description": "Returns every blockchain OpenSea indexes, with its identifier, display name, and architecture. The identifiers are the accepted values for the `chain` path parameter on the item endpoints.", + "operationId": "opensea-chains", "produces": [ "application/json" ], @@ -416922,7 +432676,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/opensea.chainsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -416931,24 +432697,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Newsweek sections", + "summary": "List the chains OpenSea indexes", "tags": [ - "Newsweek" + "OpenSea" ] } }, - "/newyorker/article": { + "/opensea/collection/{slug}": { "get": { - "description": "Returns public The New Yorker article metadata and body paragraphs from a canonical article URL. The New Yorker uses a metered paywall: when a page marks itself as gated, only the publicly served text is returned and is_truncated is true; is_accessible_for_free reports the page's own access flag.", - "operationId": "newyorker-article", + "description": "Returns public marketplace metadata and trading statistics for one NFT collection: name, description, imagery, verification flag, contract address and chain, social links, current floor price and top collection offer, plus lifetime and rolling one-hour/one-day/seven-day/thirty-day sales, volume, and floor-price change. Delisted and blacklisted collections return 404 rather than an empty payload.", + "operationId": "opensea-collection", "parameters": [ { - "description": "Canonical The New Yorker article URL", - "in": "query", - "name": "url", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.newyorker.com/news/the-lede/example-article-slug" + "x-example": "boredapeyachtclub" } ], "produces": [ @@ -416958,7 +432724,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newyorkerArticleResponseDoc" + "$ref": "#/definitions/opensea.collectionResponseDoc" } }, "400": { @@ -416991,24 +432757,52 @@ "ApiKeyAuth": [] } ], - "summary": "Get The New Yorker article content", + "summary": "Get an OpenSea collection", "tags": [ - "The New Yorker" + "OpenSea" ] } }, - "/newyorker/author": { + "/opensea/collection/{slug}/activity": { "get": { - "description": "Returns a The New Yorker contributor's name, photo, biography, external profile links, and the first page of their recent articles from a canonical contributor URL.", - "operationId": "newyorker-author", + "description": "Returns a cursor-paginated feed of marketplace events for a collection — sales, listings, offers, transfers, mints, and collection/trait offers — with the counterparties, price, marketplace, and transaction hash. Filter with `event_types` to narrow the feed, for example `event_types=SALE` for a sales-only history.", + "operationId": "opensea-collection-activity", "parameters": [ { - "description": "Canonical The New Yorker contributor URL", - "in": "query", - "name": "url", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.newyorker.com/contributors/casey-cep" + "x-example": "boredapeyachtclub" + }, + { + "default": 20, + "description": "Events per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "description": "Comma-separated event types", + "enum": [ + "SALE", + "LISTING", + "OFFER", + "TRANSFER", + "MINT", + "COLLECTION_OFFER", + "TRAIT_OFFER" + ], + "in": "query", + "name": "event_types", + "type": "string" } ], "produces": [ @@ -417018,7 +432812,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newyorkerAuthorResponseDoc" + "$ref": "#/definitions/opensea.activityResponseDoc" } }, "400": { @@ -417051,39 +432845,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The New Yorker contributor profile", + "summary": "List an OpenSea collection's marketplace activity", "tags": [ - "The New Yorker" + "OpenSea" ] } }, - "/newyorker/headlines": { + "/opensea/collection/{slug}/best-deals": { "get": { - "description": "Returns fresh headlines from one public The New Yorker section feed. Section must be one of the slugs returned by the sections endpoint.", - "operationId": "newyorker-headlines", + "description": "Returns the listed items OpenSea surfaces as the best value in a collection, judged against each item's rarity and the collection floor. This is the curated \"best deals\" shelf from the collection page, not a generic price sort.", + "operationId": "opensea-collection-best-deals", "parameters": [ { - "description": "The New Yorker section slug", - "enum": [ - "everything", - "news", - "culture", - "humor", - "magazine", - "business", - "tech", - "daily-comment", - "news-desk", - "cultural-comment", - "photo-booth", - "page-turner", - "borowitz-report" - ], - "in": "query", - "name": "section", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "everything" + "x-example": "boredapeyachtclub" } ], "produces": [ @@ -417093,7 +432872,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/opensea.itemsShelfResponseDoc" } }, "400": { @@ -417102,6 +432881,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -417120,16 +432905,51 @@ "ApiKeyAuth": [] } ], - "summary": "Get The New Yorker section headlines", + "summary": "List an OpenSea collection's best-value listings", "tags": [ - "The New Yorker" + "OpenSea" ] } }, - "/newyorker/news": { + "/opensea/collection/{slug}/chart": { "get": { - "description": "Returns fresh The New Yorker top stories from its public RSS feed: title, canonical URL, summary, author, publication time, lead image, and the department label (for example \"News / The Lede\").", - "operationId": "newyorker-news", + "description": "Returns a time series for a collection — either its floor price or its traded volume — over the requested window, with each sample in both the settlement token and USD. Use `metric=floor_price` for the floor line and `metric=volume` for the volume bars.", + "operationId": "opensea-collection-chart", + "parameters": [ + { + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "boredapeyachtclub" + }, + { + "default": "floor_price", + "description": "Series to return", + "enum": [ + "floor_price", + "volume" + ], + "in": "query", + "name": "metric", + "type": "string" + }, + { + "default": "SEVEN_DAYS", + "description": "Window", + "enum": [ + "ONE_HOUR", + "ONE_DAY", + "SEVEN_DAYS", + "THIRTY_DAYS", + "ALL_TIME" + ], + "in": "query", + "name": "timeframe", + "type": "string" + } + ], "produces": [ "application/json" ], @@ -417137,7 +432957,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/opensea.chartResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -417158,16 +432990,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get The New Yorker top stories", + "summary": "Get an OpenSea collection's price or volume history", "tags": [ - "The New Yorker" + "OpenSea" ] } }, - "/newyorker/sections": { + "/opensea/collection/{slug}/depth": { "get": { - "description": "Lists every The New Yorker section accepted by the headlines endpoint, with slug, display name, and feed URL. This is the complete set of public text-article feeds the publisher serves; cartoon, podcast, video, and puzzle feeds are not included.", - "operationId": "newyorker-sections", + "description": "Returns the full bid/ask ladder for a collection: resting listings and offers grouped into price levels with the quantity available at each. This is the depth chart behind OpenSea's own collection page, and it is the fastest way to see how thin or deep the book is above the floor.", + "operationId": "opensea-collection-depth", + "parameters": [ + { + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "boredapeyachtclub" + } + ], "produces": [ "application/json" ], @@ -417175,7 +433017,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/opensea.depthResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -417196,19 +433050,50 @@ "ApiKeyAuth": [] } ], - "summary": "List The New Yorker sections", + "summary": "Get an OpenSea collection's order book", "tags": [ - "The New Yorker" + "OpenSea" ] } }, - "/nike/categories": { + "/opensea/collection/{slug}/holders": { "get": { - "consumes": [ - "application/json" + "description": "Returns a cursor-paginated leaderboard of wallets holding items in the collection, ranked by quantity held, with each holder's address and display name where OpenSea publishes one.", + "operationId": "opensea-collection-holders", + "parameters": [ + { + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "boredapeyachtclub" + }, + { + "default": 20, + "description": "Holders per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "default": "DESC", + "description": "Sort direction by quantity held", + "enum": [ + "ASC", + "DESC" + ], + "in": "query", + "name": "sort_direction", + "type": "string" + } ], - "description": "Returns Nike's full Men/Women/Kids/Jordan category and subcategory taxonomy tree, sourced directly from Nike.com's own nav mega-menu. Each top-level entry (Men, Women, Kids, Jordan) breaks down into named groups (e.g. Shoes, Clothing, Accessories, Shop By Sport -- Women additionally carries a Shop by Color group, and Jordan is organized by Men/Women/Kids instead of by product type), each with its own subcategory entries. Every subcategory (and most groups) carries a slug usable as a future category-browse endpoint's path/slug input, and is directly browsable today at https://www.nike.com/w/. This mirrors the live nav exactly, including its seasonal/promotional groups (e.g. Limited Time, New & Featured) alongside the stable structural ones -- Nike's own markup does not distinguish the two.", - "operationId": "nike-categories", "produces": [ "application/json" ], @@ -417216,7 +433101,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.categoriesResponseDoc" + "$ref": "#/definitions/opensea.collectionHoldersResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -417237,35 +433134,98 @@ "ApiKeyAuth": [] } ], - "summary": "List Nike's category and subcategory taxonomy", + "summary": "List an OpenSea collection's holders", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/product": { + "/opensea/collection/{slug}/items": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns product-detail data for one color variant: title, description, pricing, images, every offered size, and every other available color. slug and style_color together reproduce Nike's own product page URL (nike.com/t//) and are both returned by nike-search's product colors[].slug and colors[].style_color fields.", - "operationId": "nike-product", + "description": "Returns a cursor-paginated page of NFTs in a collection with their traits, rarity rank, current owner, best standing listing, and last sale price. Pass `cursor` from `next_page_cursor` to page forward. Narrow the result set with `listed_only`, `traits`, a `min_price`/`max_price` band, or a `min_rarity`/`max_rarity` rank band — the filters combine, so `traits=Fur:Solid Gold&listed_only=true` returns only buyable Solid Gold apes.", + "operationId": "opensea-collection-items", "parameters": [ { - "description": "Product-detail URL slug, from a search result's colors[].slug field", - "in": "query", + "description": "OpenSea collection slug", + "in": "path", "name": "slug", "required": true, "type": "string", - "x-example": "vomero-premium-mens-road-running-shoes-l11miwwa" + "x-example": "boredapeyachtclub" }, { - "description": "Style-color id, from a search result's colors[].style_color field", + "default": 20, + "description": "Items per page, 1-100", "in": "query", - "name": "style_color", - "required": true, + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "default": "PRICE", + "description": "Sort field", + "enum": [ + "PRICE", + "LAST_SALE_DATE", + "RARITY", + "CREATED_DATE" + ], + "in": "query", + "name": "sort_by", + "type": "string" + }, + { + "default": "ASC", + "description": "Sort direction", + "enum": [ + "ASC", + "DESC" + ], + "in": "query", + "name": "sort_direction", + "type": "string" + }, + { + "description": "Only return items with a standing listing", + "in": "query", + "name": "listed_only", + "type": "boolean" + }, + { + "description": "Comma-separated trait_type:value pairs", + "in": "query", + "name": "traits", "type": "string", - "x-example": "HQ2050-102" + "x-example": "Fur:Solid Gold,Eyes:Laser Eyes" + }, + { + "description": "Minimum listing price in the collection's native token", + "in": "query", + "name": "min_price", + "type": "number" + }, + { + "description": "Maximum listing price in the collection's native token", + "in": "query", + "name": "max_price", + "type": "number" + }, + { + "description": "Minimum rarity rank (1 is rarest)", + "in": "query", + "name": "min_rarity", + "type": "integer" + }, + { + "description": "Maximum rarity rank", + "in": "query", + "name": "max_rarity", + "type": "integer" } ], "produces": [ @@ -417275,7 +433235,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.productResponseDoc" + "$ref": "#/definitions/opensea.collectionItemsResponseDoc" } }, "400": { @@ -417308,27 +433268,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Nike product", + "summary": "List items in an OpenSea collection", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/product/availability": { + "/opensea/collection/{slug}/offers": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns per-size shipping availability for one product, sourced from the same anonymous mobile backend Nike's own app uses. group_key is the product's rollup key (from a search result's products[].group_key field). Each size carries its label, localized label, the color variant it belongs to, a GTIN, an available flag, Nike's own shipping-availability level (HIGH/LOW/MEDIUM/OOS), and the width grouping (Regular/Wide). Per-store pickup availability is not included -- this reflects online shipping availability.", - "operationId": "nike-product-availability", + "description": "Returns the collection-wide offer book as price levels: how many standing offers sit at each price per item, plus the aggregate offer count and total value across the whole collection. Offers are sorted by price.", + "operationId": "opensea-collection-offers", "parameters": [ { - "description": "Product rollup key, from a search result's products[].group_key field", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "boredapeyachtclub" + }, + { + "default": 20, + "description": "Price levels per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "default": "DESC", + "description": "Sort direction by offer price", + "enum": [ + "ASC", + "DESC" + ], "in": "query", - "name": "group_key", - "required": true, - "type": "string", - "x-example": "5npsVBwT" + "name": "sort_direction", + "type": "string" } ], "produces": [ @@ -417338,7 +433319,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.availabilityResponseDoc" + "$ref": "#/definitions/opensea.collectionOffersResponseDoc" } }, "400": { @@ -417371,27 +433352,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Nike product size availability", + "summary": "List an OpenSea collection's offer book", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/product/details": { + "/opensea/collection/{slug}/rarest-items": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns full product-group detail for one product's rollup key, sourced from the same anonymous mobile backend Nike's own app uses: shared product copy plus every purchasable color variant (across width groupings), each with its own pricing, sizes, and images. group_key is the product's rollup key, the same value nike-search returns as a products[].group_key field. Unlike nike-product (which returns one color variant by slug/style_color), this returns every color of the product in one response.", - "operationId": "nike-product-details", + "description": "Returns the rarest items in a collection that currently have a standing listing, each with its rarity rank, traits, and asking price. Unlike the trait endpoints, this shelf is scoped to what is actually buyable right now.", + "operationId": "opensea-collection-rarest-items", "parameters": [ { - "description": "Product rollup key, from a search result's products[].group_key field", - "in": "query", - "name": "group_key", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "5npsVBwT" + "x-example": "boredapeyachtclub" } ], "produces": [ @@ -417401,7 +433379,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.productDetailsResponseDoc" + "$ref": "#/definitions/opensea.itemsShelfResponseDoc" } }, "400": { @@ -417434,27 +433412,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get full Nike product details", + "summary": "List an OpenSea collection's rarest listed items", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/product/recommendations": { + "/opensea/collection/{slug}/search-items": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Nike's own related-product (\"Shop Similar\") recommendations for one product, sourced from the same anonymous mobile backend Nike's own app uses. style_color is the anchor product's style-color id (from a search result's colors[].style_color field). Each recommendation carries the product's style-color, rank, title/subtitle, image, PDP URL, and current pricing. Recommendations are Nike's own ranking, not a guaranteed keyword match: an unrecognized style_color returns Nike's fallback recommendations rather than an empty list or an error.", - "operationId": "nike-product-recommendations", + "description": "Runs a keyword search scoped to one collection — matching on item name and trait values — and returns the hits with rarity rank and best standing listing. Narrower than `/opensea/collection/{slug}/items`, which lists everything.", + "operationId": "opensea-collection-search-items", "parameters": [ { - "description": "Anchor product's style-color id, from a search result's colors[].style_color field", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "boredapeyachtclub" + }, + { + "description": "Search keyword", "in": "query", - "name": "style_color", + "name": "query", "required": true, "type": "string", - "x-example": "HQ2050-102" + "x-example": "gold" + }, + { + "default": 20, + "description": "Results per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -417464,7 +433454,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.recommendationsResponseDoc" + "$ref": "#/definitions/opensea.itemSearchResponseDoc" } }, "400": { @@ -417473,6 +433463,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -417491,42 +433487,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Nike product recommendations", + "summary": "Search items inside an OpenSea collection", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/product/reviews": { + "/opensea/collection/{slug}/social-proof": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of a Nike product's customer reviews, plus an aggregate rating summary (average rating and a per-star rating breakdown) that Nike's own product-detail endpoint does not otherwise expose. slug and style_color are the same values nike-product accepts (from a search result's colors[].slug/colors[].style_color fields). A product with no reviews yet returns a well-formed empty result rather than an error. Requesting a page beyond the available result pages returns a not-found error.", - "operationId": "nike-product-reviews", + "description": "Returns how many accounts follow or watch a collection, plus the notable collectors OpenSea highlights for it. Useful as a demand signal alongside the trading stats.", + "operationId": "opensea-collection-social-proof", "parameters": [ { - "description": "Product-detail URL slug, from a search result's colors[].slug field", - "in": "query", + "description": "OpenSea collection slug", + "in": "path", "name": "slug", "required": true, "type": "string", - "x-example": "vomero-premium-mens-road-running-shoes-l11miwwa" - }, - { - "description": "Style-color id, from a search result's colors[].style_color field", - "in": "query", - "name": "style_color", - "required": true, - "type": "string", - "x-example": "HQ2050-102" - }, - { - "description": "One-based page number, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "boredapeyachtclub" } ], "produces": [ @@ -417536,7 +433514,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.productReviewsResponseDoc" + "$ref": "#/definitions/opensea.socialProofResponseDoc" } }, "400": { @@ -417569,40 +433547,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Nike product reviews", + "summary": "Get an OpenSea collection's social following", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/search": { + "/opensea/collection/{slug}/top-sales": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Nike.com product listings by keyword, or browses a category/subcategory listing by slug, with real pagination. Exactly one of keyword or category is required. Returns product groups with pricing, colorway images, and every purchasable color variant, plus filter and subcategory navigation data (facet_nav) already present on the same response -- both keyword search and a category listing's first page include filter groups (Gender, Color, Price, Size, and similar); only a category listing includes a breadcrumb trail and subcategory drill-down options, and only its first page (a category listing's later pages do not repeat navigation data). Keyword search is best-effort relevance, not a guaranteed keyword match: for an obscure or nonsense keyword, Nike's own search index falls back to its own recommended results instead of returning an empty list, and there is currently no reliable signal in the response to distinguish a true keyword match from that fallback behavior. A keyword Nike's own search router treats as structurally empty (for example a punctuation-only query) does return a genuine empty result. Category values come from nike-categories' own slug field, or from a prior response's own facet_nav navigation paths (with the leading /w/ stripped). Requesting a page beyond the available result pages returns a not-found error.", - "operationId": "nike-search", + "description": "Returns the highest-value sales ever recorded for a collection, with the buyer, seller, price, and transaction hash for each. Unlike `/opensea/collection/{slug}/activity?event_types=SALE`, which is a reverse-chronological feed, this is ranked by sale price.", + "operationId": "opensea-collection-top-sales", "parameters": [ { - "description": "Search keyword. Exactly one of keyword or category is required.", - "in": "query", - "name": "keyword", - "type": "string", - "x-example": "running shoes" - }, - { - "description": "Category/subcategory browse slug, from nike-categories' own slug field or a prior response's facet_nav navigation. Exactly one of keyword or category is required.", - "in": "query", - "name": "category", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", + "required": true, "type": "string", - "x-example": "mens-jordan-shoes-37eefznik1zy7ok" - }, - { - "description": "One-based page number, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "boredapeyachtclub" } ], "produces": [ @@ -417612,7 +433574,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.searchResponseDoc" + "$ref": "#/definitions/opensea.collectionTopSalesResponseDoc" } }, "400": { @@ -417645,49 +433607,48 @@ "ApiKeyAuth": [] } ], - "summary": "Search or browse Nike products", + "summary": "List an OpenSea collection's highest-value sales", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/stores": { + "/opensea/collection/{slug}/trait-offers": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Nike's physical retail store locator by coordinates and radius. Returns each nearby store's name, address, phone, coordinates, distance, and store page URL. A location with no nearby stores within the given radius returns a well-formed empty result.", - "operationId": "nike-stores", + "description": "Returns standing offers scoped to a specific trait value rather than the whole collection, as price levels with the trait type and value attached. Useful for pricing rare-trait items against the collection floor.", + "operationId": "opensea-collection-trait-offers", "parameters": [ { - "description": "Latitude, -90 to 90", - "in": "query", - "name": "lat", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", "required": true, - "type": "number", - "x-example": 40.75 + "type": "string", + "x-example": "boredapeyachtclub" }, { - "description": "Longitude, -180 to 180", + "default": 20, + "description": "Price levels per page, 1-100", "in": "query", - "name": "lng", - "required": true, - "type": "number", - "x-example": -73.99 + "name": "limit", + "type": "integer" }, { - "description": "Search radius in miles, defaults to 50", + "description": "Opaque pagination cursor from a previous next_page_cursor", "in": "query", - "name": "radius_miles", - "type": "integer", - "x-example": 50 + "name": "cursor", + "type": "string" }, { - "description": "One-based page number, defaults to 1", + "default": "DESC", + "description": "Sort direction by offer price", + "enum": [ + "ASC", + "DESC" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "sort_direction", + "type": "string" } ], "produces": [ @@ -417697,7 +433658,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.storesResponseDoc" + "$ref": "#/definitions/opensea.collectionTraitOffersResponseDoc" } }, "400": { @@ -417730,27 +433691,37 @@ "ApiKeyAuth": [] } ], - "summary": "Find nearby Nike stores", + "summary": "List an OpenSea collection's trait offer book", "tags": [ - "Nike" + "OpenSea" ] } }, - "/nike/suggest": { + "/opensea/collection/{slug}/traits": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Nike's own search-box suggestions (typeahead) for a partial query, the same \"Top Suggestions\" list shown while typing into Nike's search box: a flat list of suggested search phrases, no product data.", - "operationId": "nike-suggest", + "description": "Returns a cursor-paginated page of the collection's trait types and the values each takes, with per-value item counts where OpenSea publishes them. Numeric traits carry a comparison operator.", + "operationId": "opensea-collection-traits", "parameters": [ { - "description": "Partial search query", - "in": "query", - "name": "query", + "description": "OpenSea collection slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "running shoes" + "x-example": "boredapeyachtclub" + }, + { + "default": 20, + "description": "Trait types per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -417760,7 +433731,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nike.suggestResponseDoc" + "$ref": "#/definitions/opensea.collectionTraitsResponseDoc" } }, "400": { @@ -417769,6 +433740,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -417787,24 +433764,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Nike search-box suggestions", + "summary": "List an OpenSea collection's traits", "tags": [ - "Nike" + "OpenSea" ] } }, - "/ninetofivegoogle/article": { + "/opensea/collections": { "get": { - "description": "Returns public 9to5Google article metadata and readable body paragraphs from a canonical dated article URL. Audio-first podcast archive slugs are excluded from the sections list; podcast episodes that appear in the main feed can still be read when their page exposes metadata and paragraphs.", - "operationId": "ninetofivegoogle-article", + "description": "Resolves up to 50 collections in a single call from a comma-separated `slugs` list, returning each one's floor price, verification flag, headline stats, and per-marketplace listed-item counts. Use this instead of calling `/opensea/collection/{slug}` in a loop — it costs one upstream request regardless of how many slugs you pass. The `markets` array shows how many items are listed on OpenSea versus other marketplaces for the same collection.", + "operationId": "opensea-collections", "parameters": [ { - "description": "Canonical 9to5Google article URL", + "description": "Comma-separated collection slugs, at most 50", "in": "query", - "name": "url", + "name": "slugs", "required": true, "type": "string", - "x-example": "https://9to5google.com/2026/09/29/pixel-11-hilight-messages-qpr2/" + "x-example": "boredapeyachtclub,azuki" } ], "produces": [ @@ -417814,7 +433791,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/opensea.collectionsResponseDoc" } }, "400": { @@ -417829,6 +433806,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -417841,24 +433824,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get a 9to5Google article", + "summary": "Look up several OpenSea collections at once", "tags": [ - "9to5Google" + "OpenSea" ] } }, - "/ninetofivegoogle/author": { + "/opensea/drops": { "get": { - "description": "Returns a 9to5Google author profile from `url`, a canonical `https://9to5google.com/author//` address. The response has the author's `name`, avatar, `biography`, `social_links` and the first page of recent articles, each with title, URL, summary and image. Social-link types and dates are as the author's page shows them.", - "operationId": "ninetofivegoogle-author", + "description": "Returns the NFT drop calendar — either upcoming mints or recently minted drops — with each drop's contract, chain, and parent collection. Use `type=UPCOMING` to watch for launches and `type=RECENTLY_MINTED` for ones that just went live.", + "operationId": "opensea-drops", "parameters": [ { - "description": "Canonical 9to5Google author URL", + "default": "UPCOMING", + "description": "Calendar window", + "enum": [ + "UPCOMING", + "RECENTLY_MINTED" + ], "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://9to5google.com/author/technacity/" + "name": "type", + "type": "string" + }, + { + "default": 20, + "description": "Drops per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -417868,7 +433867,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ninetofivegoogleAuthorResponseDoc" + "$ref": "#/definitions/opensea.dropsResponseDoc" } }, "400": { @@ -417877,8 +433876,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -417895,89 +433894,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get a 9to5Google author profile", + "summary": "List the OpenSea drop calendar", "tags": [ - "9to5Google" + "OpenSea" ] } }, - "/ninetofivegoogle/headlines": { + "/opensea/item/{chain}/{contract_address}/{token_id}": { "get": { - "description": "Returns recent 9to5Google headlines for one guide or editorial archive. `section` is required and takes a slug such as `gemini`, `google-pixel-9` or `wear-os`; an unknown or missing value returns an invalid-params error. There are 58 guide feeds and five editorial archives, and some hold fewer than 100 entries.", - "operationId": "ninetofivegoogle-headlines", + "description": "Returns one NFT addressed by chain, contract address, and token id, including its traits, rarity rank, current owner, parent collection, best standing listing, and best standing offer. Call `/opensea/chains` for the accepted `chain` values.", + "operationId": "opensea-item", "parameters": [ { - "description": "Slug returned by ninetofivegoogle_sections", - "enum": [ - "gemini", - "google-pixel-9-pro-fold", - "google-pixel-9-pro-xl", - "google-pixel-9-pro", - "google-pixel-9", - "google-pixel-8-pro", - "google-pixel-8", - "google-pixel-watch-3", - "google-pixel-watch", - "google-pixel-buds-pro-2", - "google-pixel-buds-pro", - "google-nest-hub", - "google-nest-hub-max", - "google-nest-mini", - "google-nest-audio", - "nest-thermostat", - "nest-cam", - "google-nest-doorbell", - "android-17", - "android-auto", - "wear-os", - "samsung", - "oneplus", - "oppo", - "xiaomi", - "google-chrome", - "chrome-os", - "google-tv", - "android-tv", - "chromecast", - "chromecast-with-google-tv", - "gmail", - "google-meet", - "google-chat", - "google-calendar", - "google-keep", - "google-drive", - "google-docs", - "youtube", - "youtube-music", - "youtube-tv", - "android", - "android-14", - "android-15", - "android-15-beta", - "apk-insight", - "apps-and-updates-2", - "exclusives", - "fitbit", - "google", - "google-apps", - "google-assistant", - "google-home", - "google-pixel", - "pixel-11-buyers-guide", - "google-play", - "google-search", - "made-by-google", - "feature-exclusives", - "feature-review", - "feature-newsletter", - "feature-videos", - "feature-sponsored-post" - ], - "in": "query", - "name": "section", + "description": "Chain identifier from /opensea/chains", + "in": "path", + "name": "chain", "required": true, "type": "string", - "x-example": "gemini" + "x-example": "ethereum" + }, + { + "description": "NFT contract address", + "in": "path", + "name": "contract_address", + "required": true, + "type": "string", + "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + }, + { + "description": "Token id within the contract", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "1" } ], "produces": [ @@ -417987,7 +433937,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/opensea.itemResponseDoc" } }, "400": { @@ -417996,37 +433946,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get 9to5Google section headlines", - "tags": [ - "9to5Google" - ] - } - }, - "/ninetofivegoogle/news": { - "get": { - "description": "Returns recent 9to5Google stories with no input needed. Each item has a title, canonical URL, summary, publication time and author. Cross-network links are filtered out, so returned items use canonical 9to5Google story URLs.", - "operationId": "ninetofivegoogle-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -418046,50 +433970,68 @@ "ApiKeyAuth": [] } ], - "summary": "Get 9to5Google top stories", - "tags": [ - "9to5Google" - ] - } - }, - "/ninetofivegoogle/sections": { - "get": { - "description": "Returns the 58 topic guides linked by the current first-party Guides directory and five separately navigable editorial feeds. Use each slug with the headlines endpoint.", - "operationId": "ninetofivegoogle-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Discover 9to5Google sections", + "summary": "Get a single OpenSea NFT", "tags": [ - "9to5Google" + "OpenSea" ] } }, - "/ninetofivemac/article": { + "/opensea/item/{chain}/{contract_address}/{token_id}/activity": { "get": { - "description": "Returns a 9to5Mac article by `url`, a canonical `9to5mac.com` address in the form `/YYYY/MM/DD//`: title, description, publication and update times, `authors`, `section`, image and the body `paragraphs`. The affiliate FTC disclaimer and embedded-tweet text are left out, and `paywalled` is never set because the articles are free.", - "operationId": "ninetofivemac-article", + "description": "Returns the marketplace event history for a single NFT — sales, listings, offers, transfers, and mints — with counterparties, price, and transaction hash. Filter with `event_types`, for example `event_types=SALE,TRANSFER` for an ownership trail.", + "operationId": "opensea-item-activity", "parameters": [ { - "description": "Canonical 9to5Mac article URL", - "in": "query", - "name": "url", + "description": "Chain identifier from /opensea/chains", + "in": "path", + "name": "chain", "required": true, "type": "string", - "x-example": "https://9to5mac.com/2026/09/24/heres-everything-new-for-apple-maps-in-ios-27/" + "x-example": "ethereum" + }, + { + "description": "NFT contract address", + "in": "path", + "name": "contract_address", + "required": true, + "type": "string", + "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + }, + { + "description": "Token id within the contract", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "1" + }, + { + "default": 20, + "description": "Events per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "description": "Comma-separated event types", + "enum": [ + "SALE", + "LISTING", + "OFFER", + "TRANSFER", + "MINT", + "COLLECTION_OFFER", + "TRAIT_OFFER" + ], + "in": "query", + "name": "event_types", + "type": "string" } ], "produces": [ @@ -418099,7 +434041,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/opensea.activityResponseDoc" } }, "400": { @@ -418114,6 +434056,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -418126,24 +434074,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get 9to5Mac article content", + "summary": "List one OpenSea NFT's event history", "tags": [ - "9to5Mac" + "OpenSea" ] } }, - "/ninetofivemac/author": { + "/opensea/item/{chain}/{contract_address}/{token_id}/chart": { "get": { - "description": "Returns a 9to5Mac author profile from `url`, a canonical `https://9to5mac.com/author//` address: name, avatar, `biography`, `social_links` and the first page of recent articles. Each social link's `type` comes from the page's icon, and each article's `published_at` is the page's own text, such as `9 hours ago`, not a timestamp.", - "operationId": "ninetofivemac-author", + "description": "Returns every indexed sale of one NFT with its timestamp and price, in both the settlement token and USD — the price history behind the chart on an item page. An item that has never sold returns an empty `points` list. For collection-level sale history use `/opensea/collection/{slug}/activity?event_types=SALE`.", + "operationId": "opensea-item-chart", "parameters": [ { - "description": "Canonical 9to5Mac author URL", - "in": "query", - "name": "url", + "description": "Chain identifier from /opensea/chains", + "in": "path", + "name": "chain", "required": true, "type": "string", - "x-example": "https://9to5mac.com/author/chmiller44/" + "x-example": "ethereum" + }, + { + "description": "NFT contract address", + "in": "path", + "name": "contract_address", + "required": true, + "type": "string", + "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + }, + { + "description": "Token id within the contract", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "2087" } ], "produces": [ @@ -418153,7 +434117,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.ninetofivemacAuthorResponseDoc" + "$ref": "#/definitions/opensea.chartResponseDoc" } }, "400": { @@ -418168,6 +434132,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -418180,61 +434150,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get a 9to5Mac author profile", + "summary": "Get an OpenSea NFT's sale-price history", "tags": [ - "9to5Mac" + "OpenSea" ] } }, - "/ninetofivemac/headlines": { + "/opensea/item/{chain}/{contract_address}/{token_id}/depth": { "get": { - "description": "Returns the newest posts from one 9to5Mac topic guide, up to 100. `section` is required and takes a guide slug such as `iphone`, `macbook-pro`, `vision-pro` or `how-to`; an unknown or missing value returns an invalid-params error. Smaller guides, such as `apple-watch-se`, return fewer. Items carry title, URL, summary, time and author.", - "operationId": "ninetofivemac-headlines", + "description": "Returns the bid/ask ladder for a single NFT: resting listings and offers grouped into price levels with the quantity at each. Useful for ERC-1155 items where many units trade at different prices.", + "operationId": "opensea-item-depth", "parameters": [ { - "description": "9to5Mac guide slug", - "enum": [ - "iphone", - "mac", - "macbook-pro", - "macbook-air", - "imac", - "mac-mini", - "mac-studio", - "mac-pro", - "ipad-pro", - "ipad-air", - "ipad-mini", - "ipad", - "ipados", - "apple-watch", - "apple-watch-ultra", - "apple-health", - "apple-watch-se", - "vision-pro", - "visionos", - "apple-music", - "airpods", - "homepod", - "apple-tv", - "review", - "how-to", - "aapl", - "apple-store", - "apple-arcade", - "apple-card", - "apple-silicon", - "apple-one", - "apple-fitness", - "carplay", - "siri", - "homekit" - ], - "in": "query", - "name": "section", + "description": "Chain identifier from /opensea/chains", + "in": "path", + "name": "chain", "required": true, "type": "string", - "x-example": "iphone" + "x-example": "ethereum" + }, + { + "description": "NFT contract address", + "in": "path", + "name": "contract_address", + "required": true, + "type": "string", + "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + }, + { + "description": "Token id within the contract", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "1" } ], "produces": [ @@ -418244,7 +434193,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/opensea.depthResponseDoc" } }, "400": { @@ -418253,37 +434202,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get 9to5Mac section headlines", - "tags": [ - "9to5Mac" - ] - } - }, - "/ninetofivemac/news": { - "get": { - "description": "Returns the latest 9to5Mac Apple news stories with no input needed. Each item has a title, canonical article URL, summary, publication time, author and image when present. The list can include podcast episode posts, such as Happy Hour and 9to5Mac Daily, alongside news articles.", - "operationId": "ninetofivemac-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -418303,42 +434226,66 @@ "ApiKeyAuth": [] } ], - "summary": "Get 9to5Mac top stories", + "summary": "Get an OpenSea NFT's order book", "tags": [ - "9to5Mac" + "OpenSea" ] } }, - "/ninetofivemac/sections": { + "/opensea/item/{chain}/{contract_address}/{token_id}/listings": { "get": { - "description": "Lists the 35 9to5Mac topic guides that the headlines endpoint accepts as `section`. Each has a `slug` (for example `iphone`, `mac-studio` or `carplay`), a display `name` and the guide's feed `url`.", - "operationId": "ninetofivemac-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ + "description": "Returns every standing sell order for one NFT, with price, quantity, validity window, marketplace, and the maker's wallet. An item with no active listings returns an empty list rather than a 404.", + "operationId": "opensea-item-listings", + "parameters": [ { - "ApiKeyAuth": [] + "description": "Chain identifier from /opensea/chains", + "in": "path", + "name": "chain", + "required": true, + "type": "string", + "x-example": "ethereum" + }, + { + "description": "NFT contract address", + "in": "path", + "name": "contract_address", + "required": true, + "type": "string", + "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + }, + { + "description": "Token id within the contract", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "1" + }, + { + "default": 20, + "description": "Listings per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "default": "ASC", + "description": "Sort direction by price", + "enum": [ + "ASC", + "DESC" + ], + "in": "query", + "name": "sort_direction", + "type": "string" } ], - "summary": "Get 9to5Mac sections", - "tags": [ - "9to5Mac" - ] - } - }, - "/njcom/news": { - "get": { - "description": "Returns current NJ.com top stories, including title, canonical URL, short summary, author, publication time, and image where available. Category discovery, section headlines, and article and author routes are not available.", - "operationId": "njcom-news", "produces": [ "application/json" ], @@ -418346,7 +434293,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/opensea.itemOrdersResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -418367,24 +434326,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get NJ.com top stories", + "summary": "List standing listings for an OpenSea NFT", "tags": [ - "NJ.com" + "OpenSea" ] } }, - "/npr/article": { + "/opensea/item/{chain}/{contract_address}/{token_id}/offers": { "get": { - "description": "Returns an NPR article by canonical `url` in the form `https://www.npr.org/YYYY/MM/DD/...`: title, description, section, authors, lead image, publication and update times, and body `paragraphs`. Tracking query strings and fragments are ignored; other hosts, encoded paths and non-article paths are rejected.", - "operationId": "npr-article", + "description": "Returns every standing bid on one NFT, with price, quantity, validity window, marketplace, and the maker's wallet. An item with no active offers returns an empty list rather than a 404.", + "operationId": "opensea-item-offers", "parameters": [ { - "description": "Canonical www.npr.org article URL", - "in": "query", - "name": "url", + "description": "Chain identifier from /opensea/chains", + "in": "path", + "name": "chain", "required": true, "type": "string", - "x-example": "https://www.npr.org/2026/09/19/nx-s1-5974980/saudi-arabia-houthis-attempted-attack-capital" + "x-example": "ethereum" + }, + { + "description": "NFT contract address", + "in": "path", + "name": "contract_address", + "required": true, + "type": "string", + "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + }, + { + "description": "Token id within the contract", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "1" + }, + { + "default": 20, + "description": "Offers per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -418394,7 +434382,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/npr.articleResponseDoc" + "$ref": "#/definitions/opensea.itemOrdersResponseDoc" } }, "400": { @@ -418427,24 +434415,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get NPR article content", + "summary": "List standing offers for an OpenSea NFT", "tags": [ - "NPR" + "OpenSea" ] } }, - "/npr/author": { + "/opensea/item/{chain}/{contract_address}/{token_id}/owners": { "get": { - "description": "Returns an NPR author profile from a required `url` in the form `https://www.npr.org/people//`. The response has `name`, `job_title`, `bio` and the recent stories listed under Stories By, each with title, URL, summary, publication date and a lead image where the card has one. Other hosts or paths return a bad-request error.", - "operationId": "npr-author", + "description": "Returns the wallets holding one NFT plus the total owner count. ERC-721 items resolve to a single owner; ERC-1155 items can have many, each with the quantity held.", + "operationId": "opensea-item-owners", "parameters": [ { - "description": "Canonical www.npr.org author URL", - "in": "query", - "name": "url", + "description": "Chain identifier from /opensea/chains", + "in": "path", + "name": "chain", "required": true, "type": "string", - "x-example": "https://www.npr.org/people/14562108/bill-chappell" + "x-example": "ethereum" + }, + { + "description": "NFT contract address", + "in": "path", + "name": "contract_address", + "required": true, + "type": "string", + "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + }, + { + "description": "Token id within the contract", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "1" + }, + { + "default": 20, + "description": "Owners per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -418454,7 +434471,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/npr.authorResponseDoc" + "$ref": "#/definitions/opensea.itemOwnersResponseDoc" } }, "400": { @@ -418487,16 +434504,25 @@ "ApiKeyAuth": [] } ], - "summary": "Get an NPR author profile", + "summary": "List the owners of an OpenSea NFT", "tags": [ - "NPR" + "OpenSea" ] } }, - "/npr/categories": { + "/opensea/most-watched": { "get": { - "description": "Lists the sections in NPR's current navigation, each with its name, slug and URL. Pass a returned `slug` as the `topic` parameter of `npr-topic`. The list is not a fixed set, so it follows whatever sections NPR currently shows.", - "operationId": "npr-categories", + "description": "Returns the collections most added to watchlists on OpenSea, with their current floor price and headline stats. A demand signal that leads trading volume, since watchlisting precedes buying.", + "operationId": "opensea-most-watched", + "parameters": [ + { + "default": 20, + "description": "Collections to return, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -418504,46 +434530,14 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/npr.categoriesResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/opensea.collectionShelfResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get NPR section navigation", - "tags": [ - "NPR" - ] - } - }, - "/npr/headlines": { - "get": { - "description": "Returns the current NPR headlines across the site, with no parameters and no section filter. Each item has a title, canonical URL, summary, publication time and author when one is given.", - "operationId": "npr-headlines", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/npr.headlinesResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -418563,24 +434557,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get NPR site-wide headlines", + "summary": "List the most watchlisted OpenSea collections", "tags": [ - "NPR" + "OpenSea" ] } }, - "/npr/topic": { + "/opensea/profile/{identifier}": { "get": { - "description": "Returns the newest public NPR stories from one section archive page. topic is a section slug; use npr-categories for the current value space.", - "operationId": "npr-topic", + "description": "Returns the public profile for a wallet, resolved from a wallet address, an ENS name, or an OpenSea username: display name, avatar and banner imagery, verification flag, and linked social handles. Wallet balances, portfolio value, and profit/loss are deliberately not exposed.", + "operationId": "opensea-profile", "parameters": [ { - "description": "NPR section slug", - "in": "query", - "name": "topic", + "description": "Wallet address, ENS name, or OpenSea username", + "in": "path", + "name": "identifier", "required": true, "type": "string", - "x-example": "politics" + "x-example": "vitalik.eth" } ], "produces": [ @@ -418590,7 +434584,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/npr.topicResponseDoc" + "$ref": "#/definitions/opensea.profileResponseDoc" } }, "400": { @@ -418623,27 +434617,52 @@ "ApiKeyAuth": [] } ], - "summary": "Get NPR section headlines", + "summary": "Get a public OpenSea profile", "tags": [ - "NPR" + "OpenSea" ] } }, - "/numbeo/cost-of-living/city/{slug}": { + "/opensea/profile/{identifier}/activity": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns itemized cost-of-living prices for one city (restaurants, markets, transportation, utilities, rent, and more), grouped by category.", - "operationId": "numbeo-cost-of-living-city", + "description": "Returns a cursor-paginated feed of a wallet's NFT marketplace events — sales, listings, offers, transfers, and mints — with the counterparty, price, and collection for each. Accepts a wallet address, ENS name, or OpenSea username. Scoped to NFT events only; token transfers and swaps are not returned.", + "operationId": "opensea-profile-activity", "parameters": [ { - "description": "Numbeo city slug", + "description": "Wallet address, ENS name, or OpenSea username", "in": "path", - "name": "slug", + "name": "identifier", "required": true, "type": "string", - "x-example": "Los-Angeles" + "x-example": "vitalik.eth" + }, + { + "default": 20, + "description": "Events per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "description": "Comma-separated event types", + "enum": [ + "SALE", + "LISTING", + "OFFER", + "TRANSFER", + "MINT", + "COLLECTION_OFFER", + "TRAIT_OFFER" + ], + "in": "query", + "name": "event_types", + "type": "string" } ], "produces": [ @@ -418653,7 +434672,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/numbeo.costOfLivingCityResponseDoc" + "$ref": "#/definitions/opensea.activityResponseDoc" } }, "400": { @@ -418668,8 +434687,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -418686,27 +434705,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Numbeo city's cost-of-living prices", + "summary": "List a wallet's NFT marketplace activity", "tags": [ - "Numbeo" + "OpenSea" ] } }, - "/numbeo/cost-of-living/country": { + "/opensea/profile/{identifier}/collections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns aggregate itemized cost-of-living prices for a country, plus the headline cost-of-living indices for every city Numbeo tracks there.", - "operationId": "numbeo-cost-of-living-country", + "description": "Returns the collections a wallet holds items in, with how many items it holds in each and that collection's current floor price. Useful for valuing a wallet's holdings collection by collection.", + "operationId": "opensea-profile-collections", "parameters": [ { - "description": "Country name as Numbeo spells it", - "in": "query", - "name": "country", + "description": "Wallet address, ENS name, or OpenSea username", + "in": "path", + "name": "identifier", "required": true, "type": "string", - "x-example": "Vietnam" + "x-example": "vitalik.eth" + }, + { + "default": 20, + "description": "Collections per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -418716,7 +434745,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/numbeo.costOfLivingCountryResponseDoc" + "$ref": "#/definitions/opensea.profileCollectionsResponseDoc" } }, "400": { @@ -418731,8 +434760,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -418749,36 +434778,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Numbeo country's cost-of-living prices", + "summary": "List the collections a wallet holds", "tags": [ - "Numbeo" + "OpenSea" ] } }, - "/numbeo/cost-of-living/rankings": { + "/opensea/profile/{identifier}/created": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the global cost-of-living city ranking (Cost of Living, Rent, Cost of Living Plus Rent, Groceries, Restaurant Price, and Local Purchasing Power indices), either the continuously-updated current index or a historical periodic snapshot.", - "operationId": "numbeo-cost-of-living-rankings", + "description": "Returns the collections a wallet created, as opposed to the ones it holds, each with its floor price and trading statistics. Use this to find a creator's full body of work from any one of their collections' contract deployer address.", + "operationId": "opensea-profile-created", "parameters": [ { - "description": "current (default) or historical", + "description": "Wallet address, ENS name, or OpenSea username", + "in": "path", + "name": "identifier", + "required": true, + "type": "string", + "x-example": "0xaba7161a7fb69c88e16ed9f455ce62b791ee4d03" + }, + { + "default": 20, + "description": "Collections per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "default": "VOLUME", + "description": "Sort field", "enum": [ - "current", - "historical" + "VOLUME", + "ONE_DAY_VOLUME", + "FLOOR_PRICE", + "SALES" ], "in": "query", - "name": "scope", + "name": "sort_by", "type": "string" }, { - "description": "Required when scope=historical, e.g. 2026-mid or 2025", + "default": "DESC", + "description": "Sort direction", + "enum": [ + "ASC", + "DESC" + ], "in": "query", - "name": "period", - "type": "string", - "x-example": "2026-mid" + "name": "sort_direction", + "type": "string" } ], "produces": [ @@ -418788,7 +434842,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/numbeo.rankingsResponseDoc" + "$ref": "#/definitions/opensea.profileCollectionsResponseDoc" } }, "400": { @@ -418797,49 +434851,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get the global Numbeo cost-of-living city ranking", - "tags": [ - "Numbeo" - ] - } - }, - "/numbeo/cost-of-living/rankings-by-country": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the global country-level cost-of-living ranking (Cost of Living, Rent, Cost of Living Plus Rent, Groceries, Restaurant Price, and Local Purchasing Power indices).", - "operationId": "numbeo-cost-of-living-rankings-by-country", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/numbeo.rankingsByCountryResponseDoc" - } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -418856,43 +434875,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get the global Numbeo cost-of-living country ranking", + "summary": "List the collections a wallet created", "tags": [ - "Numbeo" + "OpenSea" ] } }, - "/numbeo/indices/city/{slug}": { + "/opensea/profile/{identifier}/items": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one city's data for a Numbeo index family (quality of life, crime, health care, pollution, traffic, or property investment): headline indices, and (depending on the family) titled sub-index sections and/or itemized prices.", - "operationId": "numbeo-indices-city", + "description": "Returns a cursor-paginated page of the NFTs held by a wallet, with each item's collection, rarity rank, and best standing listing. Accepts a wallet address, ENS name, or OpenSea username; a non-address identifier costs one extra resolution lookup.", + "operationId": "opensea-profile-items", "parameters": [ { - "description": "Numbeo city slug", + "description": "Wallet address, ENS name, or OpenSea username", "in": "path", - "name": "slug", + "name": "identifier", "required": true, "type": "string", - "x-example": "Los-Angeles" + "x-example": "vitalik.eth" }, { - "description": "Index family", + "default": 20, + "description": "Items per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" + }, + { + "default": "DESC", + "description": "Sort direction by received date", "enum": [ - "quality-of-life", - "crime", - "health-care", - "pollution", - "traffic", - "property-investment" + "ASC", + "DESC" ], "in": "query", - "name": "index", - "required": true, - "type": "string", - "x-example": "quality-of-life" + "name": "sort_direction", + "type": "string" } ], "produces": [ @@ -418902,7 +434926,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/numbeo.indicesCityResponseDoc" + "$ref": "#/definitions/opensea.profileItemsResponseDoc" } }, "400": { @@ -418917,8 +434941,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -418935,43 +434959,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Numbeo city's data for an index family", + "summary": "List the NFTs a wallet holds", "tags": [ - "Numbeo" + "OpenSea" ] } }, - "/numbeo/indices/country": { + "/opensea/profile/{identifier}/search-items": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one country's aggregate data for a Numbeo index family, plus every city Numbeo tracks there with its index breakdown.", - "operationId": "numbeo-indices-country", + "description": "Runs a keyword search across a wallet's holdings, matching on item and collection name, and returns the hits with rarity rank and best standing listing. Narrower than `/opensea/profile/{identifier}/items`, which lists everything the wallet holds.", + "operationId": "opensea-profile-search-items", "parameters": [ { - "description": "Country name as Numbeo spells it", - "in": "query", - "name": "country", + "description": "Wallet address, ENS name, or OpenSea username", + "in": "path", + "name": "identifier", "required": true, "type": "string", - "x-example": "Vietnam" + "x-example": "vitalik.eth" }, { - "description": "Index family", - "enum": [ - "quality-of-life", - "crime", - "health-care", - "pollution", - "traffic", - "property-investment" - ], + "description": "Search keyword", "in": "query", - "name": "index", + "name": "query", "required": true, "type": "string", - "x-example": "quality-of-life" + "x-example": "ape" + }, + { + "default": 20, + "description": "Results per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -418981,7 +435001,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/numbeo.indicesCountryResponseDoc" + "$ref": "#/definitions/opensea.itemSearchResponseDoc" } }, "400": { @@ -418996,8 +435016,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -419014,52 +435034,55 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Numbeo country's data for an index family", + "summary": "Search the NFTs a wallet holds", "tags": [ - "Numbeo" + "OpenSea" ] } }, - "/numbeo/indices/rankings": { + "/opensea/rankings": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the global city ranking for a Numbeo index family, either the continuously-updated current index or a historical periodic snapshot.", - "operationId": "numbeo-indices-rankings", + "description": "Returns the collections on one of OpenSea's ranking boards for a given window, each with its ranking score, floor price, and rolling stats. `TRENDING` ranks by recent momentum, `TOP` by absolute volume, and `NEW` surfaces recently launched collections.", + "operationId": "opensea-rankings", "parameters": [ { - "description": "Index family", + "default": "TRENDING", + "description": "Ranking board", "enum": [ - "quality-of-life", - "crime", - "health-care", - "pollution", - "traffic", - "property-investment" + "TOP", + "TRENDING", + "NEW" ], "in": "query", - "name": "index", - "required": true, - "type": "string", - "x-example": "quality-of-life" + "name": "ranking", + "type": "string" }, { - "description": "current (default) or historical", + "default": "ONE_DAY", + "description": "Ranking window", "enum": [ - "current", - "historical" + "ONE_HOUR", + "ONE_DAY", + "SEVEN_DAYS", + "THIRTY_DAYS", + "ALL_TIME" ], "in": "query", - "name": "scope", + "name": "timeframe", "type": "string" }, { - "description": "Required when scope=historical, e.g. 2026-mid or 2025", + "default": 20, + "description": "Collections per page, 1-100", "in": "query", - "name": "period", - "type": "string", - "x-example": "2026-mid" + "name": "limit", + "type": "integer" + }, + { + "description": "Opaque pagination cursor from a previous next_page_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -419069,7 +435092,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/numbeo.indicesRankingsResponseDoc" + "$ref": "#/definitions/opensea.rankingsResponseDoc" } }, "400": { @@ -419078,8 +435101,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -419096,35 +435119,31 @@ "ApiKeyAuth": [] } ], - "summary": "Get the global Numbeo city ranking for an index family", + "summary": "List ranked OpenSea collections", "tags": [ - "Numbeo" + "OpenSea" ] } }, - "/numbeo/indices/rankings-by-country": { + "/opensea/search/collections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the global Numbeo ranking of countries for one index family, selected by the required `index`: `quality-of-life`, `crime`, `health-care`, `pollution`, `traffic` or `property-investment`. Each row has its `rank`, country and a list of named index values, such as the Crime Index and Safety Index for `crime`.", - "operationId": "numbeo-indices-rankings-by-country", + "description": "Runs a keyword search across OpenSea collections and returns the matches with floor price, verification flag, and headline stats. Use this to resolve a human-readable name to the `slug` the other collection endpoints take.", + "operationId": "opensea-search-collections", "parameters": [ { - "description": "Index family", - "enum": [ - "quality-of-life", - "crime", - "health-care", - "pollution", - "traffic", - "property-investment" - ], + "description": "Search keyword", "in": "query", - "name": "index", + "name": "query", "required": true, "type": "string", - "x-example": "quality-of-life" + "x-example": "ape" + }, + { + "default": 20, + "description": "Results per page, 1-100", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -419134,7 +435153,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/numbeo.indicesRankingsByCountryResponseDoc" + "$ref": "#/definitions/opensea.collectionSearchResponseDoc" } }, "400": { @@ -419143,8 +435162,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -419161,24 +435180,23 @@ "ApiKeyAuth": [] } ], - "summary": "Get the global Numbeo country ranking for an index family", + "summary": "Search OpenSea collections by keyword", "tags": [ - "Numbeo" + "OpenSea" ] } }, - "/nydailynews/article": { + "/opensea/top-movers": { "get": { - "description": "Returns public New York Daily News article metadata and body paragraphs from a canonical article URL. For subscriber-only articles the response carries the free lead-in with paywalled set to true.", - "operationId": "nydailynews-article", + "description": "Returns the collections with the largest recent floor-price and volume moves, each with its current floor and rolling one-hour and one-day stats. Complements `/opensea/rankings`, which ranks by score rather than by change.", + "operationId": "opensea-top-movers", "parameters": [ { - "description": "Canonical New York Daily News article URL", + "default": 20, + "description": "Collections to return, 1-100", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.nydailynews.com/2026/09/24/city-hall-must-explain-why-they-broke-disclosure-rules/" + "name": "limit", + "type": "integer" } ], "produces": [ @@ -419188,7 +435206,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/opensea.collectionShelfResponseDoc" } }, "400": { @@ -419197,8 +435215,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -419215,30 +435233,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Daily News article content", + "summary": "List the biggest movers on OpenSea", "tags": [ - "New York Daily News" + "OpenSea" ] } }, - "/nydailynews/author": { + "/opentable/restaurant": { "get": { - "description": "Returns one New York Daily News author's public profile: name, job title, bio, public email and X/Twitter handle, and their recent articles.", - "operationId": "nydailynews-author", + "consumes": [ + "application/json" + ], + "description": "Returns a restaurant's profile (location, cuisines, hours, price band, review summary) plus real-time bookable timeslots for the given date/time and party size.", + "operationId": "opentable-restaurant", "parameters": [ { - "description": "Author slug, e.g. rocco-parascandola", + "description": "OpenTable restaurant id", "in": "query", - "name": "slug", + "name": "restaurant_id", + "required": true, "type": "string", - "x-example": "rocco-parascandola" + "x-example": "131459" }, { - "description": "Canonical nydailynews.com/author// URL; alternative to slug", + "description": "Reservation date/time, RFC3339-minute local format; defaults to now", "in": "query", - "name": "url", + "name": "date_time", "type": "string", - "x-example": "https://www.nydailynews.com/author/rocco-parascandola/" + "x-example": "2026-08-04T19:00" + }, + { + "description": "Party size, default 2", + "in": "query", + "name": "party_size", + "type": "integer", + "x-example": 2 } ], "produces": [ @@ -419248,7 +435277,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.nyDailyNewsAuthorResponseDoc" + "$ref": "#/definitions/opentable.restaurantResponseDoc" } }, "400": { @@ -419263,6 +435292,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -419275,62 +435310,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a New York Daily News author profile", + "summary": "Get an OpenTable restaurant's profile and live availability", "tags": [ - "New York Daily News" + "OpenTable" ] } }, - "/nydailynews/headlines": { + "/opentable/restaurant/menus": { "get": { - "description": "Returns New York Daily News headlines for one section, newest first, up to about 100 stories. `section` is required and takes one of 36 slugs such as `crime-public-safety`, `new-york-yankees` or `opinion`; other values return an invalid-params error. Items carry a title and URL, plus publication time, byline, excerpt and lead image where shown. Team pages can list fewer stories out of season.", - "operationId": "nydailynews-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns the menus of one OpenTable restaurant, identified by the required `restaurant_id`. Each menu has a title, a currency and sections, and each section lists items with title, price and description. The price is returned as a string in the menu's currency, for example HK$.", + "operationId": "opentable-restaurant-menus", "parameters": [ { - "description": "New York Daily News section slug", - "enum": [ - "news", - "crime-public-safety", - "politics", - "new-york-politics", - "business", - "health", - "national", - "world", - "local-news", - "new-york-news", - "education", - "transportation", - "news-obituaries", - "sports", - "mlb", - "new-york-yankees", - "new-york-mets", - "nfl", - "new-york-giants", - "new-york-jets", - "nba", - "new-york-knicks", - "brooklyn-nets", - "wnba", - "new-york-liberty", - "nhl", - "new-york-rangers", - "new-york-islanders", - "soccer", - "opinion", - "editorials", - "viva", - "things-to-do", - "restaurants-food-drink", - "horoscopes", - "best-reviews" - ], + "description": "OpenTable restaurant id", "in": "query", - "name": "section", + "name": "restaurant_id", "required": true, "type": "string", - "x-example": "news" + "x-example": "164555" } ], "produces": [ @@ -419340,7 +435340,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/opentable.menusResponseDoc" } }, "400": { @@ -419349,36 +435349,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get New York Daily News section headlines", - "tags": [ - "New York Daily News" - ] - } - }, - "/nydailynews/news": { - "get": { - "description": "Returns the current New York Daily News top stories, with no parameters. Each item has a title and canonical article URL, plus publication time, byline, excerpt and lead image where the story card shows them. Use `nydailynews-headlines` for a single section.", - "operationId": "nydailynews-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/app.Response" } }, "503": { @@ -419393,50 +435373,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Daily News top stories", + "summary": "Get an OpenTable restaurant's menus", "tags": [ - "New York Daily News" + "OpenTable" ] } }, - "/nydailynews/sections": { + "/opentable/restaurant/reviews": { "get": { - "description": "Lists the 36 New York Daily News section slugs accepted by `nydailynews-headlines`, such as `crime-public-safety`, `new-york-mets`, `nfl` and `things-to-do`. Each entry has its `slug` (the last path segment of the section URL), display `name` and `url`. Topic (`/tag/...`) pages and off-site properties are not sections.", - "operationId": "nydailynews-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get New York Daily News sections", - "tags": [ - "New York Daily News" - ] - } - }, - "/nymag/article": { - "get": { - "description": "Returns a New York Magazine article by its canonical `url`: title, description, section, authors, lead image, publication and update times, a `paywalled` flag and the body `paragraphs`. Subscriber-only or blocked articles return an upstream error.", - "operationId": "nymag-article", + "description": "Returns one page of diner reviews for an OpenTable restaurant, identified by the required `restaurant_id`. `page` defaults to 1 and `size` to 20. Each review has its id, author and author's metro area, reservation and posted dates, text, a recommended flag, and ratings for overall, food, service, ambience, value and noise.", + "operationId": "opentable-restaurant-reviews", "parameters": [ { - "description": "Canonical New York Magazine article URL", + "description": "OpenTable restaurant id", "in": "query", - "name": "url", + "name": "restaurant_id", "required": true, "type": "string", - "x-example": "https://nymag.com/intelligencer/example.html" + "x-example": "131459" + }, + { + "description": "Page number, default 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Reviews per page, default 20", + "in": "query", + "name": "size", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -419446,7 +435417,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/opentable.reviewsResponseDoc" } }, "400": { @@ -419461,6 +435432,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -419473,24 +435450,64 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Magazine article content", + "summary": "Get a page of an OpenTable restaurant's diner reviews", "tags": [ - "New York Magazine" + "OpenTable" ] } }, - "/nymag/author": { + "/opentable/search": { "get": { - "description": "Returns a New York Magazine author profile from a required `url` in the form `https://nymag.com/author//`. The response has `name`, `job_title` (empty for some contributors), `bio` and recent articles with title, URL, `excerpt` and a `section` label. Each article's `published_at` is the page's date text, such as `Sept. 20, 2026`, not a timestamp.", - "operationId": "nymag-author", + "consumes": [ + "application/json" + ], + "description": "Searches restaurants by free-text term (cuisine, name, neighborhood) near a latitude/longitude, for a given date/time and party size, including inline live availability per result.", + "operationId": "opentable-search", "parameters": [ { - "description": "Canonical New York Magazine author URL", + "description": "Free-text search term", "in": "query", - "name": "url", + "name": "term", "required": true, "type": "string", - "x-example": "https://nymag.com/author/john-herrman/" + "x-example": "dinner" + }, + { + "description": "Search center latitude", + "in": "query", + "name": "latitude", + "required": true, + "type": "number", + "x-example": 10.7873 + }, + { + "description": "Search center longitude", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": 106.7407 + }, + { + "description": "Reservation date/time, RFC3339-minute local format; defaults to now", + "in": "query", + "name": "date_time", + "type": "string", + "x-example": "2026-08-04T19:00" + }, + { + "description": "Party size, default 2", + "in": "query", + "name": "party_size", + "type": "integer", + "x-example": 2 + }, + { + "description": "Max results, default 10", + "in": "query", + "name": "size", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -419500,7 +435517,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.nymagAuthorResponseDoc" + "$ref": "#/definitions/opentable.searchResponseDoc" } }, "400": { @@ -419509,8 +435526,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -419527,37 +435544,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get a New York Magazine author profile", + "summary": "Search OpenTable restaurants near a location", "tags": [ - "New York Magazine" + "OpenTable" ] } }, - "/nymag/headlines": { + "/otto/categories": { "get": { - "description": "Returns recent New York Magazine stories for one site section. `section` is required and takes one of nine slugs: `intelligencer`, `thecut`, `vulture`, `grub-street`, `curbed`, `strategist`, `select-all`, `science` or `daily`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "nymag-headlines", - "parameters": [ - { - "description": "New York Magazine section slug", - "enum": [ - "intelligencer", - "thecut", - "vulture", - "grub-street", - "curbed", - "strategist", - "select-all", - "science", - "daily" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "intelligencer" - } - ], + "description": "Lists the top-level categories shown in Otto.de's homepage navigation, each with its name and its canonical browse URL. The response also gives the `count` of categories and a `fetched_at` time. It takes no parameters.", + "operationId": "otto-categories", "produces": [ "application/json" ], @@ -419565,11 +435561,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/otto.categoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -419586,16 +435582,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Magazine section headlines", + "summary": "Get Otto.de's top-level categories", "tags": [ - "New York Magazine" + "Otto" ] } }, - "/nymag/news": { + "/otto/product": { "get": { - "description": "Returns the current New York Magazine top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nymag-headlines` to read one of its sections.", - "operationId": "nymag-news", + "description": "Returns a product's public detail, images, selectable colors and sizes. This endpoint uses a browser renderer because Otto.de product pages require JavaScript rendering.", + "operationId": "otto-product", + "parameters": [ + { + "description": "Canonical Otto.de product URL returned by otto-search", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.otto.de/p/nike-nike-performance-damen-laufschuh-juniper-trail-3-laufschuh-C2019218809/" + } + ], "produces": [ "application/json" ], @@ -419603,7 +435609,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/otto.productResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -419618,16 +435636,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Magazine top stories", + "summary": "Get an Otto.de product", "tags": [ - "New York Magazine" + "Otto" ] } }, - "/nymag/sections": { + "/otto/search": { "get": { - "description": "Lists the New York Magazine section slugs accepted by `nymag-headlines`, such as `intelligencer`, `thecut`, `vulture` and `grub-street`. Each entry has its stable `slug`, display `name` and section `url`.", - "operationId": "nymag-sections", + "description": "Searches Otto.de's public catalogue and returns the server-rendered product cards. offset advances by Otto's fixed 109-card page size; valid values are 0, 109, 218, and so on.", + "operationId": "otto-search", + "parameters": [ + { + "description": "Product search keyword", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "laufschuhe" + }, + { + "default": 0, + "description": "Result offset; non-negative multiple of 109", + "in": "query", + "name": "offset", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -419635,7 +435670,31 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/otto.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -419644,24 +435703,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Magazine sections", + "summary": "Search Otto.de products", "tags": [ - "New York Magazine" + "Otto" ] } }, - "/nypost/article": { + "/pagesix/article": { "get": { - "description": "Returns a New York Post article by canonical `url` in the form `https://nypost.com/YYYY/MM/DD/
//`: title, description, section, authors, lead image, publication and update times, a `paywalled` flag and the body `paragraphs`.", - "operationId": "nypost-article", + "description": "Returns a Page Six article by canonical `url` in the form `https://pagesix.com/YYYY/MM/DD/
//`: title, description, section, authors, lead image, publication and update times, a `paywalled` flag and the body `paragraphs`.", + "operationId": "pagesix-article", "parameters": [ { - "description": "Canonical New York Post article URL", + "description": "Canonical Page Six article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://nypost.com/2026/09/23/us-news/example-article-slug/" + "x-example": "https://pagesix.com/2026/09/24/celebrity-news/example-article-slug/" } ], "produces": [ @@ -419698,24 +435757,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Post article content", + "summary": "Get Page Six article content", "tags": [ - "New York Post" + "Page Six" ] } }, - "/nypost/author": { + "/pagesix/author": { "get": { - "description": "Returns a New York Post author profile from a required `url` in the form `https://nypost.com/author//`. The response has `name`, `biography`, `image_url`, `social_links` and recent articles. Staff and wire bylines often have no headshot or bio, and each article's `published_at` is the page's date text such as `September 20, 2026 | 10:06pm`.", - "operationId": "nypost-author", + "description": "Returns a Page Six author profile from a required `url` in the form `https://pagesix.com/author//`. The response has `name`, `biography`, `image_url`, `social_links` and recent articles. An RSS feed link is the only social link always present, and each article's `published_at` is the page's date text such as `September 23, 2026 | 8:16pm`.", + "operationId": "pagesix-author", "parameters": [ { - "description": "Canonical New York Post author URL", + "description": "Canonical Page Six author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://nypost.com/author/jane-doe/" + "x-example": "https://pagesix.com/author/jane-doe/" } ], "produces": [ @@ -419725,7 +435784,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.nypostAuthorResponseDoc" + "$ref": "#/definitions/publicnews.pagesixAuthorResponseDoc" } }, "400": { @@ -419752,80 +435811,56 @@ "ApiKeyAuth": [] } ], - "summary": "Get a New York Post author profile", + "summary": "Get a Page Six author profile", "tags": [ - "New York Post" + "Page Six" ] } }, - "/nypost/headlines": { + "/pagesix/headlines": { "get": { - "description": "Returns recent New York Post stories for one section. `section` is required and takes one of 54 slugs, such as `us-news`, `metro`, `nfl`, `business`, `real-estate` or `astrology`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "nypost-headlines", + "description": "Returns recent Page Six stories for one section. `section` is required and takes one of 30 slugs, such as `celebrity-news`, `royal-family`, `taylor-swift` or `new-york-city-society`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "pagesix-headlines", "parameters": [ { - "description": "New York Post RSS section slug", + "description": "Page Six RSS section slug", "enum": [ - "us-news", - "metro", - "long-island", - "politics", - "world-news", - "sports", - "nfl", - "mlb", - "olympics", - "nba", - "nhl", - "college-football", - "college-basketball", - "wnba", - "sports-plus", - "betting", - "business", - "opinion", + "awards", + "beauty", + "california-society", + "celebrity-news", + "contributor-content", "entertainment", - "tv", + "fashion", + "hollywood", + "hollywood-awards-watch", + "hollywood-media-news", + "hollywood-studio-news", + "lifestyle", + "los-angeles-society", + "media", + "miami-society", "movies", "music", - "celebrities", - "awards", - "theater", + "new-york-city-society", + "palm-beach-society", + "parents", + "real-estate", + "royal-family", "shopping", - "lifestyle", - "weird-but-true", - "sex-and-relationships", - "viral-trends", - "human-interest", - "parenting", - "fashion-and-beauty", - "food-and-drink", + "society", + "sports", + "style", + "taylor-swift", "travel", - "health", - "wellness", - "fitness", - "health-care", - "medicine", - "mens-health", - "womens-health", - "mental-health", - "nutrition", - "real-estate", - "alexa", - "media", - "tech", - "science", - "space", - "environment", - "wildlife", - "archaeology", - "astrology" + "tv", + "washington-dc-society" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "us-news" + "x-example": "awards" } ], "produces": [ @@ -419856,16 +435891,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Post section headlines", + "summary": "Get Page Six section headlines", "tags": [ - "New York Post" + "Page Six" ] } }, - "/nypost/news": { + "/pagesix/news": { "get": { - "description": "Returns the current New York Post top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nypost-headlines` to read a single section.", - "operationId": "nypost-news", + "description": "Returns the current Page Six top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `pagesix-headlines` to read one section.", + "operationId": "pagesix-news", "produces": [ "application/json" ], @@ -419894,16 +435929,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Post top stories", + "summary": "Get Page Six top stories", "tags": [ - "New York Post" + "Page Six" ] } }, - "/nypost/sections": { + "/pagesix/sections": { "get": { - "description": "Lists the 54 New York Post section slugs accepted by `nypost-headlines`, such as `us-news`, `politics`, `nfl`, `celebrities` and `mental-health`. Each entry has its `slug`, display `name` and `url`.", - "operationId": "nypost-sections", + "description": "Lists the 30 Page Six section slugs accepted by `pagesix-headlines`, such as `celebrity-news`, `royal-family`, `taylor-swift` and `palm-beach-society`. Each entry has its `slug`, display `name` and `url`.", + "operationId": "pagesix-sections", "produces": [ "application/json" ], @@ -419920,148 +435955,66 @@ "ApiKeyAuth": [] } ], - "summary": "Get New York Post RSS sections", + "summary": "Get Page Six RSS sections", "tags": [ - "New York Post" + "Page Six" ] } }, - "/nyt/article": { + "/pandamart/search": { "get": { - "description": "Returns a New York Times article by canonical `url`, with `title`, `description`, `published_at`, `updated_at`, `section`, `authors`, `keywords`, `image_url` and the body `paragraphs` in order. Query strings and fragments are stripped. A subscription barrier returns `403`, and non-article or non-NYT URLs return `400`.", - "operationId": "nyt-article", + "consumes": [ + "application/json" + ], + "description": "Returns pandamart grocery/convenience darkstores delivering to a latitude/longitude. Each store carries its code (the value the store and products endpoints take), name, address, coordinates, budget tier, chain, minimum order amount and delivery fee, delivery/pickup availability, and a hero image. A location with no coverage returns an empty list rather than an error.", + "operationId": "pandamart-search", "parameters": [ { - "description": "Canonical NYT article URL", + "description": "Delivery Hero market. One of sg, pk, bd, hk, my, ph. Defaults to sg.", + "enum": [ + "sg", + "pk", + "bd", + "hk", + "my", + "ph" + ], "in": "query", - "name": "url", - "required": true, + "name": "market", "type": "string", - "x-example": "https://www.nytimes.com/2026/09/20/us/politics/example-story.html" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/nyt.articleResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + "x-example": "sg" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get a New York Times article's content", - "tags": [ - "New York Times" - ] - } - }, - "/nyt/author": { - "get": { - "description": "Returns one New York Times contributor's public byline page: name, tagline, About/Contact panels, and their recent articles from a canonical author URL.", - "operationId": "nyt-author", - "parameters": [ { - "description": "Canonical NYT author URL", + "description": "Search center latitude", "in": "query", - "name": "url", + "name": "latitude", "required": true, - "type": "string", - "x-example": "https://www.nytimes.com/by/maggie-haberman" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/nyt.authorResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } + "type": "number", + "x-example": 1.3521 }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Search center longitude", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": 103.8198 }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Darkstores to return, clamped to 50 (default 20)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] + "description": "Result offset for pagination (default 0)", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], - "summary": "Get a New York Times contributor profile", - "tags": [ - "New York Times" - ] - } - }, - "/nyt/categories": { - "get": { - "description": "Lists the public New York Times editorial navigation taxonomy, including top-level categories and nested destinations. Use /nyt/sections for the separately verified RSS-backed section values accepted by /nyt/headlines; product links, newsletters, and podcasts are not included as article categories.", - "operationId": "nyt-categories", "produces": [ "application/json" ], @@ -420069,11 +436022,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nyt.categoriesResponseDoc" + "$ref": "#/definitions/pandamart.searchResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -420090,24 +436043,56 @@ "ApiKeyAuth": [] } ], - "summary": "List New York Times navigation categories", + "summary": "Search pandamart darkstores near a location", "tags": [ - "New York Times" + "Pandamart" ] } }, - "/nyt/headlines": { + "/pandamart/store": { "get": { - "description": "Returns a New York Times section RSS feed: each story's title, canonical URL, description, author, publication time, and lead image. Section must be a slug returned by /nyt/sections.", - "operationId": "nyt-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one pandamart darkstore's detail by code: name, address, coordinates, budget tier, chain, minimum order amount, minimum delivery fee, delivery/pickup availability, timezone, and a hero image. Supplying latitude and longitude only affects the (optional) computed fields the upstream itself returns for that coordinate; it does not filter or reject the lookup.", + "operationId": "pandamart-store", "parameters": [ { - "description": "Section slug from /nyt/sections", + "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", + "enum": [ + "sg", + "pk", + "bd", + "hk", + "my", + "ph" + ], "in": "query", - "name": "section", + "name": "market", + "type": "string", + "x-example": "sg" + }, + { + "description": "Darkstore code, from /pandamart/search's code field", + "in": "query", + "name": "code", "required": true, "type": "string", - "x-example": "World" + "x-example": "wsg7" + }, + { + "description": "Caller latitude, optional", + "in": "query", + "name": "latitude", + "type": "number", + "x-example": 1.3521 + }, + { + "description": "Caller longitude, optional", + "in": "query", + "name": "longitude", + "type": "number", + "x-example": 103.8198 } ], "produces": [ @@ -420117,7 +436102,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nyt.headlinesResponseDoc" + "$ref": "#/definitions/pandamart.storeResponseDoc" } }, "400": { @@ -420132,12 +436117,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -420150,16 +436129,44 @@ "ApiKeyAuth": [] } ], - "summary": "Get the latest stories in a New York Times section", + "summary": "Get one pandamart darkstore's detail", "tags": [ - "New York Times" + "Pandamart" ] } }, - "/nyt/sections": { + "/pandamart/store/categories": { "get": { - "description": "Lists the New York Times section slugs accepted by `nyt-headlines`, such as `World` and `Business`, each with its display `name` and `url`. It covers only the sections that endpoint takes; use `nyt-categories` for the broader site navigation, including Politics, DealBook and Wirecutter.", - "operationId": "nyt-sections", + "consumes": [ + "application/json" + ], + "description": "Returns one darkstore's full category tree: every category and sub-category, each with the upstream-reported product count and (for top-level categories) an image. This lists what categories exist and how large they are -- it does not fetch the items inside any one category. Sub-category product counts are frequently 0 upstream; only top-level counts are reliably populated.", + "operationId": "pandamart-store-categories", + "parameters": [ + { + "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", + "enum": [ + "sg", + "pk", + "bd", + "hk", + "my", + "ph" + ], + "in": "query", + "name": "market", + "type": "string", + "x-example": "sg" + }, + { + "description": "Darkstore code, from /pandamart/search's code field", + "in": "query", + "name": "code", + "required": true, + "type": "string", + "x-example": "wsg7" + } + ], "produces": [ "application/json" ], @@ -420167,7 +436174,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/nyt.sectionsResponseDoc" + "$ref": "#/definitions/pandamart.categoriesResponseDoc" } }, "400": { @@ -420176,8 +436183,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -420194,24 +436201,50 @@ "ApiKeyAuth": [] } ], - "summary": "List New York Times sections", + "summary": "Get one pandamart darkstore's category tree", "tags": [ - "New York Times" + "Pandamart" ] } }, - "/nzherald/article": { + "/pandamart/store/product": { "get": { - "description": "Returns public NZ Herald article metadata and body paragraphs from a canonical article URL. A premium (subscriber-only) article URL returns a permission error instead of a partial or fabricated body.", - "operationId": "nzherald-article", + "consumes": [ + "application/json" + ], + "description": "Returns one product's full detail by ID: the same fields a shelf/search result carries plus category_id and, for weighable/grocery items, per-unit pricing and nutrition attributes. Resolves the store's page slug internally, so only the darkstore code and product ID are needed.", + "operationId": "pandamart-store-product", "parameters": [ { - "description": "Canonical NZ Herald article URL", + "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", + "enum": [ + "sg", + "pk", + "bd", + "hk", + "my", + "ph" + ], "in": "query", - "name": "url", + "name": "market", + "type": "string", + "x-example": "sg" + }, + { + "description": "Darkstore code, from /pandamart/search's code field", + "in": "query", + "name": "code", "required": true, "type": "string", - "x-example": "https://www.nzherald.co.nz/nz/example-article-slug/ABCDEFGHIJKLMNOPQRST1234/" + "x-example": "wsg7" + }, + { + "description": "Product ID, from a search/products/categories response's id field", + "in": "query", + "name": "product_id", + "required": true, + "type": "string", + "x-example": "8012454" } ], "produces": [ @@ -420221,7 +436254,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/pandamart.productDetailResponseDoc" } }, "400": { @@ -420230,12 +436263,6 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "404": { "description": "Not Found", "schema": { @@ -420254,24 +436281,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get NZ Herald article content", + "summary": "Get one pandamart product's full detail", "tags": [ - "NZ Herald" + "Pandamart" ] } }, - "/nzherald/author": { + "/pandamart/store/products": { "get": { - "description": "Returns an NZ Herald author profile from a required `url` in the form `https://www.nzherald.co.nz/author//`. The response has `name`, `job_title`, `location`, `email`, `biography`, `image_url` and recent articles. Each field reflects what the author's page shows, and article `published_at` is RFC3339 where the page gives a machine-readable timestamp.", - "operationId": "nzherald-author", + "consumes": [ + "application/json" + ], + "description": "Returns one darkstore's product showcase: every named shelf its own home page displays (deals, new arrivals, category highlights, etc.), each with real prices, stock, and availability. This is the curated set of shelves the store's home page surfaces, not the full category-browsable catalog.", + "operationId": "pandamart-store-products", "parameters": [ { - "description": "Canonical NZ Herald author URL", + "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", + "enum": [ + "sg", + "pk", + "bd", + "hk", + "my", + "ph" + ], "in": "query", - "name": "url", + "name": "market", + "type": "string", + "x-example": "sg" + }, + { + "description": "Darkstore code, from /pandamart/search's code field", + "in": "query", + "name": "code", "required": true, "type": "string", - "x-example": "https://www.nzherald.co.nz/author/jane-doe/" + "x-example": "wsg7" } ], "produces": [ @@ -420281,7 +436326,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.nzheraldAuthorResponseDoc" + "$ref": "#/definitions/pandamart.productsResponseDoc" } }, "400": { @@ -420308,70 +436353,76 @@ "ApiKeyAuth": [] } ], - "summary": "Get an NZ Herald author profile", + "summary": "Get one pandamart darkstore's product showcase", "tags": [ - "NZ Herald" + "Pandamart" ] } }, - "/nzherald/headlines": { + "/pandamart/store/search": { "get": { - "description": "Returns recent NZ Herald headlines for one section. `section` is required and takes a slug listed by `nzherald-sections`, such as `nz`, `business`, `rugby`, `politics` or `world`. Each item has a title and URL. A URL may point at a premium article, which `nzherald-article` rejects with a permission error.", - "operationId": "nzherald-headlines", + "consumes": [ + "application/json" + ], + "description": "Searches by keyword within one darkstore's own catalog -- the pandamart equivalent of the search box on a darkstore page. Unlike the product showcase's curated shelves, this reaches the store's full catalog by keyword. Returns matching products with real prices, stock, and availability, plus total_products and has_more for pagination via page/limit.", + "operationId": "pandamart-store-search", "parameters": [ { - "description": "NZ Herald section slug", + "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", "enum": [ - "business", - "markets-with-madison", - "media-insider", - "business-reports", - "small-business", - "personal-finance", - "economy", - "companies", - "markets", - "entertainment", - "lifestyle", - "society-insider", - "nz", - "crime", - "education", - "politics", - "trailblazers", - "property", - "sport", - "commonwealth-games", - "cricket", - "olympics", - "paralympics", - "rugby", - "rugby-league", - "football", - "basketball", - "golf", - "boxing", - "netball", - "athletics", - "cycling", - "motorsport", - "racing", - "sailing", - "tennis", - "ufc", - "technology", - "travel", - "travel-news", - "world", - "kahu", - "talanoa", - "the-selection" + "sg", + "pk", + "bd", + "hk", + "my", + "ph" ], "in": "query", - "name": "section", + "name": "market", + "type": "string", + "x-example": "sg" + }, + { + "description": "Darkstore code, from /pandamart/search's code field", + "in": "query", + "name": "code", "required": true, "type": "string", - "x-example": "business" + "x-example": "wsg7" + }, + { + "description": "Product search text", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "milk" + }, + { + "description": "Result order. One of RELEVANCE, PRICE_ASC, PRICE_DESC. Defaults to RELEVANCE.", + "enum": [ + "RELEVANCE", + "PRICE_ASC", + "PRICE_DESC" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "RELEVANCE" + }, + { + "description": "1-based result page (default 1)", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Products per page, clamped to 10-50 (default 20)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -420381,7 +436432,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/pandamart.storeSearchResponseDoc" } }, "400": { @@ -420402,16 +436453,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get NZ Herald section headlines", + "summary": "Search for products within one pandamart darkstore", "tags": [ - "NZ Herald" + "Pandamart" ] } }, - "/nzherald/news": { + "/panera/at-work-locations": { "get": { - "description": "Returns the current New Zealand Herald top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `nzherald-headlines` to read one section.", - "operationId": "nzherald-news", + "consumes": [ + "application/json" + ], + "description": "Returns the full national Panera at Work location list -- a separate B2B workplace-delivery drop-off program from ordinary cafe pickup/delivery covered by GET /panera/locations. Each location carries its address, coordinates, delivery contact, lead time, the cafe id that services it, and its scheduled drop-off/order-cutoff times per weekday. This is a small, national dataset -- no query parameters are needed.", + "operationId": "panera-at-work-locations", "produces": [ "application/json" ], @@ -420419,7 +436473,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/panera.atWorkLocationsResponseDoc" } }, "429": { @@ -420440,59 +436494,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get NZ Herald top stories", - "tags": [ - "NZ Herald" - ] - } - }, - "/nzherald/sections": { - "get": { - "description": "Lists the NZ Herald section slugs accepted by `nzherald-headlines`, such as `nz`, `business`, `rugby`, `technology` and `world`. Each entry has its `slug`, a display `name` (for example `New Zealand` for `nz`) and a `url`.", - "operationId": "nzherald-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get NZ Herald sections", + "summary": "Get Panera Bread's Panera at Work workplace-delivery locations", "tags": [ - "NZ Herald" + "Panera" ] } }, - "/ohpolly/collections": { + "/panera/cafe": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from Oh Polly (https://www.ohpolly.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", - "operationId": "ohpolly-collections", + "description": "Returns one Panera Bread cafe's address, phone, coordinates, amenity flags, per-fulfillment-channel availability (dine-in, storefront/pickup, rapid pickup, drive-thru, curbside, delivery -- each with its own available/open-now/lead-time-minutes and weekly hours where Panera publishes them) and the published storefront hours for the next calendar week with concrete dates. Cafe ids come from GET /panera/locations. An unknown cafe id returns a 404.", + "operationId": "panera-cafe", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Panera cafe id, from /panera/locations", "in": "query", - "name": "limit", + "name": "cafe_id", + "required": true, "type": "integer", - "x-example": 50 + "x-example": 601447 } ], "produces": [ @@ -420502,7 +436524,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/panera.cafeResponseDoc" } }, "400": { @@ -420511,6 +436533,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -420529,41 +436557,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Oh Polly collections", + "summary": "Get one Panera Bread cafe's detail and hours", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/collections/{handle}/products": { + "/panera/catering-delivery-info": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one Oh Polly (https://www.ohpolly.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", - "operationId": "ohpolly-collection-products", + "description": "Returns one cafe's catering delivery fee, minimum order amount, weekly delivery hours, order-size lead-time tiers (e.g. a $750+ order needs a longer lead time than a smaller one), and upcoming available delivery dates with their order windows. This is Panera's catering delivery flow specifically -- catering pickup happens at the cafe itself, whose hours are already covered by GET /panera/cafe. Returns 404 if the cafe does not offer catering delivery.", + "operationId": "panera-catering-delivery-info", "parameters": [ { - "description": "Collection handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "collection-handle" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Panera cafe id, from /panera/locations", "in": "query", - "name": "limit", + "name": "cafe_id", + "required": true, "type": "integer", - "x-example": 50 + "x-example": 601447 } ], "produces": [ @@ -420573,7 +436587,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/panera.cateringDeliveryInfoResponseDoc" } }, "400": { @@ -420606,33 +436620,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Oh Polly collection products", + "summary": "Get one Panera Bread cafe's catering delivery fee, minimum order, hours and lead times", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/pages": { + "/panera/catering-menu": { "get": { "consumes": [ "application/json" ], - "description": "Lists Oh Polly's static pages, paged with `page` (default 1) and `limit` (default 50, max 250). Each page has its handle, title, URL, plain-text content and timestamps. In some responses `transport_mode` is `ssr_embedded` and items carry only `handle`, `url` and `updated_at`, so fetch a single page for its content.", - "operationId": "ohpolly-pages", + "description": "Returns one cafe's catering category list and its full catering item catalog, priced for that specific cafe -- Panera's catering ordering flow is a separate application from its retail site, with its own category structure, pricing and item availability (confirmed live: the same item priced differently between a placeholder default cafe and a real cafe). Categories are a flat list (catering does not publish a category hierarchy the way the retail menu does). Each item carries its price, product type, portion label, whether it is customizable, a full published nutrient panel (calories, calories from fat, fat, saturated fat, trans fat, cholesterol, sodium, carbohydrates, dietary fiber, total sugars, protein, caffeine -- richer than the retail menu's calories/caffeine-only surface), its allergen statement (contains / may-contain, each with an id and display name), and a live in_stock flag from this cafe's current catering stockout feed for today. Cafe ids come from GET /panera/locations.", + "operationId": "panera-catering-menu", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Panera cafe id, from /panera/locations", "in": "query", - "name": "limit", + "name": "cafe_id", + "required": true, "type": "integer", - "x-example": 50 + "x-example": 601447 } ], "produces": [ @@ -420642,7 +436650,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/panera.cateringMenuResponseDoc" } }, "400": { @@ -420669,27 +436677,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Oh Polly static pages", + "summary": "Get one Panera Bread cafe's catering menu with prices, nutrition and allergens", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/pages/{handle}": { + "/panera/geocode": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Oh Polly static page by its `handle`: title, page URL, plain-text content, and created, published and updated times. Content is cleaned text, not HTML. An unknown handle returns 404. The store is fixed to Oh Polly, so no store URL is needed. Some responses include `transport_mode` set to `ssr_embedded` and omit `id`.", - "operationId": "ohpolly-page", + "description": "Resolves a free-text address, city, or postal code to coordinates using Panera Bread's own locator geocoder -- the same lookup its site uses to center a cafe search. Returns latitude/longitude plus the resolved city, state, country and formatted address. An address Panera cannot resolve returns a single result with resolved false rather than an error.", + "operationId": "panera-geocode", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", + "description": "Free-text address, city, or postal code", + "in": "query", + "name": "address", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "Chicago, IL" } ], "produces": [ @@ -420699,7 +436707,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/panera.geocodeResponseDoc" } }, "400": { @@ -420708,12 +436716,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -420732,33 +436734,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Oh Polly static page", + "summary": "Geocode a free-text address for Panera Bread's locator", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/products": { + "/panera/item-detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from Oh Polly's (https://www.ohpolly.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "ohpolly-products", + "description": "Returns one menu item's full description, ingredient statement, a full per-serving nutrient panel (richer than GET /panera/menu's calories/caffeine-only surface), its allergen statement, and every selectable size with its own price and calories. item_id may be negative -- GET /panera/menu itself surfaces negative item ids for some items, and they resolve fine here. Returns 404 if Panera publishes no detail page for the given item id at this cafe.", + "operationId": "panera-item-detail", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Panera cafe id, from /panera/locations", "in": "query", - "name": "page", + "name": "cafe_id", + "required": true, "type": "integer", - "x-example": 1 + "x-example": 601447 }, { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Menu item id, from /panera/menu", "in": "query", - "name": "limit", + "name": "item_id", + "required": true, "type": "integer", - "x-example": 50 + "x-example": 650115 } ], "produces": [ @@ -420768,7 +436772,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" + "$ref": "#/definitions/panera.itemDetailResponseDoc" } }, "400": { @@ -420777,6 +436781,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -420795,27 +436805,35 @@ "ApiKeyAuth": [] } ], - "summary": "List Oh Polly products", + "summary": "Get one Panera Bread menu item's full detail", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/products/{handle}": { + "/panera/item-options": { "get": { "consumes": [ "application/json" ], - "description": "Returns product detail for one Oh Polly (https://www.ohpolly.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "ohpolly-product", + "description": "Returns one item's selectable option groups: for a combo, each group is a slot to fill (for example \"pick 4 sandwiches\", \"pick 1 soup\"), listing every eligible choice; for a single customizable item, each group is one topping/add-in/amount choice (for example No, Light, Regular, Extra). Each group has min_allowed and max_allowed (how many selections it requires). Each option is one selectable choice, with its own selectable variants (amount tiers) each carrying an item_id and price -- price 0 for a variant included at no extra charge. Panera does not publish a resolved display name for options or groups on this surface, so each option carries its raw upstream image_key as the caller-facing identifier instead of a name. An item that is not customizable, or an unknown item id, returns an empty groups list rather than an error -- Panera's own API does not distinguish the two cases. Item ids come from GET /panera/menu.", + "operationId": "panera-item-options", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Panera cafe id, from /panera/locations", + "in": "query", + "name": "cafe_id", "required": true, - "type": "string", - "x-example": "product-handle" + "type": "integer", + "x-example": 601447 + }, + { + "description": "Menu item id, from /panera/menu", + "in": "query", + "name": "item_id", + "required": true, + "type": "integer", + "x-example": 643423 } ], "produces": [ @@ -420825,7 +436843,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" + "$ref": "#/definitions/panera.itemOptionsResponseDoc" } }, "400": { @@ -420834,12 +436852,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -420858,45 +436870,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Oh Polly product", + "summary": "Get one Panera Bread menu item's selectable option groups", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/products/{handle}/recommendations": { + "/panera/locations": { "get": { "consumes": [ "application/json" ], - "description": "Returns recommended products for one Oh Polly (https://www.ohpolly.com) product handle. The storefront URL is fixed server-side.", - "operationId": "ohpolly-product-recommendations", + "description": "Returns one level of Panera Bread's US cafe locator tree. Omit both state and city to list every US state and territory Panera serves, each with its cafe count. Pass state to list every city in that state, each with its full cafe list -- id, name, street address, city, state, postal code, phone, coordinates and per-cafe amenity flags (for example hasDriveThru, hasDelivery, hasCurbside, hasKiosk). Pass both state and city to narrow to that one city's cafes. A state Panera does not serve, or a city with no match, returns an empty list rather than an error.", + "operationId": "panera-locations", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" - }, - { - "description": "Maximum products, defaults to 10 and supports up to 20", + "description": "Two-letter US state abbreviation. Omit to list every state.", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "state", + "type": "string", + "x-example": "IL" }, { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], + "description": "City name. Requires state. Omit to list every city in the state.", "in": "query", - "name": "intent", + "name": "city", "type": "string", - "x-example": "related" + "x-example": "Chicago" } ], "produces": [ @@ -420906,7 +436906,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/panera.locationsResponseDoc" } }, "400": { @@ -420915,12 +436915,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -420939,41 +436933,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Oh Polly product recommendations", + "summary": "Browse Panera Bread's US cafe locator", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/search/suggest": { + "/panera/menu": { "get": { "consumes": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from Oh Polly's (https://www.ohpolly.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "ohpolly-search-suggest", + "description": "Returns one cafe's full category tree (with subcategories) and its complete item catalog, priced for that specific cafe -- Panera's prices are genuinely per-cafe, not a national list (the same salad has been confirmed live at different prices in Chicago and New York). Each item carries its price, product type, whether it is customizable, its published nutrients (only Calories and Caffeine are published -- a fuller macro/micronutrient breakdown is not available), its allergen statement (contains / may-contain, each with an id and display name), Panera's own wellness/dietary labels (for example Vegan, Vegetarian, Gluten Conscious), and a live in_stock flag reflecting this cafe's current stockouts. Cafe ids come from GET /panera/locations. An unknown cafe id returns a 404.", + "operationId": "panera-menu", "parameters": [ { - "description": "Search query", + "description": "Panera cafe id, from /panera/locations", "in": "query", - "name": "q", + "name": "cafe_id", "required": true, - "type": "string", - "x-example": "wool" - }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" - }, - { - "description": "Maximum results per type, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", "type": "integer", - "x-example": 10 + "x-example": 601447 } ], "produces": [ @@ -420983,7 +436963,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + "$ref": "#/definitions/panera.menuResponseDoc" } }, "400": { @@ -420992,6 +436972,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -421010,42 +436996,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Oh Polly search suggestions", + "summary": "Get one Panera Bread cafe's full menu with prices, nutrition and allergens", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/sitemap/urls": { + "/panera/quantity-rules": { "get": { "consumes": [ "application/json" ], - "description": "Returns capped URL entries from Oh Polly's (https://www.ohpolly.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", - "operationId": "ohpolly-sitemap-urls", + "description": "Returns one cafe's active order-quantity limits -- promotional or supply-constrained items Panera caps per order (for example a seasonal souffle limited to 6 within a 2-day window). Each rule has a scope (item or group), the item ids it applies to, and one or more day-offset windows each with its own max_quantity. A cafe with no active limits returns an empty rules list, not an error. Cafe ids come from GET /panera/locations.", + "operationId": "panera-quantity-rules", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", - "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" - ], - "in": "query", - "name": "type", - "type": "string", - "x-example": "products" - }, - { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "description": "Panera cafe id, from /panera/locations", "in": "query", - "name": "limit", + "name": "cafe_id", + "required": true, "type": "integer", - "x-example": 50 + "x-example": 601447 } ], "produces": [ @@ -421055,7 +437026,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/panera.quantityRulesResponseDoc" } }, "400": { @@ -421082,19 +437053,29 @@ "ApiKeyAuth": [] } ], - "summary": "List Oh Polly sitemap URLs", + "summary": "Get one Panera Bread cafe's order-quantity limits", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/sitemaps": { + "/panera/retired-products": { "get": { "consumes": [ "application/json" ], - "description": "Returns child sitemap URLs from Oh Polly's (https://www.ohpolly.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", - "operationId": "ohpolly-sitemaps", + "description": "Returns items no longer on the active menu, resolved through the given cafe's own version map -- either permanently retired (availability_stage RETIRED) or currently out of seasonal rotation (SEASONAL, may return). Each item carries its name, description, portion label and image key. Cafe ids come from GET /panera/locations.", + "operationId": "panera-retired-products", + "parameters": [ + { + "description": "Panera cafe id, from /panera/locations", + "in": "query", + "name": "cafe_id", + "required": true, + "type": "integer", + "x-example": 601447 + } + ], "produces": [ "application/json" ], @@ -421102,7 +437083,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/panera.retiredProductsResponseDoc" } }, "400": { @@ -421129,19 +437110,37 @@ "ApiKeyAuth": [] } ], - "summary": "List Oh Polly sitemaps", + "summary": "Get Panera Bread's retired and seasonal menu items", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/ohpolly/store": { + "/panera/time-slots": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for Oh Polly (https://www.ohpolly.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "ohpolly-store", + "description": "Returns one cafe's available pickup/delivery order time-slot windows for one date, plus that date's overall open/close time. Unlike GET /panera/cafe's published storefront hours, this reflects live order-slot availability, not just when the cafe is open -- an empty windows list is a legitimate outcome (e.g. the cafe is closed that day), not an error. date must be YYYY-MM-DD, interpreted in the cafe's own local timezone.", + "operationId": "panera-time-slots", + "parameters": [ + { + "description": "Panera cafe id, from /panera/locations", + "in": "query", + "name": "cafe_id", + "required": true, + "type": "integer", + "x-example": 601447 + }, + { + "description": "Date, YYYY-MM-DD", + "in": "query", + "name": "date", + "required": true, + "type": "string", + "x-example": "2026-09-10" + } + ], "produces": [ "application/json" ], @@ -421149,7 +437148,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/panera.timeSlotsResponseDoc" } }, "400": { @@ -421176,36 +437175,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Oh Polly store metadata", + "summary": "Get one Panera Bread cafe's available order time-slot windows", "tags": [ - "Oh Polly" + "Panera" ] } }, - "/oldnavy/categories": { + "/panera/upsell-suggestions": { "get": { "consumes": [ "application/json" ], - "description": "Lists Old Navy's own storefront navigation as name/cid pairs, resolving the cid-discovery gap oldnavy-search, oldnavy-product, and oldnavy-category all document. Omit cid to list Old Navy's top-level divisions (e.g. Women, Men, Boys, Toddler). Pass a cid (a division's own, or any deeper category's) to list the related categories for that part of the storefront instead, in the same order the live storefront menu shows them -- this is section-level, not necessarily unique per leaf category. Currently only available for brand=on (Old Navy).", - "operationId": "oldnavy-categories", + "description": "Returns Panera's own suggested add-ons per menu item (for example \"Extra Turkey\" and \"Extra Bacon\" for a Bacon Turkey Bravo sandwich). Item ids on this surface are in a separate id space from /panera/menu's item_id, but both the item and its suggestions carry their own resolved names, so no cross-reference is needed. Cafe ids come from GET /panera/locations.", + "operationId": "panera-upsell-suggestions", "parameters": [ { - "default": "on", - "description": "Storefront to list -- only on (Old Navy) is currently supported", - "enum": [ - "on" - ], - "in": "query", - "name": "brand", - "type": "string" - }, - { - "description": "Category id to list related categories for; omit to list the top-level divisions", + "description": "Panera cafe id, from /panera/locations", "in": "query", - "name": "cid", - "type": "string", - "x-example": "1185232" + "name": "cafe_id", + "required": true, + "type": "integer", + "x-example": 601447 } ], "produces": [ @@ -421215,7 +437205,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/oldnavy.categoriesResponseDoc" + "$ref": "#/definitions/panera.upsellSuggestionsResponseDoc" } }, "400": { @@ -421242,51 +437232,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Old Navy storefront categories", + "summary": "Get one Panera Bread cafe's per-item upsell suggestions", "tags": [ - "Old Navy" + "Panera" ] } }, - "/oldnavy/category": { + "/papajohns/allergens": { "get": { "consumes": [ "application/json" ], - "description": "Returns a category/browse listing for one storefront category id (cid). cid is an opaque Gap Inc category id assigned by the storefront's own navigation -- neither oldnavy-search nor oldnavy-category currently surface a category-id list, so find one from the storefront's own category page URLs (the cid query parameter on a /browse/... page) for now. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the cid was found under. Returns the category's subcategory breakdown, product summaries with per-color inventory data, and available search facets with live counts.", - "operationId": "oldnavy-category", - "parameters": [ - { - "description": "Category id, from a storefront category page's own cid query parameter", - "in": "query", - "name": "cid", - "required": true, - "type": "string", - "x-example": "85729" - }, - { - "default": "on", - "description": "Storefront to browse", - "enum": [ - "on", - "gap", - "br", - "at" - ], - "in": "query", - "name": "brand", - "type": "string" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", - "type": "integer" - } - ], + "description": "Returns Papa John's complete published item x allergen matrix (crusts, sauces, cheeses, meats, veggies, and more), grouped by section, each item flagged for peanut, tree nut, egg, milk, wheat, soy, fish, shellfish, and sesame content.", + "operationId": "papajohns-allergens", "produces": [ "application/json" ], @@ -421294,19 +437252,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/oldnavy.categoryResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/papajohns.allergensResponseDoc" } }, "429": { @@ -421327,40 +437273,33 @@ "ApiKeyAuth": [] } ], - "summary": "Browse an Old Navy, Gap, Banana Republic, or Athleta category", + "summary": "Get Papa John's full allergen guide", "tags": [ - "Old Navy" + "Papa John's" ] } }, - "/oldnavy/product": { + "/papajohns/colombia/menu": { "get": { "consumes": [ "application/json" ], - "description": "Returns product-detail data for one color variant: name, description, images, aggregate rating, and every size offered in that color as a separate priced offer. pid is a color-specific product id, as returned by oldnavy-search's product colors[].id field (not the bare base product id). Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the pid was found under.", - "operationId": "oldnavy-product", + "description": "Returns Papa John's **Colombia** menu with prices in Colombian pesos. Every product lists its priced SKU variants across the four axes Colombia sells on — size, dough, crust and sauce — each with its own price and availability. Colombia runs its own ordering platform, independent of the six markets behind GET /papajohns/intl/menu and of Peru and El Salvador, so it has its own endpoint. Prices are Colombian pesos and are not comparable with any other market. The full catalog is paged through before returning, so the response is complete rather than a first page.", + "operationId": "papajohns-colombia-menu", "parameters": [ { - "description": "Color-specific product id, from a search result's colors[].id field", + "description": "Return only categories whose name contains this text, case-insensitive, e.g. Pizzas or Bebidas", "in": "query", - "name": "pid", - "required": true, + "name": "category", "type": "string", - "x-example": "907290012" + "x-example": "Pizzas" }, { - "default": "on", - "description": "Storefront the pid belongs to", - "enum": [ - "on", - "gap", - "br", - "at" - ], + "description": "Include every priced SKU variant. Default true; set false for a lighter response carrying only each product's cheapest price.", "in": "query", - "name": "brand", - "type": "string" + "name": "include_variants", + "type": "boolean", + "x-example": true } ], "produces": [ @@ -421370,7 +437309,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/oldnavy.productResponseDoc" + "$ref": "#/definitions/papajohns.latamMenuResponseDoc" } }, "400": { @@ -421403,68 +437342,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Old Navy, Gap, Banana Republic, or Athleta product", + "summary": "Get the Papa John's Colombia priced menu (COP)", "tags": [ - "Old Navy" + "Papa John's" ] } }, - "/oldnavy/product/availability": { + "/papajohns/deals": { "get": { "consumes": [ "application/json" ], - "description": "Checks per-size, in-store pickup stock status for one color (pid) at one or more physical stores. pid matches oldnavy-product's own color-level id. Give store location either directly with store_id (one or more comma-separated store ids, e.g. from a prior call to this endpoint or a value you already have) or with zip or both lat and lng, which resolves the nearest stores automatically. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Each returned store lists every offered size's stock status: `in_stock`, `out_of_stock`, or `low_stock`.", - "operationId": "oldnavy-product-availability", + "description": "Returns the promotions a Papa John's US or Canada restaurant is currently running. Each offer carries its redemption code, title, description, offer price and — where the deal advertises a saving — the struck-through regular price, plus its artwork and deal-builder link. Pass a store_id from GET /papajohns/store or GET /papajohns/nearby: promotions are store-specific, and the national response is largely placeholders prompting the customer to choose a store, which are omitted here rather than returned as real offers.", + "operationId": "papajohns-deals", "parameters": [ { - "description": "Color-level Old Navy/Gap/Banana Republic/Athleta product id", - "in": "query", - "name": "pid", - "required": true, - "type": "string", - "x-example": "907290012" - }, - { - "default": "on", - "description": "Storefront to check", - "enum": [ - "on", - "gap", - "br", - "at" - ], - "in": "query", - "name": "brand", - "type": "string" - }, - { - "description": "One or more comma-separated numeric store ids", + "description": "Restaurant id from GET /papajohns/store or GET /papajohns/nearby. Omit for national promotions.", "in": "query", "name": "store_id", "type": "string", - "x-example": "3444" - }, - { - "description": "Zip code to resolve the nearest stores from", - "in": "query", - "name": "zip", - "type": "string", - "x-example": "10001" - }, - { - "description": "Latitude to resolve the nearest stores from (must be given together with lng)", - "in": "query", - "name": "lat", - "type": "number", - "x-example": 40.7128 - }, - { - "description": "Longitude to resolve the nearest stores from (must be given together with lat)", - "in": "query", - "name": "lng", - "type": "number", - "x-example": -74.006 + "x-example": "5054" } ], "produces": [ @@ -421474,7 +437371,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/oldnavy.availabilityResponseDoc" + "$ref": "#/definitions/papajohns.dealsResponseDoc" } }, "400": { @@ -421507,49 +437404,26 @@ "ApiKeyAuth": [] } ], - "summary": "Check in-store pickup stock for an Old Navy, Gap, Banana Republic, or Athleta product", + "summary": "List a Papa John's restaurant's current promotions", "tags": [ - "Old Navy" + "Papa John's" ] } }, - "/oldnavy/product/reviews": { + "/papajohns/directory": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a product's customer reviews (author, date, rating, headline, body, and verified-purchase flag), plus the product's overall rating summary (average rating, rating count, per-star histogram, and recommended ratio). pid is a color-specific product id, as returned by oldnavy-search's product colors[].id field (not the bare base product id) -- the same pid oldnavy-product accepts. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the pid was found under. A product with no reviews yet returns a well-formed empty result, not an error.", - "operationId": "oldnavy-product-reviews", + "description": "Returns one level of Papa John's store directory. Omit path for the root country index, then pass a child's path to descend through state, city, and store levels. Each child includes its name, path, URL, store count when available, and whether it is a store leaf. Pass a store child's path to GET /papajohns/store. This is a directory browse; use GET /papajohns/nearby for a coordinate search.", + "operationId": "papajohns-directory", "parameters": [ { - "description": "Color-specific product id, from a search result's colors[].id field", + "description": "Directory path from a previous response's children[].path; omit for the root country index", "in": "query", - "name": "pid", - "required": true, + "name": "path", "type": "string", - "x-example": "907290012" - }, - { - "default": "on", - "description": "Storefront the pid belongs to", - "enum": [ - "on", - "gap", - "br", - "at" - ], - "in": "query", - "name": "brand", - "type": "string" - }, - { - "default": 1, - "description": "One-based page, 10 reviews per page", - "in": "query", - "maximum": 1000, - "minimum": 1, - "name": "page", - "type": "integer" + "x-example": "united-states/ca" } ], "produces": [ @@ -421559,7 +437433,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/oldnavy.productReviewsResponseDoc" + "$ref": "#/definitions/papajohns.directoryResponseDoc" } }, "400": { @@ -421592,49 +437466,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get reviews for an Old Navy, Gap, Banana Republic, or Athleta product", + "summary": "Browse the Papa John's store directory", "tags": [ - "Old Navy" + "Papa John's" ] } }, - "/oldnavy/search": { + "/papajohns/elsalvador/menu": { "get": { "consumes": [ "application/json" ], - "description": "Searches product listings across Old Navy, Gap, Banana Republic, and Athleta -- select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Returns product summaries with pricing, review scores, and every purchasable color variant. This search is best-effort relevance, not a guaranteed keyword match: for an obscure or nonsense keyword the upstream search index falls back to its own recommended results instead of returning an empty list, and there is currently no reliable signal in the response to distinguish a true keyword match from that fallback behavior.", - "operationId": "oldnavy-search", + "description": "Returns Papa John's **El Salvador** menu with prices in US dollars. Each pizza lists its full size and crust price matrix — every combination of size (Grande, Gigante) and crust (Masa Original, Masa Delgada, Orilla Rellena de Queso) with that combination's own price — while sides, desserts and extras carry a single price. El Salvador runs its own ordering platform, independent of the six markets behind GET /papajohns/intl/menu and of Colombia and Peru, so it has its own endpoint. This is El Salvador's national menu; the site itself notes that choosing a restaurant can reveal further items.", + "operationId": "papajohns-elsalvador-menu", "parameters": [ { - "description": "Search keyword", + "description": "Return only categories whose name contains this text, case-insensitive. One of: Pizzas, Entradas, Postres, Extras", "in": "query", - "name": "keyword", - "required": true, + "name": "category", "type": "string", - "x-example": "jeans" - }, - { - "default": "on", - "description": "Storefront to search", - "enum": [ - "on", - "gap", - "br", - "at" - ], - "in": "query", - "name": "brand", - "type": "string" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", - "type": "integer" + "x-example": "Pizzas" } ], "produces": [ @@ -421644,7 +437495,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/oldnavy.searchResponseDoc" + "$ref": "#/definitions/papajohns.latamMenuResponseDoc" } }, "400": { @@ -421677,53 +437528,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Old Navy, Gap, Banana Republic, or Athleta products", + "summary": "Get the Papa John's El Salvador priced menu (USD)", "tags": [ - "Old Navy" + "Papa John's" ] } }, - "/oldnavy/stores": { + "/papajohns/india/deal": { "get": { "consumes": [ "application/json" ], - "description": "Searches physical store locations for one storefront by free-text search (zip code or city) and/or coordinates. Provide search, or both lat and lng. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Returns each nearby store's name, full address, phone number, coordinates, distance, and specialties (e.g. \"In-Store Shopping\", \"Outlet\"). This is location search only -- it does not report per-item, per-store stock levels; use oldnavy-product-availability for that.", - "operationId": "oldnavy-stores", + "description": "Returns one Papa John's **India** combo or offer with its full composition: each slot in the deal (with its quantity, size, and whether it can be skipped) and every menu item eligible to fill that slot, with each choice's own price in Indian Rupees. This is materially more than the deal row in GET /papajohns/india/menu, which carries only the deal's name, price, and pricing rule. price_type is one of fixedPrice, BuyXGetY, HalfAndHalf, or variablePrice; only fixedPrice deals report a non-zero price. India market only.", + "operationId": "papajohns-india-deal", "parameters": [ { - "description": "Zip code or city to search near", + "description": "Deal id from GET /papajohns/india/menu (items with kind=deal)", "in": "query", - "name": "search", + "name": "deal_id", + "required": true, "type": "string", - "x-example": "10001" - }, - { - "description": "Latitude (must be given together with lng)", - "in": "query", - "name": "lat", - "type": "number", - "x-example": 40.7128 - }, - { - "description": "Longitude (must be given together with lat)", - "in": "query", - "name": "lng", - "type": "number", - "x-example": -74.006 - }, - { - "default": "on", - "description": "Storefront to search", - "enum": [ - "on", - "gap", - "br", - "at" - ], - "in": "query", - "name": "brand", - "type": "string" + "x-example": "17" } ], "produces": [ @@ -421733,7 +437558,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/oldnavy.storesResponseDoc" + "$ref": "#/definitions/papajohns.indiaDealResponseDoc" } }, "400": { @@ -421742,6 +437567,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -421760,44 +437591,76 @@ "ApiKeyAuth": [] } ], - "summary": "Find Old Navy, Gap, Banana Republic, or Athleta store locations", + "summary": "Get one Papa John's India deal's composition (INR)", "tags": [ - "Old Navy" + "Papa John's" ] } }, - "/opensea/activity": { + "/papajohns/india/menu": { "get": { - "description": "Returns the live cross-collection activity feed — every sale, listing, offer, transfer, and mint OpenSea indexes, newest first, with the collection each event belongs to. Filter with `event_types` for a marketplace-wide trade tape.", - "operationId": "opensea-activity", + "consumes": [ + "application/json" + ], + "description": "Returns Papa John's **India** menu with live prices in Indian Rupees, from papajohns.in's own ordering backend. This is the India market only -- prices, items, and availability are India-specific and are not comparable to Papa John's US/Canada data (see GET /papajohns/nutrition for US national reference data). Returns every category with its items and deals: list price, strike-through price where a discount is active, dietary tags (Veg, Non Veg, Spicy), images, and the store/channel/day combinations where an item is blacked out. Set include_options=true to also get each item's full size, crust, topping, sauce, and drizzle tree with per-option prices -- this makes the response very large, so prefer GET /papajohns/india/menu/item for one item's options. Pricing is franchise-wide rather than per-store; store_id, channel_id, and day filter item availability, not price, and only take effect when all three are supplied.", + "operationId": "papajohns-india-menu", "parameters": [ { - "default": 20, - "description": "Events per page, 1-100", + "description": "Return only this category id", "in": "query", - "name": "limit", - "type": "integer" + "name": "category_id", + "type": "string", + "x-example": "6" }, { - "description": "Opaque pagination cursor from a previous next_page_cursor", + "description": "Hide items blacked out at this store id (see GET /papajohns/india/stores). Only applies together with channel_id and day.", "in": "query", - "name": "cursor", - "type": "string" + "name": "store_id", + "type": "string", + "x-example": "7" }, { - "description": "Comma-separated event types", + "description": "Order channel. One of: 1 (Delivery), 2 (Take Away), 3 (Dine In), 4 (Drive Through Pickup). Only applies together with store_id and day.", "enum": [ - "SALE", - "LISTING", - "OFFER", - "TRANSFER", - "MINT", - "COLLECTION_OFFER", - "TRAIT_OFFER" + "1", + "2", + "3", + "4" ], "in": "query", - "name": "event_types", - "type": "string" + "name": "channel_id", + "type": "string", + "x-example": "1" + }, + { + "description": "Weekday. One of: 0 (Sunday), 1 (Monday), 2 (Tuesday), 3 (Wednesday), 4 (Thursday), 5 (Friday), 6 (Saturday). Only applies together with store_id and channel_id.", + "enum": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6" + ], + "in": "query", + "name": "day", + "type": "string", + "x-example": "1" + }, + { + "description": "Return only items carrying this tag, e.g. Veg, Non Veg, Spicy. Case-insensitive.", + "in": "query", + "name": "tag", + "type": "string", + "x-example": "Veg" + }, + { + "description": "Include every item's full size/crust/topping option tree with prices. Default false.", + "in": "query", + "name": "include_options", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -421807,7 +437670,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.activityResponseDoc" + "$ref": "#/definitions/papajohns.indiaMenuResponseDoc" } }, "400": { @@ -421816,6 +437679,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -421834,16 +437703,29 @@ "ApiKeyAuth": [] } ], - "summary": "List marketplace-wide OpenSea activity", + "summary": "Get the Papa John's India priced menu (INR)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/categories": { + "/papajohns/india/menu/item": { "get": { - "description": "Returns OpenSea's category taxonomy as top-level groups and their child categories, with display names. The child slugs are the canonical category identifiers used across the marketplace.", - "operationId": "opensea-categories", + "consumes": [ + "application/json" + ], + "description": "Returns one Papa John's **India** menu item with its complete customization tree: every size, and for each size every crust, topping, dipping sauce, drizzle, and base sauce with that option's own price in Indian Rupees. The option group flagged base_price carries the item's base price for that size (the crust group on pizzas) rather than an add-on charge; half_price is the surcharge when the option is applied to one half of a pizza. India market only -- prices are Indian Rupees. Use GET /papajohns/india/menu to discover item ids.", + "operationId": "papajohns-india-menu-item", + "parameters": [ + { + "description": "Item id (saleitem_id) from GET /papajohns/india/menu", + "in": "query", + "name": "item_id", + "required": true, + "type": "string", + "x-example": "71" + } + ], "produces": [ "application/json" ], @@ -421851,46 +437733,20 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.categoriesResponseDoc" + "$ref": "#/definitions/papajohns.indiaMenuItemResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List OpenSea's browse categories", - "tags": [ - "OpenSea" - ] - } - }, - "/opensea/chains": { - "get": { - "description": "Returns every blockchain OpenSea indexes, with its identifier, display name, and architecture. The identifiers are the accepted values for the `chain` path parameter on the item endpoints.", - "operationId": "opensea-chains", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/opensea.chainsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -421910,24 +437766,32 @@ "ApiKeyAuth": [] } ], - "summary": "List the chains OpenSea indexes", + "summary": "Get one Papa John's India item with its full options (INR)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}": { + "/papajohns/india/stores": { "get": { - "description": "Returns public marketplace metadata and trading statistics for one NFT collection: name, description, imagery, verification flag, contract address and chain, social links, current floor price and top collection offer, plus lifetime and rolling one-hour/one-day/seven-day/thirty-day sales, volume, and floor-price change. Delisted and blacklisted collections return 404 rather than an empty payload.", - "operationId": "opensea-collection", + "consumes": [ + "application/json" + ], + "description": "Returns every Papa John's **India** restaurant with its address, phone, coordinates, and weekly opening hours broken down per order channel (delivery, take away, dine in, drive-through pickup). These store ids are what GET /papajohns/india/menu's store_id availability filter is keyed on. India market only -- for US/Canada stores use GET /papajohns/directory, GET /papajohns/store, or GET /papajohns/nearby.", + "operationId": "papajohns-india-stores", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", - "required": true, + "description": "Return only hours for this order channel. One of: 1 (Delivery), 2 (Take Away), 3 (Dine In), 4 (Drive Through Pickup).", + "enum": [ + "1", + "2", + "3", + "4" + ], + "in": "query", + "name": "channel_id", "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "1" } ], "produces": [ @@ -421937,7 +437801,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionResponseDoc" + "$ref": "#/definitions/papajohns.indiaStoresResponseDoc" } }, "400": { @@ -421946,12 +437810,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -421970,52 +437828,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenSea collection", + "summary": "List Papa John's India restaurants", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/activity": { + "/papajohns/intl/deals": { "get": { - "description": "Returns a cursor-paginated feed of marketplace events for a collection — sales, listings, offers, transfers, mints, and collection/trait offers — with the counterparties, price, marketplace, and transaction hash. Filter with `event_types` to narrow the feed, for example `event_types=SALE` for a sales-only history.", - "operationId": "opensea-collection-activity", + "consumes": [ + "application/json" + ], + "description": "Returns the promotions currently running in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain, for either delivery or pickup. Each promotion carries its headline product, description, artwork, the weekdays it runs on, and its start and end dates. Offers that upstream has marked inactive are omitted rather than returned as live.", + "operationId": "papajohns-intl-deals", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", + "enum": [ + "chile", + "costa-rica", + "guatemala", + "panama", + "portugal", + "spain" + ], + "in": "query", + "name": "market", "required": true, "type": "string", - "x-example": "boredapeyachtclub" - }, - { - "default": 20, - "description": "Events per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" + "x-example": "spain" }, { - "description": "Comma-separated event types", + "description": "One of: pj_delivery (delivery offers), in_store (pickup/dine-in offers)", "enum": [ - "SALE", - "LISTING", - "OFFER", - "TRANSFER", - "MINT", - "COLLECTION_OFFER", - "TRAIT_OFFER" + "pj_delivery", + "in_store" ], "in": "query", - "name": "event_types", - "type": "string" + "name": "dispatch_method", + "required": true, + "type": "string", + "x-example": "pj_delivery" } ], "produces": [ @@ -422025,7 +437878,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.activityResponseDoc" + "$ref": "#/definitions/papajohns.intlDealsResponseDoc" } }, "400": { @@ -422058,24 +437911,60 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's marketplace activity", + "summary": "List Papa John's active promotions (international)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/best-deals": { + "/papajohns/intl/ingredients": { "get": { - "description": "Returns the listed items OpenSea surfaces as the best value in a collection, judged against each item's rarity and the collection floor. This is the curated \"best deals\" shelf from the collection page, not a generic price sort.", - "operationId": "opensea-collection-best-deals", + "consumes": [ + "application/json" + ], + "description": "Returns every topping, sauce, and cheese a pizza can be built with on one menu, in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. Each ingredient reports its family (meat, vegetable, base sauce, and so on), whether it is included on pizzas by default, whether it is charged at the premium rather than the normal rate, and whether it can be applied to just one half. The response also carries what one extra ingredient costs at each size, for both the normal and premium rates. Menu ids come from GET /papajohns/intl/stores.", + "operationId": "papajohns-intl-ingredients", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", + "enum": [ + "chile", + "costa-rica", + "guatemala", + "panama", + "portugal", + "spain" + ], + "in": "query", + "name": "market", "required": true, "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "spain" + }, + { + "description": "Menu id from a restaurant returned by GET /papajohns/intl/stores", + "in": "query", + "name": "menu_id", + "required": true, + "type": "string", + "x-example": "8" + }, + { + "description": "Return only one ingredient category. One of: base_cheese, base_sauce, extra_cheese, extra_sauce, meat, not_ingredient, premium, vegetable", + "enum": [ + "base_cheese", + "base_sauce", + "extra_cheese", + "extra_sauce", + "meat", + "not_ingredient", + "premium", + "vegetable" + ], + "in": "query", + "name": "category", + "type": "string", + "x-example": "meat" } ], "produces": [ @@ -422085,7 +437974,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemsShelfResponseDoc" + "$ref": "#/definitions/papajohns.intlIngredientsResponseDoc" } }, "400": { @@ -422118,49 +438007,67 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's best-value listings", + "summary": "Get a Papa John's menu's ingredient catalog (international)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/chart": { + "/papajohns/intl/menu": { "get": { - "description": "Returns a time series for a collection — either its floor price or its traded volume — over the requested window, with each sample in both the settlement token and USD. Use `metric=floor_price` for the floor line and `metric=volume` for the volume bars.", - "operationId": "opensea-collection-chart", + "consumes": [ + "application/json" + ], + "description": "Returns one Papa John's restaurant's full menu with that restaurant's own prices, in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. Prices are per restaurant, not national, so two restaurants in the same market can differ. Each pizza lists every size and crust combination it is sold in with that combination's own price and, where published, its calorie and portion figures; sides, drinks and desserts list their own portions. Machine codes for size and crust are returned alongside the market's own display labels in the local language. Currency is whatever the market trades in -- euros in Spain and Portugal, Chilean pesos in Chile, and so on -- so do not compare figures across markets. Use GET /papajohns/intl/stores to find a store_id. For India use GET /papajohns/india/menu; for the US and Canada see GET /papajohns/nutrition.", + "operationId": "papajohns-intl-menu", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", + "enum": [ + "chile", + "costa-rica", + "guatemala", + "panama", + "portugal", + "spain" + ], + "in": "query", + "name": "market", "required": true, "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "spain" }, { - "default": "floor_price", - "description": "Series to return", + "description": "Restaurant id from GET /papajohns/intl/stores. Prices are specific to this restaurant.", + "in": "query", + "name": "store_id", + "required": true, + "type": "string", + "x-example": "9" + }, + { + "description": "Return only one product kind. One of: pizza, side", "enum": [ - "floor_price", - "volume" + "pizza", + "side" ], "in": "query", - "name": "metric", - "type": "string" + "name": "kind", + "type": "string", + "x-example": "pizza" }, { - "default": "SEVEN_DAYS", - "description": "Window", + "description": "Return only products carrying this dietary or heat marker. One of: hot, mild, spicy, vegetarian. Products upstream does not mark are excluded.", "enum": [ - "ONE_HOUR", - "ONE_DAY", - "SEVEN_DAYS", - "THIRTY_DAYS", - "ALL_TIME" + "hot", + "mild", + "spicy", + "vegetarian" ], "in": "query", - "name": "timeframe", - "type": "string" + "name": "food_type", + "type": "string", + "x-example": "vegetarian" } ], "produces": [ @@ -422170,7 +438077,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.chartResponseDoc" + "$ref": "#/definitions/papajohns.intlMenuResponseDoc" } }, "400": { @@ -422203,24 +438110,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenSea collection's price or volume history", + "summary": "Get a Papa John's restaurant's priced menu (international)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/depth": { + "/papajohns/intl/offer": { "get": { - "description": "Returns the full bid/ask ladder for a collection: resting listings and offers grouped into price levels with the quantity available at each. This is the depth chart behind OpenSea's own collection page, and it is the fastest way to see how thin or deep the book is above the floor.", - "operationId": "opensea-collection-depth", + "consumes": [ + "application/json" + ], + "description": "Returns one promotional offer's full composition in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. This is what a promotion banner from GET /papajohns/intl/deals actually contains: the offer's own price, each choice step a customer works through in order (e.g. \"pick your family pizza\", \"pick a side\"), and every product eligible at that step with the surcharge picking it adds. It also carries the offer's ingredient rules -- how many extras are free, the minimum and maximum that may be chosen, and which ingredient families are allowed. Offer ids come from the offer_id field on a deal.", + "operationId": "papajohns-intl-offer", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", + "enum": [ + "chile", + "costa-rica", + "guatemala", + "panama", + "portugal", + "spain" + ], + "in": "query", + "name": "market", "required": true, "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "spain" + }, + { + "description": "Offer id from the offer_id field on GET /papajohns/intl/deals", + "in": "query", + "name": "offer_id", + "required": true, + "type": "string", + "x-example": "660" } ], "produces": [ @@ -422230,7 +438156,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.depthResponseDoc" + "$ref": "#/definitions/papajohns.intlOfferResponseDoc" } }, "400": { @@ -422263,48 +438189,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenSea collection's order book", + "summary": "Get one Papa John's offer's composition (international)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/holders": { + "/papajohns/intl/product": { "get": { - "description": "Returns a cursor-paginated leaderboard of wallets holding items in the collection, ranked by quantity held, with each holder's address and display name where OpenSea publishes one.", - "operationId": "opensea-collection-holders", + "consumes": [ + "application/json" + ], + "description": "Returns one product's own catalog record in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain -- its description, imagery, dietary markers, and customization rules (whether toppings may be changed, how many extra ingredients are included free, and whether it can be used as one half of a half-and-half pizza). This record carries no price, because pricing is per restaurant: use GET /papajohns/intl/menu for prices. Product ids come from that same endpoint.", + "operationId": "papajohns-intl-product", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", + "enum": [ + "chile", + "costa-rica", + "guatemala", + "panama", + "portugal", + "spain" + ], + "in": "query", + "name": "market", "required": true, "type": "string", - "x-example": "boredapeyachtclub" - }, - { - "default": 20, - "description": "Holders per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" + "x-example": "spain" }, { - "default": "DESC", - "description": "Sort direction by quantity held", - "enum": [ - "ASC", - "DESC" - ], + "description": "Product id from GET /papajohns/intl/menu", "in": "query", - "name": "sort_direction", - "type": "string" + "name": "product_id", + "required": true, + "type": "string", + "x-example": "8" } ], "produces": [ @@ -422314,7 +438235,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionHoldersResponseDoc" + "$ref": "#/definitions/papajohns.intlProductResponseDoc" } }, "400": { @@ -422347,98 +438268,86 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's holders", + "summary": "Get one Papa John's product (international)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/items": { + "/papajohns/intl/stores": { "get": { - "description": "Returns a cursor-paginated page of NFTs in a collection with their traits, rarity rank, current owner, best standing listing, and last sale price. Pass `cursor` from `next_page_cursor` to page forward. Narrow the result set with `listed_only`, `traits`, a `min_price`/`max_price` band, or a `min_rarity`/`max_rarity` rank band — the filters combine, so `traits=Fur:Solid Gold&listed_only=true` returns only buyable Solid Gold apes.", - "operationId": "opensea-collection-items", + "consumes": [ + "application/json" + ], + "description": "Returns Papa John's restaurants in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain -- either every restaurant near a coordinate, or one known restaurant looked up by id. Each restaurant carries its address, coordinates, phone, per-weekday opening hours split by fulfillment channel, accepted payment methods, delivery zones with their minimum-order and free-delivery thresholds, and live delivery/pickup open flags. Restaurants come back ranked by distance with no radius limit, five at a time by default; page and limit walk the rest, and the response reports total_count, the market's whole restaurant total. The returned id is what GET /papajohns/intl/menu prices against, and menu_id is what GET /papajohns/intl/ingredients reads. This covers those six markets only -- for India use GET /papajohns/india/stores, and for the US and Canada use GET /papajohns/directory, GET /papajohns/store, or GET /papajohns/nearby.", + "operationId": "papajohns-intl-stores", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", + "enum": [ + "chile", + "costa-rica", + "guatemala", + "panama", + "portugal", + "spain" + ], + "in": "query", + "name": "market", "required": true, "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "spain" }, { - "default": 20, - "description": "Items per page, 1-100", + "description": "Look up one known restaurant by id instead of searching a coordinate. Supply either store_id, or both latitude and longitude.", "in": "query", - "name": "limit", - "type": "integer" + "name": "store_id", + "type": "string", + "x-example": "9" }, { - "description": "Opaque pagination cursor from a previous next_page_cursor", + "description": "Latitude to search around. Required unless store_id is supplied.", "in": "query", - "name": "cursor", - "type": "string" + "name": "latitude", + "type": "string", + "x-example": "40.4168" }, { - "default": "PRICE", - "description": "Sort field", - "enum": [ - "PRICE", - "LAST_SALE_DATE", - "RARITY", - "CREATED_DATE" - ], + "description": "Longitude to search around. Required unless store_id is supplied.", "in": "query", - "name": "sort_by", - "type": "string" + "name": "longitude", + "type": "string", + "x-example": "-3.7038" }, { - "default": "ASC", - "description": "Sort direction", + "description": "One of: delivery (default, every nearby restaurant), pickup (only restaurants accepting pickup orders). Ignored when store_id is supplied.", "enum": [ - "ASC", - "DESC" + "delivery", + "pickup" ], "in": "query", - "name": "sort_direction", - "type": "string" - }, - { - "description": "Only return items with a standing listing", - "in": "query", - "name": "listed_only", - "type": "boolean" - }, - { - "description": "Comma-separated trait_type:value pairs", - "in": "query", - "name": "traits", + "name": "fulfillment", "type": "string", - "x-example": "Fur:Solid Gold,Eyes:Laser Eyes" - }, - { - "description": "Minimum listing price in the collection's native token", - "in": "query", - "name": "min_price", - "type": "number" - }, - { - "description": "Maximum listing price in the collection's native token", - "in": "query", - "name": "max_price", - "type": "number" + "x-example": "delivery" }, { - "description": "Minimum rarity rank (1 is rarest)", + "default": 1, + "description": "One-based page of the distance-ranked restaurants. Ignored for a store_id lookup and for pickup, neither of which is paginated.", "in": "query", - "name": "min_rarity", - "type": "integer" + "minimum": 1, + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Maximum rarity rank", + "default": 5, + "description": "Restaurants per page, 1-100. Ignored for a store_id lookup and for pickup, neither of which is paginated.", "in": "query", - "name": "max_rarity", - "type": "integer" + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -422448,7 +438357,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionItemsResponseDoc" + "$ref": "#/definitions/papajohns.intlStoresResponseDoc" } }, "400": { @@ -422481,48 +438390,51 @@ "ApiKeyAuth": [] } ], - "summary": "List items in an OpenSea collection", + "summary": "Find Papa John's restaurants in an international market", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/offers": { + "/papajohns/menu": { "get": { - "description": "Returns the collection-wide offer book as price levels: how many standing offers sit at each price per item, plus the aggregate offer count and total value across the whole collection. Offers are sorted by price.", - "operationId": "opensea-collection-offers", + "consumes": [ + "application/json" + ], + "description": "Returns a Papa John's US or Canada restaurant's full menu with that restaurant's own prices. Prices are per restaurant, not national -- the same 14-inch pizza can differ by several dollars between two stores -- so pass a store_id from GET /papajohns/store or GET /papajohns/nearby. Omitting it returns the national default menu, flagged as national_default in the response. Each category is returned with its sections and product groups, and every orderable SKU carries its price, calories, serving size, slice count and image. Set include_options to also get each product group's customization axes: every size and crust it is sold in, and every preparation instruction (how much cheese, how well done) with its choices. This is the US and Canada menu -- for India use GET /papajohns/india/menu, and for Chile, Costa Rica, Guatemala, Panama, Portugal or Spain use GET /papajohns/intl/menu.", + "operationId": "papajohns-menu", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "boredapeyachtclub" - }, - { - "default": 20, - "description": "Price levels per page, 1-100", + "description": "Restaurant id from GET /papajohns/store or GET /papajohns/nearby. Omit for the national default menu.", "in": "query", - "name": "limit", - "type": "integer" + "name": "store_id", + "type": "string", + "x-example": "5054" }, { - "description": "Opaque pagination cursor from a previous next_page_cursor", + "description": "Return only one category. One of: dippingsauces, desserts, drinks, extras, papabowls, pizza, sandwiches, sides, wings", + "enum": [ + "dippingsauces", + "desserts", + "drinks", + "extras", + "papabowls", + "pizza", + "sandwiches", + "sides", + "wings" + ], "in": "query", - "name": "cursor", - "type": "string" + "name": "category", + "type": "string", + "x-example": "pizza" }, { - "default": "DESC", - "description": "Sort direction by offer price", - "enum": [ - "ASC", - "DESC" - ], + "description": "Include each product group's sizes, crusts and preparation instructions. Default false.", "in": "query", - "name": "sort_direction", - "type": "string" + "name": "include_options", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -422532,7 +438444,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionOffersResponseDoc" + "$ref": "#/definitions/papajohns.menuResponseDoc" } }, "400": { @@ -422565,24 +438477,34 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's offer book", + "summary": "Get a Papa John's restaurant's priced menu", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/rarest-items": { + "/papajohns/menu/item": { "get": { - "description": "Returns the rarest items in a collection that currently have a standing listing, each with its rarity rank, traits, and asking price. Unlike the trait endpoints, this shelf is scoped to what is actually buyable right now.", - "operationId": "opensea-collection-rarest-items", + "consumes": [ + "application/json" + ], + "description": "Returns one Papa John's US or Canada menu SKU with that restaurant's price for it, together with the full customization axes of the product group it belongs to: every size and crust the product is sold in, and every preparation instruction with its choices and default. The response also names the category and section the item sits under. Pass a store_id so the price is that restaurant's; omitting it returns the national default price. SKUs come from GET /papajohns/menu.", + "operationId": "papajohns-menu-item", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Product sku from GET /papajohns/menu", + "in": "query", + "name": "sku", "required": true, "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "1-1-2-115" + }, + { + "description": "Restaurant id from GET /papajohns/store or GET /papajohns/nearby. Omit for the national default price.", + "in": "query", + "name": "store_id", + "type": "string", + "x-example": "5054" } ], "produces": [ @@ -422592,7 +438514,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemsShelfResponseDoc" + "$ref": "#/definitions/papajohns.menuItemResponseDoc" } }, "400": { @@ -422625,39 +438547,56 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's rarest listed items", + "summary": "Get one Papa John's menu item with its options", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/search-items": { + "/papajohns/nearby": { "get": { - "description": "Runs a keyword search scoped to one collection — matching on item name and trait values — and returns the hits with rarity rank and best standing listing. Narrower than `/opensea/collection/{slug}/items`, which lists everything.", - "operationId": "opensea-collection-search-items", + "consumes": [ + "application/json" + ], + "description": "Returns Papa John's stores within a radius of a latitude/longitude, ordered nearest first, with distance, address, phone, hours, timezone, price range, fulfillment services, payment options, and ordering link. The response includes total_in_radius and offset paging. A coordinate with no nearby stores returns an empty list.", + "operationId": "papajohns-nearby", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "Search center latitude", + "in": "query", + "name": "latitude", "required": true, - "type": "string", - "x-example": "boredapeyachtclub" + "type": "number", + "x-example": 34.0522 }, { - "description": "Search keyword", + "description": "Search center longitude", "in": "query", - "name": "query", + "name": "longitude", "required": true, - "type": "string", - "x-example": "gold" + "type": "number", + "x-example": -118.2437 }, { - "default": 20, - "description": "Results per page, 1-100", + "description": "Search radius in miles, 1-100 (default 25)", + "in": "query", + "name": "radius", + "type": "integer", + "x-example": 25 + }, + { + "description": "Maximum stores to return, 1-50 (default 10)", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 10 + }, + { + "description": "Result offset, 0 or greater (default 0)", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -422667,7 +438606,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemSearchResponseDoc" + "$ref": "#/definitions/papajohns.nearbyResponseDoc" } }, "400": { @@ -422676,12 +438615,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -422700,24 +438633,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search items inside an OpenSea collection", + "summary": "Find Papa John's stores near a coordinate", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/social-proof": { + "/papajohns/nutrition": { "get": { - "description": "Returns how many accounts follow or watch a collection, plus the notable collectors OpenSea highlights for it. Useful as a demand signal alongside the trading stats.", - "operationId": "opensea-collection-social-proof", + "consumes": [ + "application/json" + ], + "description": "Returns Papa John's own published nutrition-facts panel for every item in one category -- full pizzas by name, or a single ingredient family (crust, cheese, sauce, toppings). Each item lists every published size/crust variant with serving size and a full nutrition-facts breakdown (calories, fat, cholesterol, sodium, carbohydrate, fiber, sugars, protein). This is Papa John's national reference data, not priced per-store data -- see GET /papajohns/directory for store lookup.", + "operationId": "papajohns-nutrition", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", + "description": "One of: cheese, crust, desserts, dipping-sauces, drinks, extras, papa-bowls, papadias, pizzas, sandwiches, sauce, sides, toppings, wings", + "in": "query", + "name": "category", "required": true, "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "pizzas" } ], "produces": [ @@ -422727,7 +438663,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.socialProofResponseDoc" + "$ref": "#/definitions/papajohns.nutritionResponseDoc" } }, "400": { @@ -422760,24 +438696,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenSea collection's social following", + "summary": "Get one Papa John's nutritional-details category", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/top-sales": { + "/papajohns/peru/menu": { "get": { - "description": "Returns the highest-value sales ever recorded for a collection, with the buyer, seller, price, and transaction hash for each. Unlike `/opensea/collection/{slug}/activity?event_types=SALE`, which is a reverse-chronological feed, this is ranked by sale price.", - "operationId": "opensea-collection-top-sales", + "consumes": [ + "application/json" + ], + "description": "Returns Papa John's **Peru** menu with prices in Peruvian soles, covering the full catalog with categories, images and per-product pricing. Peru runs its own ordering platform, independent of the six markets behind GET /papajohns/intl/menu and of Colombia and El Salvador, so it has its own endpoint. Prices are Peruvian soles and are not comparable with any other market.", + "operationId": "papajohns-peru-menu", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", - "required": true, + "description": "Return only categories whose name contains this text, case-insensitive, e.g. Promociones or Combos", + "in": "query", + "name": "category", "type": "string", - "x-example": "boredapeyachtclub" + "x-example": "Promociones" } ], "produces": [ @@ -422787,7 +438725,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionTopSalesResponseDoc" + "$ref": "#/definitions/papajohns.latamMenuResponseDoc" } }, "400": { @@ -422820,48 +438758,26 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's highest-value sales", + "summary": "Get the Papa John's Peru priced menu (PEN)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/trait-offers": { + "/papajohns/poland/menu": { "get": { - "description": "Returns standing offers scoped to a specific trait value rather than the whole collection, as price levels with the trait type and value attached. Useful for pricing rare-trait items against the collection floor.", - "operationId": "opensea-collection-trait-offers", + "consumes": [ + "application/json" + ], + "description": "Returns Papa John's **Poland** menu with prices in Polish zloty. Russia and Poland run one franchise platform of their own, separate from the six markets behind GET /papajohns/intl/menu and from Colombia, Peru and El Salvador, so each has its own endpoint. The catalog is national -- it does not vary by city -- and every product lists its priced variants with size, dough and any stuffed crust. Prices are zloty and are not comparable with any other market.", + "operationId": "papajohns-poland-menu", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "boredapeyachtclub" - }, - { - "default": 20, - "description": "Price levels per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "default": "DESC", - "description": "Sort direction by offer price", - "enum": [ - "ASC", - "DESC" - ], + "description": "Return only sections whose name or slug contains this text, case-insensitive. Slugs work in either market, e.g. pizza, combo, deserty, napitki, sauce, zakuski", "in": "query", - "name": "sort_direction", - "type": "string" + "name": "category", + "type": "string", + "x-example": "pizza" } ], "produces": [ @@ -422871,7 +438787,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionTraitOffersResponseDoc" + "$ref": "#/definitions/papajohns.storefrontMenuResponseDoc" } }, "400": { @@ -422904,37 +438820,26 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's trait offer book", + "summary": "Get the Papa John's Poland priced menu (PLN)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collection/{slug}/traits": { + "/papajohns/russia/menu": { "get": { - "description": "Returns a cursor-paginated page of the collection's trait types and the values each takes, with per-value item counts where OpenSea publishes them. Numeric traits carry a comparison operator.", - "operationId": "opensea-collection-traits", + "consumes": [ + "application/json" + ], + "description": "Returns Papa John's **Russia** menu with prices in Russian roubles. Russia and Poland run one franchise platform of their own, separate from the six markets behind GET /papajohns/intl/menu and from Colombia, Peru and El Salvador, so each has its own endpoint. The catalog is national -- it does not vary by city -- and every product lists its priced variants with size, dough and any stuffed crust. Prices are roubles and are not comparable with any other market.", + "operationId": "papajohns-russia-menu", "parameters": [ { - "description": "OpenSea collection slug", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "boredapeyachtclub" - }, - { - "default": 20, - "description": "Trait types per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", + "description": "Return only sections whose name or slug contains this text, case-insensitive. Slugs work in either market, e.g. pizza, combo, deserty, napitki, sauce, zakuski", "in": "query", - "name": "cursor", - "type": "string" + "name": "category", + "type": "string", + "x-example": "pizza" } ], "produces": [ @@ -422944,7 +438849,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionTraitsResponseDoc" + "$ref": "#/definitions/papajohns.storefrontMenuResponseDoc" } }, "400": { @@ -422977,24 +438882,27 @@ "ApiKeyAuth": [] } ], - "summary": "List an OpenSea collection's traits", + "summary": "Get the Papa John's Russia priced menu (RUB)", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/collections": { + "/papajohns/store": { "get": { - "description": "Resolves up to 50 collections in a single call from a comma-separated `slugs` list, returning each one's floor price, verification flag, headline stats, and per-marketplace listed-item counts. Use this instead of calling `/opensea/collection/{slug}` in a loop — it costs one upstream request regardless of how many slugs you pass. The `markets` array shows how many items are listed on OpenSea versus other marketplaces for the same collection.", - "operationId": "opensea-collections", + "consumes": [ + "application/json" + ], + "description": "Returns one Papa John's store's published profile: address, phone, coordinates, general and pickup hours, timezone, Google Place id, and ordering link. The path comes from a store child returned by GET /papajohns/directory. Passing a directory path returns 404.", + "operationId": "papajohns-store", "parameters": [ { - "description": "Comma-separated collection slugs, at most 50", + "description": "Store path from a /papajohns/directory child marked is_store=true", "in": "query", - "name": "slugs", + "name": "path", "required": true, "type": "string", - "x-example": "boredapeyachtclub,azuki" + "x-example": "united-states/ca/91803/alhambra/2136-s-fremont-ave" } ], "produces": [ @@ -423004,7 +438912,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionsResponseDoc" + "$ref": "#/definitions/papajohns.storeResponseDoc" } }, "400": { @@ -423037,40 +438945,27 @@ "ApiKeyAuth": [] } ], - "summary": "Look up several OpenSea collections at once", + "summary": "Get one Papa John's store", "tags": [ - "OpenSea" + "Papa John's" ] } }, - "/opensea/drops": { + "/patreon/creator": { "get": { - "description": "Returns the NFT drop calendar — either upcoming mints or recently minted drops — with each drop's contract, chain, and parent collection. Use `type=UPCOMING` to watch for launches and `type=RECENTLY_MINTED` for ones that just went live.", - "operationId": "opensea-drops", + "consumes": [ + "application/json" + ], + "description": "Returns public profile metadata from a creator's Patreon page: creator identity, summary, images, membership and creation counts, public earnings snapshot, membership/RSS availability flags, and public external profile links. handle is the creator's page handle, e.g. CachyOS for patreon.com/CachyOS.", + "operationId": "patreon-creator", "parameters": [ { - "default": "UPCOMING", - "description": "Calendar window", - "enum": [ - "UPCOMING", - "RECENTLY_MINTED" - ], - "in": "query", - "name": "type", - "type": "string" - }, - { - "default": 20, - "description": "Drops per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", + "description": "Creator page handle", "in": "query", - "name": "cursor", - "type": "string" + "name": "handle", + "required": true, + "type": "string", + "x-example": "CachyOS" } ], "produces": [ @@ -423080,7 +438975,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.dropsResponseDoc" + "$ref": "#/definitions/patreon.creatorResponseDoc" } }, "400": { @@ -423089,6 +438984,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -423107,40 +439008,27 @@ "ApiKeyAuth": [] } ], - "summary": "List the OpenSea drop calendar", + "summary": "Get a public Patreon creator profile", "tags": [ - "OpenSea" + "Patreon" ] } }, - "/opensea/item/{chain}/{contract_address}/{token_id}": { + "/patreon/creator/tiers": { "get": { - "description": "Returns one NFT addressed by chain, contract address, and token id, including its traits, rarity rank, current owner, parent collection, best standing listing, and best standing offer. Call `/opensea/chains` for the accepted `chain` values.", - "operationId": "opensea-item", + "consumes": [ + "application/json" + ], + "description": "Returns published membership tiers and their published benefits from a creator's public Patreon page. It excludes member-only entitlements, tier capacity, and member counts. handle is the creator's page handle, e.g. CachyOS for patreon.com/CachyOS.", + "operationId": "patreon-creator-tiers", "parameters": [ { - "description": "Chain identifier from /opensea/chains", - "in": "path", - "name": "chain", - "required": true, - "type": "string", - "x-example": "ethereum" - }, - { - "description": "NFT contract address", - "in": "path", - "name": "contract_address", - "required": true, - "type": "string", - "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" - }, - { - "description": "Token id within the contract", - "in": "path", - "name": "token_id", + "description": "Creator page handle", + "in": "query", + "name": "handle", "required": true, "type": "string", - "x-example": "1" + "x-example": "CachyOS" } ], "produces": [ @@ -423150,7 +439038,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemResponseDoc" + "$ref": "#/definitions/patreon.membershipTiersResponseDoc" } }, "400": { @@ -423183,68 +439071,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get a single OpenSea NFT", + "summary": "Get a creator's public Patreon membership tiers", "tags": [ - "OpenSea" + "Patreon" ] } }, - "/opensea/item/{chain}/{contract_address}/{token_id}/activity": { + "/patreon/explore": { "get": { - "description": "Returns the marketplace event history for a single NFT — sales, listings, offers, transfers, and mints — with counterparties, price, and transaction hash. Filter with `event_types`, for example `event_types=SALE,TRANSFER` for an ownership trail.", - "operationId": "opensea-item-activity", + "consumes": [ + "application/json" + ], + "description": "Returns Patreon's public curated creator shelves for one topic: Top creators, Popular this week, and New on Patreon. topic must be one of podcasts_and_shows, visual_arts, tabletop_games, video_games, music, lifestyle, writing, handicrafts, apps_and_software, social_impact.", + "operationId": "patreon-explore", "parameters": [ { - "description": "Chain identifier from /opensea/chains", - "in": "path", - "name": "chain", - "required": true, - "type": "string", - "x-example": "ethereum" - }, - { - "description": "NFT contract address", - "in": "path", - "name": "contract_address", - "required": true, - "type": "string", - "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" - }, - { - "description": "Token id within the contract", - "in": "path", - "name": "token_id", - "required": true, - "type": "string", - "x-example": "1" - }, - { - "default": 20, - "description": "Events per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "description": "Comma-separated event types", + "description": "Public Explore topic. Allowed values: podcasts_and_shows, visual_arts, tabletop_games, video_games, music, lifestyle, writing, handicrafts, apps_and_software, social_impact", "enum": [ - "SALE", - "LISTING", - "OFFER", - "TRANSFER", - "MINT", - "COLLECTION_OFFER", - "TRAIT_OFFER" + "podcasts_and_shows", + "visual_arts", + "tabletop_games", + "video_games", + "music", + "lifestyle", + "writing", + "handicrafts", + "apps_and_software", + "social_impact" ], "in": "query", - "name": "event_types", - "type": "string" + "name": "topic", + "required": true, + "type": "string", + "x-example": "podcasts_and_shows" } ], "produces": [ @@ -423254,7 +439113,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.activityResponseDoc" + "$ref": "#/definitions/patreon.exploreResponseDoc" } }, "400": { @@ -423263,12 +439122,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -423287,40 +439140,35 @@ "ApiKeyAuth": [] } ], - "summary": "List one OpenSea NFT's event history", + "summary": "Browse public Patreon creators by topic", "tags": [ - "OpenSea" + "Patreon" ] } }, - "/opensea/item/{chain}/{contract_address}/{token_id}/chart": { + "/patreon/rss": { "get": { - "description": "Returns every indexed sale of one NFT with its timestamp and price, in both the settlement token and USD — the price history behind the chart on an item page. An item that has never sold returns an empty `points` list. For collection-level sale history use `/opensea/collection/{slug}/activity?event_types=SALE`.", - "operationId": "opensea-item-chart", + "consumes": [ + "application/json" + ], + "description": "Returns public podcast channel metadata and episodes from Patreon's canonical public RSS feed. campaign_id and show_id are the numeric IDs in the public feed URL. Private member feeds and authentication URLs are not supported.", + "operationId": "patreon-rss", "parameters": [ { - "description": "Chain identifier from /opensea/chains", - "in": "path", - "name": "chain", - "required": true, - "type": "string", - "x-example": "ethereum" - }, - { - "description": "NFT contract address", - "in": "path", - "name": "contract_address", + "description": "Numeric Patreon campaign id", + "in": "query", + "name": "campaign_id", "required": true, "type": "string", - "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + "x-example": "80117" }, { - "description": "Token id within the contract", - "in": "path", - "name": "token_id", + "description": "Numeric Patreon show id", + "in": "query", + "name": "show_id", "required": true, "type": "string", - "x-example": "2087" + "x-example": "1322380" } ], "produces": [ @@ -423330,7 +439178,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.chartResponseDoc" + "$ref": "#/definitions/patreon.publicRSSResponseDoc" } }, "400": { @@ -423363,40 +439211,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenSea NFT's sale-price history", + "summary": "Get an explicitly public Patreon podcast RSS feed", "tags": [ - "OpenSea" + "Patreon" ] } }, - "/opensea/item/{chain}/{contract_address}/{token_id}/depth": { + "/pcgamer/article": { "get": { - "description": "Returns the bid/ask ladder for a single NFT: resting listings and offers grouped into price levels with the quantity at each. Useful for ERC-1155 items where many units trade at different prices.", - "operationId": "opensea-item-depth", + "description": "Returns a PC Gamer article by canonical `pcgamer.com` `url`; review pages work the same way as news articles. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`.", + "operationId": "pcgamer-article", "parameters": [ { - "description": "Chain identifier from /opensea/chains", - "in": "path", - "name": "chain", - "required": true, - "type": "string", - "x-example": "ethereum" - }, - { - "description": "NFT contract address", - "in": "path", - "name": "contract_address", - "required": true, - "type": "string", - "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" - }, - { - "description": "Token id within the contract", - "in": "path", - "name": "token_id", + "description": "Canonical PC Gamer article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "1" + "x-example": "https://www.pcgamer.com/games/discord-takes-a-second-swing-at-age-verification-but-dont-worry-this-time-itll-guess-how-old-you-are-with-90-percent-accuracy/" } ], "produces": [ @@ -423406,7 +439238,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.depthResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -423421,12 +439253,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -423439,64 +439265,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenSea NFT's order book", + "summary": "Get PC Gamer article content", "tags": [ - "OpenSea" + "PC Gamer" ] } }, - "/opensea/item/{chain}/{contract_address}/{token_id}/listings": { + "/pcgamer/author": { "get": { - "description": "Returns every standing sell order for one NFT, with price, quantity, validity window, marketplace, and the maker's wallet. An item with no active listings returns an empty list rather than a 404.", - "operationId": "opensea-item-listings", + "description": "Returns a PC Gamer author profile by `slug` (for example `harvey-randall`) or a pcgamer.com author `url`; supply exactly one. `page` picks the 1-based page of recent articles (default 1) and overrides a `/page/` segment in `url`. The response has `name`, `job_title`, `biography`, `social_links`, articles, `page` and `has_next_page`.", + "operationId": "pcgamer-author", "parameters": [ { - "description": "Chain identifier from /opensea/chains", - "in": "path", - "name": "chain", - "required": true, - "type": "string", - "x-example": "ethereum" - }, - { - "description": "NFT contract address", - "in": "path", - "name": "contract_address", - "required": true, + "description": "Author slug, e.g. harvey-randall", + "in": "query", + "name": "slug", "type": "string", - "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" + "x-example": "harvey-randall" }, { - "description": "Token id within the contract", - "in": "path", - "name": "token_id", - "required": true, + "description": "Canonical pcgamer.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "in": "query", + "name": "url", "type": "string", - "x-example": "1" + "x-example": "https://www.pcgamer.com/author/harvey-randall" }, { - "default": 20, - "description": "Listings per page, 1-100", + "default": 1, + "description": "1-based page number; overrides any page number in url", "in": "query", - "name": "limit", + "name": "page", "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "default": "ASC", - "description": "Sort direction by price", - "enum": [ - "ASC", - "DESC" - ], - "in": "query", - "name": "sort_direction", - "type": "string" } ], "produces": [ @@ -423506,7 +439305,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemOrdersResponseDoc" + "$ref": "#/definitions/publicnews.pcgamerAuthorResponseDoc" } }, "400": { @@ -423521,12 +439320,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -423539,53 +439332,34 @@ "ApiKeyAuth": [] } ], - "summary": "List standing listings for an OpenSea NFT", + "summary": "Get a PC Gamer author profile", "tags": [ - "OpenSea" + "PC Gamer" ] } }, - "/opensea/item/{chain}/{contract_address}/{token_id}/offers": { + "/pcgamer/headlines": { "get": { - "description": "Returns every standing bid on one NFT, with price, quantity, validity window, marketplace, and the maker's wallet. An item with no active offers returns an empty list rather than a 404.", - "operationId": "opensea-item-offers", + "description": "Returns recent PC Gamer headlines for one section. `section` is required and takes one of eight slugs: `deals`, `games`, `gaming-industry`, `guides`, `hardware`, `movies-tv`, `news` or `software`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "pcgamer-headlines", "parameters": [ { - "description": "Chain identifier from /opensea/chains", - "in": "path", - "name": "chain", - "required": true, - "type": "string", - "x-example": "ethereum" - }, - { - "description": "NFT contract address", - "in": "path", - "name": "contract_address", - "required": true, - "type": "string", - "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" - }, - { - "description": "Token id within the contract", - "in": "path", - "name": "token_id", + "description": "PC Gamer section slug", + "enum": [ + "deals", + "games", + "gaming-industry", + "guides", + "hardware", + "movies-tv", + "news", + "software" + ], + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "1" - }, - { - "default": 20, - "description": "Offers per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" + "x-example": "deals" } ], "produces": [ @@ -423595,7 +439369,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemOrdersResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -423604,18 +439378,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -423628,55 +439390,16 @@ "ApiKeyAuth": [] } ], - "summary": "List standing offers for an OpenSea NFT", + "summary": "Get PC Gamer section headlines", "tags": [ - "OpenSea" + "PC Gamer" ] } }, - "/opensea/item/{chain}/{contract_address}/{token_id}/owners": { + "/pcgamer/news": { "get": { - "description": "Returns the wallets holding one NFT plus the total owner count. ERC-721 items resolve to a single owner; ERC-1155 items can have many, each with the quantity held.", - "operationId": "opensea-item-owners", - "parameters": [ - { - "description": "Chain identifier from /opensea/chains", - "in": "path", - "name": "chain", - "required": true, - "type": "string", - "x-example": "ethereum" - }, - { - "description": "NFT contract address", - "in": "path", - "name": "contract_address", - "required": true, - "type": "string", - "x-example": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" - }, - { - "description": "Token id within the contract", - "in": "path", - "name": "token_id", - "required": true, - "type": "string", - "x-example": "1" - }, - { - "default": 20, - "description": "Owners per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" - } - ], + "description": "Returns the current PC Gamer top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `pcgamer-headlines` to read one section.", + "operationId": "pcgamer-news", "produces": [ "application/json" ], @@ -423684,19 +439407,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemOwnersResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -423717,23 +439428,50 @@ "ApiKeyAuth": [] } ], - "summary": "List the owners of an OpenSea NFT", + "summary": "Get PC Gamer top stories", "tags": [ - "OpenSea" + "PC Gamer" ] } }, - "/opensea/most-watched": { + "/pcgamer/sections": { "get": { - "description": "Returns the collections most added to watchlists on OpenSea, with their current floor price and headline stats. A demand signal that leads trading volume, since watchlisting precedes buying.", - "operationId": "opensea-most-watched", + "description": "Lists the eight top-level PC Gamer sections accepted by `pcgamer-headlines`: `deals`, `games`, `gaming-industry`, `guides`, `hardware`, `movies-tv`, `news` and `software`. Each entry has its `slug`, display `name` and `url`.", + "operationId": "pcgamer-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get PC Gamer sections", + "tags": [ + "PC Gamer" + ] + } + }, + "/pcmag/article": { + "get": { + "description": "Returns a PCMag article or product review by canonical `pcmag.com` `url`, such as `/news/` or `/reviews/`. The response has title, description, publication time, section label, authors, lead image and body `paragraphs`. Hub pages, author pages and pages without a readable body return an upstream error.", + "operationId": "pcmag-article", "parameters": [ { - "default": 20, - "description": "Collections to return, 1-100", + "description": "Canonical PCMag article or review URL", "in": "query", - "name": "limit", - "type": "integer" + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.pcmag.com/news/durabooks-latest-rugged-laptop-goes-to-the-extreme-with-triple-screen-setup" } ], "produces": [ @@ -423743,7 +439481,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionShelfResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -423752,8 +439490,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -423770,24 +439508,30 @@ "ApiKeyAuth": [] } ], - "summary": "List the most watchlisted OpenSea collections", + "summary": "Get PCMag article or review content", "tags": [ - "OpenSea" + "PCMag" ] } }, - "/opensea/profile/{identifier}": { + "/pcmag/author": { "get": { - "description": "Returns the public profile for a wallet, resolved from a wallet address, an ENS name, or an OpenSea username: display name, avatar and banner imagery, verification flag, and linked social handles. Wallet balances, portfolio value, and profit/loss are deliberately not exposed.", - "operationId": "opensea-profile", + "description": "Returns a PCMag author profile by `slug` (for example `michael-kan`) or a pcmag.com authors `url`; supply exactly one. The response has `name`, `role`, `biography`, `image_url`, `expertise` topics linked to category hubs, `social_links` (X, LinkedIn, Bluesky, Threads) as full URLs, and recent articles.", + "operationId": "pcmag-author", "parameters": [ { - "description": "Wallet address, ENS name, or OpenSea username", - "in": "path", - "name": "identifier", - "required": true, + "description": "Author slug, e.g. michael-kan", + "in": "query", + "name": "slug", "type": "string", - "x-example": "vitalik.eth" + "x-example": "michael-kan" + }, + { + "description": "Canonical pcmag.com/authors/ URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.pcmag.com/authors/michael-kan" } ], "produces": [ @@ -423797,7 +439541,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.profileResponseDoc" + "$ref": "#/definitions/publicnews.pcmagAuthorResponseDoc" } }, "400": { @@ -423812,12 +439556,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -423830,52 +439568,258 @@ "ApiKeyAuth": [] } ], - "summary": "Get a public OpenSea profile", + "summary": "Get a PCMag author profile", "tags": [ - "OpenSea" + "PCMag" ] } }, - "/opensea/profile/{identifier}/activity": { + "/pcmag/headlines": { "get": { - "description": "Returns a cursor-paginated feed of a wallet's NFT marketplace events — sales, listings, offers, transfers, and mints — with the counterparty, price, and collection for each. Accepts a wallet address, ENS name, or OpenSea username. Scoped to NFT events only; token transfers and swaps are not returned.", - "operationId": "opensea-profile-activity", + "description": "Returns recent PCMag headlines for one product or topic category. `section` is required and takes a category slug such as `ai`, `antivirus`, `cameras`, `crm-software` or `gaming-systems`; `pcmag-sections` lists them. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "pcmag-headlines", "parameters": [ { - "description": "Wallet address, ENS name, or OpenSea username", - "in": "path", - "name": "identifier", - "required": true, - "type": "string", - "x-example": "vitalik.eth" - }, - { - "default": 20, - "description": "Events per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "description": "Comma-separated event types", + "description": "PCMag category slug", "enum": [ - "SALE", - "LISTING", - "OFFER", - "TRANSFER", - "MINT", - "COLLECTION_OFFER", - "TRAIT_OFFER" + "3d-printers", + "accounting", + "ai", + "air-purifiers", + "android", + "android-apps", + "anti-ransomware-for-business", + "antivirus", + "appliances", + "applicant-tracking-systems", + "application-performance-management", + "asset-management", + "audio", + "audio-accessories", + "audio-editing", + "audio-recording", + "background-check-services", + "batteries-power", + "benefits-administration-software", + "billing-invoicing-software", + "blu-ray-players", + "bluetooth-headsets", + "browsers", + "business-card-printing", + "business-plan-software", + "call-center-features", + "camera-accessories", + "cameras", + "car-accessories", + "cars-auto", + "cloud-backup-for-business", + "cloud-file-storage-for-business", + "cloud-infrastructure", + "collaboration", + "communications", + "components", + "computer-mice", + "connected-kitchen", + "contract-management-software", + "credit-card-processors", + "crm-software", + "cryptocurrency", + "dash-cams", + "data-analytics", + "data-visualization-tools", + "database", + "dating", + "desktop-pcs", + "digital-life", + "digital-voice-recorders", + "disaster-recovery", + "dna-testing-kits", + "document-management-software", + "drones", + "e-commerce-fulfillment-services", + "e-commerce-payments", + "e-commerce-software", + "ebook-readers", + "education", + "elearning-authoring-tools", + "electronic-health-record-management", + "email-marketing", + "employee-monitoring", + "employee-monitoring-software", + "employee-shift-scheduling", + "enterprise-accounting-software", + "erp-software", + "expense-tracking-software", + "fax-services", + "file-sync-backup", + "fitness", + "fitness-trackers", + "fleet-management", + "game-controllers-accessories", + "game-streaming-services", + "games", + "gaming", + "gaming-systems", + "gps-navigation", + "graphic-design", + "graphics-cards", + "hard-drives", + "headphones", + "health-fitness", + "heart-rate-monitors", + "help-desk", + "home-automation-hubs", + "home-entertainment", + "home-entertainment-accessories", + "home-security", + "home-security-cameras", + "hosted-email-providers", + "hosted-endpoint-protection", + "hr-software", + "human-resources", + "identity-management", + "infrastructure-management", + "input-devices", + "inventory-management-software", + "ios", + "ipad-apps", + "iphone-apps", + "it-management", + "it-security", + "keyboards", + "language-learning", + "laptop-accessories", + "laptops", + "lead-management", + "lenses", + "linux", + "low-code-app-development", + "macos", + "malware-protection-removal", + "marketing-automation-software", + "meal-kits", + "media-streaming-devices", + "media-streaming-software", + "medical-alert-systems", + "membership-management", + "microsoft-xbox-games", + "mobile-apps", + "mobile-device-management", + "mobile-games", + "mobile-payment-apps", + "mobile-phone-accessories", + "mobile-phones", + "modems-hotspots", + "monitors", + "motherboards", + "music-audio", + "network-attached-storage", + "network-management", + "network-monitoring", + "networking", + "nintendo-games", + "office-suites", + "online-learning-platforms-for-business", + "online-survey-tools", + "onlinecloud-backup-services", + "operating-systems", + "operations", + "parental-control", + "password-managers", + "payroll", + "pc-cases", + "pc-games", + "performance-management", + "personal-finance", + "personal-finance-apps", + "photo-design", + "photo-editing", + "photo-printing", + "podcasting", + "point-of-sale", + "power-supplies", + "printers", + "processors", + "productivity", + "project-management", + "projectors", + "proxies", + "ransomware-protection", + "robot-vacuums", + "sales-marketing", + "scanners", + "secure-file-transfer", + "security", + "security-suites", + "self-service-business-intelligence-tools", + "seo-tools", + "shopping", + "shredders", + "sim-cards", + "smart-displays", + "smart-glasses", + "smart-home", + "smart-lawn-mowers", + "smart-lighting", + "smart-locks", + "smart-plugs", + "smart-scales", + "smart-thermostats", + "smartwatches", + "smb-accounting", + "social-listening-and-influencer-identification", + "social-media", + "social-media-management", + "sony-playstation-games", + "speakers", + "spyware-protection", + "ssds", + "storage", + "streaming-music-services", + "styli", + "subscription-services", + "system-utilities", + "tablet-accessories", + "tablets", + "tax-software", + "team-messaging", + "tech-for-kids", + "time-tracking", + "to-do-list-apps", + "toys", + "tracking-devices-for-kids", + "tracking-devices-for-pets", + "travel", + "tune-up-utilities", + "tvs", + "universal-remotes", + "video", + "video-camera-accessories", + "video-cameras", + "video-conferencing-software", + "video-editing", + "video-streaming-services", + "virtualization", + "voip-phone-services", + "vpn", + "vr", + "wearables", + "web-hosting", + "webcams", + "website-app-building-tools", + "website-builders", + "website-monitoring", + "wi-fi-mesh-networking-systems", + "wi-fi-range-extenders", + "windows", + "wireless-carriers", + "wireless-routers" ], "in": "query", - "name": "event_types", - "type": "string" + "name": "section", + "required": true, + "type": "string", + "x-example": "3d-printers" } ], "produces": [ @@ -423885,7 +439829,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.activityResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -423894,11 +439838,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get PCMag section headlines", + "tags": [ + "PCMag" + ] + } + }, + "/pcmag/news": { + "get": { + "description": "Returns the current PCMag top stories, with no parameters. Each item has a title, canonical URL, summary, publication time and author name when available. Use `pcmag-headlines` to read one product or topic category.", + "operationId": "pcmag-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -423918,37 +439888,50 @@ "ApiKeyAuth": [] } ], - "summary": "List a wallet's NFT marketplace activity", + "summary": "Get PCMag top stories", "tags": [ - "OpenSea" + "PCMag" ] } }, - "/opensea/profile/{identifier}/collections": { + "/pcmag/sections": { "get": { - "description": "Returns the collections a wallet holds items in, with how many items it holds in each and that collection's current floor price. Useful for valuing a wallet's holdings collection by collection.", - "operationId": "opensea-profile-collections", + "description": "Lists the PCMag product and topic category slugs accepted by `pcmag-headlines`, such as `3d-printers`, `ai`, `antivirus`, `crm-software` and `drones`. Each entry has a `slug`, a display `name` and the category hub `url`.", + "operationId": "pcmag-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get PCMag sections", + "tags": [ + "PCMag" + ] + } + }, + "/people/article": { + "get": { + "description": "Returns a PEOPLE article by canonical `people.com` `url`, such as `https://people.com/example-headline-12345678`. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`. `authors` is empty for pieces with no byline.", + "operationId": "people-article", "parameters": [ { - "description": "Wallet address, ENS name, or OpenSea username", - "in": "path", - "name": "identifier", + "description": "Canonical PEOPLE article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "vitalik.eth" - }, - { - "default": 20, - "description": "Collections per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" + "x-example": "https://people.com/example-headline-12345678" } ], "produces": [ @@ -423958,7 +439941,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.profileCollectionsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -423973,12 +439956,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -423991,61 +439968,24 @@ "ApiKeyAuth": [] } ], - "summary": "List the collections a wallet holds", + "summary": "Get PEOPLE article content", "tags": [ - "OpenSea" + "PEOPLE" ] } }, - "/opensea/profile/{identifier}/created": { + "/people/author": { "get": { - "description": "Returns the collections a wallet created, as opposed to the ones it holds, each with its floor price and trading statistics. Use this to find a creator's full body of work from any one of their collections' contract deployer address.", - "operationId": "opensea-profile-created", + "description": "Returns a PEOPLE staff writer or contributor's public profile (name, job title, structured intro fields, biography, personal social links) and recent articles from a canonical author URL.", + "operationId": "people-author", "parameters": [ { - "description": "Wallet address, ENS name, or OpenSea username", - "in": "path", - "name": "identifier", + "description": "Canonical PEOPLE author URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "0xaba7161a7fb69c88e16ed9f455ce62b791ee4d03" - }, - { - "default": 20, - "description": "Collections per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "default": "VOLUME", - "description": "Sort field", - "enum": [ - "VOLUME", - "ONE_DAY_VOLUME", - "FLOOR_PRICE", - "SALES" - ], - "in": "query", - "name": "sort_by", - "type": "string" - }, - { - "default": "DESC", - "description": "Sort direction", - "enum": [ - "ASC", - "DESC" - ], - "in": "query", - "name": "sort_direction", - "type": "string" + "x-example": "https://people.com/madison-goldberg-11701619" } ], "produces": [ @@ -424055,7 +439995,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.profileCollectionsResponseDoc" + "$ref": "#/definitions/publicnews.peopleAuthorResponseDoc" } }, "400": { @@ -424070,12 +440010,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -424088,48 +440022,24 @@ "ApiKeyAuth": [] } ], - "summary": "List the collections a wallet created", + "summary": "Get a PEOPLE author profile", "tags": [ - "OpenSea" + "PEOPLE" ] } }, - "/opensea/profile/{identifier}/items": { + "/people/headlines": { "get": { - "description": "Returns a cursor-paginated page of the NFTs held by a wallet, with each item's collection, rarity rank, and best standing listing. Accepts a wallet address, ENS name, or OpenSea username; a non-address identifier costs one extra resolution lookup.", - "operationId": "opensea-profile-items", + "description": "Returns fresh headlines from one PEOPLE section listing page. section accepts any slug returned by GET /people/sections (37 values, too many to enumerate inline -- see that endpoint for the full, current list), for example \"celebrity\" or \"royals\".", + "operationId": "people-headlines", "parameters": [ { - "description": "Wallet address, ENS name, or OpenSea username", - "in": "path", - "name": "identifier", + "description": "PEOPLE section slug, from GET /people/sections", + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "vitalik.eth" - }, - { - "default": 20, - "description": "Items per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous next_page_cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "default": "DESC", - "description": "Sort direction by received date", - "enum": [ - "ASC", - "DESC" - ], - "in": "query", - "name": "sort_direction", - "type": "string" + "x-example": "celebrity" } ], "produces": [ @@ -424139,7 +440049,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.profileItemsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -424148,11 +440058,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get PEOPLE section headlines", + "tags": [ + "PEOPLE" + ] + } + }, + "/people/news": { + "get": { + "description": "Returns the current PEOPLE celebrity and entertainment top stories, with no parameters and no section filter. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "people-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -424172,39 +440108,50 @@ "ApiKeyAuth": [] } ], - "summary": "List the NFTs a wallet holds", + "summary": "Get PEOPLE top stories", "tags": [ - "OpenSea" + "PEOPLE" ] } }, - "/opensea/profile/{identifier}/search-items": { + "/people/sections": { "get": { - "description": "Runs a keyword search across a wallet's holdings, matching on item and collection name, and returns the hits with rarity rank and best standing listing. Narrower than `/opensea/profile/{identifier}/items`, which lists everything the wallet holds.", - "operationId": "opensea-profile-search-items", - "parameters": [ + "description": "Returns the full PEOPLE section/category navigation inventory (37 entries as of 2026-09-24), each with a slug, display name, and public listing URL. Use a returned slug as the section parameter on GET /people/headlines.", + "operationId": "people-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ { - "description": "Wallet address, ENS name, or OpenSea username", - "in": "path", - "name": "identifier", - "required": true, - "type": "string", - "x-example": "vitalik.eth" - }, + "ApiKeyAuth": [] + } + ], + "summary": "Get PEOPLE sections", + "tags": [ + "PEOPLE" + ] + } + }, + "/phillyinquirer/article": { + "get": { + "description": "Returns a Philadelphia Inquirer story by canonical `inquirer.com` `url` ending in `-.html`: title, description, publication and update times, section, authors, lead image and body `paragraphs` in reading order. Captions, teasers and comments are excluded. Associated Press `/wires/` pages, section pages and author pages return `400`.", + "operationId": "phillyinquirer-article", + "parameters": [ { - "description": "Search keyword", + "description": "Canonical Philadelphia Inquirer story URL", "in": "query", - "name": "query", + "name": "url", "required": true, "type": "string", - "x-example": "ape" - }, - { - "default": 20, - "description": "Results per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "https://www.inquirer.com/news/ice-arrest-philadelphia-california-business-trip-airport-20260924.html" } ], "produces": [ @@ -424214,7 +440161,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.itemSearchResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -424229,12 +440176,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -424247,55 +440188,30 @@ "ApiKeyAuth": [] } ], - "summary": "Search the NFTs a wallet holds", + "summary": "Get Philadelphia Inquirer article content", "tags": [ - "OpenSea" + "Philadelphia Inquirer" ] } }, - "/opensea/rankings": { + "/phillyinquirer/author": { "get": { - "description": "Returns the collections on one of OpenSea's ranking boards for a given window, each with its ranking score, floor price, and rolling stats. `TRENDING` ranks by recent momentum, `TOP` by absolute volume, and `NEW` surfaces recently launched collections.", - "operationId": "opensea-rankings", + "description": "Returns a Philadelphia Inquirer staff author profile by `slug` (for example `gammage_jeff`) or an inquirer.com author `url`; supply exactly one. The response has `name`, `role`, `biography`, `image_url`, public web social links (no email or phone) and the latest 20 stories, with no paging. An unknown slug returns a 404 error.", + "operationId": "phillyinquirer-author", "parameters": [ { - "default": "TRENDING", - "description": "Ranking board", - "enum": [ - "TOP", - "TRENDING", - "NEW" - ], - "in": "query", - "name": "ranking", - "type": "string" - }, - { - "default": "ONE_DAY", - "description": "Ranking window", - "enum": [ - "ONE_HOUR", - "ONE_DAY", - "SEVEN_DAYS", - "THIRTY_DAYS", - "ALL_TIME" - ], - "in": "query", - "name": "timeframe", - "type": "string" - }, - { - "default": 20, - "description": "Collections per page, 1-100", + "description": "Author slug, e.g. gammage_jeff", "in": "query", - "name": "limit", - "type": "integer" + "name": "slug", + "type": "string", + "x-example": "gammage_jeff" }, { - "description": "Opaque pagination cursor from a previous next_page_cursor", + "description": "Canonical inquirer.com/author/ URL; alternative to slug", "in": "query", - "name": "cursor", - "type": "string" + "name": "url", + "type": "string", + "x-example": "https://www.inquirer.com/author/gammage_jeff/" } ], "produces": [ @@ -424305,7 +440221,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.rankingsResponseDoc" + "$ref": "#/definitions/publicnews.phillyinquirerAuthorResponseDoc" } }, "400": { @@ -424313,9 +440229,9 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "429": { - "description": "Too Many Requests", + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -424332,31 +440248,50 @@ "ApiKeyAuth": [] } ], - "summary": "List ranked OpenSea collections", + "summary": "Get a Philadelphia Inquirer author profile", "tags": [ - "OpenSea" + "Philadelphia Inquirer" ] } }, - "/opensea/search/collections": { + "/phillyinquirer/headlines": { "get": { - "description": "Runs a keyword search across OpenSea collections and returns the matches with floor price, verification flag, and headline stats. Use this to resolve a human-readable name to the `slug` the other collection endpoints take.", - "operationId": "opensea-search-collections", + "description": "Returns recent Philadelphia Inquirer stories for one section, without Associated Press wire copy. `section` is required and takes one of 24 slugs, such as `news`, `sixers`, `eagles`, `south-jersey` or `real-estate`; invalid values return `400`. Each item has a title and URL, and may include summary, author, publication time and image.", + "operationId": "phillyinquirer-headlines", "parameters": [ { - "description": "Search keyword", + "description": "Philadelphia Inquirer section slug", + "enum": [ + "arts", + "business", + "college-sports", + "crime", + "eagles", + "education", + "entertainment", + "flyers", + "food", + "health", + "high-school-sports", + "life", + "news", + "opinion", + "phillies", + "politics", + "real-estate", + "science", + "sixers", + "soccer", + "south-jersey", + "sports", + "transportation", + "weather" + ], "in": "query", - "name": "query", + "name": "section", "required": true, "type": "string", - "x-example": "ape" - }, - { - "default": 20, - "description": "Results per page, 1-100", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "arts" } ], "produces": [ @@ -424366,7 +440301,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionSearchResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -424375,12 +440310,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -424393,25 +440322,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search OpenSea collections by keyword", + "summary": "Get Philadelphia Inquirer section headlines", "tags": [ - "OpenSea" + "Philadelphia Inquirer" ] } }, - "/opensea/top-movers": { + "/phillyinquirer/news": { "get": { - "description": "Returns the collections with the largest recent floor-price and volume moves, each with its current floor and rolling one-hour and one-day stats. Complements `/opensea/rankings`, which ranks by score rather than by change.", - "operationId": "opensea-top-movers", - "parameters": [ - { - "default": 20, - "description": "Collections to return, 1-100", - "in": "query", - "name": "limit", - "type": "integer" - } - ], + "description": "Returns the current Philadelphia Inquirer top stories, with no parameters. Each item has a title, canonical URL, summary, publication time and author name when available. Associated Press wire copy, which makes up much of the source, is excluded.", + "operationId": "phillyinquirer-news", "produces": [ "application/json" ], @@ -424419,13 +440339,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opensea.collectionShelfResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -424446,43 +440360,16 @@ "ApiKeyAuth": [] } ], - "summary": "List the biggest movers on OpenSea", + "summary": "Get Philadelphia Inquirer top stories", "tags": [ - "OpenSea" + "Philadelphia Inquirer" ] } }, - "/opentable/restaurant": { + "/phillyinquirer/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a restaurant's profile (location, cuisines, hours, price band, review summary) plus real-time bookable timeslots for the given date/time and party size.", - "operationId": "opentable-restaurant", - "parameters": [ - { - "description": "OpenTable restaurant id", - "in": "query", - "name": "restaurant_id", - "required": true, - "type": "string", - "x-example": "131459" - }, - { - "description": "Reservation date/time, RFC3339-minute local format; defaults to now", - "in": "query", - "name": "date_time", - "type": "string", - "x-example": "2026-08-04T19:00" - }, - { - "description": "Party size, default 2", - "in": "query", - "name": "party_size", - "type": "integer", - "x-example": 2 - } - ], + "description": "Lists the 24 Philadelphia Inquirer section slugs accepted by `phillyinquirer-headlines`, such as `news`, `sixers`, `eagles` and `south-jersey`. Each entry has a `slug`, display `name` and `url`. Sub-sections such as `news/philadelphia` are not listed because the `news` section already contains them.", + "operationId": "phillyinquirer-sections", "produces": [ "application/json" ], @@ -424490,23 +440377,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opentable.restaurantResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -424523,27 +440398,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenTable restaurant's profile and live availability", + "summary": "Get Philadelphia Inquirer sections", "tags": [ - "OpenTable" + "Philadelphia Inquirer" ] } }, - "/opentable/restaurant/menus": { + "/philstar/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the menus of one OpenTable restaurant, identified by the required `restaurant_id`. Each menu has a title, a currency and sections, and each section lists items with title, price and description. The price is returned as a string in the menu's currency, for example HK$.", - "operationId": "opentable-restaurant-menus", + "description": "Returns public Philstar article metadata and body paragraphs from a canonical article URL. Philstar serves full stories to anonymous readers, so no paywall flag is needed.", + "operationId": "philstar-article", "parameters": [ { - "description": "OpenTable restaurant id", + "description": "Canonical Philstar article URL", "in": "query", - "name": "restaurant_id", + "name": "url", "required": true, "type": "string", - "x-example": "164555" + "x-example": "https://www.philstar.com/business/2026/09/25/2558683/naysayers-wont-take-away-gcashs-very-exciting-story" } ], "produces": [ @@ -424553,7 +440425,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opentable.menusResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -424568,12 +440440,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -424586,41 +440452,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get an OpenTable restaurant's menus", + "summary": "Get Philstar article content", "tags": [ - "OpenTable" + "Philstar" ] } }, - "/opentable/restaurant/reviews": { + "/philstar/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of diner reviews for an OpenTable restaurant, identified by the required `restaurant_id`. `page` defaults to 1 and `size` to 20. Each review has its id, author and author's metro area, reservation and posted dates, text, a recommended flag, and ratings for overall, food, service, ambience, value and noise.", - "operationId": "opentable-restaurant-reviews", + "description": "Returns one Philstar author's public archive: name, profile photo when set, and the most recent stories on the first page of the archive. Authors are identified by the numeric id in the byline link (philstar.com/authors//).", + "operationId": "philstar-author", "parameters": [ { - "description": "OpenTable restaurant id", + "description": "Numeric Philstar author id from a byline link, e.g. 1805259", "in": "query", - "name": "restaurant_id", - "required": true, + "name": "id", "type": "string", - "x-example": "131459" - }, - { - "description": "Page number, default 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "1805259" }, { - "description": "Reviews per page, default 20", + "description": "Author archive URL, https://www.philstar.com/authors/[/]; alternative to id", "in": "query", - "name": "size", - "type": "integer", - "x-example": 20 + "name": "url", + "type": "string", + "x-example": "https://www.philstar.com/authors/1805259/richmond-mercurio" } ], "produces": [ @@ -424630,7 +440485,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opentable.reviewsResponseDoc" + "$ref": "#/definitions/publicnews.philstarAuthorResponseDoc" } }, "400": { @@ -424645,12 +440500,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -424663,64 +440512,119 @@ "ApiKeyAuth": [] } ], - "summary": "Get a page of an OpenTable restaurant's diner reviews", + "summary": "Get a Philstar author archive", "tags": [ - "OpenTable" + "Philstar" ] } }, - "/opentable/search": { + "/philstar/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches restaurants by free-text term (cuisine, name, neighborhood) near a latitude/longitude, for a given date/time and party size, including inline live availability per result.", - "operationId": "opentable-search", + "description": "Returns the current headlines from the first page of one public Philstar section page (Philstar publishes no crawlable feeds, so this reads the section page itself).", + "operationId": "philstar-headlines", "parameters": [ { - "description": "Free-text search term", - "in": "query", - "name": "term", - "required": true, - "type": "string", - "x-example": "dinner" - }, - { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 10.7873 - }, - { - "description": "Search center longitude", + "description": "Philstar section slug", + "enum": [ + "headlines", + "headlines-climate-and-environment", + "headlines-weather", + "opinion", + "nation", + "world", + "business", + "business-agriculture", + "business-banking", + "business-biz-memos", + "business-business-as-usual", + "business-motoring", + "business-real-estate", + "business-science-and-environment", + "business-stock-commentary", + "business-technology", + "business-telecoms", + "sports", + "sports-deans-corner", + "esport", + "entertainment", + "entertainment-korean-wave", + "entertainment-movies", + "entertainment-music", + "movies", + "music", + "lifestyle", + "lifestyle-arts-and-culture", + "lifestyle-business-life", + "lifestyle-fashion-and-beauty", + "lifestyle-food-and-leisure", + "lifestyle-gadgets", + "lifestyle-health-and-family", + "lifestyle-modern-living", + "lifestyle-on-the-radar", + "lifestyle-pet-life", + "lifestyle-shopping-guide", + "lifestyle-the-budgetarian", + "lifestyle-travel-and-tourism", + "news-commentary", + "videos", + "brandspace", + "campus", + "exam-results", + "lotto-results", + "other-sections-comics", + "other-sections-daily-bread", + "other-sections-education-and-home", + "other-sections-exam-results", + "other-sections-forex", + "other-sections-letters-to-the-editor", + "other-sections-lotto-results", + "other-sections-newsmakers", + "other-sections-star-cover", + "other-sections-supplements", + "other-sections-the-good-news", + "other-sections-word-of-the-day", + "pang-masa", + "pang-masa-pang-movies", + "pang-masa-para-malibang", + "pang-masa-para-manalo", + "pang-masa-pm-sports", + "pang-masa-police-metro", + "pang-masa-punto-mo", + "pilipino-star-ngayon", + "pilipino-star-ngayon-bansa", + "pilipino-star-ngayon-dr-love", + "pilipino-star-ngayon-komiks", + "pilipino-star-ngayon-kutob", + "pilipino-star-ngayon-litra-talk", + "pilipino-star-ngayon-metro", + "pilipino-star-ngayon-opinyon", + "pilipino-star-ngayon-palaro", + "pilipino-star-ngayon-probinsiya", + "pilipino-star-ngayon-showbiz", + "pilipino-star-ngayon-true-confessions", + "banat", + "banat-balita", + "banat-imong-kapalaran", + "banat-kalingawan", + "banat-opinyon", + "banat-palaro", + "banat-punsoy", + "banat-showbiz", + "the-freeman", + "the-freeman-cebu-business", + "the-freeman-cebu-entertainment", + "the-freeman-cebu-lifestyle", + "the-freeman-cebu-news", + "the-freeman-cebu-sports", + "the-freeman-metro-cebu", + "the-freeman-opinion", + "the-freeman-region" + ], "in": "query", - "name": "longitude", + "name": "section", "required": true, - "type": "number", - "x-example": 106.7407 - }, - { - "description": "Reservation date/time, RFC3339-minute local format; defaults to now", - "in": "query", - "name": "date_time", "type": "string", - "x-example": "2026-08-04T19:00" - }, - { - "description": "Party size, default 2", - "in": "query", - "name": "party_size", - "type": "integer", - "x-example": 2 - }, - { - "description": "Max results, default 10", - "in": "query", - "name": "size", - "type": "integer", - "x-example": 10 + "x-example": "headlines" } ], "produces": [ @@ -424730,7 +440634,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/opentable.searchResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -424739,12 +440643,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -424757,16 +440655,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search OpenTable restaurants near a location", + "summary": "Get Philstar section headlines", "tags": [ - "OpenTable" + "Philstar" ] } }, - "/otto/categories": { + "/philstar/news": { "get": { - "description": "Lists the top-level categories shown in Otto.de's homepage navigation, each with its name and its canonical browse URL. The response also gives the `count` of categories and a `fetched_at` time. It takes no parameters.", - "operationId": "otto-categories", + "description": "Returns the current Philstar (Philippine Star) top stories from the public homepage: the latest, trending and featured stories with summary, byline, thumbnail and the publication date encoded in the story URL.", + "operationId": "philstar-news", "produces": [ "application/json" ], @@ -424774,13 +440672,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/otto.categoriesResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "503": { @@ -424795,24 +440687,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get Otto.de's top-level categories", + "summary": "Get Philstar top stories", "tags": [ - "Otto" + "Philstar" ] } }, - "/otto/product": { + "/philstar/sections": { "get": { - "description": "Returns a product's public detail, images, selectable colors and sizes. This endpoint uses a browser renderer because Otto.de product pages require JavaScript rendering.", - "operationId": "otto-product", + "description": "Returns the public Philstar editorial section inventory: every English, Filipino (Pilipino Star Ngayon, Pang-Masa) and Cebuano (Banat, The Freeman) section page that lists stories.", + "operationId": "philstar-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Philstar sections", + "tags": [ + "Philstar" + ] + } + }, + "/phonearena/article": { + "get": { + "description": "Returns public PhoneArena news or review metadata and body paragraphs from a canonical article URL. PhoneArena serves pages behind a Cloudflare challenge; when the challenge is not cleared the endpoint returns a 503 error.", + "operationId": "phonearena-article", "parameters": [ { - "description": "Canonical Otto.de product URL returned by otto-search", + "description": "Canonical PhoneArena article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.otto.de/p/nike-nike-performance-damen-laufschuh-juniper-trail-3-laufschuh-C2019218809/" + "x-example": "https://www.phonearena.com/news/the-galaxy-z-fold-8-shamelessly-stole-the-crown-from-the-iphone-duo_id183377" } ], "produces": [ @@ -424822,7 +440740,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/otto.productResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -424831,8 +440749,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -424849,31 +440767,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Otto.de product", + "summary": "Get PhoneArena article or review content", "tags": [ - "Otto" + "PhoneArena" ] } }, - "/otto/search": { + "/phonearena/author": { "get": { - "description": "Searches Otto.de's public catalogue and returns the server-rendered product cards. offset advances by Otto's fixed 109-card page size; valid values are 0, 109, 218, and so on.", - "operationId": "otto-search", + "description": "Returns one PhoneArena staff author's public profile: name, role, biography, image, social links and the recent articles listed on the profile page.", + "operationId": "phonearena-author", "parameters": [ { - "description": "Product search keyword", + "description": "Author username, e.g. sebastian.f", "in": "query", - "name": "q", - "required": true, + "name": "slug", "type": "string", - "x-example": "laufschuhe" + "x-example": "sebastian.f" }, { - "default": 0, - "description": "Result offset; non-negative multiple of 109", + "description": "Canonical phonearena.com/team/ URL; alternative to slug", "in": "query", - "name": "offset", - "type": "integer" + "name": "url", + "type": "string", + "x-example": "https://www.phonearena.com/team/sebastian.f" } ], "produces": [ @@ -424883,7 +440800,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/otto.searchResponseDoc" + "$ref": "#/definitions/publicnews.phonearenaAuthorResponseDoc" } }, "400": { @@ -424898,12 +440815,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -424916,24 +440827,29 @@ "ApiKeyAuth": [] } ], - "summary": "Search Otto.de products", + "summary": "Get a PhoneArena author profile", "tags": [ - "Otto" + "PhoneArena" ] } }, - "/pagesix/article": { + "/phonearena/headlines": { "get": { - "description": "Returns a Page Six article by canonical `url` in the form `https://pagesix.com/YYYY/MM/DD/
//`: title, description, section, authors, lead image, publication and update times, a `paywalled` flag and the body `paragraphs`.", - "operationId": "pagesix-article", + "description": "Returns up to 100 newest PhoneArena stories or reviews from one public listing. For news-month and reviews, titles are reconstructed from the hero-image file name and published_at is the listing's last-modified time.", + "operationId": "phonearena-headlines", "parameters": [ { - "description": "Canonical Page Six article URL", + "description": "PhoneArena listing slug", + "enum": [ + "news", + "news-month", + "reviews" + ], "in": "query", - "name": "url", + "name": "section", "required": true, "type": "string", - "x-example": "https://pagesix.com/2026/09/24/celebrity-news/example-article-slug/" + "x-example": "news" } ], "produces": [ @@ -424943,7 +440859,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -424952,8 +440868,40 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get PhoneArena section headlines", + "tags": [ + "PhoneArena" + ] + } + }, + "/phonearena/news": { + "get": { + "description": "Returns PhoneArena's most recent phone news stories (about the last two days) from its public news sitemap, with exact titles and publication times.", + "operationId": "phonearena-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -424970,24 +440918,62 @@ "ApiKeyAuth": [] } ], - "summary": "Get Page Six article content", + "summary": "Get PhoneArena top stories", "tags": [ - "Page Six" + "PhoneArena" ] } }, - "/pagesix/author": { + "/phonearena/sections": { "get": { - "description": "Returns a Page Six author profile from a required `url` in the form `https://pagesix.com/author//`. The response has `name`, `biography`, `image_url`, `social_links` and recent articles. An RSS feed link is the only social link always present, and each article's `published_at` is the page's date text such as `September 23, 2026 | 8:16pm`.", - "operationId": "pagesix-author", + "description": "Lists the three PhoneArena listings that `phonearena-headlines` accepts: `news` (the last two days of news), `news-month` (the newest news of the current calendar month) and `reviews` (the newest reviews, comparisons and hands-on articles of the current year). Each entry has a `slug`, a display `name` and a source `url`.", + "operationId": "phonearena-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get PhoneArena sections", + "tags": [ + "PhoneArena" + ] + } + }, + "/physorg/article": { + "get": { + "description": "Returns public Phys.org article metadata and readable body paragraphs from a canonical dated news URL. The service tries proxied HTTP first and uses the production browser fleet when the article edge challenges HTTP. Billing is 2 credits for an HTTP-profile success and 10 credits when browser rendering is required. No author-profile route was verified.", + "operationId": "physorg-article", "parameters": [ { - "description": "Canonical Page Six author URL", + "description": "Canonical Phys.org article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://pagesix.com/author/jane-doe/" + "x-example": "https://phys.org/news/2026-09-example-story.html" } ], "produces": [ @@ -424997,7 +440983,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.pagesixAuthorResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -425024,56 +441010,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Page Six author profile", + "summary": "Get a Phys.org article", "tags": [ - "Page Six" + "Phys.org" ] } }, - "/pagesix/headlines": { + "/physorg/headlines": { "get": { - "description": "Returns recent Page Six stories for one section. `section` is required and takes one of 30 slugs, such as `celebrity-news`, `royal-family`, `taylor-swift` or `new-york-city-society`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "pagesix-headlines", + "description": "Returns current stories from one Phys.org feed. The accepted values are the seven Topics menu feeds plus the Breaking and Editorials feeds. Search and tag feeds are not included.", + "operationId": "physorg-headlines", "parameters": [ { - "description": "Page Six RSS section slug", + "description": "Phys.org RSS feed slug from physorg-sections", "enum": [ - "awards", - "beauty", - "california-society", - "celebrity-news", - "contributor-content", - "entertainment", - "fashion", - "hollywood", - "hollywood-awards-watch", - "hollywood-media-news", - "hollywood-studio-news", - "lifestyle", - "los-angeles-society", - "media", - "miami-society", - "movies", - "music", - "new-york-city-society", - "palm-beach-society", - "parents", - "real-estate", - "royal-family", - "shopping", - "society", - "sports", - "style", - "taylor-swift", - "travel", - "tv", - "washington-dc-society" + "nanotech-news", + "physics-news", + "space-news", + "earth-news", + "chemistry-news", + "biology-news", + "science-news", + "breaking", + "editorials" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "awards" + "x-example": "nanotech-news" } ], "produces": [ @@ -425104,16 +441069,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Page Six section headlines", + "summary": "Get Phys.org section headlines", "tags": [ - "Page Six" + "Phys.org" ] } }, - "/pagesix/news": { + "/physorg/news": { "get": { - "description": "Returns the current Page Six top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `pagesix-headlines` to read one section.", - "operationId": "pagesix-news", + "description": "Returns current stories from Phys.org's public all-stories RSS feed. Summaries are publisher-provided teasers. Use physorg-sections to discover the topic and editorial RSS feeds accepted by physorg-headlines.", + "operationId": "physorg-news", "produces": [ "application/json" ], @@ -425142,16 +441107,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Page Six top stories", + "summary": "Get Phys.org top stories", "tags": [ - "Page Six" + "Phys.org" ] } }, - "/pagesix/sections": { + "/physorg/sections": { "get": { - "description": "Lists the 30 Page Six section slugs accepted by `pagesix-headlines`, such as `celebrity-news`, `royal-family`, `taylor-swift` and `palm-beach-society`. Each entry has its `slug`, display `name` and `url`.", - "operationId": "pagesix-sections", + "description": "Lists the seven topic feeds in Phys.org's Topics menu and its two additional public Breaking and Editorials feeds. Every returned slug is accepted by physorg-headlines. Search and tag feeds are not included.", + "operationId": "physorg-sections", "produces": [ "application/json" ], @@ -425168,64 +441133,65 @@ "ApiKeyAuth": [] } ], - "summary": "Get Page Six RSS sections", + "summary": "List Phys.org RSS sections", "tags": [ - "Page Six" + "Phys.org" ] } }, - "/pandamart/search": { + "/ping": { "get": { "consumes": [ "application/json" ], - "description": "Returns pandamart grocery/convenience darkstores delivering to a latitude/longitude. Each store carries its code (the value the store and products endpoints take), name, address, coordinates, budget tier, chain, minimum order amount and delivery fee, delivery/pickup availability, and a hero image. A location with no coverage returns an empty list rather than an error.", - "operationId": "pandamart-search", - "parameters": [ - { - "description": "Delivery Hero market. One of sg, pk, bd, hk, my, ph. Defaults to sg.", - "enum": [ - "sg", - "pk", - "bd", - "hk", - "my", - "ph" - ], - "in": "query", - "name": "market", - "type": "string", - "x-example": "sg" + "description": "Returns the API's release metadata: `status`, `service`, `api` name, `version`, full and short `commit`, `build_time` and a `dirty` flag. The root `/ping` path returns the same payload.", + "operationId": "ping", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/api.pingResponseDoc" + } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "summary": "Return API metadata", + "tags": [ + "Meta" + ] + } + }, + "/pinterest/board/{username}/{slug}": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns a Pinterest board's metadata (name, description, cover image, pin/follower counts, owner) plus a page of pins from that board. Public data sourced from Pinterest's own board pages.", + "operationId": "pinterest-board", + "parameters": [ { - "description": "Search center latitude", - "in": "query", - "name": "latitude", + "description": "Pinterest username that owns the board", + "in": "path", + "name": "username", "required": true, - "type": "number", - "x-example": 1.3521 + "type": "string", + "x-example": "patrontequila" }, { - "description": "Search center longitude", - "in": "query", - "name": "longitude", + "description": "Board URL slug, from the board's own /{username}/{slug}/ URL", + "in": "path", + "name": "slug", "required": true, - "type": "number", - "x-example": 103.8198 - }, - { - "description": "Darkstores to return, clamped to 50 (default 20)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Result offset for pagination (default 0)", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "type": "string", + "x-example": "el-cafecito" } ], "produces": [ @@ -425235,7 +441201,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pandamart.searchResponseDoc" + "$ref": "#/definitions/pinterest.boardResponseDoc" } }, "400": { @@ -425244,6 +441210,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -425256,58 +441234,19 @@ "ApiKeyAuth": [] } ], - "summary": "Search pandamart darkstores near a location", + "summary": "Get a Pinterest board's detail", "tags": [ - "Pandamart" + "Pinterest" ] } }, - "/pandamart/store": { + "/pinterest/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns one pandamart darkstore's detail by code: name, address, coordinates, budget tier, chain, minimum order amount, minimum delivery fee, delivery/pickup availability, timezone, and a hero image. Supplying latitude and longitude only affects the (optional) computed fields the upstream itself returns for that coordinate; it does not filter or reject the lookup.", - "operationId": "pandamart-store", - "parameters": [ - { - "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", - "enum": [ - "sg", - "pk", - "bd", - "hk", - "my", - "ph" - ], - "in": "query", - "name": "market", - "type": "string", - "x-example": "sg" - }, - { - "description": "Darkstore code, from /pandamart/search's code field", - "in": "query", - "name": "code", - "required": true, - "type": "string", - "x-example": "wsg7" - }, - { - "description": "Caller latitude, optional", - "in": "query", - "name": "latitude", - "type": "number", - "x-example": 1.3521 - }, - { - "description": "Caller longitude, optional", - "in": "query", - "name": "longitude", - "type": "number", - "x-example": 103.8198 - } - ], + "description": "Returns Pinterest's top-level \"Ideas\" category taxonomy (e.g. \"Animals\", \"Home Decor\", \"Food And Drink\"). Each entry's id is usable directly with GET /pinterest/ideas/{id}. Public data sourced from Pinterest's own ideas.pinterest.com-style category hub.", + "operationId": "pinterest-categories", "produces": [ "application/json" ], @@ -425315,17 +441254,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pandamart.storeResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/pinterest.categoriesResponseDoc" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -425342,42 +441275,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one pandamart darkstore's detail", + "summary": "Get Pinterest's \"Ideas\" category list", "tags": [ - "Pandamart" + "Pinterest" ] } }, - "/pandamart/store/categories": { + "/pinterest/ideas/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one darkstore's full category tree: every category and sub-category, each with the upstream-reported product count and (for top-level categories) an image. This lists what categories exist and how large they are -- it does not fetch the items inside any one category. Sub-category product counts are frequently 0 upstream; only top-level counts are reliably populated.", - "operationId": "pandamart-store-categories", + "description": "Returns one \"Ideas\" category's metadata (name, description, follower count) plus a page of pins from that category's feed. Public data sourced from Pinterest's own ideas category pages.", + "operationId": "pinterest-idea", "parameters": [ { - "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", - "enum": [ - "sg", - "pk", - "bd", - "hk", - "my", - "ph" - ], - "in": "query", - "name": "market", - "type": "string", - "x-example": "sg" - }, - { - "description": "Darkstore code, from /pandamart/search's code field", - "in": "query", - "name": "code", + "description": "Pinterest ideas category id. See GET /pinterest/categories for the full list.", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "wsg7" + "x-example": "925056443165" } ], "produces": [ @@ -425387,7 +441305,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pandamart.categoriesResponseDoc" + "$ref": "#/definitions/pinterest.ideaResponseDoc" } }, "400": { @@ -425402,6 +441320,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -425414,50 +441338,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one pandamart darkstore's category tree", + "summary": "Get a Pinterest \"Ideas\" category's detail feed", "tags": [ - "Pandamart" + "Pinterest" ] } }, - "/pandamart/store/product": { + "/pinterest/pin/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one product's full detail by ID: the same fields a shelf/search result carries plus category_id and, for weighable/grocery items, per-unit pricing and nutrition attributes. Resolves the store's page slug internally, so only the darkstore code and product ID are needed.", - "operationId": "pandamart-store-product", + "description": "Returns a single Pinterest pin's full detail: title, description, image, board, pinner, comment count, save count, and creation time. Public data sourced from Pinterest's own pin pages.", + "operationId": "pinterest-pin", "parameters": [ { - "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", - "enum": [ - "sg", - "pk", - "bd", - "hk", - "my", - "ph" - ], - "in": "query", - "name": "market", - "type": "string", - "x-example": "sg" - }, - { - "description": "Darkstore code, from /pandamart/search's code field", - "in": "query", - "name": "code", - "required": true, - "type": "string", - "x-example": "wsg7" - }, - { - "description": "Product ID, from a search/products/categories response's id field", - "in": "query", - "name": "product_id", + "description": "Pinterest pin id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "8012454" + "x-example": "52846995624279072" } ], "produces": [ @@ -425467,7 +441368,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pandamart.productDetailResponseDoc" + "$ref": "#/definitions/pinterest.pinResponseDoc" } }, "400": { @@ -425482,6 +441383,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -425494,42 +441401,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one pandamart product's full detail", + "summary": "Get a Pinterest pin's full detail", "tags": [ - "Pandamart" + "Pinterest" ] } }, - "/pandamart/store/products": { + "/pinterest/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one darkstore's product showcase: every named shelf its own home page displays (deals, new arrivals, category highlights, etc.), each with real prices, stock, and availability. This is the curated set of shelves the store's home page surfaces, not the full category-browsable catalog.", - "operationId": "pandamart-store-products", + "description": "Returns public Pinterest pins matching a text query: title, description, image, board, and pinner for each result. Public data sourced from Pinterest's own web search.", + "operationId": "pinterest-search", "parameters": [ { - "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", - "enum": [ - "sg", - "pk", - "bd", - "hk", - "my", - "ph" - ], - "in": "query", - "name": "market", - "type": "string", - "x-example": "sg" - }, - { - "description": "Darkstore code, from /pandamart/search's code field", + "description": "Search text", "in": "query", - "name": "code", + "name": "query", "required": true, "type": "string", - "x-example": "wsg7" + "x-example": "minimalist living room" } ], "produces": [ @@ -425539,7 +441431,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pandamart.productsResponseDoc" + "$ref": "#/definitions/pinterest.searchResponseDoc" } }, "400": { @@ -425548,8 +441440,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -425566,76 +441458,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one pandamart darkstore's product showcase", + "summary": "Search Pinterest pins", "tags": [ - "Pandamart" + "Pinterest" ] } }, - "/pandamart/store/search": { + "/pinterest/user/{username}": { "get": { "consumes": [ "application/json" ], - "description": "Searches by keyword within one darkstore's own catalog -- the pandamart equivalent of the search box on a darkstore page. Unlike the product showcase's curated shelves, this reaches the store's full catalog by keyword. Returns matching products with real prices, stock, and availability, plus total_products and has_more for pagination via page/limit.", - "operationId": "pandamart-store-search", + "description": "Returns a Pinterest user's public profile: display name, bio, website, avatar, and follower/following/pin/board counts. Public data sourced from Pinterest's own profile pages.", + "operationId": "pinterest-user", "parameters": [ { - "description": "Delivery Hero market the store belongs to. One of sg, pk, bd, hk, my, ph. Defaults to sg.", - "enum": [ - "sg", - "pk", - "bd", - "hk", - "my", - "ph" - ], - "in": "query", - "name": "market", - "type": "string", - "x-example": "sg" - }, - { - "description": "Darkstore code, from /pandamart/search's code field", - "in": "query", - "name": "code", - "required": true, - "type": "string", - "x-example": "wsg7" - }, - { - "description": "Product search text", - "in": "query", - "name": "query", + "description": "Pinterest username", + "in": "path", + "name": "username", "required": true, "type": "string", - "x-example": "milk" - }, - { - "description": "Result order. One of RELEVANCE, PRICE_ASC, PRICE_DESC. Defaults to RELEVANCE.", - "enum": [ - "RELEVANCE", - "PRICE_ASC", - "PRICE_DESC" - ], - "in": "query", - "name": "sort", - "type": "string", - "x-example": "RELEVANCE" - }, - { - "description": "1-based result page (default 1)", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Products per page, clamped to 10-50 (default 20)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "patrontequila" } ], "produces": [ @@ -425645,11 +441488,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pandamart.storeSearchResponseDoc" + "$ref": "#/definitions/pinterest.userResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, - "400": { - "description": "Bad Request", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -425666,19 +441521,29 @@ "ApiKeyAuth": [] } ], - "summary": "Search for products within one pandamart darkstore", + "summary": "Get a Pinterest user's public profile", "tags": [ - "Pandamart" + "Pinterest" ] } }, - "/panera/at-work-locations": { + "/pinterest/user/{username}/boards": { "get": { "consumes": [ "application/json" ], - "description": "Returns the full national Panera at Work location list -- a separate B2B workplace-delivery drop-off program from ordinary cafe pickup/delivery covered by GET /panera/locations. Each location carries its address, coordinates, delivery contact, lead time, the cafe id that services it, and its scheduled drop-off/order-cutoff times per weekday. This is a small, national dataset -- no query parameters are needed.", - "operationId": "panera-at-work-locations", + "description": "Returns a page of a Pinterest user's own boards: name, description, cover image, and pin/follower counts for each. Public data sourced from Pinterest's own profile pages.", + "operationId": "pinterest-user-boards", + "parameters": [ + { + "description": "Pinterest username", + "in": "path", + "name": "username", + "required": true, + "type": "string", + "x-example": "patrontequila" + } + ], "produces": [ "application/json" ], @@ -425686,11 +441551,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.atWorkLocationsResponseDoc" + "$ref": "#/definitions/pinterest.userBoardsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -425707,27 +441578,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Panera Bread's Panera at Work workplace-delivery locations", + "summary": "Get a Pinterest user's boards", "tags": [ - "Panera" + "Pinterest" ] } }, - "/panera/cafe": { + "/pinterest/user/{username}/pins": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Panera Bread cafe's address, phone, coordinates, amenity flags, per-fulfillment-channel availability (dine-in, storefront/pickup, rapid pickup, drive-thru, curbside, delivery -- each with its own available/open-now/lead-time-minutes and weekly hours where Panera publishes them) and the published storefront hours for the next calendar week with concrete dates. Cafe ids come from GET /panera/locations. An unknown cafe id returns a 404.", - "operationId": "panera-cafe", + "description": "Returns a page of a Pinterest user's own pins: title, description, image, board, and pinner for each. Public data sourced from Pinterest's own profile pages.", + "operationId": "pinterest-user-pins", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", - "in": "query", - "name": "cafe_id", + "description": "Pinterest username", + "in": "path", + "name": "username", "required": true, - "type": "integer", - "x-example": 601447 + "type": "string", + "x-example": "patrontequila" } ], "produces": [ @@ -425737,7 +441608,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.cafeResponseDoc" + "$ref": "#/definitions/pinterest.userPinsResponseDoc" } }, "400": { @@ -425746,14 +441617,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -425770,27 +441635,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread cafe's detail and hours", + "summary": "Get a Pinterest user's own pins", "tags": [ - "Panera" + "Pinterest" ] } }, - "/panera/catering-delivery-info": { + "/pitchbook/advisor": { "get": { "consumes": [ "application/json" ], - "description": "Returns one cafe's catering delivery fee, minimum order amount, weekly delivery hours, order-size lead-time tiers (e.g. a $750+ order needs a longer lead time than a smaller one), and upcoming available delivery dates with their order windows. This is Panera's catering delivery flow specifically -- catering pickup happens at the cafe itself, whose hours are already covered by GET /panera/cafe. Returns 404 if the cafe does not offer catering delivery.", - "operationId": "panera-catering-delivery-info", + "description": "Returns the free/teaser content of a PitchBook advisor (service provider, e.g. investment bank, lender, or financing advisory firm) profile page: overview, description, contact/HQ, and a preview of serviced companies/deals, co-lenders, and subsidiaries. PitchBook gates most numeric figures and full lists behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", + "operationId": "pitchbook-advisor", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "PitchBook advisor id", "in": "query", - "name": "cafe_id", - "required": true, - "type": "integer", - "x-example": 601447 + "name": "id", + "type": "string", + "x-example": "676215-64" + }, + { + "description": "Absolute https://pitchbook.com/profiles/advisor/ URL", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://pitchbook.com/profiles/advisor/676215-64" } ], "produces": [ @@ -425800,7 +441671,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.cateringDeliveryInfoResponseDoc" + "$ref": "#/definitions/pitchbook.advisorResponseDoc" } }, "400": { @@ -425833,27 +441704,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread cafe's catering delivery fee, minimum order, hours and lead times", + "summary": "PitchBook advisor profile", "tags": [ - "Panera" + "PitchBook" ] } }, - "/panera/catering-menu": { + "/pitchbook/company": { "get": { "consumes": [ "application/json" ], - "description": "Returns one cafe's catering category list and its full catering item catalog, priced for that specific cafe -- Panera's catering ordering flow is a separate application from its retail site, with its own category structure, pricing and item availability (confirmed live: the same item priced differently between a placeholder default cafe and a real cafe). Categories are a flat list (catering does not publish a category hierarchy the way the retail menu does). Each item carries its price, product type, portion label, whether it is customizable, a full published nutrient panel (calories, calories from fat, fat, saturated fat, trans fat, cholesterol, sodium, carbohydrates, dietary fiber, total sugars, protein, caffeine -- richer than the retail menu's calories/caffeine-only surface), its allergen statement (contains / may-contain, each with an id and display name), and a live in_stock flag from this cafe's current catering stockout feed for today. Cafe ids come from GET /panera/locations.", - "operationId": "panera-catering-menu", + "description": "Returns the free/teaser content of a PitchBook company profile page (overview, description, contact/HQ, industry, funding-round history without dollar amounts, a preview of investors, acquisitions, and subsidiaries). PitchBook gates most numeric figures (deal amounts, cap tables, full investor/LP lists) behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", + "operationId": "pitchbook-company", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "PitchBook company id", "in": "query", - "name": "cafe_id", - "required": true, - "type": "integer", - "x-example": 601447 + "name": "id", + "type": "string", + "x-example": "752821-12" + }, + { + "description": "Absolute https://pitchbook.com/profiles/company/ URL", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://pitchbook.com/profiles/company/752821-12" } ], "produces": [ @@ -425863,7 +441740,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.cateringMenuResponseDoc" + "$ref": "#/definitions/pitchbook.companyResponseDoc" } }, "400": { @@ -425872,6 +441749,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -425890,27 +441773,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread cafe's catering menu with prices, nutrition and allergens", + "summary": "PitchBook company profile", "tags": [ - "Panera" + "PitchBook" ] } }, - "/panera/geocode": { + "/pitchbook/fund": { "get": { "consumes": [ "application/json" ], - "description": "Resolves a free-text address, city, or postal code to coordinates using Panera Bread's own locator geocoder -- the same lookup its site uses to center a cafe search. Returns latitude/longitude plus the resolved city, state, country and formatted address. An address Panera cannot resolve returns a single result with resolved false rather than an error.", - "operationId": "panera-geocode", + "description": "Returns the free/teaser content of a PitchBook fund profile page (strategy, status, manager, size, vintage, and a preview of limited partners and benchmark peer funds). PitchBook gates most numeric figures (returns/IRR, full LP lists) behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", + "operationId": "pitchbook-fund", "parameters": [ { - "description": "Free-text address, city, or postal code", + "description": "PitchBook fund id", "in": "query", - "name": "address", - "required": true, + "name": "id", "type": "string", - "x-example": "Chicago, IL" + "x-example": "19719-91F" + }, + { + "description": "Absolute https://pitchbook.com/profiles/fund/ URL", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://pitchbook.com/profiles/fund/19719-91F" } ], "produces": [ @@ -425920,7 +441809,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.geocodeResponseDoc" + "$ref": "#/definitions/pitchbook.fundResponseDoc" } }, "400": { @@ -425929,6 +441818,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -425947,35 +441842,33 @@ "ApiKeyAuth": [] } ], - "summary": "Geocode a free-text address for Panera Bread's locator", + "summary": "PitchBook fund profile", "tags": [ - "Panera" + "PitchBook" ] } }, - "/panera/item-detail": { + "/pitchbook/investor": { "get": { "consumes": [ "application/json" ], - "description": "Returns one menu item's full description, ingredient statement, a full per-serving nutrient panel (richer than GET /panera/menu's calories/caffeine-only surface), its allergen statement, and every selectable size with its own price and calories. item_id may be negative -- GET /panera/menu itself surfaces negative item ids for some items, and they resolve fine here. Returns 404 if Panera publishes no detail page for the given item id at this cafe.", - "operationId": "panera-item-detail", + "description": "Returns the free/teaser content of a PitchBook investor (fund manager/firm) profile page (overview, description, contact/HQ, and a preview of investments, exits, and co-investors). PitchBook gates most numeric figures and full lists behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", + "operationId": "pitchbook-investor", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "PitchBook investor id", "in": "query", - "name": "cafe_id", - "required": true, - "type": "integer", - "x-example": 601447 + "name": "id", + "type": "string", + "x-example": "294471-37" }, { - "description": "Menu item id, from /panera/menu", + "description": "Absolute https://pitchbook.com/profiles/investor/ URL", "in": "query", - "name": "item_id", - "required": true, - "type": "integer", - "x-example": 650115 + "name": "url", + "type": "string", + "x-example": "https://pitchbook.com/profiles/investor/294471-37" } ], "produces": [ @@ -425985,7 +441878,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.itemDetailResponseDoc" + "$ref": "#/definitions/pitchbook.investorResponseDoc" } }, "400": { @@ -426018,35 +441911,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread menu item's full detail", + "summary": "PitchBook investor profile", "tags": [ - "Panera" + "PitchBook" ] } }, - "/panera/item-options": { + "/pitchbook/limited-partner": { "get": { "consumes": [ "application/json" ], - "description": "Returns one item's selectable option groups: for a combo, each group is a slot to fill (for example \"pick 4 sandwiches\", \"pick 1 soup\"), listing every eligible choice; for a single customizable item, each group is one topping/add-in/amount choice (for example No, Light, Regular, Extra). Each group has min_allowed and max_allowed (how many selections it requires). Each option is one selectable choice, with its own selectable variants (amount tiers) each carrying an item_id and price -- price 0 for a variant included at no extra charge. Panera does not publish a resolved display name for options or groups on this surface, so each option carries its raw upstream image_key as the caller-facing identifier instead of a name. An item that is not customizable, or an unknown item id, returns an empty groups list rather than an error -- Panera's own API does not distinguish the two cases. Item ids come from GET /panera/menu.", - "operationId": "panera-item-options", + "description": "Returns the free/teaser content of a PitchBook limited partner (institutional investor, e.g. pension fund, endowment, or insurance company) profile page: overview, description, contact, and a preview of fund commitments. PitchBook gates most numeric figures and full lists behind a paid subscription; those come through as empty cells rather than being fabricated. Some limited partner profiles have no FAQ section (thinner profiles) -- this is normal, not a sign of a blocked or broken response. Pass exactly one of `id` or `url`.", + "operationId": "pitchbook-limited-partner", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "PitchBook limited partner id", "in": "query", - "name": "cafe_id", - "required": true, - "type": "integer", - "x-example": 601447 + "name": "id", + "type": "string", + "x-example": "864326-44" }, { - "description": "Menu item id, from /panera/menu", + "description": "Absolute https://pitchbook.com/profiles/limited-partner/ URL", "in": "query", - "name": "item_id", - "required": true, - "type": "integer", - "x-example": 643423 + "name": "url", + "type": "string", + "x-example": "https://pitchbook.com/profiles/limited-partner/864326-44" } ], "produces": [ @@ -426056,7 +441947,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.itemOptionsResponseDoc" + "$ref": "#/definitions/pitchbook.limitedPartnerResponseDoc" } }, "400": { @@ -426065,6 +441956,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -426083,33 +441980,56 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread menu item's selectable option groups", + "summary": "PitchBook limited partner profile", "tags": [ - "Panera" + "PitchBook" ] } }, - "/panera/locations": { + "/pizzahut/bundle-choices": { "get": { "consumes": [ "application/json" ], - "description": "Returns one level of Panera Bread's US cafe locator tree. Omit both state and city to list every US state and territory Panera serves, each with its cafe count. Pass state to list every city in that state, each with its full cafe list -- id, name, street address, city, state, postal code, phone, coordinates and per-cafe amenity flags (for example hasDriveThru, hasDelivery, hasCurbside, hasKiosk). Pass both state and city to narrow to that one city's cafes. A state Panera does not serve, or a city with no match, returns an empty list rather than an error.", - "operationId": "panera-locations", + "description": "Returns one deal/combo's full choice-builder tree -- every named slot it offers (e.g. \"1st Pizza\", \"Wings or Fries\", \"1st Dip\") and every product variant a caller can pick to fill that slot, each with the real price delta selecting it adds over the bundle's base price (zero for a variant already covered by the deal, positive for an upgrade such as a larger size or a specialty pizza). This is a different structure from /pizzahut/modifiers -- that endpoint customizes toppings/sauces on one product variant, while this endpoint swaps whole product variants in and out of a multi-item combo. bundle_code comes from /pizzahut/menu's code field on a type=bundle item.", + "operationId": "pizzahut-bundle-choices", "parameters": [ { - "description": "Two-letter US state abbreviation. Omit to list every state.", + "description": "Pizza Hut's store number, from /pizzahut/stores", "in": "query", - "name": "state", + "name": "store_number", + "required": true, "type": "string", - "x-example": "IL" + "x-example": "040937" }, { - "description": "City name. Requires state. Omit to list every city in the state.", + "description": "A deal/combo's bundle code, from /pizzahut/menu's code field on a type=bundle item", "in": "query", - "name": "city", + "name": "bundle_code", + "required": true, "type": "string", - "x-example": "Chicago" + "x-example": "MEAL501BD" + }, + { + "description": "Order channel the deal and pricing reflect (default WEB)", + "enum": [ + "WEB", + "MOBILE", + "POS", + "KIOSK", + "DOORDASH", + "UBEREATS", + "GRUBHUB", + "IOS", + "ANDROID", + "DELIVEROO", + "JUST_EAT", + "CALL_CENTER" + ], + "in": "query", + "name": "channel", + "type": "string", + "x-example": "WEB" } ], "produces": [ @@ -426119,7 +442039,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.locationsResponseDoc" + "$ref": "#/definitions/pizzahut.bundleChoicesResponseDoc" } }, "400": { @@ -426128,6 +442048,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -426146,27 +442072,116 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Panera Bread's US cafe locator", + "summary": "Get one Pizza Hut deal/combo's full choice-builder tree", "tags": [ - "Panera" + "Pizza Hut" ] } }, - "/panera/menu": { + "/pizzahut/delivery-estimate": { "get": { "consumes": [ "application/json" ], - "description": "Returns one cafe's full category tree (with subcategories) and its complete item catalog, priced for that specific cafe -- Panera's prices are genuinely per-cafe, not a national list (the same salad has been confirmed live at different prices in Chicago and New York). Each item carries its price, product type, whether it is customizable, its published nutrients (only Calories and Caffeine are published -- a fuller macro/micronutrient breakdown is not available), its allergen statement (contains / may-contain, each with an id and display name), Panera's own wellness/dietary labels (for example Vegan, Vegetarian, Gluten Conscious), and a live in_stock flag reflecting this cafe's current stockouts. Cafe ids come from GET /panera/locations. An unknown cafe id returns a 404.", - "operationId": "panera-menu", + "description": "Checks whether a Pizza Hut restaurant's delivery integration can deliver to a given address and, when it can, the estimated delivery fee (broken down by fee line item) and pickup/dropoff time. This is a checkout-time estimate -- it does not add an item to a cart or place an order, and takes no payment or account information. serviceable is true only when the upstream returned a real estimate; a false value with reason populated covers every other case seen live, such as the requested delivery_provider not being enabled at that store. For the default INTERNAL provider, a serviceable result does not by itself confirm the address is within a real deliverable radius -- see this endpoint's markdown doc for the caveat. order_subtotal materially affects the fee estimate, so it is required rather than defaulted. pickup_at defaults to 30 minutes from now (an \"order now\" style estimate) when omitted.", + "operationId": "pizzahut-delivery-estimate", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "Pizza Hut's store number, from /pizzahut/stores", "in": "query", - "name": "cafe_id", + "name": "store_number", "required": true, - "type": "integer", - "x-example": 601447 + "type": "string", + "x-example": "040937" + }, + { + "description": "Delivery address line 1", + "in": "query", + "name": "address1", + "required": true, + "type": "string", + "x-example": "250 W 57th St" + }, + { + "description": "Delivery address line 2", + "in": "query", + "name": "address2", + "type": "string", + "x-example": "" + }, + { + "description": "Delivery address city", + "in": "query", + "name": "city", + "required": true, + "type": "string", + "x-example": "New York" + }, + { + "description": "Delivery address state, two-letter code", + "in": "query", + "name": "state", + "required": true, + "type": "string", + "x-example": "NY" + }, + { + "description": "Delivery address postal code", + "in": "query", + "name": "postal_code", + "required": true, + "type": "string", + "x-example": "10019" + }, + { + "description": "Delivery address country code (default US)", + "in": "query", + "name": "country_code", + "type": "string", + "x-example": "US" + }, + { + "description": "Delivery address latitude", + "in": "query", + "name": "latitude", + "required": true, + "type": "number", + "x-example": 40.7656 + }, + { + "description": "Delivery address longitude", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": -73.982 + }, + { + "description": "Order subtotal before fees, in dollars", + "in": "query", + "name": "order_subtotal", + "required": true, + "type": "number", + "x-example": 10 + }, + { + "description": "RFC3339 pickup time (default 30 minutes from now)", + "in": "query", + "name": "pickup_at", + "type": "string", + "x-example": "2026-09-05T20:00:00Z" + }, + { + "description": "Delivery provider to check (default INTERNAL)", + "enum": [ + "DOORDASH", + "MOCK_DOORDASH", + "INTERNAL" + ], + "in": "query", + "name": "delivery_provider", + "type": "string", + "x-example": "INTERNAL" } ], "produces": [ @@ -426176,7 +442191,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.menuResponseDoc" + "$ref": "#/definitions/pizzahut.deliveryEstimateResponseDoc" } }, "400": { @@ -426209,27 +442224,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread cafe's full menu with prices, nutrition and allergens", + "summary": "Check Pizza Hut delivery serviceability and estimated fee for one store and address", "tags": [ - "Panera" + "Pizza Hut" ] } }, - "/panera/quantity-rules": { + "/pizzahut/menu": { "get": { "consumes": [ "application/json" ], - "description": "Returns one cafe's active order-quantity limits -- promotional or supply-constrained items Panera caps per order (for example a seasonal souffle limited to 6 within a 2-day window). Each rule has a scope (item or group), the item ids it applies to, and one or more day-offset windows each with its own max_quantity. A cafe with no active limits returns an empty rules list, not an error. Cafe ids come from GET /panera/locations.", - "operationId": "panera-quantity-rules", + "description": "Returns one restaurant's full menu grouped into categories (e.g. \"Pizza\", \"Wings\", \"Deals\"). Every entry is a product, a bundle (a deal or combo), or a standalone priced variant -- type tells callers which -- and carries a price in USD cents plus a decimal dollar value, and an image when the upstream publishes one. A product item also lists variants: every other priced size/crust/style option beyond its default (e.g. a pizza's Personal Pan through Large Original Stuffed Crust). Prices reflect this specific restaurant and order channel, not a national default. channel selects which order channel the menu is priced for (web ordering by default); prices can genuinely differ by channel (e.g. a delivery-marketplace channel vs. web). Some restaurants also carry products with no category at all (e.g. individual dip cup flavors); these are returned separately as uncategorized_items rather than silently dropped.", + "operationId": "pizzahut-menu", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "Pizza Hut's store number, from /pizzahut/stores", "in": "query", - "name": "cafe_id", + "name": "store_number", "required": true, - "type": "integer", - "x-example": 601447 + "type": "string", + "x-example": "040937" + }, + { + "description": "Order channel the menu is priced for (default WEB)", + "enum": [ + "WEB", + "MOBILE", + "POS", + "KIOSK", + "DOORDASH", + "UBEREATS", + "GRUBHUB", + "IOS", + "ANDROID", + "DELIVEROO", + "JUST_EAT", + "CALL_CENTER" + ], + "in": "query", + "name": "channel", + "type": "string", + "x-example": "WEB" } ], "produces": [ @@ -426239,7 +442275,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.quantityRulesResponseDoc" + "$ref": "#/definitions/pizzahut.menuResponseDoc" } }, "400": { @@ -426248,6 +442284,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -426266,27 +442308,56 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread cafe's order-quantity limits", + "summary": "Get one Pizza Hut restaurant's full priced menu", "tags": [ - "Panera" + "Pizza Hut" ] } }, - "/panera/retired-products": { + "/pizzahut/modifiers": { "get": { "consumes": [ "application/json" ], - "description": "Returns items no longer on the active menu, resolved through the given cafe's own version map -- either permanently retired (availability_stage RETIRED) or currently out of seasonal rotation (SEASONAL, may return). Each item carries its name, description, portion label and image key. Cafe ids come from GET /panera/locations.", - "operationId": "panera-retired-products", + "description": "Returns one product variant's full build-your-own customization tree -- every slot (e.g. \"Pizza Sauce\", \"Pizza Cheese\", \"Pizza Toppings\", \"Crust Finishers\"), every modifier within it (a specific topping, sauce flavor, or seasoning), and every weight/placement option (e.g. Light, Regular, Extra, or a Left/Right/Whole pizza-half placement) with its own real price delta -- zero for an amount already included by default, a positive upcharge for an \"extra\" option. variant_code comes from /pizzahut/menu's variant_code or variants[].variant_code fields.", + "operationId": "pizzahut-modifiers", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "Pizza Hut's store number, from /pizzahut/stores", "in": "query", - "name": "cafe_id", + "name": "store_number", "required": true, - "type": "integer", - "x-example": 601447 + "type": "string", + "x-example": "040937" + }, + { + "description": "A product's specific size/crust/style variant code, from /pizzahut/menu", + "in": "query", + "name": "variant_code", + "required": true, + "type": "string", + "x-example": "variant_CLSS001_010BCYO1T_SIZE060L_BASE020H" + }, + { + "description": "Order channel the customization tree and pricing reflect (default WEB)", + "enum": [ + "WEB", + "MOBILE", + "POS", + "KIOSK", + "DOORDASH", + "UBEREATS", + "GRUBHUB", + "IOS", + "ANDROID", + "DELIVEROO", + "JUST_EAT", + "CALL_CENTER" + ], + "in": "query", + "name": "channel", + "type": "string", + "x-example": "WEB" } ], "produces": [ @@ -426296,7 +442367,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.retiredProductsResponseDoc" + "$ref": "#/definitions/pizzahut.modifiersResponseDoc" } }, "400": { @@ -426305,6 +442376,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -426323,35 +442400,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Panera Bread's retired and seasonal menu items", + "summary": "Get one Pizza Hut product variant's full customization tree", "tags": [ - "Panera" + "Pizza Hut" ] } }, - "/panera/time-slots": { + "/pizzahut/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns one cafe's available pickup/delivery order time-slot windows for one date, plus that date's overall open/close time. Unlike GET /panera/cafe's published storefront hours, this reflects live order-slot availability, not just when the cafe is open -- an empty windows list is a legitimate outcome (e.g. the cafe is closed that day), not an error. date must be YYYY-MM-DD, interpreted in the cafe's own local timezone.", - "operationId": "panera-time-slots", + "description": "Returns one Pizza Hut restaurant's detail by its exact store number, from /pizzahut/stores, including its recurring open hours per order channel (carryout, delivery, dine-in, drive-thru, catering carryout) plus each channel's ordering constraints -- minimum/maximum order amount, whether tipping is offered, and accepted payment methods. A channel this restaurant does not offer at all is omitted from hours rather than reported as always-closed.", + "operationId": "pizzahut-store", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", - "in": "query", - "name": "cafe_id", - "required": true, - "type": "integer", - "x-example": 601447 - }, - { - "description": "Date, YYYY-MM-DD", + "description": "Pizza Hut's store number, from /pizzahut/stores", "in": "query", - "name": "date", + "name": "store_number", "required": true, "type": "string", - "x-example": "2026-09-10" + "x-example": "040937" } ], "produces": [ @@ -426361,7 +442430,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.timeSlotsResponseDoc" + "$ref": "#/definitions/pizzahut.storeResponseDoc" } }, "400": { @@ -426370,6 +442439,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -426388,27 +442463,103 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread cafe's available order time-slot windows", + "summary": "Get one Pizza Hut restaurant by its store number", "tags": [ - "Panera" + "Pizza Hut" ] } }, - "/panera/upsell-suggestions": { + "/pizzahut/stores": { "get": { "consumes": [ "application/json" ], - "description": "Returns Panera's own suggested add-ons per menu item (for example \"Extra Turkey\" and \"Extra Bacon\" for a Bacon Turkey Bravo sandwich). Item ids on this surface are in a separate id space from /panera/menu's item_id, but both the item and its suggestions carry their own resolved names, so no cross-reference is needed. Cafe ids come from GET /panera/locations.", - "operationId": "panera-upsell-suggestions", + "description": "Returns Pizza Hut restaurants matching a city/state/postal code/name/franchise code/store number filter. At least one filter is required -- an unfiltered call would enumerate every US restaurant in one response, which this endpoint intentionally does not expose. Each restaurant carries its store number (the value /pizzahut/menu and /pizzahut/store take), full address with coordinates, phone, whether it currently accepts online orders, and its timezone.", + "operationId": "pizzahut-stores", "parameters": [ { - "description": "Panera cafe id, from /panera/locations", + "description": "Exact store number", "in": "query", - "name": "cafe_id", - "required": true, + "name": "store_number", + "type": "string", + "x-example": "040937" + }, + { + "description": "Restaurant city", + "in": "query", + "name": "city", + "type": "string", + "x-example": "New York" + }, + { + "description": "Restaurant state, two-letter code", + "in": "query", + "name": "state", + "type": "string", + "x-example": "NY" + }, + { + "description": "Restaurant postal code", + "in": "query", + "name": "postal_code", + "type": "string", + "x-example": "10019" + }, + { + "description": "Restaurant name, partial match", + "in": "query", + "name": "name", + "type": "string", + "x-example": "040937" + }, + { + "description": "Exact franchise/operator code", + "in": "query", + "name": "franchise_code", + "type": "string" + }, + { + "description": "Restrict to restaurants Pizza Hut's own storefront marks customer-facing. Unfiltered (upstream default) unless set -- passing true returns zero results for every region tested during research, so it is not defaulted on", + "in": "query", + "name": "appear_in_store_results", + "type": "boolean", + "x-example": false + }, + { + "description": "Restrict to restaurants currently accepting (true) or not accepting (false) online orders. Unfiltered (upstream default) unless set", + "in": "query", + "name": "accepting_online_orders", + "type": "boolean", + "x-example": true + }, + { + "description": "Set true to include archived/closed restaurant records, which the upstream default (unset) already excludes. Set false to make that exclusion explicit", + "in": "query", + "name": "is_archived", + "type": "boolean", + "x-example": false + }, + { + "description": "Sort order", + "enum": [ + "store_number_asc", + "store_number_desc", + "name_asc", + "name_desc", + "franchise_code_asc", + "franchise_code_desc" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "name_asc" + }, + { + "description": "Maximum restaurants to return, 1-50 (default 20)", + "in": "query", + "name": "max_results", "type": "integer", - "x-example": 601447 + "x-example": 20 } ], "produces": [ @@ -426418,7 +442569,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/panera.upsellSuggestionsResponseDoc" + "$ref": "#/definitions/pizzahut.storesResponseDoc" } }, "400": { @@ -426445,19 +442596,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Panera Bread cafe's per-item upsell suggestions", + "summary": "Search Pizza Hut restaurants by city, state, postal code, name, franchise code, or store number", "tags": [ - "Panera" + "Pizza Hut" ] } }, - "/papajohns/allergens": { + "/playstation/browse": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's complete published item x allergen matrix (crusts, sauces, cheeses, meats, veggies, and more), grouped by section, each item flagged for peanut, tree nut, egg, milk, wheat, soy, fish, shellfish, and sesame content.", - "operationId": "papajohns-allergens", + "description": "Returns a page of the PlayStation Store \"all games\" grid with per-item price, platforms, and media, plus the available filter facets (price, genre, platform, subscription, content type, etc.) with value counts. Pass page to advance; next_page is set when more results exist. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-browse", + "parameters": [ + { + "default": 1, + "description": "1-based page number", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" + } + ], "produces": [ "application/json" ], @@ -426465,11 +442639,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.allergensResponseDoc" + "$ref": "#/definitions/playstation.gridResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -426486,33 +442660,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get Papa John's full allergen guide", + "summary": "Browse the PlayStation Store all-games grid", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/colombia/menu": { + "/playstation/category": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's **Colombia** menu with prices in Colombian pesos. Every product lists its priced SKU variants across the four axes Colombia sells on — size, dough, crust and sauce — each with its own price and availability. Colombia runs its own ordering platform, independent of the six markets behind GET /papajohns/intl/menu and of Peru and El Salvador, so it has its own endpoint. Prices are Colombian pesos and are not comparable with any other market. The full catalog is paged through before returning, so the response is complete rather than a first page.", - "operationId": "papajohns-colombia-menu", + "description": "Returns a page of a specific PlayStation Store category grid (by category UUID) with per-item price, platforms, and media, plus the available filter facets with value counts. Pass page to advance; next_page is set when more results exist. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-category", "parameters": [ { - "description": "Return only categories whose name contains this text, case-insensitive, e.g. Pizzas or Bebidas", + "description": "Category UUID", "in": "query", - "name": "category", + "name": "id", + "required": true, "type": "string", - "x-example": "Pizzas" + "x-example": "e7d3a34c-9a4a-4a94-a0d1-e42c94d0a3fb" }, { - "description": "Include every priced SKU variant. Default true; set false for a lighter response carrying only each product's cheapest price.", + "default": 1, + "description": "1-based page number", "in": "query", - "name": "include_variants", - "type": "boolean", - "x-example": true + "name": "page", + "type": "integer" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -426522,7 +442711,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.latamMenuResponseDoc" + "$ref": "#/definitions/playstation.gridResponseDoc" } }, "400": { @@ -426537,12 +442726,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -426555,26 +442738,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Papa John's Colombia priced menu (COP)", + "summary": "Browse a PlayStation Store category grid", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/deals": { + "/playstation/concept": { "get": { "consumes": [ "application/json" ], - "description": "Returns the promotions a Papa John's US or Canada restaurant is currently running. Each offer carries its redemption code, title, description, offer price and — where the deal advertises a saving — the struck-through regular price, plus its artwork and deal-builder link. Pass a store_id from GET /papajohns/store or GET /papajohns/nearby: promotions are store-specific, and the national response is largely placeholders prompting the customer to choose a store, which are omitted here rather than returned as real offers.", - "operationId": "papajohns-deals", + "description": "Returns store metadata for a PlayStation concept: title, publisher, release date, platforms, genres, description, content rating, aggregate star rating, the default product's purchase price, media, and the full lists of purchasable editions and add-ons. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-concept", "parameters": [ { - "description": "Restaurant id from GET /papajohns/store or GET /papajohns/nearby. Omit for national promotions.", + "description": "Numeric PlayStation concept id", "in": "query", - "name": "store_id", + "name": "id", + "required": true, "type": "string", - "x-example": "5054" + "x-example": "10000237" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -426584,7 +442782,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.dealsResponseDoc" + "$ref": "#/definitions/playstation.conceptResponseDoc" } }, "400": { @@ -426599,12 +442797,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -426617,26 +442809,79 @@ "ApiKeyAuth": [] } ], - "summary": "List a Papa John's restaurant's current promotions", + "summary": "Get PlayStation Store details for a concept (game hub)", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/directory": { + "/playstation/concept/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns one level of Papa John's store directory. Omit path for the root country index, then pass a child's path to descend through state, city, and store levels. Each child includes its name, path, URL, store count when available, and whether it is a store leaf. Pass a store child's path to GET /papajohns/store. This is a directory browse; use GET /papajohns/nearby for a coordinate search.", - "operationId": "papajohns-directory", + "description": "Returns one page of written PlayStation Store reviews for a concept (game hub), each with its title, body, rating, helpful count, spoiler flag, the edition the reviewer owned, and reviewer identity (online id, PS Plus subscriber status, verified-purchase status, avatar). Also includes the concept's aggregate star rating (including its rating distribution). page/page_size page through the full review list (total_count reports the true upstream review count, has_next_page whether a later page has more), sort controls ordering, and rating optionally filters to one star value. Reviews are region-scoped: cc selects the store region whose reviews are returned (and the price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-concept-reviews", "parameters": [ { - "description": "Directory path from a previous response's children[].path; omit for the root country index", + "description": "Numeric PlayStation concept id", "in": "query", - "name": "path", + "name": "id", + "required": true, "type": "string", - "x-example": "united-states/ca" + "x-example": "10002456" + }, + { + "default": "us", + "description": "Store country code (ISO)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" + }, + { + "default": 1, + "description": "1-based page number", + "in": "query", + "maximum": 10000, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 10, + "description": "Reviews per page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page_size", + "type": "integer" + }, + { + "default": "latest", + "description": "Sort order", + "enum": [ + "latest", + "oldest", + "helpful" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Filter to one star rating (1-5)", + "in": "query", + "maximum": 5, + "minimum": 1, + "name": "rating", + "type": "integer" } ], "produces": [ @@ -426646,7 +442891,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.directoryResponseDoc" + "$ref": "#/definitions/playstation.conceptReviewsResponseDoc" } }, "400": { @@ -426661,12 +442906,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -426679,26 +442918,33 @@ "ApiKeyAuth": [] } ], - "summary": "Browse the Papa John's store directory", + "summary": "Get PlayStation concept reviews", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/elsalvador/menu": { + "/playstation/deals": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's **El Salvador** menu with prices in US dollars. Each pizza lists its full size and crust price matrix — every combination of size (Grande, Gigante) and crust (Masa Original, Masa Delgada, Orilla Rellena de Queso) with that combination's own price — while sides, desserts and extras carry a single price. El Salvador runs its own ordering platform, independent of the six markets behind GET /papajohns/intl/menu and of Colombia and Peru, so it has its own endpoint. This is El Salvador's national menu; the site itself notes that choosing a restaurant can reveal further items.", - "operationId": "papajohns-elsalvador-menu", + "description": "Returns the PlayStation Store deals landing page as a list of merchandising shelves (sections), each with its titles and per-item price, plus a flattened, de-duplicated item list across all shelves. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-deals", "parameters": [ { - "description": "Return only categories whose name contains this text, case-insensitive. One of: Pizzas, Entradas, Postres, Extras", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "category", - "type": "string", - "x-example": "Pizzas" + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -426708,7 +442954,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.latamMenuResponseDoc" + "$ref": "#/definitions/playstation.merchResponseDoc" } }, "400": { @@ -426717,18 +442963,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -426741,27 +442975,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Papa John's El Salvador priced menu (USD)", + "summary": "Get PlayStation Store deals shelves", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/india/deal": { + "/playstation/latest": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Papa John's **India** combo or offer with its full composition: each slot in the deal (with its quantity, size, and whether it can be skipped) and every menu item eligible to fill that slot, with each choice's own price in Indian Rupees. This is materially more than the deal row in GET /papajohns/india/menu, which carries only the deal's name, price, and pricing rule. price_type is one of fixedPrice, BuyXGetY, HalfAndHalf, or variablePrice; only fixedPrice deals report a non-zero price. India market only.", - "operationId": "papajohns-india-deal", + "description": "Returns the PlayStation Store latest-releases landing page as a list of merchandising shelves (sections), each with its titles and per-item price, plus a flattened, de-duplicated item list across all shelves. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-latest", "parameters": [ { - "description": "Deal id from GET /papajohns/india/menu (items with kind=deal)", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "deal_id", - "required": true, - "type": "string", - "x-example": "17" + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -426771,7 +443011,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.indiaDealResponseDoc" + "$ref": "#/definitions/playstation.merchResponseDoc" } }, "400": { @@ -426780,18 +443020,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -426804,76 +443032,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Papa John's India deal's composition (INR)", + "summary": "Get PlayStation Store latest-release shelves", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/india/menu": { + "/playstation/page": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's **India** menu with live prices in Indian Rupees, from papajohns.in's own ordering backend. This is the India market only -- prices, items, and availability are India-specific and are not comparable to Papa John's US/Canada data (see GET /papajohns/nutrition for US national reference data). Returns every category with its items and deals: list price, strike-through price where a discount is active, dietary tags (Veg, Non Veg, Spicy), images, and the store/channel/day combinations where an item is blacked out. Set include_options=true to also get each item's full size, crust, topping, sauce, and drizzle tree with per-option prices -- this makes the response very large, so prefer GET /papajohns/india/menu/item for one item's options. Pricing is franchise-wide rather than per-store; store_id, channel_id, and day filter item availability, not price, and only take effect when all three are supplied.", - "operationId": "papajohns-india-menu", + "description": "Reads any PlayStation Store merchandising page by alias (e.g. collections, subscriptions, or a promotional alias) and returns its shelves (sections) plus the curated collection links found on the page. Each collection link carries a category_id (UUID) you can pass to /playstation/category to fetch that collection's full, paginated title grid. Known aliases: collections, subscriptions, deals, latest. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-page", "parameters": [ { - "description": "Return only this category id", - "in": "query", - "name": "category_id", - "type": "string", - "x-example": "6" - }, - { - "description": "Hide items blacked out at this store id (see GET /papajohns/india/stores). Only applies together with channel_id and day.", - "in": "query", - "name": "store_id", - "type": "string", - "x-example": "7" - }, - { - "description": "Order channel. One of: 1 (Delivery), 2 (Take Away), 3 (Dine In), 4 (Drive Through Pickup). Only applies together with store_id and day.", - "enum": [ - "1", - "2", - "3", - "4" - ], - "in": "query", - "name": "channel_id", - "type": "string", - "x-example": "1" - }, - { - "description": "Weekday. One of: 0 (Sunday), 1 (Monday), 2 (Tuesday), 3 (Wednesday), 4 (Thursday), 5 (Friday), 6 (Saturday). Only applies together with store_id and channel_id.", - "enum": [ - "0", - "1", - "2", - "3", - "4", - "5", - "6" - ], + "description": "Merchandising page alias", "in": "query", - "name": "day", + "name": "alias", + "required": true, "type": "string", - "x-example": "1" + "x-example": "collections" }, { - "description": "Return only items carrying this tag, e.g. Veg, Non Veg, Spicy. Case-insensitive.", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "tag", - "type": "string", - "x-example": "Veg" + "name": "cc", + "type": "string" }, { - "description": "Include every item's full size/crust/topping option tree with prices. Default false.", + "default": "en", + "description": "Language code", "in": "query", - "name": "include_options", - "type": "boolean", - "x-example": false + "name": "l", + "type": "string" } ], "produces": [ @@ -426883,7 +443076,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.indiaMenuResponseDoc" + "$ref": "#/definitions/playstation.merchResponseDoc" } }, "400": { @@ -426892,18 +443085,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -426916,27 +443097,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Papa John's India priced menu (INR)", + "summary": "Get a PlayStation Store merchandising page by alias", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/india/menu/item": { + "/playstation/product": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Papa John's **India** menu item with its complete customization tree: every size, and for each size every crust, topping, dipping sauce, drizzle, and base sauce with that option's own price in Indian Rupees. The option group flagged base_price carries the item's base price for that size (the crust group on pizzas) rather than an add-on charge; half_price is the surcharge when the option is applied to one half of a pizza. India market only -- prices are Indian Rupees. Use GET /papajohns/india/menu to discover item ids.", - "operationId": "papajohns-india-menu-item", + "description": "Returns store metadata for a single PlayStation product/edition: title, np title id, parent concept id, product type and store classification, edition name, publisher, release date, platforms, genres, spoken/screen languages, content rating, aggregate star rating, purchase price, and media. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-product", "parameters": [ { - "description": "Item id (saleitem_id) from GET /papajohns/india/menu", + "description": "PlayStation product id", "in": "query", - "name": "item_id", + "name": "id", "required": true, "type": "string", - "x-example": "71" + "x-example": "UP0001-PPSA01491_00-GAME000000000000" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -426946,7 +443141,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.indiaMenuItemResponseDoc" + "$ref": "#/definitions/playstation.productResponseDoc" } }, "400": { @@ -426955,14 +443150,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -426979,32 +443168,55 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Papa John's India item with its full options (INR)", + "summary": "Get PlayStation Store details for a single product", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/india/stores": { + "/playstation/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns every Papa John's **India** restaurant with its address, phone, coordinates, and weekly opening hours broken down per order channel (delivery, take away, dine in, drive-through pickup). These store ids are what GET /papajohns/india/menu's store_id availability filter is keyed on. India market only -- for US/Canada stores use GET /papajohns/directory, GET /papajohns/store, or GET /papajohns/nearby.", - "operationId": "papajohns-india-stores", + "description": "Returns a page of PlayStation Store search results (concepts and products) for a term, with pagination and per-item price, platforms, classification, and media. Pass page to advance; next_page is set when more results exist. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-search", "parameters": [ { - "description": "Return only hours for this order channel. One of: 1 (Delivery), 2 (Take Away), 3 (Dine In), 4 (Drive Through Pickup).", - "enum": [ - "1", - "2", - "3", - "4" - ], + "description": "Search term", "in": "query", - "name": "channel_id", + "name": "term", + "required": true, "type": "string", - "x-example": "1" + "x-example": "god of war" + }, + { + "default": 1, + "description": "1-based page number", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "default": 24, + "description": "Results per page (max 48)", + "in": "query", + "name": "page_size", + "type": "integer" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -427014,7 +443226,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.indiaStoresResponseDoc" + "$ref": "#/definitions/playstation.searchResponseDoc" } }, "400": { @@ -427023,12 +443235,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -427041,47 +443247,48 @@ "ApiKeyAuth": [] } ], - "summary": "List Papa John's India restaurants", + "summary": "Search the PlayStation Store", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/intl/deals": { + "/playstation/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns the promotions currently running in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain, for either delivery or pickup. Each promotion carries its headline product, description, artwork, the weekdays it runs on, and its start and end dates. Offers that upstream has marked inactive are omitted rather than returned as live.", - "operationId": "papajohns-intl-deals", + "description": "Returns typeahead-style PlayStation Store search suggestions for a partial or full term: id, name, classification, platforms, publisher, release date, price, a representative image, and a direct store URL per match. Matching is upstream-ordered and loose (it may include titles that only loosely relate to the term), not a ranked exact-substring search. limit caps how many suggestions are returned (max 20; the upstream API does not honor a higher value). cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", + "operationId": "playstation-suggest", "parameters": [ { - "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", - "enum": [ - "chile", - "costa-rica", - "guatemala", - "panama", - "portugal", - "spain" - ], + "description": "Search term (partial or full)", "in": "query", - "name": "market", + "name": "term", "required": true, "type": "string", - "x-example": "spain" + "x-example": "god of war" }, { - "description": "One of: pj_delivery (delivery offers), in_store (pickup/dine-in offers)", - "enum": [ - "pj_delivery", - "in_store" - ], + "default": 5, + "description": "Maximum number of suggestions to return (max 20)", "in": "query", - "name": "dispatch_method", - "required": true, - "type": "string", - "x-example": "pj_delivery" + "name": "limit", + "type": "integer" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -427091,7 +443298,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.intlDealsResponseDoc" + "$ref": "#/definitions/playstation.suggestResponseDoc" } }, "400": { @@ -427100,18 +443307,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -427124,60 +443319,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Papa John's active promotions (international)", + "summary": "Get PlayStation Store search suggestions for a term", "tags": [ - "Papa John's" + "PlayStation" ] } }, - "/papajohns/intl/ingredients": { + "/politico/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns every topping, sauce, and cheese a pizza can be built with on one menu, in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. Each ingredient reports its family (meat, vegetable, base sauce, and so on), whether it is included on pizzas by default, whether it is charged at the premium rather than the normal rate, and whether it can be applied to just one half. The response also carries what one extra ingredient costs at each size, for both the normal and premium rates. Menu ids come from GET /papajohns/intl/stores.", - "operationId": "papajohns-intl-ingredients", + "description": "Returns a Politico article by its canonical `url`, in the form `https://www.politico.com/news/YYYY/MM/DD/slug`. The response has the title, description, authors, publication and update times, lead image URL and the body `paragraphs`.", + "operationId": "politico-article", "parameters": [ { - "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", - "enum": [ - "chile", - "costa-rica", - "guatemala", - "panama", - "portugal", - "spain" - ], - "in": "query", - "name": "market", - "required": true, - "type": "string", - "x-example": "spain" - }, - { - "description": "Menu id from a restaurant returned by GET /papajohns/intl/stores", + "description": "Canonical www.politico.com article URL", "in": "query", - "name": "menu_id", + "name": "url", "required": true, "type": "string", - "x-example": "8" - }, - { - "description": "Return only one ingredient category. One of: base_cheese, base_sauce, extra_cheese, extra_sauce, meat, not_ingredient, premium, vegetable", - "enum": [ - "base_cheese", - "base_sauce", - "extra_cheese", - "extra_sauce", - "meat", - "not_ingredient", - "premium", - "vegetable" - ], - "in": "query", - "name": "category", - "type": "string", - "x-example": "meat" + "x-example": "https://www.politico.com/news/2026/09/18/congress-f-35-china-investigation-01083647" } ], "produces": [ @@ -427187,7 +443346,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.intlIngredientsResponseDoc" + "$ref": "#/definitions/politico.articleResponseDoc" } }, "400": { @@ -427220,67 +443379,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Papa John's menu's ingredient catalog (international)", + "summary": "Get Politico article content", "tags": [ - "Papa John's" + "Politico" ] } }, - "/papajohns/intl/menu": { + "/politico/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Papa John's restaurant's full menu with that restaurant's own prices, in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. Prices are per restaurant, not national, so two restaurants in the same market can differ. Each pizza lists every size and crust combination it is sold in with that combination's own price and, where published, its calorie and portion figures; sides, drinks and desserts list their own portions. Machine codes for size and crust are returned alongside the market's own display labels in the local language. Currency is whatever the market trades in -- euros in Spain and Portugal, Chilean pesos in Chile, and so on -- so do not compare figures across markets. Use GET /papajohns/intl/stores to find a store_id. For India use GET /papajohns/india/menu; for the US and Canada see GET /papajohns/nutrition.", - "operationId": "papajohns-intl-menu", + "description": "Returns one Politico staff author's public profile: name, job title, bio, headshot, and their most recent bylined articles. Politico staff pages expose a fixed-size recent-articles list with no pagination.", + "operationId": "politico-author", "parameters": [ { - "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", - "enum": [ - "chile", - "costa-rica", - "guatemala", - "panama", - "portugal", - "spain" - ], - "in": "query", - "name": "market", - "required": true, - "type": "string", - "x-example": "spain" - }, - { - "description": "Restaurant id from GET /papajohns/intl/stores. Prices are specific to this restaurant.", - "in": "query", - "name": "store_id", - "required": true, - "type": "string", - "x-example": "9" - }, - { - "description": "Return only one product kind. One of: pizza, side", - "enum": [ - "pizza", - "side" - ], + "description": "Politico staff slug, e.g. mark-satter", "in": "query", - "name": "kind", + "name": "slug", "type": "string", - "x-example": "pizza" + "x-example": "mark-satter" }, { - "description": "Return only products carrying this dietary or heat marker. One of: hot, mild, spicy, vegetarian. Products upstream does not mark are excluded.", - "enum": [ - "hot", - "mild", - "spicy", - "vegetarian" - ], + "description": "Canonical www.politico.com/staff/ URL, as an alternative to slug", "in": "query", - "name": "food_type", + "name": "url", "type": "string", - "x-example": "vegetarian" + "x-example": "https://www.politico.com/staff/mark-satter" } ], "produces": [ @@ -427290,7 +443412,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.intlMenuResponseDoc" + "$ref": "#/definitions/politico.authorResponseDoc" } }, "400": { @@ -427323,45 +443445,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Papa John's restaurant's priced menu (international)", + "summary": "Get a Politico staff author profile", "tags": [ - "Papa John's" + "Politico" ] } }, - "/papajohns/intl/offer": { + "/politico/categories": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one promotional offer's full composition in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. This is what a promotion banner from GET /papajohns/intl/deals actually contains: the offer's own price, each choice step a customer works through in order (e.g. \"pick your family pizza\", \"pick a side\"), and every product eligible at that step with the surcharge picking it adds. It also carries the offer's ingredient rules -- how many extras are free, the minimum and maximum that may be chosen, and which ingredient families are allowed. Offer ids come from the offer_id field on a deal.", - "operationId": "papajohns-intl-offer", - "parameters": [ - { - "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", - "enum": [ - "chile", - "costa-rica", - "guatemala", - "panama", - "portugal", - "spain" - ], - "in": "query", - "name": "market", - "required": true, - "type": "string", - "x-example": "spain" - }, - { - "description": "Offer id from the offer_id field on GET /papajohns/intl/deals", - "in": "query", - "name": "offer_id", - "required": true, - "type": "string", - "x-example": "660" - } - ], + "description": "Returns Politico's full public section navigation tree, grouped the same way the site's own nav menu groups it. Use a section's slug directly as the topic parameter on politico-topic.", + "operationId": "politico-categories", "produces": [ "application/json" ], @@ -427369,20 +443462,46 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.intlOfferResponseDoc" + "$ref": "#/definitions/politico.categoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Politico section navigation", + "tags": [ + "Politico" + ] + } + }, + "/politico/headlines": { + "get": { + "description": "Returns the latest Politico stories across the whole site, not limited to one section. Takes no parameters. Each item has its title, URL, a short summary, publication time and author.", + "operationId": "politico-headlines", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/politico.headlinesResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -427402,43 +443521,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Papa John's offer's composition (international)", + "summary": "Get Politico site-wide headlines", "tags": [ - "Papa John's" + "Politico" ] } }, - "/papajohns/intl/product": { + "/politico/topic": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one product's own catalog record in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain -- its description, imagery, dietary markers, and customization rules (whether toppings may be changed, how many extra ingredients are included free, and whether it can be used as one half of a half-and-half pizza). This record carries no price, because pricing is per restaurant: use GET /papajohns/intl/menu for prices. Product ids come from that same endpoint.", - "operationId": "papajohns-intl-product", + "description": "Returns the newest public Politico stories on one section archive page. topic is a section slug -- see politico-categories for the full known value space.", + "operationId": "politico-topic", "parameters": [ { - "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", - "enum": [ - "chile", - "costa-rica", - "guatemala", - "panama", - "portugal", - "spain" - ], - "in": "query", - "name": "market", - "required": true, - "type": "string", - "x-example": "spain" - }, - { - "description": "Product id from GET /papajohns/intl/menu", + "description": "Politico section slug", "in": "query", - "name": "product_id", + "name": "topic", "required": true, "type": "string", - "x-example": "8" + "x-example": "congress-news-updates-analysis" } ], "produces": [ @@ -427448,7 +443548,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.intlProductResponseDoc" + "$ref": "#/definitions/politico.topicResponseDoc" } }, "400": { @@ -427481,86 +443581,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Papa John's product (international)", + "summary": "Get Politico section archive", "tags": [ - "Papa John's" + "Politico" ] } }, - "/papajohns/intl/stores": { + "/polygon/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Papa John's restaurants in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain -- either every restaurant near a coordinate, or one known restaurant looked up by id. Each restaurant carries its address, coordinates, phone, per-weekday opening hours split by fulfillment channel, accepted payment methods, delivery zones with their minimum-order and free-delivery thresholds, and live delivery/pickup open flags. Restaurants come back ranked by distance with no radius limit, five at a time by default; page and limit walk the rest, and the response reports total_count, the market's whole restaurant total. The returned id is what GET /papajohns/intl/menu prices against, and menu_id is what GET /papajohns/intl/ingredients reads. This covers those six markets only -- for India use GET /papajohns/india/stores, and for the US and Canada use GET /papajohns/directory, GET /papajohns/store, or GET /papajohns/nearby.", - "operationId": "papajohns-intl-stores", + "description": "Returns a Polygon article by canonical `url` (`https://www.polygon.com//`): title, description, section, authors, publication and update times, lead image, body `paragraphs` and a `paywalled` flag. Section, guide and other non-article URLs, such as `/gaming-news/` or `/guides/`, are rejected as an invalid parameter.", + "operationId": "polygon-article", "parameters": [ { - "description": "Market. One of: chile, costa-rica, guatemala, panama, portugal, spain", - "enum": [ - "chile", - "costa-rica", - "guatemala", - "panama", - "portugal", - "spain" - ], + "description": "Canonical Polygon article URL", "in": "query", - "name": "market", + "name": "url", "required": true, "type": "string", - "x-example": "spain" - }, - { - "description": "Look up one known restaurant by id instead of searching a coordinate. Supply either store_id, or both latitude and longitude.", - "in": "query", - "name": "store_id", - "type": "string", - "x-example": "9" - }, - { - "description": "Latitude to search around. Required unless store_id is supplied.", - "in": "query", - "name": "latitude", - "type": "string", - "x-example": "40.4168" - }, - { - "description": "Longitude to search around. Required unless store_id is supplied.", - "in": "query", - "name": "longitude", - "type": "string", - "x-example": "-3.7038" - }, - { - "description": "One of: delivery (default, every nearby restaurant), pickup (only restaurants accepting pickup orders). Ignored when store_id is supplied.", - "enum": [ - "delivery", - "pickup" - ], - "in": "query", - "name": "fulfillment", - "type": "string", - "x-example": "delivery" - }, - { - "default": 1, - "description": "One-based page of the distance-ranked restaurants. Ignored for a store_id lookup and for pickup, neither of which is paginated.", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "default": 5, - "description": "Restaurants per page, 1-100. Ignored for a store_id lookup and for pickup, neither of which is paginated.", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "limit", - "type": "integer", - "x-example": 5 + "x-example": "https://www.polygon.com/best-marvel-video-games-ever/" } ], "produces": [ @@ -427570,7 +443608,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.intlStoresResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -427585,12 +443623,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -427603,51 +443635,24 @@ "ApiKeyAuth": [] } ], - "summary": "Find Papa John's restaurants in an international market", + "summary": "Get Polygon article content", "tags": [ - "Papa John's" + "Polygon" ] } }, - "/papajohns/menu": { + "/polygon/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Papa John's US or Canada restaurant's full menu with that restaurant's own prices. Prices are per restaurant, not national -- the same 14-inch pizza can differ by several dollars between two stores -- so pass a store_id from GET /papajohns/store or GET /papajohns/nearby. Omitting it returns the national default menu, flagged as national_default in the response. Each category is returned with its sections and product groups, and every orderable SKU carries its price, calories, serving size, slice count and image. Set include_options to also get each product group's customization axes: every size and crust it is sold in, and every preparation instruction (how much cheese, how well done) with its choices. This is the US and Canada menu -- for India use GET /papajohns/india/menu, and for Chile, Costa Rica, Guatemala, Panama, Portugal or Spain use GET /papajohns/intl/menu.", - "operationId": "papajohns-menu", + "description": "Returns a Polygon author profile by canonical `url` (`https://www.polygon.com/author//`): name, `title`, `image_url`, `biography`, social links and the articles in the profile's Latest module. Title, image and biography appear only as the profile shows them. `social_links` holds the author's own accounts, not Polygon's internal follow link.", + "operationId": "polygon-author", "parameters": [ { - "description": "Restaurant id from GET /papajohns/store or GET /papajohns/nearby. Omit for the national default menu.", - "in": "query", - "name": "store_id", - "type": "string", - "x-example": "5054" - }, - { - "description": "Return only one category. One of: dippingsauces, desserts, drinks, extras, papabowls, pizza, sandwiches, sides, wings", - "enum": [ - "dippingsauces", - "desserts", - "drinks", - "extras", - "papabowls", - "pizza", - "sandwiches", - "sides", - "wings" - ], + "description": "Canonical Polygon author URL", "in": "query", - "name": "category", + "name": "url", + "required": true, "type": "string", - "x-example": "pizza" - }, - { - "description": "Include each product group's sizes, crusts and preparation instructions. Default false.", - "in": "query", - "name": "include_options", - "type": "boolean", - "x-example": false + "x-example": "https://www.polygon.com/author/venter-jason/" } ], "produces": [ @@ -427657,7 +443662,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.menuResponseDoc" + "$ref": "#/definitions/publicnews.polygonAuthorResponseDoc" } }, "400": { @@ -427672,12 +443677,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -427690,34 +443689,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Papa John's restaurant's priced menu", + "summary": "Get a Polygon author profile", "tags": [ - "Papa John's" + "Polygon" ] } }, - "/papajohns/menu/item": { + "/polygon/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Papa John's US or Canada menu SKU with that restaurant's price for it, together with the full customization axes of the product group it belongs to: every size and crust the product is sold in, and every preparation instruction with its choices and default. The response also names the category and section the item sits under. Pass a store_id so the price is that restaurant's; omitting it returns the national default price. SKUs come from GET /papajohns/menu.", - "operationId": "papajohns-menu-item", + "description": "Returns the latest Polygon stories for one section. `section` is required and takes one of 15 slugs, including `gaming-news`, `gaming-reviews`, `movie-tv-reviews`, `anime`, `guides` and `videos`. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "polygon-headlines", "parameters": [ { - "description": "Product sku from GET /papajohns/menu", + "description": "Polygon RSS section slug", + "enum": [ + "gaming-news", + "gaming-reviews", + "gaming-previews", + "gaming-features", + "entertainment-news", + "movie-tv-reviews", + "entertainment-features", + "anime", + "horror", + "sci-fi", + "fantasy", + "what-to-play", + "what-to-watch", + "guides", + "videos" + ], "in": "query", - "name": "sku", + "name": "section", "required": true, "type": "string", - "x-example": "1-1-2-115" - }, - { - "description": "Restaurant id from GET /papajohns/store or GET /papajohns/nearby. Omit for the national default price.", - "in": "query", - "name": "store_id", - "type": "string", - "x-example": "5054" + "x-example": "gaming-news" } ], "produces": [ @@ -427727,7 +443733,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.menuItemResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -427736,18 +443742,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -427760,58 +443754,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Papa John's menu item with its options", + "summary": "Get Polygon section headlines", "tags": [ - "Papa John's" + "Polygon" ] } }, - "/papajohns/nearby": { + "/polygon/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Papa John's stores within a radius of a latitude/longitude, ordered nearest first, with distance, address, phone, hours, timezone, price range, fulfillment services, payment options, and ordering link. The response includes total_in_radius and offset paging. A coordinate with no nearby stores returns an empty list.", - "operationId": "papajohns-nearby", - "parameters": [ - { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 34.0522 - }, - { - "description": "Search center longitude", - "in": "query", - "name": "longitude", - "required": true, - "type": "number", - "x-example": -118.2437 - }, - { - "description": "Search radius in miles, 1-100 (default 25)", - "in": "query", - "name": "radius", - "type": "integer", - "x-example": 25 - }, - { - "description": "Maximum stores to return, 1-50 (default 10)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Result offset, 0 or greater (default 0)", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - } - ], + "description": "Returns Polygon's latest top stories across the site, covering games and entertainment. Takes no parameters, and `polygon-headlines` narrows by section instead. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "polygon-news", "produces": [ "application/json" ], @@ -427819,13 +443771,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.nearbyResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -427846,27 +443792,110 @@ "ApiKeyAuth": [] } ], - "summary": "Find Papa John's stores near a coordinate", + "summary": "Get Polygon top stories", "tags": [ - "Papa John's" + "Polygon" ] } }, - "/papajohns/nutrition": { + "/polygon/sections": { + "get": { + "description": "Lists the Polygon sections that `polygon-headlines` accepts, from `gaming-news` and `gaming-reviews` to `guides` and `videos`. Each entry has a `slug`, a display `name` and the section's feed `url`.", + "operationId": "polygon-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Polygon RSS sections", + "tags": [ + "Polygon" + ] + } + }, + "/polymarket/activity/trades": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's own published nutrition-facts panel for every item in one category -- full pizzas by name, or a single ingredient family (crust, cheese, sauce, toppings). Each item lists every published size/crust variant with serving size and a full nutrition-facts breakdown (calories, fat, cholesterol, sodium, carbohydrate, fiber, sugars, protein). This is Papa John's national reference data, not priced per-store data -- see GET /papajohns/directory for store lookup.", - "operationId": "papajohns-nutrition", + "description": "Returns public trade rows used by Polymarket's `/activity` page. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`.", + "operationId": "polymarket-activity-trades", "parameters": [ { - "description": "One of: cheese, crust, desserts, dipping-sauces, drinks, extras, papa-bowls, papadias, pizzas, sandwiches, sauce, sides, toppings, wings", + "description": "Maximum trades, defaults to 50 and supports up to 100", "in": "query", - "name": "category", - "required": true, + "name": "limit", + "type": "integer", + "x-example": 50 + }, + { + "description": "Result offset, defaults to 0 and supports up to 10000", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "default": "true", + "description": "Taker-only filter", + "enum": [ + "true", + "false" + ], + "in": "query", + "name": "taker_only", + "type": "string" + }, + { + "default": "CASH", + "description": "Activity amount filter type", + "enum": [ + "CASH" + ], + "in": "query", + "name": "filter_type", + "type": "string" + }, + { + "default": "1", + "description": "Minimum filtered amount", + "enum": [ + "1", + "5", + "10", + "100", + "1000", + "10000", + "100000" + ], + "in": "query", + "name": "filter_amount", + "type": "string" + }, + { + "description": "Optional Polymarket event id", + "in": "query", + "name": "event_id", "type": "string", - "x-example": "pizzas" + "x-example": "101772" + }, + { + "description": "Optional market condition id", + "in": "query", + "name": "market", + "type": "string", + "x-example": "0x3f2604d62ac3ee496ffd6d30156f30663fbaf22097f17f09d7364c35db255d2b" } ], "produces": [ @@ -427876,7 +443905,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.nutritionResponseDoc" + "$ref": "#/definitions/polymarket.activityTradesResponseDoc" } }, "400": { @@ -427885,12 +443914,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -427909,26 +443932,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Papa John's nutritional-details category", + "summary": "List Polymarket activity trades", "tags": [ - "Papa John's" + "Polymarket" ] } }, - "/papajohns/peru/menu": { + "/polymarket/clob/market/{condition_id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's **Peru** menu with prices in Peruvian soles, covering the full catalog with categories, images and per-product pricing. Peru runs its own ordering platform, independent of the six markets behind GET /papajohns/intl/menu and of Colombia and El Salvador, so it has its own endpoint. Prices are Peruvian soles and are not comparable with any other market.", - "operationId": "papajohns-peru-menu", + "description": "Returns one public CLOB market detail row by market condition id, including tokens, reward settings, order acceptance state, tags, and fees.", + "operationId": "polymarket-clob-market", "parameters": [ { - "description": "Return only categories whose name contains this text, case-insensitive, e.g. Promociones or Combos", - "in": "query", - "name": "category", + "description": "Polymarket market condition id", + "in": "path", + "name": "condition_id", + "required": true, "type": "string", - "x-example": "Promociones" + "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" } ], "produces": [ @@ -427938,7 +443962,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.latamMenuResponseDoc" + "$ref": "#/definitions/polymarket.clobMarketResponseDoc" } }, "400": { @@ -427971,26 +443995,32 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Papa John's Peru priced menu (PEN)", + "summary": "Get Polymarket CLOB market", "tags": [ - "Papa John's" + "Polymarket" ] } }, - "/papajohns/poland/menu": { + "/polymarket/dashboards/macro": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's **Poland** menu with prices in Polish zloty. Russia and Poland run one franchise platform of their own, separate from the six markets behind GET /papajohns/intl/menu and from Colombia, Peru and El Salvador, so each has its own endpoint. The catalog is national -- it does not vary by city -- and every product lists its priced variants with size, dough and any stuffed crust. Prices are zloty and are not comparable with any other market.", - "operationId": "papajohns-poland-menu", + "description": "Lists events from Polymarket's macro dashboard, tagged `macro`, up to `limit` events (default 20, max 100). Each event has its title, slug, dates, volume, liquidity, open interest, tags and nested markets with outcomes and prices. Pass the returned `cursor` back to fetch the next page; `has_more` shows whether there is one.", + "operationId": "polymarket-dashboard-macro", "parameters": [ { - "description": "Return only sections whose name or slug contains this text, case-insensitive. Slugs work in either market, e.g. pizza, combo, deserty, napitki, sauce, zakuski", + "description": "Maximum macro events, defaults to 20 and supports up to 100", "in": "query", - "name": "category", - "type": "string", - "x-example": "pizza" + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Optional keyset cursor from a prior macro dashboard response", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -428000,7 +444030,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.storefrontMenuResponseDoc" + "$ref": "#/definitions/polymarket.macroDashboardResponseDoc" } }, "400": { @@ -428009,12 +444039,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -428033,26 +444057,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Papa John's Poland priced menu (PLN)", + "summary": "List Polymarket macro dashboard events", "tags": [ - "Papa John's" + "Polymarket" ] } }, - "/papajohns/russia/menu": { + "/polymarket/data/followers/{address}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Papa John's **Russia** menu with prices in Russian roubles. Russia and Poland run one franchise platform of their own, separate from the six markets behind GET /papajohns/intl/menu and from Colombia, Peru and El Salvador, so each has its own endpoint. The catalog is national -- it does not vary by city -- and every product lists its priced variants with size, dough and any stuffed crust. Prices are roubles and are not comparable with any other market.", - "operationId": "papajohns-russia-menu", + "description": "Returns the public followers of one Polymarket wallet address. Page with `limit` and `offset` or `after_cursor`, and sort with `order` and `ascending`. The rows are passed through unchanged in `data`, with the source URL and the time they were fetched.", + "operationId": "polymarket-data-followers", "parameters": [ { - "description": "Return only sections whose name or slug contains this text, case-insensitive. Slugs work in either market, e.g. pizza, combo, deserty, napitki, sauce, zakuski", + "description": "Wallet address", + "in": "path", + "name": "address", + "required": true, + "type": "string", + "x-example": "0x0000000000000000000000000000000000000000" + }, + { + "description": "Rows to return", "in": "query", - "name": "category", + "name": "limit", + "type": "integer", + "x-example": 25 + }, + { + "description": "Result offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Optional upstream sort field", + "in": "query", + "name": "order", "type": "string", - "x-example": "pizza" + "x-example": "createdAt" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" + }, + { + "description": "Optional upstream cursor", + "in": "query", + "name": "after_cursor", + "type": "string" } ], "produces": [ @@ -428062,7 +444121,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.storefrontMenuResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -428071,12 +444130,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -428095,27 +444148,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Papa John's Russia priced menu (RUB)", + "summary": "Polymarket data followers", "tags": [ - "Papa John's" + "Polymarket" ] } }, - "/papajohns/store": { + "/polymarket/data/following/{address}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Papa John's store's published profile: address, phone, coordinates, general and pickup hours, timezone, Google Place id, and ordering link. The path comes from a store child returned by GET /papajohns/directory. Passing a directory path returns 404.", - "operationId": "papajohns-store", + "description": "Returns the accounts that one Polymarket wallet `address` follows, as rows under `data`. Optional `limit`, `offset`, `order`, `ascending` and `after_cursor` control the page. An invalid address returns an invalid-parameter error. The data is for reference and is not investment advice.", + "operationId": "polymarket-data-following", "parameters": [ { - "description": "Store path from a /papajohns/directory child marked is_store=true", - "in": "query", - "name": "path", + "description": "Wallet address", + "in": "path", + "name": "address", "required": true, "type": "string", - "x-example": "united-states/ca/91803/alhambra/2136-s-fremont-ave" + "x-example": "0x0000000000000000000000000000000000000000" + }, + { + "description": "Rows to return", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 25 + }, + { + "description": "Result offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Optional upstream sort field", + "in": "query", + "name": "order", + "type": "string", + "x-example": "createdAt" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" + }, + { + "description": "Optional upstream cursor", + "in": "query", + "name": "after_cursor", + "type": "string" } ], "produces": [ @@ -428125,7 +444212,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/papajohns.storeResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -428134,12 +444221,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -428158,27 +444239,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Papa John's store", + "summary": "Polymarket data following", "tags": [ - "Papa John's" + "Polymarket" ] } }, - "/patreon/creator": { + "/polymarket/data/follows/counts/{address}": { "get": { "consumes": [ "application/json" ], - "description": "Returns public profile metadata from a creator's Patreon page: creator identity, summary, images, membership and creation counts, public earnings snapshot, membership/RSS availability flags, and public external profile links. handle is the creator's page handle, e.g. CachyOS for patreon.com/CachyOS.", - "operationId": "patreon-creator", + "description": "Returns the follower and following counts for one Polymarket wallet `address` under `data`, with a `fetched_at` timestamp. An invalid address returns an invalid-parameter error. The counts are a snapshot and are not real-time trading data.", + "operationId": "polymarket-data-follows-counts", "parameters": [ { - "description": "Creator page handle", - "in": "query", - "name": "handle", + "description": "Wallet address", + "in": "path", + "name": "address", "required": true, "type": "string", - "x-example": "CachyOS" + "x-example": "0x0000000000000000000000000000000000000000" } ], "produces": [ @@ -428188,7 +444269,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/patreon.creatorResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -428197,12 +444278,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -428221,27 +444296,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a public Patreon creator profile", + "summary": "Polymarket data follow counts", "tags": [ - "Patreon" + "Polymarket" ] } }, - "/patreon/creator/tiers": { + "/polymarket/event/id/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns published membership tiers and their published benefits from a creator's public Patreon page. It excludes member-only entitlements, tier capacity, and member counts. handle is the creator's page handle, e.g. CachyOS for patreon.com/CachyOS.", - "operationId": "patreon-creator-tiers", + "description": "Returns one Polymarket event. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-event-detail-by-id", "parameters": [ { - "description": "Creator page handle", - "in": "query", - "name": "handle", + "description": "Polymarket event id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "CachyOS" + "x-example": "30615" } ], "produces": [ @@ -428251,7 +444326,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/patreon.membershipTiersResponseDoc" + "$ref": "#/definitions/polymarket.eventDetailResponseDoc" } }, "400": { @@ -428284,39 +444359,78 @@ "ApiKeyAuth": [] } ], - "summary": "Get a creator's public Patreon membership tiers", + "summary": "Get Polymarket event detail by id", "tags": [ - "Patreon" + "Polymarket" ] } }, - "/patreon/explore": { + "/polymarket/event/id/{id}/activity": { "get": { "consumes": [ "application/json" ], - "description": "Returns Patreon's public curated creator shelves for one topic: Top creators, Popular this week, and New on Patreon. topic must be one of podcasts_and_shows, visual_arts, tabletop_games, video_games, music, lifestyle, writing, handicrafts, apps_and_software, social_impact.", - "operationId": "patreon-explore", + "description": "Returns public trade rows for one Polymarket event. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-event-activity-by-id", "parameters": [ { - "description": "Public Explore topic. Allowed values: podcasts_and_shows, visual_arts, tabletop_games, video_games, music, lifestyle, writing, handicrafts, apps_and_software, social_impact", + "description": "Polymarket event id", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "30615" + }, + { + "description": "Maximum trades, defaults to 50 and supports up to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + }, + { + "description": "Result offset, defaults to 0 and supports up to 10000", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "default": "true", + "description": "Accepted for compatibility with the global activity contract; scoped upstream requests are filtered by event id", "enum": [ - "podcasts_and_shows", - "visual_arts", - "tabletop_games", - "video_games", - "music", - "lifestyle", - "writing", - "handicrafts", - "apps_and_software", - "social_impact" + "true", + "false" ], "in": "query", - "name": "topic", - "required": true, - "type": "string", - "x-example": "podcasts_and_shows" + "name": "taker_only", + "type": "string" + }, + { + "default": "CASH", + "description": "Activity amount filter type", + "enum": [ + "CASH" + ], + "in": "query", + "name": "filter_type", + "type": "string" + }, + { + "default": "1", + "description": "Minimum filtered amount", + "enum": [ + "1", + "5", + "10", + "100", + "1000", + "10000", + "100000" + ], + "in": "query", + "name": "filter_amount", + "type": "string" } ], "produces": [ @@ -428326,11 +444440,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/patreon.exploreResponseDoc" + "$ref": "#/definitions/polymarket.activityTradesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -428353,35 +444473,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse public Patreon creators by topic", + "summary": "List Polymarket event activity trades by id", "tags": [ - "Patreon" + "Polymarket" ] } }, - "/patreon/rss": { + "/polymarket/event/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns public podcast channel metadata and episodes from Patreon's canonical public RSS feed. campaign_id and show_id are the numeric IDs in the public feed URL. Private member feeds and authentication URLs are not supported.", - "operationId": "patreon-rss", + "description": "Returns one Polymarket event. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-event-detail", "parameters": [ { - "description": "Numeric Patreon campaign id", - "in": "query", - "name": "campaign_id", - "required": true, - "type": "string", - "x-example": "80117" - }, - { - "description": "Numeric Patreon show id", - "in": "query", - "name": "show_id", + "description": "Polymarket event slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "1322380" + "x-example": "world-cup-winner" } ], "produces": [ @@ -428391,7 +444503,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/patreon.publicRSSResponseDoc" + "$ref": "#/definitions/polymarket.eventDetailResponseDoc" } }, "400": { @@ -428424,24 +444536,78 @@ "ApiKeyAuth": [] } ], - "summary": "Get an explicitly public Patreon podcast RSS feed", + "summary": "Get Polymarket event detail", "tags": [ - "Patreon" + "Polymarket" ] } }, - "/pcgamer/article": { + "/polymarket/event/{slug}/activity": { "get": { - "description": "Returns a PC Gamer article by canonical `pcgamer.com` `url`; review pages work the same way as news articles. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`.", - "operationId": "pcgamer-article", + "consumes": [ + "application/json" + ], + "description": "Returns public trade rows for one Polymarket event. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-event-activity", "parameters": [ { - "description": "Canonical PC Gamer article URL", - "in": "query", - "name": "url", + "description": "Polymarket event slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.pcgamer.com/games/discord-takes-a-second-swing-at-age-verification-but-dont-worry-this-time-itll-guess-how-old-you-are-with-90-percent-accuracy/" + "x-example": "world-cup-winner" + }, + { + "description": "Maximum trades, defaults to 50 and supports up to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + }, + { + "description": "Result offset, defaults to 0 and supports up to 10000", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "default": "true", + "description": "Accepted for compatibility with the global activity contract; scoped upstream requests are filtered by event id", + "enum": [ + "true", + "false" + ], + "in": "query", + "name": "taker_only", + "type": "string" + }, + { + "default": "CASH", + "description": "Activity amount filter type", + "enum": [ + "CASH" + ], + "in": "query", + "name": "filter_type", + "type": "string" + }, + { + "default": "1", + "description": "Minimum filtered amount", + "enum": [ + "1", + "5", + "10", + "100", + "1000", + "10000", + "100000" + ], + "in": "query", + "name": "filter_amount", + "type": "string" } ], "produces": [ @@ -428451,7 +444617,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/polymarket.activityTradesResponseDoc" } }, "400": { @@ -428466,6 +444632,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -428478,37 +444650,70 @@ "ApiKeyAuth": [] } ], - "summary": "Get PC Gamer article content", + "summary": "List Polymarket event activity trades", "tags": [ - "PC Gamer" + "Polymarket" ] } }, - "/pcgamer/author": { + "/polymarket/events": { "get": { - "description": "Returns a PC Gamer author profile by `slug` (for example `harvey-randall`) or a pcgamer.com author `url`; supply exactly one. `page` picks the 1-based page of recent articles (default 1) and overrides a `/page/` segment in `url`. The response has `name`, `job_title`, `biography`, `social_links`, articles, `page` and `has_next_page`.", - "operationId": "pcgamer-author", + "consumes": [ + "application/json" + ], + "description": "Lists Polymarket events with their markets. Sort by 24-hour volume, total volume, liquidity, end date and more, filter to open or closed events, and page with `limit` (default 25, max 100) and `offset`. Each event has its slug, description, end date, liquidity, open interest and comment count; each market has its question, outcomes, best bid and ask, last trade price and volume.", + "operationId": "polymarket-events", "parameters": [ { - "description": "Author slug, e.g. harvey-randall", + "description": "Maximum events, defaults to 25 and supports up to 100", "in": "query", - "name": "slug", - "type": "string", - "x-example": "harvey-randall" + "name": "limit", + "type": "integer", + "x-example": 25 }, { - "description": "Canonical pcgamer.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "description": "Result offset, defaults to 0 and supports up to 10000", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.pcgamer.com/author/harvey-randall" + "name": "offset", + "type": "integer", + "x-example": 0 }, { - "default": 1, - "description": "1-based page number; overrides any page number in url", + "default": "volume24hr", + "description": "Sort field", + "enum": [ + "volume24hr", + "volume", + "liquidity", + "endDate", + "updatedAt", + "createdAt", + "id", + "slug", + "title", + "question", + "label" + ], "in": "query", - "name": "page", - "type": "integer" + "name": "order", + "type": "string" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" + }, + { + "description": "Closed filter", + "enum": [ + "true", + "false" + ], + "in": "query", + "name": "closed", + "type": "string" } ], "produces": [ @@ -428518,7 +444723,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.pcgamerAuthorResponseDoc" + "$ref": "#/definitions/polymarket.eventsResponseDoc" } }, "400": { @@ -428527,8 +444732,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -428545,34 +444750,71 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PC Gamer author profile", + "summary": "List Polymarket events", "tags": [ - "PC Gamer" + "Polymarket" ] } }, - "/pcgamer/headlines": { + "/polymarket/events/similar": { "get": { - "description": "Returns recent PC Gamer headlines for one section. `section` is required and takes one of eight slugs: `deals`, `games`, `gaming-industry`, `guides`, `hardware`, `movies-tv`, `news` or `software`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "pcgamer-headlines", + "consumes": [ + "application/json" + ], + "description": "Finds Polymarket events similar to a given one. Supply at least one of `id`, `event_title`, `event_slug`, `market_title` or `market_slug`; `limit` defaults to 10 (max 50) and `closed` (`true` or `false`) filters by closed state. Each event has its title, dates, volume, liquidity, tags and nested markets.", + "operationId": "polymarket-events-similar", "parameters": [ { - "description": "PC Gamer section slug", + "description": "Polymarket event id", + "in": "query", + "name": "id", + "type": "integer", + "x-example": 30615 + }, + { + "description": "Event title", + "in": "query", + "name": "event_title", + "type": "string", + "x-example": "World Cup Winner" + }, + { + "description": "Event slug", + "in": "query", + "name": "event_slug", + "type": "string", + "x-example": "world-cup-winner" + }, + { + "description": "Market title", + "in": "query", + "name": "market_title", + "type": "string", + "x-example": "Will Spain win the 2026 FIFA World Cup?" + }, + { + "description": "Market slug", + "in": "query", + "name": "market_slug", + "type": "string", + "x-example": "will-spain-win-the-2026-fifa-world-cup-963" + }, + { + "description": "Maximum events, defaults to 10 and supports up to 50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Closed filter", "enum": [ - "deals", - "games", - "gaming-industry", - "guides", - "hardware", - "movies-tv", - "news", - "software" + "true", + "false" ], "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "deals" + "name": "closed", + "type": "string" } ], "produces": [ @@ -428582,7 +444824,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/polymarket.similarEventsResponseDoc" } }, "400": { @@ -428591,38 +444833,6 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get PC Gamer section headlines", - "tags": [ - "PC Gamer" - ] - } - }, - "/pcgamer/news": { - "get": { - "description": "Returns the current PC Gamer top stories, with no parameters. Each item has a title and URL, and may include summary, author, publication time and image. Use `pcgamer-headlines` to read one section.", - "operationId": "pcgamer-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -428641,50 +444851,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get PC Gamer top stories", + "summary": "Find similar Polymarket events", "tags": [ - "PC Gamer" + "Polymarket" ] } }, - "/pcgamer/sections": { + "/polymarket/events/{id}/tags": { "get": { - "description": "Lists the eight top-level PC Gamer sections accepted by `pcgamer-headlines`: `deals`, `games`, `gaming-industry`, `guides`, `hardware`, `movies-tv`, `news` and `software`. Each entry has its `slug`, display `name` and `url`.", - "operationId": "pcgamer-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get PC Gamer sections", - "tags": [ - "PC Gamer" - ] - } - }, - "/pcmag/article": { - "get": { - "description": "Returns a PCMag article or product review by canonical `pcmag.com` `url`, such as `/news/` or `/reviews/`. The response has title, description, publication time, section label, authors, lead image and body `paragraphs`. Hub pages, author pages and pages without a readable body return an upstream error.", - "operationId": "pcmag-article", + "description": "Lists the tags attached to one Polymarket event, identified by the required event `id`. Each tag has its id, label and slug. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-event-tags", "parameters": [ { - "description": "Canonical PCMag article or review URL", - "in": "query", - "name": "url", + "description": "Polymarket event id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.pcmag.com/news/durabooks-latest-rugged-laptop-goes-to-the-extreme-with-triple-screen-setup" + "x-example": "30615" } ], "produces": [ @@ -428694,7 +444881,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/polymarket.tagsResponseDoc" } }, "400": { @@ -428703,8 +444890,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -428721,30 +444908,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get PCMag article or review content", + "summary": "List tags for a Polymarket event", "tags": [ - "PCMag" + "Polymarket" ] } }, - "/pcmag/author": { + "/polymarket/fee-types": { "get": { - "description": "Returns a PCMag author profile by `slug` (for example `michael-kan`) or a pcmag.com authors `url`; supply exactly one. The response has `name`, `role`, `biography`, `image_url`, `expertise` topics linked to category hubs, `social_links` (X, LinkedIn, Bluesky, Threads) as full URLs, and recent articles.", - "operationId": "pcmag-author", + "consumes": [ + "application/json" + ], + "description": "Returns Polymarket's fee type reference data as rows under `data`, optionally narrowed with `active` (`true` or `false`) or a `search` term. The response includes a `fetched_at` time. An invalid `active` value returns an invalid-parameter error.", + "operationId": "polymarket-fee-types", "parameters": [ { - "description": "Author slug, e.g. michael-kan", + "description": "Optional upstream active filter", + "enum": [ + "true", + "false" + ], "in": "query", - "name": "slug", - "type": "string", - "x-example": "michael-kan" + "name": "active", + "type": "string" }, { - "description": "Canonical pcmag.com/authors/ URL; alternative to slug", + "description": "Optional upstream search filter", "in": "query", - "name": "url", + "name": "search", "type": "string", - "x-example": "https://www.pcmag.com/authors/michael-kan" + "x-example": "sports" } ], "produces": [ @@ -428754,7 +444947,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.pcmagAuthorResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -428763,8 +444956,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -428781,258 +444974,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PCMag author profile", + "summary": "Polymarket fee types", "tags": [ - "PCMag" + "Polymarket" ] } }, - "/pcmag/headlines": { + "/polymarket/games": { "get": { - "description": "Returns recent PCMag headlines for one product or topic category. `section` is required and takes a category slug such as `ai`, `antivirus`, `cameras`, `crm-software` or `gaming-systems`; `pcmag-sections` lists them. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "pcmag-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns Polymarket's sports game rows under `data`, optionally filtered by `sport` or `ticker`. The response includes a `fetched_at` time. The data is a snapshot, not real-time trading data.", + "operationId": "polymarket-games", "parameters": [ { - "description": "PCMag category slug", - "enum": [ - "3d-printers", - "accounting", - "ai", - "air-purifiers", - "android", - "android-apps", - "anti-ransomware-for-business", - "antivirus", - "appliances", - "applicant-tracking-systems", - "application-performance-management", - "asset-management", - "audio", - "audio-accessories", - "audio-editing", - "audio-recording", - "background-check-services", - "batteries-power", - "benefits-administration-software", - "billing-invoicing-software", - "blu-ray-players", - "bluetooth-headsets", - "browsers", - "business-card-printing", - "business-plan-software", - "call-center-features", - "camera-accessories", - "cameras", - "car-accessories", - "cars-auto", - "cloud-backup-for-business", - "cloud-file-storage-for-business", - "cloud-infrastructure", - "collaboration", - "communications", - "components", - "computer-mice", - "connected-kitchen", - "contract-management-software", - "credit-card-processors", - "crm-software", - "cryptocurrency", - "dash-cams", - "data-analytics", - "data-visualization-tools", - "database", - "dating", - "desktop-pcs", - "digital-life", - "digital-voice-recorders", - "disaster-recovery", - "dna-testing-kits", - "document-management-software", - "drones", - "e-commerce-fulfillment-services", - "e-commerce-payments", - "e-commerce-software", - "ebook-readers", - "education", - "elearning-authoring-tools", - "electronic-health-record-management", - "email-marketing", - "employee-monitoring", - "employee-monitoring-software", - "employee-shift-scheduling", - "enterprise-accounting-software", - "erp-software", - "expense-tracking-software", - "fax-services", - "file-sync-backup", - "fitness", - "fitness-trackers", - "fleet-management", - "game-controllers-accessories", - "game-streaming-services", - "games", - "gaming", - "gaming-systems", - "gps-navigation", - "graphic-design", - "graphics-cards", - "hard-drives", - "headphones", - "health-fitness", - "heart-rate-monitors", - "help-desk", - "home-automation-hubs", - "home-entertainment", - "home-entertainment-accessories", - "home-security", - "home-security-cameras", - "hosted-email-providers", - "hosted-endpoint-protection", - "hr-software", - "human-resources", - "identity-management", - "infrastructure-management", - "input-devices", - "inventory-management-software", - "ios", - "ipad-apps", - "iphone-apps", - "it-management", - "it-security", - "keyboards", - "language-learning", - "laptop-accessories", - "laptops", - "lead-management", - "lenses", - "linux", - "low-code-app-development", - "macos", - "malware-protection-removal", - "marketing-automation-software", - "meal-kits", - "media-streaming-devices", - "media-streaming-software", - "medical-alert-systems", - "membership-management", - "microsoft-xbox-games", - "mobile-apps", - "mobile-device-management", - "mobile-games", - "mobile-payment-apps", - "mobile-phone-accessories", - "mobile-phones", - "modems-hotspots", - "monitors", - "motherboards", - "music-audio", - "network-attached-storage", - "network-management", - "network-monitoring", - "networking", - "nintendo-games", - "office-suites", - "online-learning-platforms-for-business", - "online-survey-tools", - "onlinecloud-backup-services", - "operating-systems", - "operations", - "parental-control", - "password-managers", - "payroll", - "pc-cases", - "pc-games", - "performance-management", - "personal-finance", - "personal-finance-apps", - "photo-design", - "photo-editing", - "photo-printing", - "podcasting", - "point-of-sale", - "power-supplies", - "printers", - "processors", - "productivity", - "project-management", - "projectors", - "proxies", - "ransomware-protection", - "robot-vacuums", - "sales-marketing", - "scanners", - "secure-file-transfer", - "security", - "security-suites", - "self-service-business-intelligence-tools", - "seo-tools", - "shopping", - "shredders", - "sim-cards", - "smart-displays", - "smart-glasses", - "smart-home", - "smart-lawn-mowers", - "smart-lighting", - "smart-locks", - "smart-plugs", - "smart-scales", - "smart-thermostats", - "smartwatches", - "smb-accounting", - "social-listening-and-influencer-identification", - "social-media", - "social-media-management", - "sony-playstation-games", - "speakers", - "spyware-protection", - "ssds", - "storage", - "streaming-music-services", - "styli", - "subscription-services", - "system-utilities", - "tablet-accessories", - "tablets", - "tax-software", - "team-messaging", - "tech-for-kids", - "time-tracking", - "to-do-list-apps", - "toys", - "tracking-devices-for-kids", - "tracking-devices-for-pets", - "travel", - "tune-up-utilities", - "tvs", - "universal-remotes", - "video", - "video-camera-accessories", - "video-cameras", - "video-conferencing-software", - "video-editing", - "video-streaming-services", - "virtualization", - "voip-phone-services", - "vpn", - "vr", - "wearables", - "web-hosting", - "webcams", - "website-app-building-tools", - "website-builders", - "website-monitoring", - "wi-fi-mesh-networking-systems", - "wi-fi-range-extenders", - "windows", - "wireless-carriers", - "wireless-routers" - ], + "description": "Optional sport filter", "in": "query", - "name": "section", - "required": true, + "name": "sport", "type": "string", - "x-example": "3d-printers" + "x-example": "basketball" + }, + { + "description": "Optional ticker filter", + "in": "query", + "name": "ticker", + "type": "string", + "x-example": "nba-sas-nyk-2026-06-08" } ], "produces": [ @@ -429042,7 +445010,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -429051,38 +445019,6 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get PCMag section headlines", - "tags": [ - "PCMag" - ] - } - }, - "/pcmag/news": { - "get": { - "description": "Returns the current PCMag top stories, with no parameters. Each item has a title, canonical URL, summary, publication time and author name when available. Use `pcmag-headlines` to read one product or topic category.", - "operationId": "pcmag-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -429101,50 +445037,57 @@ "ApiKeyAuth": [] } ], - "summary": "Get PCMag top stories", + "summary": "Polymarket games", "tags": [ - "PCMag" + "Polymarket" ] } }, - "/pcmag/sections": { + "/polymarket/homepage/feed": { "get": { - "description": "Lists the PCMag product and topic category slugs accepted by `pcmag-headlines`, such as `3d-printers`, `ai`, `antivirus`, `crm-software` and `drones`. Each entry has a `slug`, a display `name` and the category hub `url`.", - "operationId": "pcmag-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get PCMag sections", - "tags": [ - "PCMag" - ] - } - }, - "/people/article": { - "get": { - "description": "Returns a PEOPLE article by canonical `people.com` `url`, such as `https://people.com/example-headline-12345678`. The response has title, description, section, authors, lead image, publication and update times, a `paywalled` flag and body `paragraphs`. `authors` is empty for pieces with no byline.", - "operationId": "people-article", + "description": "Returns rows for Polymarket homepage feeds. The `feed` enum accepts `trending`, `breaking`, `new`, `politics`, `sports`, `crypto`, `esports`, `iran`, `finance`, `geopolitics`, `tech`, `culture`, `economy`, `weather`, `mentions`, and `elections`. Most feeds return events; `breaking` returns high-movement market rows and `mentions` returns open event search matches.", + "operationId": "polymarket-homepage-feed", "parameters": [ { - "description": "Canonical PEOPLE article URL", + "default": "trending", + "description": "Homepage feed", + "enum": [ + "trending", + "breaking", + "new", + "politics", + "sports", + "crypto", + "esports", + "iran", + "finance", + "geopolitics", + "tech", + "culture", + "economy", + "weather", + "mentions", + "elections" + ], "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://people.com/example-headline-12345678" + "name": "feed", + "type": "string" + }, + { + "description": "Maximum rows, defaults to 20 and supports up to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Optional keyset cursor from a prior event feed response", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -429154,7 +445097,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/polymarket.homepageFeedResponseDoc" } }, "400": { @@ -429163,8 +445106,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -429181,24 +445124,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get PEOPLE article content", + "summary": "List Polymarket homepage feed rows", "tags": [ - "PEOPLE" + "Polymarket" ] } }, - "/people/author": { + "/polymarket/leaderboard": { "get": { - "description": "Returns a PEOPLE staff writer or contributor's public profile (name, job title, structured intro fields, biography, personal social links) and recent articles from a canonical author URL.", - "operationId": "people-author", + "consumes": [ + "application/json" + ], + "description": "Returns trader leaderboard rows. The `window` enum accepts `1d`, `7d`, `30d`, and `all`; the `sort_by` enum accepts `profit` and `volume`.", + "operationId": "polymarket-leaderboard", "parameters": [ { - "description": "Canonical PEOPLE author URL", + "default": "30d", + "description": "Leaderboard time window", + "enum": [ + "1d", + "7d", + "30d", + "all" + ], "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://people.com/madison-goldberg-11701619" + "name": "window", + "type": "string" + }, + { + "default": "profit", + "description": "Leaderboard sort", + "enum": [ + "profit", + "volume" + ], + "in": "query", + "name": "sort_by", + "type": "string" + }, + { + "description": "Maximum rows, defaults to 20 and supports up to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -429208,7 +445177,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.peopleAuthorResponseDoc" + "$ref": "#/definitions/polymarket.leaderboardResponseDoc" } }, "400": { @@ -429217,8 +445186,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -429235,24 +445204,86 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PEOPLE author profile", + "summary": "List Polymarket leaderboard rows", "tags": [ - "PEOPLE" + "Polymarket" ] } }, - "/people/headlines": { + "/polymarket/market-clarifications": { "get": { - "description": "Returns fresh headlines from one PEOPLE section listing page. section accepts any slug returned by GET /people/sections (37 values, too many to enumerate inline -- see that endpoint for the full, current list), for example \"celebrity\" or \"royals\".", - "operationId": "people-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns Polymarket market clarification rows under `data`, with a `fetched_at` time. Filter by `market_id`, `event_id`, `state`, `question_id` or `tx_hash`, and page with `limit`, `offset`, `order`, `ascending` and `after_cursor`. All filters are optional.", + "operationId": "polymarket-market-clarifications", "parameters": [ { - "description": "PEOPLE section slug, from GET /people/sections", + "description": "Optional market id filter", "in": "query", - "name": "section", - "required": true, + "name": "market_id", "type": "string", - "x-example": "celebrity" + "x-example": "558934" + }, + { + "description": "Optional event id filter", + "in": "query", + "name": "event_id", + "type": "string", + "x-example": "30615" + }, + { + "description": "Optional upstream state filter", + "in": "query", + "name": "state", + "type": "string", + "x-example": "resolved" + }, + { + "description": "Optional upstream question id filter", + "in": "query", + "name": "question_id", + "type": "string" + }, + { + "description": "Optional transaction hash filter", + "in": "query", + "name": "tx_hash", + "type": "string" + }, + { + "description": "Rows to return", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 25 + }, + { + "description": "Result offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Optional upstream sort field", + "in": "query", + "name": "order", + "type": "string", + "x-example": "createdAt" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" + }, + { + "description": "Optional upstream cursor", + "in": "query", + "name": "after_cursor", + "type": "string" } ], "produces": [ @@ -429262,7 +445293,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -429271,38 +445302,6 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get PEOPLE section headlines", - "tags": [ - "PEOPLE" - ] - } - }, - "/people/news": { - "get": { - "description": "Returns the current PEOPLE celebrity and entertainment top stories, with no parameters and no section filter. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "people-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -429321,50 +445320,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get PEOPLE top stories", + "summary": "Polymarket market clarifications", "tags": [ - "PEOPLE" + "Polymarket" ] } }, - "/people/sections": { + "/polymarket/market/condition/{condition_id}": { "get": { - "description": "Returns the full PEOPLE section/category navigation inventory (37 entries as of 2026-09-24), each with a slug, display name, and public listing URL. Use a returned slug as the section parameter on GET /people/headlines.", - "operationId": "people-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get PEOPLE sections", - "tags": [ - "PEOPLE" - ] - } - }, - "/phillyinquirer/article": { - "get": { - "description": "Returns a Philadelphia Inquirer story by canonical `inquirer.com` `url` ending in `-.html`: title, description, publication and update times, section, authors, lead image and body `paragraphs` in reading order. Captions, teasers and comments are excluded. Associated Press `/wires/` pages, section pages and author pages return `400`.", - "operationId": "phillyinquirer-article", + "description": "Returns one Polymarket market by condition id. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-market-detail-by-condition", "parameters": [ { - "description": "Canonical Philadelphia Inquirer story URL", - "in": "query", - "name": "url", + "description": "Polymarket market condition id", + "in": "path", + "name": "condition_id", "required": true, "type": "string", - "x-example": "https://www.inquirer.com/news/ice-arrest-philadelphia-california-business-trip-airport-20260924.html" + "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" } ], "produces": [ @@ -429374,7 +445350,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/polymarket.marketDetailResponseDoc" } }, "400": { @@ -429389,6 +445365,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -429401,30 +445383,78 @@ "ApiKeyAuth": [] } ], - "summary": "Get Philadelphia Inquirer article content", + "summary": "Get Polymarket market detail by condition id", "tags": [ - "Philadelphia Inquirer" + "Polymarket" ] } }, - "/phillyinquirer/author": { + "/polymarket/market/condition/{condition_id}/activity": { "get": { - "description": "Returns a Philadelphia Inquirer staff author profile by `slug` (for example `gammage_jeff`) or an inquirer.com author `url`; supply exactly one. The response has `name`, `role`, `biography`, `image_url`, public web social links (no email or phone) and the latest 20 stories, with no paging. An unknown slug returns a 404 error.", - "operationId": "phillyinquirer-author", + "consumes": [ + "application/json" + ], + "description": "Returns public trade rows for one Polymarket market condition id. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-market-activity-by-condition", "parameters": [ { - "description": "Author slug, e.g. gammage_jeff", - "in": "query", - "name": "slug", + "description": "Polymarket market condition id", + "in": "path", + "name": "condition_id", + "required": true, "type": "string", - "x-example": "gammage_jeff" + "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" + }, + { + "description": "Maximum trades, defaults to 50 and supports up to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + }, + { + "description": "Result offset, defaults to 0 and supports up to 10000", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "default": "true", + "description": "Accepted for compatibility with the global activity contract; scoped upstream requests are filtered by condition id", + "enum": [ + "true", + "false" + ], + "in": "query", + "name": "taker_only", + "type": "string" + }, + { + "default": "CASH", + "description": "Activity amount filter type", + "enum": [ + "CASH" + ], + "in": "query", + "name": "filter_type", + "type": "string" }, { - "description": "Canonical inquirer.com/author/ URL; alternative to slug", + "default": "1", + "description": "Minimum filtered amount", + "enum": [ + "1", + "5", + "10", + "100", + "1000", + "10000", + "100000" + ], "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.inquirer.com/author/gammage_jeff/" + "name": "filter_amount", + "type": "string" } ], "produces": [ @@ -429434,7 +445464,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.phillyinquirerAuthorResponseDoc" + "$ref": "#/definitions/polymarket.activityTradesResponseDoc" } }, "400": { @@ -429449,6 +445479,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -429461,50 +445497,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Philadelphia Inquirer author profile", + "summary": "List Polymarket market activity trades by condition id", "tags": [ - "Philadelphia Inquirer" + "Polymarket" ] } }, - "/phillyinquirer/headlines": { + "/polymarket/market/condition/{condition_id}/liquidity": { "get": { - "description": "Returns recent Philadelphia Inquirer stories for one section, without Associated Press wire copy. `section` is required and takes one of 24 slugs, such as `news`, `sixers`, `eagles`, `south-jersey` or `real-estate`; invalid values return `400`. Each item has a title and URL, and may include summary, author, publication time and image.", - "operationId": "phillyinquirer-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a public market liquidity snapshot that joins market detail with public CLOB market data when token ids are available. This endpoint is not a trading endpoint and does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-market-liquidity-by-condition", "parameters": [ { - "description": "Philadelphia Inquirer section slug", - "enum": [ - "arts", - "business", - "college-sports", - "crime", - "eagles", - "education", - "entertainment", - "flyers", - "food", - "health", - "high-school-sports", - "life", - "news", - "opinion", - "phillies", - "politics", - "real-estate", - "science", - "sixers", - "soccer", - "south-jersey", - "sports", - "transportation", - "weather" - ], - "in": "query", - "name": "section", + "description": "Polymarket market condition id", + "in": "path", + "name": "condition_id", "required": true, "type": "string", - "x-example": "arts" + "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" } ], "produces": [ @@ -429514,7 +445527,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/polymarket.marketLiquidityResponseDoc" } }, "400": { @@ -429523,37 +445536,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Philadelphia Inquirer section headlines", - "tags": [ - "Philadelphia Inquirer" - ] - } - }, - "/phillyinquirer/news": { - "get": { - "description": "Returns the current Philadelphia Inquirer top stories, with no parameters. Each item has a title, canonical URL, summary, publication time and author name when available. Associated Press wire copy, which makes up much of the source, is excluded.", - "operationId": "phillyinquirer-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -429573,16 +445560,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get Philadelphia Inquirer top stories", + "summary": "Get Polymarket market liquidity by condition id", "tags": [ - "Philadelphia Inquirer" + "Polymarket" ] } }, - "/phillyinquirer/sections": { + "/polymarket/market/slug/{slug}": { "get": { - "description": "Lists the 24 Philadelphia Inquirer section slugs accepted by `phillyinquirer-headlines`, such as `news`, `sixers`, `eagles` and `south-jersey`. Each entry has a `slug`, display `name` and `url`. Sub-sections such as `news/philadelphia` are not listed because the `news` section already contains them.", - "operationId": "phillyinquirer-sections", + "consumes": [ + "application/json" + ], + "description": "Returns one Polymarket market. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-market-detail-by-slug", + "parameters": [ + { + "description": "Polymarket market slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "nba-sas-nyk-2026-06-08" + } + ], "produces": [ "application/json" ], @@ -429590,7 +445590,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/polymarket.marketDetailResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -429611,24 +445623,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Philadelphia Inquirer sections", + "summary": "Get Polymarket market detail by slug", "tags": [ - "Philadelphia Inquirer" + "Polymarket" ] } }, - "/philstar/article": { + "/polymarket/market/slug/{slug}/liquidity": { "get": { - "description": "Returns public Philstar article metadata and body paragraphs from a canonical article URL. Philstar serves full stories to anonymous readers, so no paywall flag is needed.", - "operationId": "philstar-article", + "consumes": [ + "application/json" + ], + "description": "Returns a public market liquidity snapshot that joins market detail with public CLOB market data when token ids are available. This endpoint is not a trading endpoint and does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-market-liquidity-by-slug", "parameters": [ { - "description": "Canonical Philstar article URL", - "in": "query", - "name": "url", + "description": "Polymarket market slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.philstar.com/business/2026/09/25/2558683/naysayers-wont-take-away-gcashs-very-exciting-story" + "x-example": "nba-sas-nyk-2026-06-08" } ], "produces": [ @@ -429638,7 +445653,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/polymarket.marketLiquidityResponseDoc" } }, "400": { @@ -429653,6 +445668,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -429665,30 +445686,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Philstar article content", + "summary": "Get Polymarket market liquidity by slug", "tags": [ - "Philstar" + "Polymarket" ] } }, - "/philstar/author": { + "/polymarket/market/{id}": { "get": { - "description": "Returns one Philstar author's public archive: name, profile photo when set, and the most recent stories on the first page of the archive. Authors are identified by the numeric id in the byline link (philstar.com/authors//).", - "operationId": "philstar-author", + "consumes": [ + "application/json" + ], + "description": "Returns one Polymarket market. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-market-detail", "parameters": [ { - "description": "Numeric Philstar author id from a byline link, e.g. 1805259", - "in": "query", + "description": "Polymarket market id", + "in": "path", "name": "id", + "required": true, "type": "string", - "x-example": "1805259" - }, - { - "description": "Author archive URL, https://www.philstar.com/authors/[/]; alternative to id", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.philstar.com/authors/1805259/richmond-mercurio" + "x-example": "558934" } ], "produces": [ @@ -429698,7 +445716,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.philstarAuthorResponseDoc" + "$ref": "#/definitions/polymarket.marketDetailResponseDoc" } }, "400": { @@ -429713,6 +445731,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -429725,119 +445749,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Philstar author archive", + "summary": "Get Polymarket market detail by id", "tags": [ - "Philstar" + "Polymarket" ] } }, - "/philstar/headlines": { + "/polymarket/market/{id}/liquidity": { "get": { - "description": "Returns the current headlines from the first page of one public Philstar section page (Philstar publishes no crawlable feeds, so this reads the section page itself).", - "operationId": "philstar-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a public market liquidity snapshot that joins market detail with public CLOB market data when token ids are available. This endpoint is not a trading endpoint and does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-market-liquidity", "parameters": [ { - "description": "Philstar section slug", - "enum": [ - "headlines", - "headlines-climate-and-environment", - "headlines-weather", - "opinion", - "nation", - "world", - "business", - "business-agriculture", - "business-banking", - "business-biz-memos", - "business-business-as-usual", - "business-motoring", - "business-real-estate", - "business-science-and-environment", - "business-stock-commentary", - "business-technology", - "business-telecoms", - "sports", - "sports-deans-corner", - "esport", - "entertainment", - "entertainment-korean-wave", - "entertainment-movies", - "entertainment-music", - "movies", - "music", - "lifestyle", - "lifestyle-arts-and-culture", - "lifestyle-business-life", - "lifestyle-fashion-and-beauty", - "lifestyle-food-and-leisure", - "lifestyle-gadgets", - "lifestyle-health-and-family", - "lifestyle-modern-living", - "lifestyle-on-the-radar", - "lifestyle-pet-life", - "lifestyle-shopping-guide", - "lifestyle-the-budgetarian", - "lifestyle-travel-and-tourism", - "news-commentary", - "videos", - "brandspace", - "campus", - "exam-results", - "lotto-results", - "other-sections-comics", - "other-sections-daily-bread", - "other-sections-education-and-home", - "other-sections-exam-results", - "other-sections-forex", - "other-sections-letters-to-the-editor", - "other-sections-lotto-results", - "other-sections-newsmakers", - "other-sections-star-cover", - "other-sections-supplements", - "other-sections-the-good-news", - "other-sections-word-of-the-day", - "pang-masa", - "pang-masa-pang-movies", - "pang-masa-para-malibang", - "pang-masa-para-manalo", - "pang-masa-pm-sports", - "pang-masa-police-metro", - "pang-masa-punto-mo", - "pilipino-star-ngayon", - "pilipino-star-ngayon-bansa", - "pilipino-star-ngayon-dr-love", - "pilipino-star-ngayon-komiks", - "pilipino-star-ngayon-kutob", - "pilipino-star-ngayon-litra-talk", - "pilipino-star-ngayon-metro", - "pilipino-star-ngayon-opinyon", - "pilipino-star-ngayon-palaro", - "pilipino-star-ngayon-probinsiya", - "pilipino-star-ngayon-showbiz", - "pilipino-star-ngayon-true-confessions", - "banat", - "banat-balita", - "banat-imong-kapalaran", - "banat-kalingawan", - "banat-opinyon", - "banat-palaro", - "banat-punsoy", - "banat-showbiz", - "the-freeman", - "the-freeman-cebu-business", - "the-freeman-cebu-entertainment", - "the-freeman-cebu-lifestyle", - "the-freeman-cebu-news", - "the-freeman-cebu-sports", - "the-freeman-metro-cebu", - "the-freeman-opinion", - "the-freeman-region" - ], - "in": "query", - "name": "section", + "description": "Polymarket market id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "headlines" + "x-example": "558934" } ], "produces": [ @@ -429847,7 +445779,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/polymarket.marketLiquidityResponseDoc" } }, "400": { @@ -429856,36 +445788,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Philstar section headlines", - "tags": [ - "Philstar" - ] - } - }, - "/philstar/news": { - "get": { - "description": "Returns the current Philstar (Philippine Star) top stories from the public homepage: the latest, trending and featured stories with summary, byline, thumbnail and the publication date encoded in the story URL.", - "operationId": "philstar-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "429": { + "description": "Too Many Requests", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/app.Response" } }, "503": { @@ -429900,50 +445812,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Philstar top stories", + "summary": "Get Polymarket market liquidity", "tags": [ - "Philstar" + "Polymarket" ] } }, - "/philstar/sections": { + "/polymarket/market/{id}/tags": { "get": { - "description": "Returns the public Philstar editorial section inventory: every English, Filipino (Pilipino Star Ngayon, Pang-Masa) and Cebuano (Banat, The Freeman) section page that lists stories.", - "operationId": "philstar-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Philstar sections", - "tags": [ - "Philstar" - ] - } - }, - "/phonearena/article": { - "get": { - "description": "Returns public PhoneArena news or review metadata and body paragraphs from a canonical article URL. PhoneArena serves pages behind a Cloudflare challenge; when the challenge is not cleared the endpoint returns a 503 error.", - "operationId": "phonearena-article", + "description": "Lists the tags attached to one Polymarket market, identified by the required market `id`. Each tag has its id, label and slug. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-market-tags", "parameters": [ { - "description": "Canonical PhoneArena article URL", - "in": "query", - "name": "url", + "description": "Polymarket market id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.phonearena.com/news/the-galaxy-z-fold-8-shamelessly-stole-the-crown-from-the-iphone-duo_id183377" + "x-example": "558934" } ], "produces": [ @@ -429953,7 +445842,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/polymarket.tagsResponseDoc" } }, "400": { @@ -429962,8 +445851,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -429980,30 +445869,70 @@ "ApiKeyAuth": [] } ], - "summary": "Get PhoneArena article or review content", + "summary": "List tags for a Polymarket market", "tags": [ - "PhoneArena" + "Polymarket" ] } }, - "/phonearena/author": { + "/polymarket/markets": { "get": { - "description": "Returns one PhoneArena staff author's public profile: name, role, biography, image, social links and the recent articles listed on the profile page.", - "operationId": "phonearena-author", + "consumes": [ + "application/json" + ], + "description": "Lists Polymarket markets, up to `limit` rows (default 25, max 100), starting at `offset` (default 0, max 10000). Sort with `order`, such as `volume24hr` or `liquidity`, flip direction with `ascending`, and filter with `closed`. Each market has its question, slug, prices, volume, liquidity, token ids and outcomes.", + "operationId": "polymarket-markets", "parameters": [ { - "description": "Author username, e.g. sebastian.f", + "description": "Maximum markets, defaults to 25 and supports up to 100", "in": "query", - "name": "slug", - "type": "string", - "x-example": "sebastian.f" + "name": "limit", + "type": "integer", + "x-example": 25 }, { - "description": "Canonical phonearena.com/team/ URL; alternative to slug", + "description": "Result offset, defaults to 0 and supports up to 10000", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.phonearena.com/team/sebastian.f" + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "default": "volume24hr", + "description": "Sort field", + "enum": [ + "volume24hr", + "volume", + "liquidity", + "endDate", + "updatedAt", + "createdAt", + "id", + "slug", + "title", + "question", + "label" + ], + "in": "query", + "name": "order", + "type": "string" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" + }, + { + "description": "Closed filter", + "enum": [ + "true", + "false" + ], + "in": "query", + "name": "closed", + "type": "string" } ], "produces": [ @@ -430013,7 +445942,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.phonearenaAuthorResponseDoc" + "$ref": "#/definitions/polymarket.marketsResponseDoc" } }, "400": { @@ -430022,8 +445951,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430040,29 +445969,80 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PhoneArena author profile", + "summary": "List Polymarket markets", "tags": [ - "PhoneArena" + "Polymarket" ] } }, - "/phonearena/headlines": { + "/polymarket/predictions": { "get": { - "description": "Returns up to 100 newest PhoneArena stories or reviews from one public listing. For news-month and reviews, titles are reconstructed from the hero-image file name and published_at is the listing's last-modified time.", - "operationId": "phonearena-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns event rows for the Polymarket `/predictions` page. The `status` enum accepts `active`, `resolved`, and `all`; the `sort` enum accepts `competitive`, `volume`, `volume_24hr`, `ending_soon`, `liquidity`, `newest`, and `closed_time`; the `recurrence` enum accepts `hourly`, `daily`, `weekly`, `monthly`, and `yearly`.", + "operationId": "polymarket-predictions", "parameters": [ { - "description": "PhoneArena listing slug", + "default": "active", + "description": "Prediction status", "enum": [ - "news", - "news-month", - "reviews" + "active", + "resolved", + "all" ], "in": "query", - "name": "section", - "required": true, + "name": "status", + "type": "string" + }, + { + "default": "competitive", + "description": "Prediction sort", + "enum": [ + "competitive", + "volume", + "volume_24hr", + "ending_soon", + "liquidity", + "newest", + "closed_time" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Optional tag slug", + "in": "query", + "name": "tag", "type": "string", - "x-example": "news" + "x-example": "politics" + }, + { + "description": "Optional recurrence filter", + "enum": [ + "hourly", + "daily", + "weekly", + "monthly", + "yearly" + ], + "in": "query", + "name": "recurrence", + "type": "string" + }, + { + "description": "Maximum events, defaults to 20 and supports up to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Optional keyset cursor from a prior predictions response", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -430072,7 +446052,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/polymarket.predictionsResponseDoc" } }, "400": { @@ -430081,6 +446061,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -430093,16 +446079,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get PhoneArena section headlines", + "summary": "List Polymarket predictions", "tags": [ - "PhoneArena" + "Polymarket" ] } }, - "/phonearena/news": { + "/polymarket/rewards/market/{condition_id}": { "get": { - "description": "Returns PhoneArena's most recent phone news stories (about the last two days) from its public news sitemap, with exact titles and publication times.", - "operationId": "phonearena-news", + "consumes": [ + "application/json" + ], + "description": "Returns the liquidity-rewards details of one Polymarket market by condition id: the question, daily reward rate, rewards minimum size and maximum spread, each reward configuration with its start and end dates and rate per day, total configured rewards, 24-hour volume and outcome token prices. A condition id with no rewards row returns `404`.", + "operationId": "polymarket-rewards-market", + "parameters": [ + { + "description": "Polymarket market condition id", + "in": "path", + "name": "condition_id", + "required": true, + "type": "string", + "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" + } + ], "produces": [ "application/json" ], @@ -430110,46 +446109,20 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/polymarket.rewardsMarketResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get PhoneArena top stories", - "tags": [ - "PhoneArena" - ] - } - }, - "/phonearena/sections": { - "get": { - "description": "Lists the three PhoneArena listings that `phonearena-headlines` accepts: `news` (the last two days of news), `news-month` (the newest news of the current calendar month) and `reviews` (the newest reviews, comparisons and hands-on articles of the current year). Each entry has a `slug`, a display `name` and a source `url`.", - "operationId": "phonearena-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -430169,24 +446142,92 @@ "ApiKeyAuth": [] } ], - "summary": "Get PhoneArena sections", + "summary": "Get Polymarket rewards market", "tags": [ - "PhoneArena" + "Polymarket" ] } }, - "/physorg/article": { + "/polymarket/rewards/markets": { "get": { - "description": "Returns public Phys.org article metadata and readable body paragraphs from a canonical dated news URL. The service tries proxied HTTP first and uses the production browser fleet when the article edge challenges HTTP. Billing is 2 credits for an HTTP-profile success and 10 credits when browser rendering is required. No author-profile route was verified.", - "operationId": "physorg-article", + "consumes": [ + "application/json" + ], + "description": "Returns public rewards-market rows used by Polymarket's `/rewards` page. The `order_by` enum accepts `market`, `earnings`, `max_spread`, `min_size`, `rate_per_day`, `price`, `earning_percentage`, and `spread`; the `position` enum accepts `asc` and `desc`; the `tag_slug` enum accepts `all`, `politics`, `sports`, `crypto`, `pop-culture`, `middle-east`, `business`, and `science`.", + "operationId": "polymarket-rewards-markets", "parameters": [ { - "description": "Canonical Phys.org article URL", + "default": "market", + "description": "Rewards market sort", + "enum": [ + "market", + "earnings", + "max_spread", + "min_size", + "rate_per_day", + "price", + "earning_percentage", + "spread" + ], "in": "query", - "name": "url", - "required": true, + "name": "order_by", + "type": "string" + }, + { + "default": "desc", + "description": "Sort direction", + "enum": [ + "asc", + "desc" + ], + "in": "query", + "name": "position", + "type": "string" + }, + { + "description": "Reward program date in YYYY-MM-DD format; defaults to today in UTC", + "in": "query", + "name": "date", "type": "string", - "x-example": "https://phys.org/news/2026-09-example-story.html" + "x-example": "2026-06-07" + }, + { + "description": "Optional market question search text", + "in": "query", + "name": "q", + "type": "string", + "x-example": "bitcoin" + }, + { + "default": "all", + "description": "Rewards category", + "enum": [ + "all", + "politics", + "sports", + "crypto", + "pop-culture", + "middle-east", + "business", + "science" + ], + "in": "query", + "name": "tag_slug", + "type": "string" + }, + { + "description": "Optional rewards cursor from a prior response; defaults to MA==", + "in": "query", + "name": "cursor", + "type": "string", + "x-example": "MA==" + }, + { + "description": "Maximum rows, defaults to 100 and supports up to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -430196,7 +446237,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/polymarket.rewardsMarketsResponseDoc" } }, "400": { @@ -430205,8 +446246,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430223,35 +446264,81 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Phys.org article", + "summary": "List Polymarket rewards markets", "tags": [ - "Phys.org" + "Polymarket" ] } }, - "/physorg/headlines": { + "/polymarket/search": { "get": { - "description": "Returns current stories from one Phys.org feed. The accepted values are the seven Topics menu feeds plus the Breaking and Editorials feeds. Search and tag feeds are not included.", - "operationId": "physorg-headlines", + "consumes": [ + "application/json" + ], + "description": "Searches Polymarket and returns event results. The `status` enum accepts `open`, `closed`, and `all`; the `sort` enum accepts `relevance`, `volume24hr`, `volume`, `liquidity`, and `endDate`.", + "operationId": "polymarket-search", "parameters": [ { - "description": "Phys.org RSS feed slug from physorg-sections", - "enum": [ - "nanotech-news", - "physics-news", - "space-news", - "earth-news", - "chemistry-news", - "biology-news", - "science-news", - "breaking", - "editorials" - ], + "description": "Search query", "in": "query", - "name": "section", + "name": "q", "required": true, "type": "string", - "x-example": "nanotech-news" + "x-example": "bitcoin" + }, + { + "description": "Maximum events, defaults to 10 and supports up to 50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "default": "open", + "description": "Event status filter", + "enum": [ + "open", + "closed", + "all" + ], + "in": "query", + "name": "status", + "type": "string" + }, + { + "default": "relevance", + "description": "Search sort", + "enum": [ + "relevance", + "volume24hr", + "volume", + "liquidity", + "endDate" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" + }, + { + "default": false, + "description": "Include matching tags", + "in": "query", + "name": "include_tags", + "type": "boolean" + }, + { + "default": false, + "description": "Include matching profiles", + "in": "query", + "name": "include_profiles", + "type": "boolean" } ], "produces": [ @@ -430261,7 +446348,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/polymarket.searchResponseDoc" } }, "400": { @@ -430270,6 +446357,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -430282,16 +446381,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Phys.org section headlines", + "summary": "Search Polymarket events", "tags": [ - "Phys.org" + "Polymarket" ] } }, - "/physorg/news": { + "/polymarket/sports": { "get": { - "description": "Returns current stories from Phys.org's public all-stories RSS feed. Summaries are publisher-provided teasers. Use physorg-sections to discover the topic and editorial RSS feeds accepted by physorg-headlines.", - "operationId": "physorg-news", + "consumes": [ + "application/json" + ], + "description": "Returns Polymarket's sports reference list under `data`, with a `fetched_at` time. It takes no parameters. The data is reference data, not real-time trading data or investment advice.", + "operationId": "polymarket-sports", "produces": [ "application/json" ], @@ -430299,7 +446401,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -430320,45 +446428,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get Phys.org top stories", + "summary": "Polymarket sports", "tags": [ - "Phys.org" + "Polymarket" ] } }, - "/physorg/sections": { + "/polymarket/sports/by-partner": { "get": { - "description": "Lists the seven topic feeds in Phys.org's Topics menu and its two additional public Breaking and Editorials feeds. Every returned slug is accepted by physorg-headlines. Search and tag feeds are not included.", - "operationId": "physorg-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ + "description": "Looks up Polymarket sports by a partner's identifiers, using `partner` (the partner name) and `external_id` (the partner's own id for the sport). Matching sports come back as rows under `data`, with a `fetched_at` time.", + "operationId": "polymarket-sports-by-partner", + "parameters": [ { - "ApiKeyAuth": [] + "description": "Partner name", + "in": "query", + "name": "partner", + "type": "string", + "x-example": "nba" + }, + { + "description": "Partner external id", + "in": "query", + "name": "external_id", + "type": "string", + "x-example": "123" } ], - "summary": "List Phys.org RSS sections", - "tags": [ - "Phys.org" - ] - } - }, - "/ping": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the API's release metadata: `status`, `service`, `api` name, `version`, full and short `commit`, `build_time` and a `dirty` flag. The root `/ping` path returns the same payload.", - "operationId": "ping", "produces": [ "application/json" ], @@ -430366,47 +446464,46 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/api.pingResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } } }, - "summary": "Return API metadata", + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Polymarket sports by partner", "tags": [ - "Meta" + "Polymarket" ] } }, - "/pinterest/board/{username}/{slug}": { + "/polymarket/sports/market-types": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Pinterest board's metadata (name, description, cover image, pin/follower counts, owner) plus a page of pins from that board. Public data sourced from Pinterest's own board pages.", - "operationId": "pinterest-board", - "parameters": [ - { - "description": "Pinterest username that owns the board", - "in": "path", - "name": "username", - "required": true, - "type": "string", - "x-example": "patrontequila" - }, - { - "description": "Board URL slug, from the board's own /{username}/{slug}/ URL", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "el-cafecito" - } - ], + "description": "Returns the list of sports market types Polymarket uses, as reference data under `data`, together with a `fetched_at` time. It takes no parameters, so every call returns the same kind of reference list for the current moment.", + "operationId": "polymarket-sports-market-types", "produces": [ "application/json" ], @@ -430414,7 +446511,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.boardResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430423,14 +446520,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430447,19 +446538,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pinterest board's detail", + "summary": "Polymarket sports market types", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pinterest/categories": { + "/polymarket/sports/summary": { "get": { "consumes": [ "application/json" ], - "description": "Returns Pinterest's top-level \"Ideas\" category taxonomy (e.g. \"Animals\", \"Home Decor\", \"Food And Drink\"). Each entry's id is usable directly with GET /pinterest/ideas/{id}. Public data sourced from Pinterest's own ideas.pinterest.com-style category hub.", - "operationId": "pinterest-categories", + "description": "Returns Polymarket's sports summary under `data`, together with a `fetched_at` time. It takes no parameters. The result is a snapshot of the summary at request time and is not real-time trading data or investment advice.", + "operationId": "polymarket-sports-summary", "produces": [ "application/json" ], @@ -430467,11 +446558,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.categoriesResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430488,27 +446585,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Pinterest's \"Ideas\" category list", + "summary": "Polymarket sports summary", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pinterest/ideas/{id}": { + "/polymarket/sports/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one \"Ideas\" category's metadata (name, description, follower count) plus a page of pins from that category's feed. Public data sourced from Pinterest's own ideas category pages.", - "operationId": "pinterest-idea", + "description": "Returns the Polymarket reference record for one sport, identified by the required sport `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-sport", "parameters": [ { - "description": "Pinterest ideas category id. See GET /pinterest/categories for the full list.", + "description": "Polymarket sport id", "in": "path", "name": "id", "required": true, - "type": "string", - "x-example": "925056443165" + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -430518,7 +446615,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.ideaResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430533,8 +446630,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430551,27 +446648,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pinterest \"Ideas\" category's detail feed", + "summary": "Polymarket sport detail", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pinterest/pin/{id}": { + "/polymarket/sports/{id}/external-partners": { "get": { "consumes": [ "application/json" ], - "description": "Returns a single Pinterest pin's full detail: title, description, image, board, pinner, comment count, save count, and creation time. Public data sourced from Pinterest's own pin pages.", - "operationId": "pinterest-pin", + "description": "Returns the external partner records linked to one Polymarket sport, identified by the required sport `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-sport-external-partners", "parameters": [ { - "description": "Pinterest pin id", + "description": "Polymarket sport id", "in": "path", "name": "id", "required": true, - "type": "string", - "x-example": "52846995624279072" + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -430581,7 +446678,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.pinResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430596,8 +446693,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430614,27 +446711,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pinterest pin's full detail", + "summary": "Polymarket sport external partners", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pinterest/search": { + "/polymarket/sports/{id}/external-partners/{partner_ref}": { "get": { "consumes": [ "application/json" ], - "description": "Returns public Pinterest pins matching a text query: title, description, image, board, and pinner for each result. Public data sourced from Pinterest's own web search.", - "operationId": "pinterest-search", + "description": "Returns the external partner record for one Polymarket sport, identified by the sport `id` and a `partner_ref`, both required. The record comes back under `data` with a `fetched_at` time. Invalid identifiers return an invalid-parameter error.", + "operationId": "polymarket-sport-external-partner", "parameters": [ { - "description": "Search text", - "in": "query", - "name": "query", + "description": "Polymarket sport id", + "in": "path", + "name": "id", + "required": true, + "type": "integer", + "x-example": 1 + }, + { + "description": "Partner reference", + "in": "path", + "name": "partner_ref", "required": true, "type": "string", - "x-example": "minimalist living room" + "x-example": "nba" } ], "produces": [ @@ -430644,7 +446749,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.searchResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430653,8 +446758,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430671,29 +446782,19 @@ "ApiKeyAuth": [] } ], - "summary": "Search Pinterest pins", + "summary": "Polymarket sport external partner", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pinterest/user/{username}": { + "/polymarket/spotlights": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Pinterest user's public profile: display name, bio, website, avatar, and follower/following/pin/board counts. Public data sourced from Pinterest's own profile pages.", - "operationId": "pinterest-user", - "parameters": [ - { - "description": "Pinterest username", - "in": "path", - "name": "username", - "required": true, - "type": "string", - "x-example": "patrontequila" - } - ], + "description": "Returns Polymarket's list of spotlights under `data`, with a `fetched_at` time. It takes no parameters. The data is a reference list, not real-time trading data or investment advice.", + "operationId": "polymarket-spotlights", "produces": [ "application/json" ], @@ -430701,7 +446802,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.userResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430710,14 +446811,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430734,27 +446829,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pinterest user's public profile", + "summary": "Polymarket spotlights", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pinterest/user/{username}/boards": { + "/polymarket/spotlights/keyset": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of a Pinterest user's own boards: name, description, cover image, and pin/follower counts for each. Public data sourced from Pinterest's own profile pages.", - "operationId": "pinterest-user-boards", + "description": "Returns Polymarket spotlights as a cursor-paged list under `data`. Control the page with `limit`, `offset`, `order`, `ascending` and `after_cursor`. The response includes a `fetched_at` time.", + "operationId": "polymarket-spotlights-keyset", "parameters": [ { - "description": "Pinterest username", - "in": "path", - "name": "username", - "required": true, + "description": "Rows to return", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 25 + }, + { + "description": "Result offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Optional upstream sort field", + "in": "query", + "name": "order", "type": "string", - "x-example": "patrontequila" + "x-example": "createdAt" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" + }, + { + "description": "Optional upstream cursor", + "in": "query", + "name": "after_cursor", + "type": "string" } ], "produces": [ @@ -430764,7 +446885,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.userBoardsResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430773,8 +446894,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430791,27 +446912,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pinterest user's boards", + "summary": "Polymarket spotlight keyset", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pinterest/user/{username}/pins": { + "/polymarket/spotlights/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of a Pinterest user's own pins: title, description, image, board, and pinner for each. Public data sourced from Pinterest's own profile pages.", - "operationId": "pinterest-user-pins", + "description": "Returns one Polymarket spotlight, identified by the required `slug`, under `data`, together with a `fetched_at` time. A slug that fails validation returns an invalid-parameter error. The data is a snapshot and is not investment advice.", + "operationId": "polymarket-spotlight", "parameters": [ { - "description": "Pinterest username", + "description": "Spotlight slug", "in": "path", - "name": "username", + "name": "slug", "required": true, "type": "string", - "x-example": "patrontequila" + "x-example": "nfl-draft" } ], "produces": [ @@ -430821,7 +446942,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pinterest.userPinsResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430830,8 +446951,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -430848,35 +446975,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pinterest user's own pins", + "summary": "Polymarket spotlight detail", "tags": [ - "Pinterest" + "Polymarket" ] } }, - "/pitchbook/advisor": { + "/polymarket/status": { "get": { "consumes": [ "application/json" ], - "description": "Returns the free/teaser content of a PitchBook advisor (service provider, e.g. investment bank, lender, or financing advisory firm) profile page: overview, description, contact/HQ, and a preview of serviced companies/deals, co-lenders, and subsidiaries. PitchBook gates most numeric figures and full lists behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", - "operationId": "pitchbook-advisor", - "parameters": [ - { - "description": "PitchBook advisor id", - "in": "query", - "name": "id", - "type": "string", - "x-example": "676215-64" - }, - { - "description": "Absolute https://pitchbook.com/profiles/advisor/ URL", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://pitchbook.com/profiles/advisor/676215-64" - } - ], + "description": "Returns the service status reported by Polymarket's public market-data API. The payload is passed through unchanged in `data`, with the source URL and the time it was fetched. Takes no parameters.", + "operationId": "polymarket-status", "produces": [ "application/json" ], @@ -430884,7 +446995,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pitchbook.advisorResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -430893,12 +447004,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -430917,33 +447022,34 @@ "ApiKeyAuth": [] } ], - "summary": "PitchBook advisor profile", + "summary": "Polymarket status", "tags": [ - "PitchBook" + "Polymarket" ] } }, - "/pitchbook/company": { + "/polymarket/tag/slug/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the free/teaser content of a PitchBook company profile page (overview, description, contact/HQ, industry, funding-round history without dollar amounts, a preview of investors, acquisitions, and subsidiaries). PitchBook gates most numeric figures (deal amounts, cap tables, full investor/LP lists) behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", - "operationId": "pitchbook-company", + "description": "Returns one Polymarket tag by its required `slug` instead of an id: its id, label and slug. An optional `locale` adjusts the lookup. An invalid slug returns an invalid-parameter error.", + "operationId": "polymarket-tag-by-slug", "parameters": [ { - "description": "PitchBook company id", - "in": "query", - "name": "id", + "description": "Polymarket tag slug", + "in": "path", + "name": "slug", + "required": true, "type": "string", - "x-example": "752821-12" + "x-example": "crypto" }, { - "description": "Absolute https://pitchbook.com/profiles/company/ URL", + "description": "Optional upstream locale", "in": "query", - "name": "url", + "name": "locale", "type": "string", - "x-example": "https://pitchbook.com/profiles/company/752821-12" + "x-example": "en" } ], "produces": [ @@ -430953,7 +447059,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pitchbook.companyResponseDoc" + "$ref": "#/definitions/polymarket.tagResponseDoc" } }, "400": { @@ -430986,33 +447092,51 @@ "ApiKeyAuth": [] } ], - "summary": "PitchBook company profile", + "summary": "Get a Polymarket tag by slug", "tags": [ - "PitchBook" + "Polymarket" ] } }, - "/pitchbook/fund": { + "/polymarket/tag/slug/{slug}/related-tags": { "get": { "consumes": [ "application/json" ], - "description": "Returns the free/teaser content of a PitchBook fund profile page (strategy, status, manager, size, vintage, and a preview of limited partners and benchmark peer funds). PitchBook gates most numeric figures (returns/IRR, full LP lists) behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", - "operationId": "pitchbook-fund", + "description": "Lists the Polymarket tags related to one tag, identified by the required tag `slug` instead of an id. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each tag has its id, label and slug.", + "operationId": "polymarket-related-tags-by-slug", "parameters": [ { - "description": "PitchBook fund id", + "description": "Polymarket tag slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "crypto" + }, + { + "description": "Omit empty related tags", + "enum": [ + "true", + "false" + ], "in": "query", - "name": "id", + "name": "omit_empty", + "type": "string" + }, + { + "description": "Optional upstream status filter", + "in": "query", + "name": "status", "type": "string", - "x-example": "19719-91F" + "x-example": "active" }, { - "description": "Absolute https://pitchbook.com/profiles/fund/ URL", + "description": "Optional upstream locale", "in": "query", - "name": "url", + "name": "locale", "type": "string", - "x-example": "https://pitchbook.com/profiles/fund/19719-91F" + "x-example": "en" } ], "produces": [ @@ -431022,7 +447146,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pitchbook.fundResponseDoc" + "$ref": "#/definitions/polymarket.tagsResponseDoc" } }, "400": { @@ -431031,12 +447155,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -431055,33 +447173,51 @@ "ApiKeyAuth": [] } ], - "summary": "PitchBook fund profile", + "summary": "Get related Polymarket tags by slug", "tags": [ - "PitchBook" + "Polymarket" ] } }, - "/pitchbook/investor": { + "/polymarket/tag/slug/{slug}/related-tags/tags": { "get": { "consumes": [ "application/json" ], - "description": "Returns the free/teaser content of a PitchBook investor (fund manager/firm) profile page (overview, description, contact/HQ, and a preview of investments, exits, and co-investors). PitchBook gates most numeric figures and full lists behind a paid subscription; those come through as empty cells rather than being fabricated. Pass exactly one of `id` or `url`.", - "operationId": "pitchbook-investor", + "description": "Returns the related-tag relationship rows for one Polymarket tag, identified by the required tag `slug` instead of an id. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each row has an id, label and slug.", + "operationId": "polymarket-related-tag-rows-by-slug", "parameters": [ { - "description": "PitchBook investor id", + "description": "Polymarket tag slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "crypto" + }, + { + "description": "Omit empty related tags", + "enum": [ + "true", + "false" + ], "in": "query", - "name": "id", + "name": "omit_empty", + "type": "string" + }, + { + "description": "Optional upstream status filter", + "in": "query", + "name": "status", "type": "string", - "x-example": "294471-37" + "x-example": "active" }, { - "description": "Absolute https://pitchbook.com/profiles/investor/ URL", + "description": "Optional upstream locale", "in": "query", - "name": "url", + "name": "locale", "type": "string", - "x-example": "https://pitchbook.com/profiles/investor/294471-37" + "x-example": "en" } ], "produces": [ @@ -431091,7 +447227,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pitchbook.investorResponseDoc" + "$ref": "#/definitions/polymarket.tagsResponseDoc" } }, "400": { @@ -431100,12 +447236,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -431124,33 +447254,41 @@ "ApiKeyAuth": [] } ], - "summary": "PitchBook investor profile", + "summary": "Get related Polymarket tag rows by slug", "tags": [ - "PitchBook" + "Polymarket" ] } }, - "/pitchbook/limited-partner": { + "/polymarket/tag/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the free/teaser content of a PitchBook limited partner (institutional investor, e.g. pension fund, endowment, or insurance company) profile page: overview, description, contact, and a preview of fund commitments. PitchBook gates most numeric figures and full lists behind a paid subscription; those come through as empty cells rather than being fabricated. Some limited partner profiles have no FAQ section (thinner profiles) -- this is normal, not a sign of a blocked or broken response. Pass exactly one of `id` or `url`.", - "operationId": "pitchbook-limited-partner", + "description": "Returns one Polymarket tag by its required `id`: its id, label and slug. Optional `include_template` and `locale` adjust the lookup. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-tag", "parameters": [ { - "description": "PitchBook limited partner id", - "in": "query", + "description": "Polymarket tag id", + "in": "path", "name": "id", + "required": true, "type": "string", - "x-example": "864326-44" + "x-example": "21" }, { - "description": "Absolute https://pitchbook.com/profiles/limited-partner/ URL", + "default": false, + "description": "Include upstream template data when supported", "in": "query", - "name": "url", + "name": "include_template", + "type": "boolean" + }, + { + "description": "Optional upstream locale", + "in": "query", + "name": "locale", "type": "string", - "x-example": "https://pitchbook.com/profiles/limited-partner/864326-44" + "x-example": "en" } ], "produces": [ @@ -431160,7 +447298,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pitchbook.limitedPartnerResponseDoc" + "$ref": "#/definitions/polymarket.tagResponseDoc" } }, "400": { @@ -431193,56 +447331,51 @@ "ApiKeyAuth": [] } ], - "summary": "PitchBook limited partner profile", + "summary": "Get a Polymarket tag by id", "tags": [ - "PitchBook" + "Polymarket" ] } }, - "/pizzahut/bundle-choices": { + "/polymarket/tag/{id}/related-tags": { "get": { "consumes": [ "application/json" ], - "description": "Returns one deal/combo's full choice-builder tree -- every named slot it offers (e.g. \"1st Pizza\", \"Wings or Fries\", \"1st Dip\") and every product variant a caller can pick to fill that slot, each with the real price delta selecting it adds over the bundle's base price (zero for a variant already covered by the deal, positive for an upgrade such as a larger size or a specialty pizza). This is a different structure from /pizzahut/modifiers -- that endpoint customizes toppings/sauces on one product variant, while this endpoint swaps whole product variants in and out of a multi-item combo. bundle_code comes from /pizzahut/menu's code field on a type=bundle item.", - "operationId": "pizzahut-bundle-choices", + "description": "Lists the Polymarket tags related to one tag, identified by the required tag `id`. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each tag has its id, label and slug. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-related-tags", "parameters": [ { - "description": "Pizza Hut's store number, from /pizzahut/stores", - "in": "query", - "name": "store_number", + "description": "Polymarket tag id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "040937" + "x-example": "21" }, { - "description": "A deal/combo's bundle code, from /pizzahut/menu's code field on a type=bundle item", + "description": "Omit empty related tags", + "enum": [ + "true", + "false" + ], "in": "query", - "name": "bundle_code", - "required": true, + "name": "omit_empty", + "type": "string" + }, + { + "description": "Optional upstream status filter", + "in": "query", + "name": "status", "type": "string", - "x-example": "MEAL501BD" + "x-example": "active" }, { - "description": "Order channel the deal and pricing reflect (default WEB)", - "enum": [ - "WEB", - "MOBILE", - "POS", - "KIOSK", - "DOORDASH", - "UBEREATS", - "GRUBHUB", - "IOS", - "ANDROID", - "DELIVEROO", - "JUST_EAT", - "CALL_CENTER" - ], + "description": "Optional upstream locale", "in": "query", - "name": "channel", + "name": "locale", "type": "string", - "x-example": "WEB" + "x-example": "en" } ], "produces": [ @@ -431252,7 +447385,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pizzahut.bundleChoicesResponseDoc" + "$ref": "#/definitions/polymarket.tagsResponseDoc" } }, "400": { @@ -431261,12 +447394,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -431285,116 +447412,51 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Pizza Hut deal/combo's full choice-builder tree", + "summary": "Get related Polymarket tags by id", "tags": [ - "Pizza Hut" + "Polymarket" ] } }, - "/pizzahut/delivery-estimate": { + "/polymarket/tag/{id}/related-tags/tags": { "get": { "consumes": [ "application/json" ], - "description": "Checks whether a Pizza Hut restaurant's delivery integration can deliver to a given address and, when it can, the estimated delivery fee (broken down by fee line item) and pickup/dropoff time. This is a checkout-time estimate -- it does not add an item to a cart or place an order, and takes no payment or account information. serviceable is true only when the upstream returned a real estimate; a false value with reason populated covers every other case seen live, such as the requested delivery_provider not being enabled at that store. For the default INTERNAL provider, a serviceable result does not by itself confirm the address is within a real deliverable radius -- see this endpoint's markdown doc for the caveat. order_subtotal materially affects the fee estimate, so it is required rather than defaulted. pickup_at defaults to 30 minutes from now (an \"order now\" style estimate) when omitted.", - "operationId": "pizzahut-delivery-estimate", + "description": "Returns the related-tag relationship rows for one Polymarket tag, identified by the required tag `id`. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each row has an id, label and slug. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-related-tag-rows", "parameters": [ { - "description": "Pizza Hut's store number, from /pizzahut/stores", - "in": "query", - "name": "store_number", - "required": true, - "type": "string", - "x-example": "040937" - }, - { - "description": "Delivery address line 1", - "in": "query", - "name": "address1", - "required": true, - "type": "string", - "x-example": "250 W 57th St" - }, - { - "description": "Delivery address line 2", - "in": "query", - "name": "address2", - "type": "string", - "x-example": "" - }, - { - "description": "Delivery address city", - "in": "query", - "name": "city", - "required": true, - "type": "string", - "x-example": "New York" - }, - { - "description": "Delivery address state, two-letter code", - "in": "query", - "name": "state", - "required": true, - "type": "string", - "x-example": "NY" - }, - { - "description": "Delivery address postal code", - "in": "query", - "name": "postal_code", + "description": "Polymarket tag id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "10019" - }, - { - "description": "Delivery address country code (default US)", - "in": "query", - "name": "country_code", - "type": "string", - "x-example": "US" - }, - { - "description": "Delivery address latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 40.7656 - }, - { - "description": "Delivery address longitude", - "in": "query", - "name": "longitude", - "required": true, - "type": "number", - "x-example": -73.982 + "x-example": "21" }, { - "description": "Order subtotal before fees, in dollars", + "description": "Omit empty related tags", + "enum": [ + "true", + "false" + ], "in": "query", - "name": "order_subtotal", - "required": true, - "type": "number", - "x-example": 10 + "name": "omit_empty", + "type": "string" }, { - "description": "RFC3339 pickup time (default 30 minutes from now)", + "description": "Optional upstream status filter", "in": "query", - "name": "pickup_at", + "name": "status", "type": "string", - "x-example": "2026-09-05T20:00:00Z" + "x-example": "active" }, { - "description": "Delivery provider to check (default INTERNAL)", - "enum": [ - "DOORDASH", - "MOCK_DOORDASH", - "INTERNAL" - ], + "description": "Optional upstream locale", "in": "query", - "name": "delivery_provider", + "name": "locale", "type": "string", - "x-example": "INTERNAL" + "x-example": "en" } ], "produces": [ @@ -431404,7 +447466,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pizzahut.deliveryEstimateResponseDoc" + "$ref": "#/definitions/polymarket.tagsResponseDoc" } }, "400": { @@ -431413,12 +447475,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -431437,48 +447493,70 @@ "ApiKeyAuth": [] } ], - "summary": "Check Pizza Hut delivery serviceability and estimated fee for one store and address", + "summary": "Get related Polymarket tag rows by id", "tags": [ - "Pizza Hut" + "Polymarket" ] } }, - "/pizzahut/menu": { + "/polymarket/tags": { "get": { "consumes": [ "application/json" ], - "description": "Returns one restaurant's full menu grouped into categories (e.g. \"Pizza\", \"Wings\", \"Deals\"). Every entry is a product, a bundle (a deal or combo), or a standalone priced variant -- type tells callers which -- and carries a price in USD cents plus a decimal dollar value, and an image when the upstream publishes one. A product item also lists variants: every other priced size/crust/style option beyond its default (e.g. a pizza's Personal Pan through Large Original Stuffed Crust). Prices reflect this specific restaurant and order channel, not a national default. channel selects which order channel the menu is priced for (web ordering by default); prices can genuinely differ by channel (e.g. a delivery-marketplace channel vs. web). Some restaurants also carry products with no category at all (e.g. individual dip cup flavors); these are returned separately as uncategorized_items rather than silently dropped.", - "operationId": "pizzahut-menu", + "description": "Lists Polymarket tags, up to `limit` rows (default 25, max 100), starting at `offset` (default 0, max 10000). Sort with `order` and flip direction with `ascending` (`true` or `false`); `locale` is optional. Each tag has its id, label and slug.", + "operationId": "polymarket-tags", "parameters": [ { - "description": "Pizza Hut's store number, from /pizzahut/stores", + "description": "Maximum tags, defaults to 25 and supports up to 100", "in": "query", - "name": "store_number", - "required": true, - "type": "string", - "x-example": "040937" + "name": "limit", + "type": "integer", + "x-example": 25 }, { - "description": "Order channel the menu is priced for (default WEB)", + "description": "Result offset, defaults to 0 and supports up to 10000", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "default": "label", + "description": "Sort field", "enum": [ - "WEB", - "MOBILE", - "POS", - "KIOSK", - "DOORDASH", - "UBEREATS", - "GRUBHUB", - "IOS", - "ANDROID", - "DELIVEROO", - "JUST_EAT", - "CALL_CENTER" + "volume24hr", + "volume", + "liquidity", + "endDate", + "updatedAt", + "createdAt", + "id", + "slug", + "title", + "question", + "label" ], "in": "query", - "name": "channel", + "name": "order", + "type": "string" + }, + { + "description": "Sort ascending flag", + "enum": [ + "true", + "false" + ], + "in": "query", + "name": "ascending", + "type": "string" + }, + { + "description": "Optional upstream locale", + "in": "query", + "name": "locale", "type": "string", - "x-example": "WEB" + "x-example": "en" } ], "produces": [ @@ -431488,7 +447566,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pizzahut.menuResponseDoc" + "$ref": "#/definitions/polymarket.tagsResponseDoc" } }, "400": { @@ -431497,12 +447575,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -431521,56 +447593,74 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Pizza Hut restaurant's full priced menu", + "summary": "List Polymarket tags", "tags": [ - "Pizza Hut" + "Polymarket" ] } }, - "/pizzahut/modifiers": { + "/polymarket/teams": { "get": { "consumes": [ "application/json" ], - "description": "Returns one product variant's full build-your-own customization tree -- every slot (e.g. \"Pizza Sauce\", \"Pizza Cheese\", \"Pizza Toppings\", \"Crust Finishers\"), every modifier within it (a specific topping, sauce flavor, or seasoning), and every weight/placement option (e.g. Light, Regular, Extra, or a Left/Right/Whole pizza-half placement) with its own real price delta -- zero for an amount already included by default, a positive upcharge for an \"extra\" option. variant_code comes from /pizzahut/menu's variant_code or variants[].variant_code fields.", - "operationId": "pizzahut-modifiers", + "description": "Lists Polymarket sports teams as rows under `data`. Filter by `league`, `name`, `abbreviation` or `provider_id`, and page with `limit`, `offset`, `order` and `ascending`. The response includes a `fetched_at` time.", + "operationId": "polymarket-teams", "parameters": [ { - "description": "Pizza Hut's store number, from /pizzahut/stores", + "description": "Optional league filter", "in": "query", - "name": "store_number", - "required": true, + "name": "league", "type": "string", - "x-example": "040937" + "x-example": "NBA" }, { - "description": "A product's specific size/crust/style variant code, from /pizzahut/menu", + "description": "Optional team name filter", "in": "query", - "name": "variant_code", - "required": true, + "name": "name", "type": "string", - "x-example": "variant_CLSS001_010BCYO1T_SIZE060L_BASE020H" + "x-example": "Knicks" }, { - "description": "Order channel the customization tree and pricing reflect (default WEB)", - "enum": [ - "WEB", - "MOBILE", - "POS", - "KIOSK", - "DOORDASH", - "UBEREATS", - "GRUBHUB", - "IOS", - "ANDROID", - "DELIVEROO", - "JUST_EAT", - "CALL_CENTER" - ], + "description": "Optional abbreviation filter", "in": "query", - "name": "channel", + "name": "abbreviation", "type": "string", - "x-example": "WEB" + "x-example": "NYK" + }, + { + "description": "Optional provider id filter", + "in": "query", + "name": "provider_id", + "type": "string" + }, + { + "description": "Rows to return", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 25 + }, + { + "description": "Result offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Optional upstream sort field", + "in": "query", + "name": "order", + "type": "string", + "x-example": "name" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" } ], "produces": [ @@ -431580,7 +447670,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pizzahut.modifiersResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -431589,12 +447679,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -431613,27 +447697,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Pizza Hut product variant's full customization tree", + "summary": "Polymarket teams", "tags": [ - "Pizza Hut" + "Polymarket" ] } }, - "/pizzahut/store": { + "/polymarket/teams/by-partner": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Pizza Hut restaurant's detail by its exact store number, from /pizzahut/stores, including its recurring open hours per order channel (carryout, delivery, dine-in, drive-thru, catering carryout) plus each channel's ordering constraints -- minimum/maximum order amount, whether tipping is offered, and accepted payment methods. A channel this restaurant does not offer at all is omitted from hours rather than reported as always-closed.", - "operationId": "pizzahut-store", + "description": "Looks up Polymarket teams by a partner's identifiers, using `partner` (the partner name) and `external_id` (the partner's own id for the team). Matching teams come back as rows under `data`, with a `fetched_at` time.", + "operationId": "polymarket-teams-by-partner", "parameters": [ { - "description": "Pizza Hut's store number, from /pizzahut/stores", + "description": "Partner name", "in": "query", - "name": "store_number", - "required": true, + "name": "partner", "type": "string", - "x-example": "040937" + "x-example": "nba" + }, + { + "description": "Partner external id", + "in": "query", + "name": "external_id", + "type": "string", + "x-example": "123" } ], "produces": [ @@ -431643,7 +447733,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pizzahut.storeResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -431652,12 +447742,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -431676,103 +447760,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Pizza Hut restaurant by its store number", + "summary": "Polymarket teams by partner", "tags": [ - "Pizza Hut" + "Polymarket" ] } }, - "/pizzahut/stores": { + "/polymarket/teams/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Pizza Hut restaurants matching a city/state/postal code/name/franchise code/store number filter. At least one filter is required -- an unfiltered call would enumerate every US restaurant in one response, which this endpoint intentionally does not expose. Each restaurant carries its store number (the value /pizzahut/menu and /pizzahut/store take), full address with coordinates, phone, whether it currently accepts online orders, and its timezone.", - "operationId": "pizzahut-stores", + "description": "Returns the Polymarket reference record for one sports team, identified by the required team `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-team", "parameters": [ { - "description": "Exact store number", - "in": "query", - "name": "store_number", - "type": "string", - "x-example": "040937" - }, - { - "description": "Restaurant city", - "in": "query", - "name": "city", - "type": "string", - "x-example": "New York" - }, - { - "description": "Restaurant state, two-letter code", - "in": "query", - "name": "state", - "type": "string", - "x-example": "NY" - }, - { - "description": "Restaurant postal code", - "in": "query", - "name": "postal_code", - "type": "string", - "x-example": "10019" - }, - { - "description": "Restaurant name, partial match", - "in": "query", - "name": "name", - "type": "string", - "x-example": "040937" - }, - { - "description": "Exact franchise/operator code", - "in": "query", - "name": "franchise_code", - "type": "string" - }, - { - "description": "Restrict to restaurants Pizza Hut's own storefront marks customer-facing. Unfiltered (upstream default) unless set -- passing true returns zero results for every region tested during research, so it is not defaulted on", - "in": "query", - "name": "appear_in_store_results", - "type": "boolean", - "x-example": false - }, - { - "description": "Restrict to restaurants currently accepting (true) or not accepting (false) online orders. Unfiltered (upstream default) unless set", - "in": "query", - "name": "accepting_online_orders", - "type": "boolean", - "x-example": true - }, - { - "description": "Set true to include archived/closed restaurant records, which the upstream default (unset) already excludes. Set false to make that exclusion explicit", - "in": "query", - "name": "is_archived", - "type": "boolean", - "x-example": false - }, - { - "description": "Sort order", - "enum": [ - "store_number_asc", - "store_number_desc", - "name_asc", - "name_desc", - "franchise_code_asc", - "franchise_code_desc" - ], - "in": "query", - "name": "sort", - "type": "string", - "x-example": "name_asc" - }, - { - "description": "Maximum restaurants to return, 1-50 (default 20)", - "in": "query", - "name": "max_results", + "description": "Polymarket team id", + "in": "path", + "name": "id", + "required": true, "type": "integer", - "x-example": 20 + "x-example": 3270556 } ], "produces": [ @@ -431782,7 +447790,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pizzahut.storesResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -431791,6 +447799,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -431809,40 +447823,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Pizza Hut restaurants by city, state, postal code, name, franchise code, or store number", + "summary": "Polymarket team detail", "tags": [ - "Pizza Hut" + "Polymarket" ] } }, - "/playstation/browse": { + "/polymarket/teams/{id}/external-partners": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of the PlayStation Store \"all games\" grid with per-item price, platforms, and media, plus the available filter facets (price, genre, platform, subscription, content type, etc.) with value counts. Pass page to advance; next_page is set when more results exist. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-browse", + "description": "Returns the external partner records linked to one Polymarket team, identified by the required team `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-team-external-partners", "parameters": [ { - "default": 1, - "description": "1-based page number", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "description": "Polymarket team id", + "in": "path", + "name": "id", + "required": true, + "type": "integer", + "x-example": 3270556 } ], "produces": [ @@ -431852,7 +447853,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.gridResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -431861,6 +447862,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -431873,48 +447886,35 @@ "ApiKeyAuth": [] } ], - "summary": "Browse the PlayStation Store all-games grid", + "summary": "Polymarket team external partners", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/category": { + "/polymarket/teams/{id}/external-partners/{partner_ref}": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of a specific PlayStation Store category grid (by category UUID) with per-item price, platforms, and media, plus the available filter facets with value counts. Pass page to advance; next_page is set when more results exist. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-category", + "description": "Returns the external partner record for one Polymarket team, identified by the team `id` and a `partner_ref`, both required. The record comes back under `data` with a `fetched_at` time. Invalid identifiers return an invalid-parameter error.", + "operationId": "polymarket-team-external-partner", "parameters": [ { - "description": "Category UUID", - "in": "query", + "description": "Polymarket team id", + "in": "path", "name": "id", "required": true, - "type": "string", - "x-example": "e7d3a34c-9a4a-4a94-a0d1-e42c94d0a3fb" - }, - { - "default": 1, - "description": "1-based page number", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" + "type": "integer", + "x-example": 3270556 }, { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "description": "Partner reference", + "in": "path", + "name": "partner_ref", + "required": true, + "type": "string", + "x-example": "nba" } ], "produces": [ @@ -431924,7 +447924,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.gridResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -431939,6 +447939,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -431951,41 +447957,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a PlayStation Store category grid", + "summary": "Polymarket team external partner", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/concept": { + "/polymarket/token/{token_id}/midpoint": { "get": { "consumes": [ "application/json" ], - "description": "Returns store metadata for a PlayStation concept: title, publisher, release date, platforms, genres, description, content rating, aggregate star rating, the default product's purchase price, media, and the full lists of purchasable editions and add-ons. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-concept", + "description": "Returns the current midpoint price for one Polymarket outcome token, identified by the required `token_id`, as a single `midpoint` number such as 0.285. It is a read-only snapshot, returned with a `fetched_at` time and the `token_id`, and is not investment advice.", + "operationId": "polymarket-token-midpoint", "parameters": [ { - "description": "Numeric PlayStation concept id", - "in": "query", - "name": "id", + "description": "Polymarket CLOB token id", + "in": "path", + "name": "token_id", "required": true, "type": "string", - "x-example": "10000237" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" } ], "produces": [ @@ -431995,7 +447987,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.conceptResponseDoc" + "$ref": "#/definitions/polymarket.tokenMidpointResponseDoc" } }, "400": { @@ -432010,6 +448002,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432022,79 +448020,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get PlayStation Store details for a concept (game hub)", + "summary": "Get Polymarket token midpoint", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/concept/reviews": { + "/polymarket/token/{token_id}/orderbook": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of written PlayStation Store reviews for a concept (game hub), each with its title, body, rating, helpful count, spoiler flag, the edition the reviewer owned, and reviewer identity (online id, PS Plus subscriber status, verified-purchase status, avatar). Also includes the concept's aggregate star rating (including its rating distribution). page/page_size page through the full review list (total_count reports the true upstream review count, has_next_page whether a later page has more), sort controls ordering, and rating optionally filters to one star value. Reviews are region-scoped: cc selects the store region whose reviews are returned (and the price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-concept-reviews", + "description": "Returns the order book for one Polymarket outcome token, identified by the required `token_id`. The `book` has `bids` and `asks` as price and size pairs, the last trade price, tick size, minimum order size, condition id and a timestamp. Prices and sizes are numbers.", + "operationId": "polymarket-token-orderbook", "parameters": [ { - "description": "Numeric PlayStation concept id", - "in": "query", - "name": "id", + "description": "Polymarket CLOB token id", + "in": "path", + "name": "token_id", "required": true, "type": "string", - "x-example": "10002456" - }, - { - "default": "us", - "description": "Store country code (ISO)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" - }, - { - "default": 1, - "description": "1-based page number", - "in": "query", - "maximum": 10000, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 10, - "description": "Reviews per page", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page_size", - "type": "integer" - }, - { - "default": "latest", - "description": "Sort order", - "enum": [ - "latest", - "oldest", - "helpful" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Filter to one star rating (1-5)", - "in": "query", - "maximum": 5, - "minimum": 1, - "name": "rating", - "type": "integer" + "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" } ], "produces": [ @@ -432104,7 +448050,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.conceptReviewsResponseDoc" + "$ref": "#/definitions/polymarket.tokenOrderBookResponseDoc" } }, "400": { @@ -432119,6 +448065,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432131,32 +448083,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get PlayStation concept reviews", + "summary": "Get Polymarket token order book", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/deals": { + "/polymarket/token/{token_id}/price": { "get": { "consumes": [ "application/json" ], - "description": "Returns the PlayStation Store deals landing page as a list of merchandising shelves (sections), each with its titles and per-item price, plus a flattened, de-duplicated item list across all shelves. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-deals", + "description": "Returns the current price for one Polymarket outcome token, identified by the required `token_id`. `side` is `buy` or `sell` and defaults to `buy`. The response gives the `price` as a number, the `side` used and a `fetched_at` time. It is a snapshot, not trading advice.", + "operationId": "polymarket-token-price", "parameters": [ { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" + "description": "Polymarket CLOB token id", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" }, { - "default": "en", - "description": "Language code", + "default": "buy", + "description": "Order side used for the CLOB price", + "enum": [ + "buy", + "sell" + ], "in": "query", - "name": "l", + "name": "side", "type": "string" } ], @@ -432167,7 +448124,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.merchResponseDoc" + "$ref": "#/definitions/polymarket.tokenPriceResponseDoc" } }, "400": { @@ -432176,6 +448133,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432188,33 +448157,64 @@ "ApiKeyAuth": [] } ], - "summary": "Get PlayStation Store deals shelves", + "summary": "Get Polymarket token price", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/latest": { + "/polymarket/token/{token_id}/price-history": { "get": { "consumes": [ "application/json" ], - "description": "Returns the PlayStation Store latest-releases landing page as a list of merchandising shelves (sections), each with its titles and per-item price, plus a flattened, de-duplicated item list across all shelves. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-latest", + "description": "Returns price history points for one Polymarket outcome token, identified by the required `token_id`. `interval` is one of `1m`, `1h`, `6h`, `1d` (default), `1w`, `all` or `max`; `fidelity` sets minutes per point (0 means 60, max 1440); `start_ts` and `end_ts` bound the range. Each point has a Unix `timestamp` and `price`. No points returns 404.", + "operationId": "polymarket-token-price-history", "parameters": [ { - "default": "us", - "description": "Store country code (ISO, selects currency)", + "description": "Polymarket CLOB token id", + "in": "path", + "name": "token_id", + "required": true, + "type": "string", + "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" + }, + { + "default": "1d", + "description": "History interval", + "enum": [ + "1m", + "1h", + "6h", + "1d", + "1w", + "all", + "max" + ], "in": "query", - "name": "cc", + "name": "interval", "type": "string" }, { - "default": "en", - "description": "Language code", + "description": "Data point resolution in minutes; 0 uses the default 60; maximum 1440", "in": "query", - "name": "l", - "type": "string" + "name": "fidelity", + "type": "integer", + "x-example": 60 + }, + { + "description": "Optional Unix timestamp lower bound", + "in": "query", + "name": "start_ts", + "type": "integer", + "x-example": 1780754400 + }, + { + "description": "Optional Unix timestamp upper bound", + "in": "query", + "name": "end_ts", + "type": "integer", + "x-example": 1780840800 } ], "produces": [ @@ -432224,7 +448224,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.merchResponseDoc" + "$ref": "#/definitions/polymarket.tokenPriceHistoryResponseDoc" } }, "400": { @@ -432233,6 +448233,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432245,41 +448257,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get PlayStation Store latest-release shelves", + "summary": "Get Polymarket token price history", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/page": { + "/polymarket/token/{token_id}/spread": { "get": { "consumes": [ "application/json" ], - "description": "Reads any PlayStation Store merchandising page by alias (e.g. collections, subscriptions, or a promotional alias) and returns its shelves (sections) plus the curated collection links found on the page. Each collection link carries a category_id (UUID) you can pass to /playstation/category to fetch that collection's full, paginated title grid. Known aliases: collections, subscriptions, deals, latest. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-page", + "description": "Returns the current bid-ask spread for one Polymarket outcome token, identified by the required `token_id`, as a single `spread` number. It is a read-only snapshot with a `fetched_at` time and is not investment advice.", + "operationId": "polymarket-token-spread", "parameters": [ { - "description": "Merchandising page alias", - "in": "query", - "name": "alias", + "description": "Polymarket CLOB token id", + "in": "path", + "name": "token_id", "required": true, "type": "string", - "x-example": "collections" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" } ], "produces": [ @@ -432289,7 +448287,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.merchResponseDoc" + "$ref": "#/definitions/polymarket.tokenSpreadResponseDoc" } }, "400": { @@ -432298,6 +448296,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432310,41 +448320,28 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PlayStation Store merchandising page by alias", + "summary": "Get Polymarket token spread", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/product": { - "get": { + "/polymarket/tokens/midpoints": { + "post": { "consumes": [ "application/json" ], - "description": "Returns store metadata for a single PlayStation product/edition: title, np title id, parent concept id, product type and store classification, edition name, publisher, release date, platforms, genres, spoken/screen languages, content rating, aggregate star rating, purchase price, and media. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-product", + "description": "Returns public CLOB midpoints for up to 25 Polymarket token ids. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-tokens-midpoints", "parameters": [ { - "description": "PlayStation product id", - "in": "query", - "name": "id", + "description": "Token ids request body", + "in": "body", + "name": "body", "required": true, - "type": "string", - "x-example": "UP0001-PPSA01491_00-GAME000000000000" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "schema": { + "$ref": "#/definitions/polymarket.BatchTokenMidpointsOption" + } } ], "produces": [ @@ -432354,7 +448351,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.productResponseDoc" + "$ref": "#/definitions/polymarket.batchTokenMidpointsResponseDoc" } }, "400": { @@ -432369,6 +448366,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432381,55 +448384,28 @@ "ApiKeyAuth": [] } ], - "summary": "Get PlayStation Store details for a single product", + "summary": "Get Polymarket token midpoints", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/search": { - "get": { + "/polymarket/tokens/orderbooks": { + "post": { "consumes": [ "application/json" ], - "description": "Returns a page of PlayStation Store search results (concepts and products) for a term, with pagination and per-item price, platforms, classification, and media. Pass page to advance; next_page is set when more results exist. cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-search", + "description": "Returns public CLOB order-book depth for up to 25 Polymarket token ids. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-tokens-orderbooks", "parameters": [ { - "description": "Search term", - "in": "query", - "name": "term", + "description": "Token ids request body", + "in": "body", + "name": "body", "required": true, - "type": "string", - "x-example": "god of war" - }, - { - "default": 1, - "description": "1-based page number", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": 24, - "description": "Results per page (max 48)", - "in": "query", - "name": "page_size", - "type": "integer" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "schema": { + "$ref": "#/definitions/polymarket.BatchTokenOrderBooksOption" + } } ], "produces": [ @@ -432439,7 +448415,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.searchResponseDoc" + "$ref": "#/definitions/polymarket.batchTokenOrderBooksResponseDoc" } }, "400": { @@ -432448,6 +448424,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432460,48 +448448,28 @@ "ApiKeyAuth": [] } ], - "summary": "Search the PlayStation Store", + "summary": "Get Polymarket token order books", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/playstation/suggest": { - "get": { + "/polymarket/tokens/prices": { + "post": { "consumes": [ "application/json" ], - "description": "Returns typeahead-style PlayStation Store search suggestions for a partial or full term: id, name, classification, platforms, publisher, release date, price, a representative image, and a direct store URL per match. Matching is upstream-ordered and loose (it may include titles that only loosely relate to the term), not a ranked exact-substring search. limit caps how many suggestions are returned (max 20; the upstream API does not honor a higher value). cc selects the store region (and price currency); l accepts a language code or locale such as en or en-US, with the locale's primary language used for text.", - "operationId": "playstation-suggest", + "description": "Returns public CLOB buy and sell prices for up to 25 Polymarket token ids. The `side` enum accepts `buy` and `sell`; when omitted, both sides are returned. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-tokens-prices", "parameters": [ { - "description": "Search term (partial or full)", - "in": "query", - "name": "term", + "description": "Token ids request body", + "in": "body", + "name": "body", "required": true, - "type": "string", - "x-example": "god of war" - }, - { - "default": 5, - "description": "Maximum number of suggestions to return (max 20)", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "schema": { + "$ref": "#/definitions/polymarket.BatchTokenPricesOption" + } } ], "produces": [ @@ -432511,7 +448479,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/playstation.suggestResponseDoc" + "$ref": "#/definitions/polymarket.batchTokenPricesResponseDoc" } }, "400": { @@ -432520,6 +448488,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432532,24 +448512,28 @@ "ApiKeyAuth": [] } ], - "summary": "Get PlayStation Store search suggestions for a term", + "summary": "Get Polymarket token prices", "tags": [ - "PlayStation" + "Polymarket" ] } }, - "/politico/article": { - "get": { - "description": "Returns a Politico article by its canonical `url`, in the form `https://www.politico.com/news/YYYY/MM/DD/slug`. The response has the title, description, authors, publication and update times, lead image URL and the body `paragraphs`.", - "operationId": "politico-article", + "/polymarket/tokens/spreads": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Returns public CLOB spreads for up to 25 Polymarket token ids. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", + "operationId": "polymarket-tokens-spreads", "parameters": [ { - "description": "Canonical www.politico.com article URL", - "in": "query", - "name": "url", + "description": "Token ids request body", + "in": "body", + "name": "body", "required": true, - "type": "string", - "x-example": "https://www.politico.com/news/2026/09/18/congress-f-35-china-investigation-01083647" + "schema": { + "$ref": "#/definitions/polymarket.BatchTokenSpreadsOption" + } } ], "produces": [ @@ -432559,7 +448543,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/politico.articleResponseDoc" + "$ref": "#/definitions/polymarket.batchTokenSpreadsResponseDoc" } }, "400": { @@ -432592,30 +448576,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get Politico article content", + "summary": "Get Polymarket token spreads", "tags": [ - "Politico" + "Polymarket" ] } }, - "/politico/author": { + "/polymarket/tournaments": { "get": { - "description": "Returns one Politico staff author's public profile: name, job title, bio, headshot, and their most recent bylined articles. Politico staff pages expose a fixed-size recent-articles list with no pagination.", - "operationId": "politico-author", + "consumes": [ + "application/json" + ], + "description": "Lists Polymarket tournaments as rows under `data`, with a `fetched_at` time. Page with `limit` and `offset`, and sort with `order` and `ascending`. The data is reference data, not real-time trading data or investment advice.", + "operationId": "polymarket-tournaments", "parameters": [ { - "description": "Politico staff slug, e.g. mark-satter", + "description": "Rows to return", "in": "query", - "name": "slug", - "type": "string", - "x-example": "mark-satter" + "name": "limit", + "type": "integer", + "x-example": 25 }, { - "description": "Canonical www.politico.com/staff/ URL, as an alternative to slug", + "description": "Result offset", "in": "query", - "name": "url", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Optional upstream sort field", + "in": "query", + "name": "order", "type": "string", - "x-example": "https://www.politico.com/staff/mark-satter" + "x-example": "name" + }, + { + "default": false, + "description": "Sort ascending when true", + "in": "query", + "name": "ascending", + "type": "boolean" } ], "produces": [ @@ -432625,7 +448626,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/politico.authorResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" } }, "400": { @@ -432634,12 +448635,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -432658,16 +448653,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Politico staff author profile", + "summary": "Polymarket tournaments", "tags": [ - "Politico" + "Polymarket" ] } }, - "/politico/categories": { + "/polymarket/tournaments/{id}": { "get": { - "description": "Returns Politico's full public section navigation tree, grouped the same way the site's own nav menu groups it. Use a section's slug directly as the topic parameter on politico-topic.", - "operationId": "politico-categories", + "consumes": [ + "application/json" + ], + "description": "Returns the Polymarket reference record for one tournament, identified by the required tournament `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", + "operationId": "polymarket-tournament", + "parameters": [ + { + "description": "Polymarket tournament id", + "in": "path", + "name": "id", + "required": true, + "type": "integer", + "x-example": 2 + } + ], "produces": [ "application/json" ], @@ -432675,7 +448683,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/politico.categoriesResponseDoc" + "$ref": "#/definitions/polymarket.publicDataResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -432696,16 +448716,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get Politico section navigation", + "summary": "Polymarket tournament detail", "tags": [ - "Politico" + "Polymarket" ] } }, - "/politico/headlines": { + "/popeyes/faq": { "get": { - "description": "Returns the latest Politico stories across the whole site, not limited to one section. Takes no parameters. Each item has its title, URL, a short summary, publication time and author.", - "operationId": "politico-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a page of Popeyes' published customer-support FAQ -- questions and answers such as \"How do I remove items from my cart?\". This is public help-center content, not account/order-specific support state, and does not require an order id or any customer identifier.", + "operationId": "popeyes-faq", + "parameters": [ + { + "description": "Maximum FAQ entries to return, 1-100 (default 20)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Number of FAQ entries to skip, for paging (default 0)", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + } + ], "produces": [ "application/json" ], @@ -432713,7 +448752,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/politico.headlinesResponseDoc" + "$ref": "#/definitions/popeyes.faqResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -432734,24 +448779,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Politico site-wide headlines", + "summary": "List Popeyes' published customer-support FAQ", "tags": [ - "Politico" + "Popeyes" ] } }, - "/politico/topic": { + "/popeyes/location": { "get": { - "description": "Returns the newest public Politico stories on one section archive page. topic is a section slug -- see politico-categories for the full known value space.", - "operationId": "politico-topic", + "consumes": [ + "application/json" + ], + "description": "Returns one restaurant's full detail -- the same fields /popeyes/locations returns per restaurant (address, coordinates, phone, operator, amenity flags, full published hours) -- looked up directly by its numeric store id instead of a coordinate/radius search. Useful when the store id is already known, e.g. from a prior /popeyes/locations call. An unknown store id returns a 404.", + "operationId": "popeyes-location", "parameters": [ { - "description": "Politico section slug", + "description": "Popeyes' numeric store id, from /popeyes/locations", "in": "query", - "name": "topic", + "name": "store_id", "required": true, "type": "string", - "x-example": "congress-news-updates-analysis" + "x-example": "14156" + }, + { + "description": "Restaurant market: `US` (default) or `CA`", + "in": "query", + "name": "market", + "type": "string", + "x-example": "US" } ], "produces": [ @@ -432761,7 +448816,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/politico.topicResponseDoc" + "$ref": "#/definitions/popeyes.locationResponseDoc" } }, "400": { @@ -432794,24 +448849,56 @@ "ApiKeyAuth": [] } ], - "summary": "Get Politico section archive", + "summary": "Look up one Popeyes restaurant directly by store id", "tags": [ - "Politico" + "Popeyes" ] } }, - "/polygon/article": { + "/popeyes/locations": { "get": { - "description": "Returns a Polygon article by canonical `url` (`https://www.polygon.com//`): title, description, section, authors, publication and update times, lead image, body `paragraphs` and a `paywalled` flag. Section, guide and other non-article URLs, such as `/gaming-news/` or `/guides/`, are rejected as an invalid parameter.", - "operationId": "polygon-article", + "consumes": [ + "application/json" + ], + "description": "Returns Popeyes restaurants near a latitude/longitude. Each restaurant carries its internal id and numeric store id (the value /popeyes/menu takes), full address with coordinates, phone, the operating franchise group, amenity flags (breakfast, delivery, drive-thru, playground, takeout, wifi, halal, dark kitchen) and the full published week of hours for dining room, drive-thru, delivery and curbside separately. A coordinate with no nearby Popeyes returns an empty list rather than an error.", + "operationId": "popeyes-locations", "parameters": [ { - "description": "Canonical Polygon article URL", + "description": "Search center latitude", "in": "query", - "name": "url", + "name": "latitude", + "required": true, + "type": "number", + "x-example": 40.7128 + }, + { + "description": "Search center longitude", + "in": "query", + "name": "longitude", "required": true, + "type": "number", + "x-example": -74.006 + }, + { + "description": "Search radius in meters, 1-50000 (default 8000)", + "in": "query", + "name": "radius", + "type": "integer", + "x-example": 8000 + }, + { + "description": "Maximum restaurants to return, 1-50 (default 20)", + "in": "query", + "name": "max_results", + "type": "integer", + "x-example": 20 + }, + { + "description": "Restaurant market: `US` (default) or `CA`", + "in": "query", + "name": "market", "type": "string", - "x-example": "https://www.polygon.com/best-marvel-video-games-ever/" + "x-example": "US" } ], "produces": [ @@ -432821,7 +448908,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/popeyes.locationsResponseDoc" } }, "400": { @@ -432836,6 +448923,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432848,24 +448941,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polygon article content", + "summary": "Find Popeyes restaurants near a location", "tags": [ - "Polygon" + "Popeyes" ] } }, - "/polygon/author": { + "/popeyes/menu": { "get": { - "description": "Returns a Polygon author profile by canonical `url` (`https://www.polygon.com/author//`): name, `title`, `image_url`, `biography`, social links and the articles in the profile's Latest module. Title, image and biography appear only as the profile shows them. `social_links` holds the author's own accounts, not Polygon's internal follow link.", - "operationId": "polygon-author", + "consumes": [ + "application/json" + ], + "description": "Returns one restaurant's menu grouped into categories (e.g. \"Big Box\", \"Chicken Wraps\"). Every entry is an item, a combo, a picker (a variant-choice product such as \"choose your side\") or a bundle, and carries a price reflecting this specific restaurant when Popeyes reports one for that exact entry -- a missing price does not mean the item is free, it means this restaurant's pricing call did not cover that entry. Some menu entries are published directly at the top level outside any named section; these are grouped into a synthetic \"Featured\" category (featured true). Entries of type ITEM also carry published nutrition facts and allergen data when Popeyes reports them for that item; COMBO/PICKER/BUNDLE entries do not carry their own nutrition/allergen data.", + "operationId": "popeyes-menu", "parameters": [ { - "description": "Canonical Polygon author URL", + "description": "Popeyes' numeric store id, from /popeyes/locations", "in": "query", - "name": "url", + "name": "store_id", "required": true, "type": "string", - "x-example": "https://www.polygon.com/author/venter-jason/" + "x-example": "14156" + }, + { + "description": "Restaurant market: `US` (default) or `CA`", + "in": "query", + "name": "market", + "type": "string", + "x-example": "US" } ], "produces": [ @@ -432875,7 +448978,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.polygonAuthorResponseDoc" + "$ref": "#/definitions/popeyes.menuResponseDoc" } }, "400": { @@ -432890,6 +448993,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432902,41 +449011,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Polygon author profile", + "summary": "Get one Popeyes restaurant's menu with real per-store pricing", "tags": [ - "Polygon" + "Popeyes" ] } }, - "/polygon/headlines": { + "/popeyes/offers": { "get": { - "description": "Returns the latest Polygon stories for one section. `section` is required and takes one of 15 slugs, including `gaming-news`, `gaming-reviews`, `movie-tv-reviews`, `anime`, `guides` and `videos`. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "polygon-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a page of Popeyes' promotional offers/deals catalog -- named value deals (e.g. \"3Pc Signature Chicken for $5\"), percentage-off combos, and paper coupons. This is CMS content describing the offer catalog, the same kind of public data /popeyes/menu already reads from -- not a personalized or store-specific list, and not account/loyalty state. A missing price does not mean free; a price of 0 means the offer's discount is not expressed as a flat price (see offer_tag/name instead, e.g. a percentage-off deal). requires_authentication reflects the offer's own published redemption rules, not any account state this endpoint reads. The catalog spans hundreds of entries including ones no longer running; there is no upstream \"currently active\" flag, so pages should be read as reference data, not a guarantee every entry is live right now.", + "operationId": "popeyes-offers", "parameters": [ { - "description": "Polygon RSS section slug", - "enum": [ - "gaming-news", - "gaming-reviews", - "gaming-previews", - "gaming-features", - "entertainment-news", - "movie-tv-reviews", - "entertainment-features", - "anime", - "horror", - "sci-fi", - "fantasy", - "what-to-play", - "what-to-watch", - "guides", - "videos" - ], + "description": "Maximum offers to return, 1-100 (default 20)", "in": "query", - "name": "section", - "required": true, + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Number of offers to skip, for paging (default 0)", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Restaurant market: US (default) or CA", + "in": "query", + "name": "market", "type": "string", - "x-example": "gaming-news" + "x-example": "US" } ], "produces": [ @@ -432946,7 +449054,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/popeyes.offersResponseDoc" } }, "400": { @@ -432955,6 +449063,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -432967,16 +449081,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polygon section headlines", + "summary": "List Popeyes' promotional deals and coupons", "tags": [ - "Polygon" + "Popeyes" ] } }, - "/polygon/news": { + "/popeyes/promotions": { "get": { - "description": "Returns Polygon's latest top stories across the site, covering games and entertainment. Takes no parameters, and `polygon-headlines` narrows by section instead. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "polygon-news", + "consumes": [ + "application/json" + ], + "description": "Returns a page of Popeyes Rewards' bonus-points promotion catalog -- flat or multiplied points bonuses tied to a qualifying purchase (e.g. \"Get Double Bonus Points on Your Cart, minimum $20\"), distinct from /popeyes/offers (priced menu deals) and /popeyes/quests (multi-step challenges). This is public CMS content, not a signed-in member's own applied-promotions state. points_multiplier and bonus_points are mutually exclusive in practice -- a promotion is either an \"Nx points\" campaign or a flat bonus. start_date/end_date bound the promotion's published active window when Popeyes sets one; both empty means no published window restriction, not that the promotion is permanently active.", + "operationId": "popeyes-promotions", + "parameters": [ + { + "description": "Maximum promotions to return, 1-100 (default 20)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Number of promotions to skip, for paging (default 0)", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Restaurant market: US (default) or CA", + "in": "query", + "name": "market", + "type": "string", + "x-example": "US" + } + ], "produces": [ "application/json" ], @@ -432984,7 +449124,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/popeyes.promotionsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -433005,16 +449151,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polygon top stories", + "summary": "List Popeyes Rewards' bonus-points promotion catalog", "tags": [ - "Polygon" + "Popeyes" ] } }, - "/polygon/sections": { + "/popeyes/quests": { "get": { - "description": "Lists the Polygon sections that `polygon-headlines` accepts, from `gaming-news` and `gaming-reviews` to `guides` and `videos`. Each entry has a `slug`, a display `name` and the section's feed `url`.", - "operationId": "polygon-sections", + "consumes": [ + "application/json" + ], + "description": "Returns a page of Popeyes Rewards' loyalty-challenge catalog -- named multi-step challenges and their reward (e.g. \"Make Two Purchases, Get FREE Chicken Sandwich in the form of 550 Bonus Points\"). This is public CMS content describing the challenge and its incentive, the same class of public promotional data as /popeyes/offers -- not scoped to any signed-in member and does not report which quests a given account has completed or activated. step_count is how many steps make up the quest; this build does not expose each step's own purchase-requirement rules.", + "operationId": "popeyes-quests", + "parameters": [ + { + "description": "Maximum quests to return, 1-100 (default 20)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Number of quests to skip, for paging (default 0)", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Restaurant market: US (default) or CA", + "in": "query", + "name": "market", + "type": "string", + "x-example": "US" + } + ], "produces": [ "application/json" ], @@ -433022,7 +449194,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/popeyes.questsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -433031,84 +449221,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polygon RSS sections", + "summary": "List Popeyes Rewards' loyalty-challenge catalog", "tags": [ - "Polygon" + "Popeyes" ] } }, - "/polymarket/activity/trades": { + "/popeyes/rewards": { "get": { "consumes": [ "application/json" ], - "description": "Returns public trade rows used by Polymarket's `/activity` page. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`.", - "operationId": "polymarket-activity-trades", + "description": "Returns a page of Popeyes Rewards' points-redemption catalog -- menu items and combos a member can redeem directly for a fixed number of loyalty points (e.g. \"600 points for Cheese Bites\"), distinct from /popeyes/offers (priced deals), /popeyes/quests (challenges) and /popeyes/promotions (bonus-points campaigns). This is public CMS content, not a signed-in member's own points balance or redemption history. points is the loyalty points cost to redeem; other per-account/per-order redemption restrictions Popeyes may publish on a reward are not exposed by this endpoint.", + "operationId": "popeyes-rewards", "parameters": [ { - "description": "Maximum trades, defaults to 50 and supports up to 100", + "description": "Maximum rewards to return, 1-100 (default 20)", "in": "query", "name": "limit", "type": "integer", - "x-example": 50 + "x-example": 20 }, { - "description": "Result offset, defaults to 0 and supports up to 10000", + "description": "Number of rewards to skip, for paging (default 0)", "in": "query", "name": "offset", "type": "integer", "x-example": 0 }, { - "default": "true", - "description": "Taker-only filter", - "enum": [ - "true", - "false" - ], - "in": "query", - "name": "taker_only", - "type": "string" - }, - { - "default": "CASH", - "description": "Activity amount filter type", - "enum": [ - "CASH" - ], - "in": "query", - "name": "filter_type", - "type": "string" - }, - { - "default": "1", - "description": "Minimum filtered amount", - "enum": [ - "1", - "5", - "10", - "100", - "1000", - "10000", - "100000" - ], - "in": "query", - "name": "filter_amount", - "type": "string" - }, - { - "description": "Optional Polymarket event id", - "in": "query", - "name": "event_id", - "type": "string", - "x-example": "101772" - }, - { - "description": "Optional market condition id", + "description": "Restaurant market: US (default) or CA", "in": "query", "name": "market", "type": "string", - "x-example": "0x3f2604d62ac3ee496ffd6d30156f30663fbaf22097f17f09d7364c35db255d2b" + "x-example": "US" } ], "produces": [ @@ -433118,7 +449264,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.activityTradesResponseDoc" + "$ref": "#/definitions/popeyes.rewardsResponseDoc" } }, "400": { @@ -433145,27 +449291,71 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket activity trades", + "summary": "List Popeyes Rewards' points-redemption catalog", "tags": [ - "Polymarket" + "Popeyes" ] } }, - "/polymarket/clob/market/{condition_id}": { + "/popularmechanics/news": { + "get": { + "description": "Returns current stories from Popular Mechanics' public all-stories RSS feed. Summaries are publisher teasers, not full article text. This feed-only route does not claim a complete section taxonomy or retrieve article bodies.", + "operationId": "popularmechanics-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Popular Mechanics top stories", + "tags": [ + "Popular Mechanics" + ] + } + }, + "/poshmark/brand/{name}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one public CLOB market detail row by market condition id, including tokens, reward settings, order acceptance state, tags, and fees.", - "operationId": "polymarket-clob-market", + "description": "Returns a page of Poshmark listings for a given brand name (e.g. Nike), the same browsing view as Poshmark's own brand pages. Pass a previous response's next_max_id back as max_id to fetch the next page.", + "operationId": "poshmark-brand", "parameters": [ { - "description": "Polymarket market condition id", + "description": "Poshmark brand name, matching the path segment of a /brand/{name} URL", "in": "path", - "name": "condition_id", + "name": "name", "required": true, "type": "string", - "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" + "x-example": "Nike" + }, + { + "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", + "in": "query", + "name": "max_id", + "type": "string" } ], "produces": [ @@ -433175,7 +449365,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.clobMarketResponseDoc" + "$ref": "#/definitions/poshmark.BrandResponse" } }, "400": { @@ -433190,8 +449380,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -433208,34 +449398,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket CLOB market", + "summary": "Browse Poshmark listings by brand", "tags": [ - "Polymarket" + "Poshmark" ] } }, - "/polymarket/dashboards/macro": { + "/poshmark/brands": { "get": { "consumes": [ "application/json" ], - "description": "Lists events from Polymarket's macro dashboard, tagged `macro`, up to `limit` events (default 20, max 100). Each event has its title, slug, dates, volume, liquidity, open interest, tags and nested markets with outcomes and prices. Pass the returned `cursor` back to fetch the next page; `has_more` shows whether there is one.", - "operationId": "polymarket-dashboard-macro", - "parameters": [ - { - "description": "Maximum macro events, defaults to 20 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Optional keyset cursor from a prior macro dashboard response", - "in": "query", - "name": "cursor", - "type": "string" - } - ], + "description": "Returns Poshmark's full brand directory: every brand Poshmark recognizes (name, slug, logo, known aliases), not just brands with active listings for a given search or category filter. Useful for resolving a brand name to the exact value the brand/search filters expect.", + "operationId": "poshmark-brands", "produces": [ "application/json" ], @@ -433243,17 +449418,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.macroDashboardResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/poshmark.brandsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -433270,63 +449439,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket macro dashboard events", + "summary": "Get the full Poshmark brand directory", "tags": [ - "Polymarket" + "Poshmark" ] } }, - "/polymarket/data/followers/{address}": { + "/poshmark/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the public followers of one Polymarket wallet address. Page with `limit` and `offset` or `after_cursor`, and sort with `order` and `ascending`. The rows are passed through unchanged in `data`, with the source URL and the time they were fetched.", - "operationId": "polymarket-data-followers", - "parameters": [ - { - "description": "Wallet address", - "in": "path", - "name": "address", - "required": true, - "type": "string", - "x-example": "0x0000000000000000000000000000000000000000" - }, - { - "description": "Rows to return", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 - }, - { - "description": "Result offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Optional upstream sort field", - "in": "query", - "name": "order", - "type": "string", - "x-example": "createdAt" - }, - { - "default": false, - "description": "Sort ascending when true", - "in": "query", - "name": "ascending", - "type": "boolean" - }, - { - "description": "Optional upstream cursor", - "in": "query", - "name": "after_cursor", - "type": "string" - } - ], + "description": "Returns Poshmark's full department/category browse taxonomy (e.g. Women > Shoes, Men > Jackets & Coats). Each entry's path resolves directly against the category endpoint. This is reference data that changes rarely, so responses are cached.", + "operationId": "poshmark-categories", "produces": [ "application/json" ], @@ -433334,17 +449459,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/poshmark.categoriesResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -433361,60 +449480,32 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket data followers", + "summary": "Get the Poshmark department/category browse taxonomy", "tags": [ - "Polymarket" + "Poshmark" ] } }, - "/polymarket/data/following/{address}": { + "/poshmark/category/{path}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the accounts that one Polymarket wallet `address` follows, as rows under `data`. Optional `limit`, `offset`, `order`, `ascending` and `after_cursor` control the page. An invalid address returns an invalid-parameter error. The data is for reference and is not investment advice.", - "operationId": "polymarket-data-following", - "parameters": [ - { - "description": "Wallet address", - "in": "path", - "name": "address", - "required": true, - "type": "string", - "x-example": "0x0000000000000000000000000000000000000000" - }, - { - "description": "Rows to return", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 - }, - { - "description": "Result offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, + "description": "Returns a page of Poshmark listings for a given category path (e.g. Women-Shoes, Men-Shirts), the same browsing view as Poshmark's own category pages. Pass a previous response's next_max_id back as max_id to fetch the next page.", + "operationId": "poshmark-category", + "parameters": [ { - "description": "Optional upstream sort field", - "in": "query", - "name": "order", + "description": "Poshmark category path segment, e.g. Women-Shoes, Men-Shirts", + "in": "path", + "name": "path", + "required": true, "type": "string", - "x-example": "createdAt" - }, - { - "default": false, - "description": "Sort ascending when true", - "in": "query", - "name": "ascending", - "type": "boolean" + "x-example": "Women-Shoes" }, { - "description": "Optional upstream cursor", + "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", "in": "query", - "name": "after_cursor", + "name": "max_id", "type": "string" } ], @@ -433425,7 +449516,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/poshmark.CategoryResponse" } }, "400": { @@ -433434,8 +449525,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -433452,27 +449549,33 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket data following", + "summary": "Browse Poshmark listings by category", "tags": [ - "Polymarket" + "Poshmark" ] } }, - "/polymarket/data/follows/counts/{address}": { + "/poshmark/closet/{username}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the follower and following counts for one Polymarket wallet `address` under `data`, with a `fetched_at` timestamp. An invalid address returns an invalid-parameter error. The counts are a snapshot and are not real-time trading data.", - "operationId": "polymarket-data-follows-counts", + "description": "Returns a Poshmark closet (seller storefront) page: the seller's public profile and reputation stats (followers, ratings, items sold) plus a first page of their currently available listings and total listing count. Pass a previous response's next_max_id back as max_id to fetch the next page of listings; paginated responses omit the seller profile, so fetch without max_id first to get seller fields.", + "operationId": "poshmark-closet", "parameters": [ { - "description": "Wallet address", + "description": "Poshmark seller username, the path segment of a /closet/{username} URL", "in": "path", - "name": "address", + "name": "username", "required": true, "type": "string", - "x-example": "0x0000000000000000000000000000000000000000" + "x-example": "maltimar" + }, + { + "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", + "in": "query", + "name": "max_id", + "type": "string" } ], "produces": [ @@ -433482,7 +449585,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/poshmark.ClosetResponse" } }, "400": { @@ -433491,8 +449594,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -433509,27 +449618,27 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket data follow counts", + "summary": "Get Poshmark seller closet (storefront)", "tags": [ - "Polymarket" + "Poshmark" ] } }, - "/polymarket/event/id/{id}": { + "/poshmark/listing/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket event. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-event-detail-by-id", + "description": "Returns a Poshmark item-detail page: the full listing (description, all photos, size/brand/condition, inventory), its seller's profile, public comments, and similar listings Poshmark itself surfaces on the same page.", + "operationId": "poshmark-listing", "parameters": [ { - "description": "Polymarket event id", + "description": "Poshmark listing id, the trailing id segment of a /listing/{slug}-{id} URL", "in": "path", "name": "id", "required": true, "type": "string", - "x-example": "30615" + "x-example": "6a3fed1de9c77df92e2c0cc6" } ], "produces": [ @@ -433539,7 +449648,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.eventDetailResponseDoc" + "$ref": "#/definitions/poshmark.ListingResponse" } }, "400": { @@ -433554,8 +449663,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -433572,77 +449681,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket event detail by id", + "summary": "Get Poshmark listing detail", "tags": [ - "Polymarket" + "Poshmark" ] } }, - "/polymarket/event/id/{id}/activity": { + "/poshmark/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns public trade rows for one Polymarket event. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-event-activity-by-id", + "description": "Searches Poshmark for clothing, shoes, and accessory listings, returning listing summaries (title, price, brand, size, condition, seller, images) plus the total matching count and an opaque pagination cursor. Pass a previous response's next_max_id back as max_id to fetch the next page.", + "operationId": "poshmark-search", "parameters": [ { - "description": "Polymarket event id", - "in": "path", - "name": "id", + "description": "Free-text keyword search", + "in": "query", + "name": "query", "required": true, "type": "string", - "x-example": "30615" - }, - { - "description": "Maximum trades, defaults to 50 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - }, - { - "description": "Result offset, defaults to 0 and supports up to 10000", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "default": "true", - "description": "Accepted for compatibility with the global activity contract; scoped upstream requests are filtered by event id", - "enum": [ - "true", - "false" - ], - "in": "query", - "name": "taker_only", - "type": "string" + "x-example": "nike jacket" }, { - "default": "CASH", - "description": "Activity amount filter type", - "enum": [ - "CASH" - ], + "description": "Department filter, e.g. Women, Men, Kids", "in": "query", - "name": "filter_type", - "type": "string" + "name": "department", + "type": "string", + "x-example": "Men" }, { - "default": "1", - "description": "Minimum filtered amount", - "enum": [ - "1", - "5", - "10", - "100", - "1000", - "10000", - "100000" - ], + "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", "in": "query", - "name": "filter_amount", + "name": "max_id", "type": "string" } ], @@ -433653,7 +449724,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.activityTradesResponseDoc" + "$ref": "#/definitions/poshmark.searchResponseDoc" } }, "400": { @@ -433662,14 +449733,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -433686,27 +449751,33 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket event activity trades by id", + "summary": "Search Poshmark listings", "tags": [ - "Polymarket" + "Poshmark" ] } }, - "/polymarket/event/{slug}": { + "/poshmark/trend/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket event. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-event-detail", + "description": "Returns a page of Poshmark listings for a curated trend/showroom collection (e.g. \"Vintage Celine Handbags\"), the same browsing view as Poshmark's own trend pages. Pass a previous response's next_max_id back as max_id to fetch the next page.", + "operationId": "poshmark-trend", "parameters": [ { - "description": "Polymarket event slug", + "description": "Poshmark trend/showroom id, the trailing id segment of a /trend/{slug}-{id} URL", "in": "path", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "world-cup-winner" + "x-example": "964e80193927e69b518f631b" + }, + { + "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", + "in": "query", + "name": "max_id", + "type": "string" } ], "produces": [ @@ -433716,7 +449787,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.eventDetailResponseDoc" + "$ref": "#/definitions/poshmark.TrendResponse" } }, "400": { @@ -433731,6 +449802,47 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Browse a Poshmark trend/showroom collection", + "tags": [ + "Poshmark" + ] + } + }, + "/prada/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns Prada's (prada.com) full category taxonomy -- every browsable category with its own breadcrumb path and canonical URL -- plus the two gender values products.prada.com currently carries. categories[].id is exactly the value prada-category accepts as its own category_id parameter; genders[].value is exactly what prada-search and prada-category accept as their own gender parameter.", + "operationId": "prada-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/prada.categoriesResponseDoc" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -433749,78 +449861,65 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket event detail", + "summary": "List Prada's category taxonomy and gender filter values", "tags": [ - "Polymarket" + "Prada" ] } }, - "/polymarket/event/{slug}/activity": { + "/prada/category": { "get": { "consumes": [ "application/json" ], - "description": "Returns public trade rows for one Polymarket event. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-event-activity", + "description": "Browses one Prada category by ID, returning every product/color variant in it. category_id is required and must be one of prada-categories' own categories[].id values. gender optionally narrows to one of prada-categories' own genders[].value values. sort selects Prada's own relevance ranking or one of its price/newest orderings. A category with no products returns a well-formed empty result rather than an error.", + "operationId": "prada-category", "parameters": [ { - "description": "Polymarket event slug", - "in": "path", - "name": "slug", + "description": "Category ID, from prada-categories' own categories[].id field", + "in": "query", + "name": "category_id", "required": true, "type": "string", - "x-example": "world-cup-winner" - }, - { - "description": "Maximum trades, defaults to 50 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "10062US" }, { - "description": "Result offset, defaults to 0 and supports up to 10000", + "description": "Gender filter. Allowed values: Woman, Man", + "enum": [ + "Woman", + "Man" + ], "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "gender", + "type": "string", + "x-example": "Woman" }, { - "default": "true", - "description": "Accepted for compatibility with the global activity contract; scoped upstream requests are filtered by event id", + "description": "Sort order. Allowed values: suggested, price_asc, price_desc, newest. Defaults to suggested (Prada's own relevance ranking)", "enum": [ - "true", - "false" + "suggested", + "price_asc", + "price_desc", + "newest" ], "in": "query", - "name": "taker_only", - "type": "string" + "name": "sort", + "type": "string", + "x-example": "price_asc" }, { - "default": "CASH", - "description": "Activity amount filter type", - "enum": [ - "CASH" - ], + "description": "One-based page number, defaults to 1", "in": "query", - "name": "filter_type", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "default": "1", - "description": "Minimum filtered amount", - "enum": [ - "1", - "5", - "10", - "100", - "1000", - "10000", - "100000" - ], + "description": "Results per page, defaults to 24, maximum 100", "in": "query", - "name": "filter_amount", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 24 } ], "produces": [ @@ -433830,7 +449929,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.activityTradesResponseDoc" + "$ref": "#/definitions/prada.categoryResponseDoc" } }, "400": { @@ -433839,12 +449938,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -433863,70 +449956,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket event activity trades", + "summary": "Browse a Prada category", "tags": [ - "Polymarket" + "Prada" ] } }, - "/polymarket/events": { + "/prada/product": { "get": { "consumes": [ "application/json" ], - "description": "Lists Polymarket events with their markets. Sort by 24-hour volume, total volume, liquidity, end date and more, filter to open or closed events, and page with `limit` (default 25, max 100) and `offset`. Each event has its slug, description, end date, liquidity, open interest and comment count; each market has its question, outcomes, best bid and ask, last trade price and volume.", - "operationId": "polymarket-events", + "description": "Returns product-detail data for one Prada product/color variant: name, price, stock, available sizes, breadcrumb, alternate colors, and images. pv is the product/color identifier, returned by prada-search's, prada-category's, and this endpoint's own products[].pv/other_colors[] fields (also the trailing path segment of a Prada product URL). description and the full image gallery are populated on a best-effort basis and may be briefly absent even for a valid pv; every other field is always populated. An unknown pv returns a not-found error.", + "operationId": "prada-product", "parameters": [ { - "description": "Maximum events, defaults to 25 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 - }, - { - "description": "Result offset, defaults to 0 and supports up to 10000", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "default": "volume24hr", - "description": "Sort field", - "enum": [ - "volume24hr", - "volume", - "liquidity", - "endDate", - "updatedAt", - "createdAt", - "id", - "slug", - "title", - "question", - "label" - ], - "in": "query", - "name": "order", - "type": "string" - }, - { - "default": false, - "description": "Sort ascending when true", - "in": "query", - "name": "ascending", - "type": "boolean" - }, - { - "description": "Closed filter", - "enum": [ - "true", - "false" - ], + "description": "Product/color identifier, from a search, category, or product result's own pv field", "in": "query", - "name": "closed", - "type": "string" + "name": "pv", + "required": true, + "type": "string", + "x-example": "1BA274_2CYS_F0002_V_YO0" } ], "produces": [ @@ -433936,7 +449986,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.eventsResponseDoc" + "$ref": "#/definitions/prada.productResponseDoc" } }, "400": { @@ -433945,6 +449995,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -433963,71 +450019,65 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket events", + "summary": "Get a Prada product", "tags": [ - "Polymarket" + "Prada" ] } }, - "/polymarket/events/similar": { + "/prada/search": { "get": { "consumes": [ "application/json" ], - "description": "Finds Polymarket events similar to a given one. Supply at least one of `id`, `event_title`, `event_slug`, `market_title` or `market_slug`; `limit` defaults to 10 (max 50) and `closed` (`true` or `false`) filters by closed state. Each event has its title, dates, volume, liquidity, tags and nested markets.", - "operationId": "polymarket-events-similar", + "description": "Searches Prada's (prada.com) product catalog by keyword, through its own public search index. q is required; gender and sort are the same optional values prada-category accepts. Keyword search is typo-tolerant relevance ranking, not a guaranteed exact match. A query with genuinely zero matches returns a well-formed empty result rather than an error.", + "operationId": "prada-search", "parameters": [ { - "description": "Polymarket event id", - "in": "query", - "name": "id", - "type": "integer", - "x-example": 30615 - }, - { - "description": "Event title", + "description": "Free-text search query", "in": "query", - "name": "event_title", + "name": "q", + "required": true, "type": "string", - "x-example": "World Cup Winner" + "x-example": "galleria bag" }, { - "description": "Event slug", + "description": "Gender filter. Allowed values: Woman, Man", + "enum": [ + "Woman", + "Man" + ], "in": "query", - "name": "event_slug", + "name": "gender", "type": "string", - "x-example": "world-cup-winner" + "x-example": "Woman" }, { - "description": "Market title", + "description": "Sort order. Allowed values: suggested, price_asc, price_desc, newest. Defaults to suggested (Prada's own relevance ranking)", + "enum": [ + "suggested", + "price_asc", + "price_desc", + "newest" + ], "in": "query", - "name": "market_title", + "name": "sort", "type": "string", - "x-example": "Will Spain win the 2026 FIFA World Cup?" + "x-example": "newest" }, { - "description": "Market slug", + "description": "One-based page number, defaults to 1", "in": "query", - "name": "market_slug", - "type": "string", - "x-example": "will-spain-win-the-2026-fifa-world-cup-963" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Maximum events, defaults to 10 and supports up to 50", + "description": "Results per page, defaults to 24, maximum 100", "in": "query", "name": "limit", "type": "integer", - "x-example": 10 - }, - { - "description": "Closed filter", - "enum": [ - "true", - "false" - ], - "in": "query", - "name": "closed", - "type": "string" + "x-example": 24 } ], "produces": [ @@ -434037,7 +450087,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.similarEventsResponseDoc" + "$ref": "#/definitions/prada.searchResponseDoc" } }, "400": { @@ -434064,27 +450114,61 @@ "ApiKeyAuth": [] } ], - "summary": "Find similar Polymarket events", + "summary": "Search Prada products", "tags": [ - "Polymarket" + "Prada" ] } }, - "/polymarket/events/{id}/tags": { + "/prada/stores": { "get": { "consumes": [ "application/json" ], - "description": "Lists the tags attached to one Polymarket event, identified by the required event `id`. Each tag has its id, label and slug. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-event-tags", + "description": "Locates Prada's (prada.com) physical retail stores worldwide, through its own public store-locator search. All parameters are optional: with none set, this returns Prada's full worldwide store list (up to limit). query is a free-text location search (city, country, or store name); lat/lng (both required together) narrow it to a geo-radius search, optionally sized with radius_km (defaults to 50, maximum 20000). A search with genuinely zero matches returns a well-formed empty result rather than an error.", + "operationId": "prada-stores", "parameters": [ { - "description": "Polymarket event id", - "in": "path", - "name": "id", - "required": true, + "description": "Free-text location search (city, country, or store name)", + "in": "query", + "name": "query", "type": "string", - "x-example": "30615" + "x-example": "New York" + }, + { + "description": "Search-center latitude, -90..90. Requires lng.", + "in": "query", + "name": "lat", + "type": "number", + "x-example": 40.7128 + }, + { + "description": "Search-center longitude, -180..180. Requires lat.", + "in": "query", + "name": "lng", + "type": "number", + "x-example": -74.006 + }, + { + "description": "Search radius in kilometers around lat/lng, defaults to 50, maximum 20000. Requires lat and lng.", + "in": "query", + "name": "radius_km", + "type": "number", + "x-example": 50 + }, + { + "description": "Maximum stores returned, defaults to 20, maximum 50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Result offset for pagination, defaults to 0", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -434094,7 +450178,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.tagsResponseDoc" + "$ref": "#/definitions/prada.storesResponseDoc" } }, "400": { @@ -434121,36 +450205,34 @@ "ApiKeyAuth": [] } ], - "summary": "List tags for a Polymarket event", + "summary": "Locate Prada retail stores", "tags": [ - "Polymarket" + "Prada" ] } }, - "/polymarket/fee-types": { + "/prada/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns Polymarket's fee type reference data as rows under `data`, optionally narrowed with `active` (`true` or `false`) or a `search` term. The response includes a `fetched_at` time. An invalid `active` value returns an invalid-parameter error.", - "operationId": "polymarket-fee-types", + "description": "Returns Prada's own search-box typeahead suggestions for a partial query -- a ranked list of suggested search phrases with the live result count each one would return. Pass a suggestion straight through to prada-search's own q parameter for product results. A query with no genuine matches returns a well-formed empty result rather than an error.", + "operationId": "prada-suggest", "parameters": [ { - "description": "Optional upstream active filter", - "enum": [ - "true", - "false" - ], + "description": "Partial search query", "in": "query", - "name": "active", - "type": "string" + "name": "q", + "required": true, + "type": "string", + "x-example": "bag" }, { - "description": "Optional upstream search filter", + "description": "Maximum suggestions, defaults to 10, maximum 20", "in": "query", - "name": "search", - "type": "string", - "x-example": "sports" + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -434160,7 +450242,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/prada.suggestResponseDoc" } }, "400": { @@ -434187,33 +450269,70 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket fee types", + "summary": "Get Prada search-box suggestions", "tags": [ - "Polymarket" + "Prada" ] } }, - "/polymarket/games": { + "/pricecharting/big-movers": { "get": { "consumes": [ "application/json" ], - "description": "Returns Polymarket's sports game rows under `data`, optionally filtered by `sport` or `ticker`. The response includes a `fetched_at` time. The data is a snapshot, not real-time trading data.", - "operationId": "polymarket-games", + "description": "Returns PriceCharting's Big Movers report for one category: the 100 products whose price changed most since the previous reading (the page says it is usually refreshed within the last week), with product id, name, console or set, address, current loose or ungraded price and the signed change. Choose the category (video-games, coins, comic-books, funko-pops, pokemon-cards, dragon-ball-cards, lorcana-cards, magic-cards, marvel-cards, one-piece-cards, star-wars-cards, yugioh-cards, garbage-pail-cards, other-tcg-cards, other-cards or lego-sets), the order (dollar-increase, dollar-decrease, percent-increase or percent-decrease) and, for video games, the region (all, japan, ntsc or pal). Price data is PriceCharting's; cite it with a link when you display it.", + "operationId": "pricecharting-big-movers", "parameters": [ { - "description": "Optional sport filter", + "description": "Report category; default video-games", + "enum": [ + "video-games", + "coins", + "comic-books", + "funko-pops", + "pokemon-cards", + "dragon-ball-cards", + "lorcana-cards", + "magic-cards", + "marvel-cards", + "one-piece-cards", + "star-wars-cards", + "yugioh-cards", + "garbage-pail-cards", + "other-tcg-cards", + "other-cards", + "lego-sets" + ], "in": "query", - "name": "sport", + "name": "category", "type": "string", - "x-example": "basketball" + "x-example": "pokemon-cards" }, { - "description": "Optional ticker filter", + "description": "Order: dollar-increase (default), dollar-decrease, percent-increase or percent-decrease", + "enum": [ + "dollar-increase", + "dollar-decrease", + "percent-increase", + "percent-decrease" + ], "in": "query", - "name": "ticker", + "name": "sort", "type": "string", - "x-example": "nba-sas-nyk-2026-06-08" + "x-example": "dollar-increase" + }, + { + "description": "Region filter, video-games only: all (default), japan, ntsc or pal", + "enum": [ + "all", + "japan", + "ntsc", + "pal" + ], + "in": "query", + "name": "region", + "type": "string", + "x-example": "all" } ], "produces": [ @@ -434223,7 +450342,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/pricecharting.bigMoversResponseDoc" } }, "400": { @@ -434250,57 +450369,26 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket games", + "summary": "Get PriceCharting's Big Movers report", "tags": [ - "Polymarket" + "PriceCharting" ] } }, - "/polymarket/homepage/feed": { + "/pricecharting/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns rows for Polymarket homepage feeds. The `feed` enum accepts `trending`, `breaking`, `new`, `politics`, `sports`, `crypto`, `esports`, `iran`, `finance`, `geopolitics`, `tech`, `culture`, `economy`, `weather`, `mentions`, and `elections`. Most feeds return events; `breaking` returns high-movement market rows and `mentions` returns open event search matches.", - "operationId": "polymarket-homepage-feed", + "description": "Lists PriceCharting's categories (Pokemon Cards, Magic Cards, Video Games, Comics, Coins, Funko Pops and more) with their slugs, or, given a category, lists that category's consoles or sets with the slugs pricecharting-console takes.", + "operationId": "pricecharting-categories", "parameters": [ { - "default": "trending", - "description": "Homepage feed", - "enum": [ - "trending", - "breaking", - "new", - "politics", - "sports", - "crypto", - "esports", - "iran", - "finance", - "geopolitics", - "tech", - "culture", - "economy", - "weather", - "mentions", - "elections" - ], - "in": "query", - "name": "feed", - "type": "string" - }, - { - "description": "Maximum rows, defaults to 20 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Optional keyset cursor from a prior event feed response", + "description": "Category slug from the category list, for example pokemon-cards; omit for the category list", "in": "query", - "name": "cursor", - "type": "string" + "name": "category", + "type": "string", + "x-example": "pokemon-cards" } ], "produces": [ @@ -434310,7 +450398,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.homepageFeedResponseDoc" + "$ref": "#/definitions/pricecharting.categoriesResponseDoc" } }, "400": { @@ -434319,6 +450407,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -434337,50 +450431,47 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket homepage feed rows", + "summary": "List PriceCharting categories and their consoles or sets", "tags": [ - "Polymarket" + "PriceCharting" ] } }, - "/polymarket/leaderboard": { + "/pricecharting/console": { "get": { "consumes": [ "application/json" ], - "description": "Returns trader leaderboard rows. The `window` enum accepts `1d`, `7d`, `30d`, and `all`; the `sort_by` enum accepts `profit` and `volume`.", - "operationId": "polymarket-leaderboard", + "description": "Lists the products of one PriceCharting console or set (for example a Pokemon set or a game console), 150 per page: id, name, product address, image and the loose/ungraded, complete/Grade 9 and new/PSA 10 prices. Sort by popularity, highest price, lowest price or name, and page with the returned cursor. Price data is PriceCharting's; cite it with a link when you display it.", + "operationId": "pricecharting-console", "parameters": [ { - "default": "30d", - "description": "Leaderboard time window", - "enum": [ - "1d", - "7d", - "30d", - "all" - ], + "description": "Console or set slug from pricecharting-categories, for example pokemon-base-set or nes", "in": "query", - "name": "window", - "type": "string" + "name": "console", + "required": true, + "type": "string", + "x-example": "pokemon-base-set" }, { - "default": "profit", - "description": "Leaderboard sort", + "description": "Ordering; defaults to popularity", "enum": [ - "profit", - "volume" + "popularity", + "highest-price", + "lowest-price", + "name" ], "in": "query", - "name": "sort_by", - "type": "string" + "name": "sort", + "type": "string", + "x-example": "highest-price" }, { - "description": "Maximum rows, defaults to 20 and supports up to 100", + "description": "The previous response's next_cursor; omit for the first page", "in": "query", - "name": "limit", + "name": "cursor", "type": "integer", - "x-example": 20 + "x-example": 150 } ], "produces": [ @@ -434390,7 +450481,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.leaderboardResponseDoc" + "$ref": "#/definitions/pricecharting.consoleResponseDoc" } }, "400": { @@ -434399,6 +450490,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -434417,86 +450514,47 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket leaderboard rows", + "summary": "List the products of a PriceCharting console or set", "tags": [ - "Polymarket" + "PriceCharting" ] } }, - "/polymarket/market-clarifications": { + "/pricecharting/price-history": { "get": { "consumes": [ "application/json" ], - "description": "Returns Polymarket market clarification rows under `data`, with a `fetched_at` time. Filter by `market_id`, `event_id`, `state`, `question_id` or `tx_hash`, and page with `limit`, `offset`, `order`, `ascending` and `after_cursor`. All filters are optional.", - "operationId": "polymarket-market-clarifications", + "description": "Returns the monthly price history behind a PriceCharting product page's price chart: one series per price column (for a trading card Ungraded, Grade 7, Grade 8, Grade 9, Grade 9.5 and PSA 10; for a video game Loose, Complete, New, Graded, Box and Manual), each a list of dated prices, oldest first, starting wherever PriceCharting's chart starts for that product. Trading cards also carry the PSA and CGC population counts by grade 1 to 10. Look a product up by id, by its pricecharting.com address, or by console and slug. Price data is PriceCharting's; cite it with a link when you display it.", + "operationId": "pricecharting-price-history", "parameters": [ { - "description": "Optional market id filter", + "description": "PriceCharting product id from pricecharting-search or pricecharting-console (costs one extra request)", "in": "query", - "name": "market_id", - "type": "string", - "x-example": "558934" + "name": "id", + "type": "integer", + "x-example": 630417 }, { - "description": "Optional event id filter", + "description": "A pricecharting.com/game// product address", "in": "query", - "name": "event_id", + "name": "url", "type": "string", - "x-example": "30615" + "x-example": "https://www.pricecharting.com/game/pokemon-base-set/charizard-4" }, { - "description": "Optional upstream state filter", + "description": "Console or set slug, used together with slug", "in": "query", - "name": "state", + "name": "console", "type": "string", - "x-example": "resolved" - }, - { - "description": "Optional upstream question id filter", - "in": "query", - "name": "question_id", - "type": "string" - }, - { - "description": "Optional transaction hash filter", - "in": "query", - "name": "tx_hash", - "type": "string" - }, - { - "description": "Rows to return", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 - }, - { - "description": "Result offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "x-example": "pokemon-base-set" }, { - "description": "Optional upstream sort field", + "description": "Product slug, used together with console", "in": "query", - "name": "order", + "name": "slug", "type": "string", - "x-example": "createdAt" - }, - { - "default": false, - "description": "Sort ascending when true", - "in": "query", - "name": "ascending", - "type": "boolean" - }, - { - "description": "Optional upstream cursor", - "in": "query", - "name": "after_cursor", - "type": "string" + "x-example": "charizard-4" } ], "produces": [ @@ -434506,7 +450564,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/pricecharting.priceHistoryResponseDoc" } }, "400": { @@ -434515,6 +450573,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -434533,27 +450597,47 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket market clarifications", + "summary": "Get a PriceCharting product's monthly price history", "tags": [ - "Polymarket" + "PriceCharting" ] } }, - "/polymarket/market/condition/{condition_id}": { + "/pricecharting/product": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket market by condition id. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-market-detail-by-condition", + "description": "Returns one PriceCharting product page: current prices by condition or grade with their latest change, the full price guide, attributes (publisher, release date, card number and similar) and the most recent completed eBay and TCGplayer sales per grade. Look a product up by id, by its pricecharting.com address, or by console and slug. Price data is PriceCharting's; cite it with a link when you display it.", + "operationId": "pricecharting-product", "parameters": [ { - "description": "Polymarket market condition id", - "in": "path", - "name": "condition_id", - "required": true, + "description": "PriceCharting product id from search or console results; costs one extra request to resolve", + "in": "query", + "name": "id", + "type": "integer", + "x-example": 630417 + }, + { + "description": "Console or set slug (for example pokemon-base-set); use with slug", + "in": "query", + "name": "console", "type": "string", - "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" + "x-example": "pokemon-base-set" + }, + { + "description": "Product slug from pricecharting.com/game//; use with console", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "charizard-4" + }, + { + "description": "A pricecharting.com product page address, instead of id or console and slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.pricecharting.com/game/pokemon-base-set/charizard-4" } ], "produces": [ @@ -434563,7 +450647,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.marketDetailResponseDoc" + "$ref": "#/definitions/pricecharting.productResponseDoc" } }, "400": { @@ -434596,78 +450680,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket market detail by condition id", + "summary": "Get a PriceCharting product's prices and recent sales", "tags": [ - "Polymarket" + "PriceCharting" ] } }, - "/polymarket/market/condition/{condition_id}/activity": { + "/pricecharting/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns public trade rows for one Polymarket market condition id. The `taker_only` enum accepts `true` and `false`; the `filter_type` enum accepts `CASH`; the `filter_amount` enum accepts `1`, `5`, `10`, `100`, `1000`, `10000`, and `100000`. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-market-activity-by-condition", + "description": "Searches PriceCharting's price guide (trading cards, video games, comics, coins, Funko Pops, LEGO and more) and returns up to 100 matches: product id, name, console or set, category, image and the loose/ungraded, complete/Grade 9 and new/PSA 10 prices. Narrow by console_uid, drop variants, and sort by popularity, highest price or name. Price data is PriceCharting's; cite it with a link when you display it.", + "operationId": "pricecharting-search", "parameters": [ { - "description": "Polymarket market condition id", - "in": "path", - "name": "condition_id", + "description": "Search text, 2 to 100 characters", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" - }, - { - "description": "Maximum trades, defaults to 50 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - }, - { - "description": "Result offset, defaults to 0 and supports up to 10000", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "x-example": "charizard" }, { - "default": "true", - "description": "Accepted for compatibility with the global activity contract; scoped upstream requests are filtered by condition id", - "enum": [ - "true", - "false" - ], + "description": "Restrict to one console or set by its console_uid (for example G10623), as returned in search results and by pricecharting-console", "in": "query", - "name": "taker_only", - "type": "string" + "name": "console_uid", + "type": "string", + "x-example": "G10623" }, { - "default": "CASH", - "description": "Activity amount filter type", - "enum": [ - "CASH" - ], + "description": "Drop variant printings such as 1st Edition", "in": "query", - "name": "filter_type", - "type": "string" + "name": "exclude_variants", + "type": "boolean", + "x-example": true }, { - "default": "1", - "description": "Minimum filtered amount", + "description": "Ordering; defaults to popularity", "enum": [ - "1", - "5", - "10", - "100", - "1000", - "10000", - "100000" + "popularity", + "highest-price", + "name" ], "in": "query", - "name": "filter_amount", - "type": "string" + "name": "sort", + "type": "string", + "x-example": "highest-price" } ], "produces": [ @@ -434677,7 +450736,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.activityTradesResponseDoc" + "$ref": "#/definitions/pricecharting.searchResponseDoc" } }, "400": { @@ -434686,14 +450745,49 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Search PriceCharting products", + "tags": [ + "PriceCharting" + ] + } + }, + "/pristine-auction/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the whole value space for pristine-auction-search's category, auction_type, sort, and status params. categories[] is fetched live (with a current listing count per category, refreshed on every call); auction_types[], sort[], and statuses[] are pristineauction.com's own fixed, small search-form value sets.", + "operationId": "pristine-auction-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/pristineauction.categoriesResponseDoc" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -434710,27 +450804,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket market activity trades by condition id", + "summary": "Discover Pristine Auction's search enum values", "tags": [ - "Polymarket" + "Pristine Auction" ] } }, - "/polymarket/market/condition/{condition_id}/liquidity": { + "/pristine-auction/lot/{lot_number}": { "get": { "consumes": [ "application/json" ], - "description": "Returns a public market liquidity snapshot that joins market detail with public CLOB market data when token ids are available. This endpoint is not a trading endpoint and does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-market-liquidity-by-condition", + "description": "Returns one pristineauction.com lot's full detail: title, description, image gallery, price (current high bid, or realized/sold price once the auction has ended), auction end time, sport/collectible category, auction type, no-reserve flag, and view/watch/bid counts. lot_number comes from pristine-auction-search's results[].lot_number.", + "operationId": "pristine-auction-lot-detail", "parameters": [ { - "description": "Polymarket market condition id", + "description": "A lot_number from pristine-auction-search's results", "in": "path", - "name": "condition_id", + "name": "lot_number", "required": true, - "type": "string", - "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" + "type": "integer", + "x-example": 13154611 } ], "produces": [ @@ -434740,7 +450834,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.marketLiquidityResponseDoc" + "$ref": "#/definitions/pristineauction.lotDetailResponseDoc" } }, "400": { @@ -434755,8 +450849,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -434773,27 +450867,139 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket market liquidity by condition id", + "summary": "Get a Pristine Auction lot's full detail", "tags": [ - "Polymarket" + "Pristine Auction" ] } }, - "/polymarket/market/slug/{slug}": { + "/pristine-auction/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket market. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-market-detail-by-slug", + "description": "Browses or searches pristineauction.com's current sports card and memorabilia auction lots. term or category is required, matching pristineauction.com's own search form. All enum values (category, auction_type, sort, status) come from pristine-auction-categories. status=completed browses ended/sold lots (a prices-realized view); the default (all statuses) mirrors the site's own default. Every filter is optional and combines with AND semantics.", + "operationId": "pristine-auction-search", "parameters": [ { - "description": "Polymarket market slug", - "in": "path", - "name": "slug", - "required": true, + "description": "Free-text search across lot titles. term or category is required.", + "in": "query", + "name": "term", "type": "string", - "x-example": "nba-sas-nyk-2026-06-08" + "x-example": "mantle" + }, + { + "description": "One value from pristine-auction-categories' categories[].slug. term or category is required.", + "enum": [ + "fine-art", + "baseball", + "basketball", + "boxing-ufc", + "coins-bullion", + "comic-books", + "football", + "golf", + "historical", + "hockey", + "music", + "other-sports", + "pop-culture", + "racing", + "soccer", + "trading-cards", + "wrestling" + ], + "in": "query", + "name": "category", + "type": "string", + "x-example": "baseball" + }, + { + "description": "Comma-separated auction-type filter. Omit to include every auction type.", + "enum": [ + "previous_featured", + "ten_minute", + "daily", + "classic", + "fine_art", + "jewelry", + "pop_culture", + "tcg", + "helmet", + "nascar_foundation", + "sports_cards", + "coin", + "sports_gear", + "jersey", + "frame_it_up", + "fall_showcase", + "elite", + "live_stream" + ], + "in": "query", + "name": "auction_type", + "type": "string", + "x-example": "daily,classic" + }, + { + "description": "Comma-separated auction-status filter. status=completed browses ended/sold lots. Omit to include every status.", + "enum": [ + "future", + "active", + "canceled", + "completed", + "forfeited" + ], + "in": "query", + "name": "status", + "type": "string", + "x-example": "active" + }, + { + "description": "Result order, default newly-listed.", + "enum": [ + "newly-listed", + "bid-time-descending", + "price-descending", + "price-ascending", + "ending-soonest", + "ending-last", + "bid-count-descending", + "bid-count-ascending" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "ending-soonest" + }, + { + "description": "Minimum current bid price in USD, inclusive. Omit or 0 for no minimum.", + "in": "query", + "name": "min_price", + "type": "number" + }, + { + "description": "Maximum current bid price in USD, inclusive. Omit or 0 for no maximum.", + "in": "query", + "name": "max_price", + "type": "number" + }, + { + "description": "1-based page number, default 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Results per page. pristineauction.com only accepts 15, 30, or 60; any other value is rejected. Default 30.", + "enum": [ + 15, + 30, + 60 + ], + "in": "query", + "name": "per_page", + "type": "integer" } ], "produces": [ @@ -434803,23 +451009,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.marketDetailResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/pristineauction.searchResponseDoc" } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -434836,27 +451036,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket market detail by slug", + "summary": "Search Pristine Auction's live auction inventory", "tags": [ - "Polymarket" + "Pristine Auction" ] } }, - "/polymarket/market/slug/{slug}/liquidity": { + "/pristine-marketplace/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns a public market liquidity snapshot that joins market detail with public CLOB market data when token ids are available. This endpoint is not a trading endpoint and does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-market-liquidity-by-slug", + "description": "Returns collections from Pristine Marketplace (https://www.pristinemarketplace.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", + "operationId": "pristine-marketplace-collections", "parameters": [ { - "description": "Polymarket market slug", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "nba-sas-nyk-2026-06-08" + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum collections, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -434866,7 +451072,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.marketLiquidityResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, "400": { @@ -434875,12 +451081,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -434899,27 +451099,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket market liquidity by slug", + "summary": "List Pristine Marketplace collections", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/market/{id}": { + "/pristine-marketplace/collections/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket market. This endpoint does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-market-detail", + "description": "Returns products from one Pristine Marketplace (https://www.pristinemarketplace.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug (typically a player, team, or memorabilia-type collection, e.g. `pop-culture`).", + "operationId": "pristine-marketplace-collection-products", "parameters": [ { - "description": "Polymarket market id", + "description": "Collection handle", "in": "path", - "name": "id", + "name": "handle", "required": true, "type": "string", - "x-example": "558934" + "x-example": "pop-culture" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -434929,7 +451143,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.marketDetailResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { @@ -434962,27 +451176,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket market detail by id", + "summary": "List Pristine Marketplace collection products", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/market/{id}/liquidity": { + "/pristine-marketplace/pages": { "get": { "consumes": [ "application/json" ], - "description": "Returns a public market liquidity snapshot that joins market detail with public CLOB market data when token ids are available. This endpoint is not a trading endpoint and does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-market-liquidity", + "description": "Returns static pages from Pristine Marketplace (https://www.pristinemarketplace.com). The storefront URL is fixed server-side. The storefront's \"Shop by Sport\" navigation (NFL, MLB, NBA, NHL, NASCAR) resolves to pages here (handles `nfl`, `mlb`, `nba`, `nhl`, `nascar`), not to a separate collections-style resource -- each is a landing page linking into many player/team collections.", + "operationId": "pristine-marketplace-pages", "parameters": [ { - "description": "Polymarket market id", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "558934" + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum static pages, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -434992,7 +451212,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.marketLiquidityResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { @@ -435001,12 +451221,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -435025,27 +451239,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket market liquidity", + "summary": "List Pristine Marketplace static pages", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/market/{id}/tags": { + "/pristine-marketplace/pages/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Lists the tags attached to one Polymarket market, identified by the required market `id`. Each tag has its id, label and slug. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-market-tags", + "description": "Returns static page detail for one Pristine Marketplace (https://www.pristinemarketplace.com) page handle. The storefront URL is fixed server-side. The \"Shop by Sport\" nav landing pages are reachable here as handles `nfl`, `mlb`, `nba`, `nhl`, and `nascar`.", + "operationId": "pristine-marketplace-page", "parameters": [ { - "description": "Polymarket market id", + "description": "Page handle", "in": "path", - "name": "id", + "name": "handle", "required": true, "type": "string", - "x-example": "558934" + "x-example": "nfl" } ], "produces": [ @@ -435055,7 +451269,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.tagsResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, "400": { @@ -435064,6 +451278,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -435082,70 +451302,33 @@ "ApiKeyAuth": [] } ], - "summary": "List tags for a Polymarket market", + "summary": "Get a Pristine Marketplace static page", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/markets": { + "/pristine-marketplace/products": { "get": { "consumes": [ "application/json" ], - "description": "Lists Polymarket markets, up to `limit` rows (default 25, max 100), starting at `offset` (default 0, max 10000). Sort with `order`, such as `volume24hr` or `liquidity`, flip direction with `ascending`, and filter with `closed`. Each market has its question, slug, prices, volume, liquidity, token ids and outcomes.", - "operationId": "polymarket-markets", + "description": "Returns products from Pristine Marketplace's (https://www.pristinemarketplace.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "pristine-marketplace-products", "parameters": [ { - "description": "Maximum markets, defaults to 25 and supports up to 100", + "description": "1-based page, defaults to 1", "in": "query", - "name": "limit", + "name": "page", "type": "integer", - "x-example": 25 + "x-example": 1 }, { - "description": "Result offset, defaults to 0 and supports up to 10000", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "offset", + "name": "limit", "type": "integer", - "x-example": 0 - }, - { - "default": "volume24hr", - "description": "Sort field", - "enum": [ - "volume24hr", - "volume", - "liquidity", - "endDate", - "updatedAt", - "createdAt", - "id", - "slug", - "title", - "question", - "label" - ], - "in": "query", - "name": "order", - "type": "string" - }, - { - "default": false, - "description": "Sort ascending when true", - "in": "query", - "name": "ascending", - "type": "boolean" - }, - { - "description": "Closed filter", - "enum": [ - "true", - "false" - ], - "in": "query", - "name": "closed", - "type": "string" + "x-example": 50 } ], "produces": [ @@ -435155,7 +451338,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.marketsResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" } }, "400": { @@ -435182,80 +451365,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket markets", + "summary": "List Pristine Marketplace products", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/predictions": { + "/pristine-marketplace/products/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns event rows for the Polymarket `/predictions` page. The `status` enum accepts `active`, `resolved`, and `all`; the `sort` enum accepts `competitive`, `volume`, `volume_24hr`, `ending_soon`, `liquidity`, `newest`, and `closed_time`; the `recurrence` enum accepts `hourly`, `daily`, `weekly`, `monthly`, and `yearly`.", - "operationId": "polymarket-predictions", + "description": "Returns product detail for one Pristine Marketplace (https://www.pristinemarketplace.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "pristine-marketplace-product", "parameters": [ { - "default": "active", - "description": "Prediction status", - "enum": [ - "active", - "resolved", - "all" - ], - "in": "query", - "name": "status", - "type": "string" - }, - { - "default": "competitive", - "description": "Prediction sort", - "enum": [ - "competitive", - "volume", - "volume_24hr", - "ending_soon", - "liquidity", - "newest", - "closed_time" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Optional tag slug", - "in": "query", - "name": "tag", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, "type": "string", - "x-example": "politics" - }, - { - "description": "Optional recurrence filter", - "enum": [ - "hourly", - "daily", - "weekly", - "monthly", - "yearly" - ], - "in": "query", - "name": "recurrence", - "type": "string" - }, - { - "description": "Maximum events, defaults to 20 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Optional keyset cursor from a prior predictions response", - "in": "query", - "name": "cursor", - "type": "string" + "x-example": "product-handle" } ], "produces": [ @@ -435265,7 +451395,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.predictionsResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { @@ -435274,6 +451404,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -435292,27 +451428,45 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket predictions", + "summary": "Get a Pristine Marketplace product", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/rewards/market/{condition_id}": { + "/pristine-marketplace/products/{handle}/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Returns the liquidity-rewards details of one Polymarket market by condition id: the question, daily reward rate, rewards minimum size and maximum spread, each reward configuration with its start and end dates and rate per day, total configured rewards, 24-hour volume and outcome token prices. A condition id with no rewards row returns `404`.", - "operationId": "polymarket-rewards-market", + "description": "Returns recommended products for one Pristine Marketplace (https://www.pristinemarketplace.com) product handle. The storefront URL is fixed server-side.", + "operationId": "pristine-marketplace-product-recommendations", "parameters": [ { - "description": "Polymarket market condition id", + "description": "Product handle", "in": "path", - "name": "condition_id", + "name": "handle", "required": true, "type": "string", - "x-example": "0x1a987cd4e88488fd12905fa9ae82cef381e03f4af68289275c4c0c2613db9327" + "x-example": "product-handle" + }, + { + "description": "Maximum products, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", + "enum": [ + "related", + "complementary" + ], + "in": "query", + "name": "intent", + "type": "string", + "x-example": "related" } ], "produces": [ @@ -435322,7 +451476,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.rewardsMarketResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -435355,92 +451509,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket rewards market", + "summary": "List Pristine Marketplace product recommendations", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/rewards/markets": { + "/pristine-marketplace/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns public rewards-market rows used by Polymarket's `/rewards` page. The `order_by` enum accepts `market`, `earnings`, `max_spread`, `min_size`, `rate_per_day`, `price`, `earning_percentage`, and `spread`; the `position` enum accepts `asc` and `desc`; the `tag_slug` enum accepts `all`, `politics`, `sports`, `crypto`, `pop-culture`, `middle-east`, `business`, and `science`.", - "operationId": "polymarket-rewards-markets", + "description": "Returns one page of Pristine Marketplace's (https://www.pristinemarketplace.com) public Judge.me store review feed. This is a store-wide, most-recent-first feed, not a per-product one: confirmed live, the storefront's own on-page review widget draws from and displays this same feed (labeled \"Reviews for other products\" on an individual product page), and no product/handle filter parameter narrows it. The storefront URL is fixed server-side. Judge.me fixes 5 reviews per upstream page regardless of any requested size, so this endpoint has no `limit` parameter -- `page` maps 1:1 onto Judge.me's own pagination.", + "operationId": "pristine-marketplace-reviews", "parameters": [ { - "default": "market", - "description": "Rewards market sort", - "enum": [ - "market", - "earnings", - "max_spread", - "min_size", - "rate_per_day", - "price", - "earning_percentage", - "spread" - ], - "in": "query", - "name": "order_by", - "type": "string" - }, - { - "default": "desc", - "description": "Sort direction", - "enum": [ - "asc", - "desc" - ], - "in": "query", - "name": "position", - "type": "string" - }, - { - "description": "Reward program date in YYYY-MM-DD format; defaults to today in UTC", - "in": "query", - "name": "date", - "type": "string", - "x-example": "2026-06-07" - }, - { - "description": "Optional market question search text", - "in": "query", - "name": "q", - "type": "string", - "x-example": "bitcoin" - }, - { - "default": "all", - "description": "Rewards category", - "enum": [ - "all", - "politics", - "sports", - "crypto", - "pop-culture", - "middle-east", - "business", - "science" - ], - "in": "query", - "name": "tag_slug", - "type": "string" - }, - { - "description": "Optional rewards cursor from a prior response; defaults to MA==", - "in": "query", - "name": "cursor", - "type": "string", - "x-example": "MA==" - }, - { - "description": "Maximum rows, defaults to 100 and supports up to 100", + "description": "1-based page, defaults to 1. 5 reviews per page.", "in": "query", - "name": "limit", + "name": "page", "type": "integer", - "x-example": 100 + "x-example": 1 } ], "produces": [ @@ -435450,7 +451538,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.rewardsMarketsResponseDoc" + "$ref": "#/definitions/shopifybrands.reviewsResponseDoc" } }, "400": { @@ -435477,81 +451565,41 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket rewards markets", + "summary": "List Pristine Marketplace store reviews", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/search": { + "/pristine-marketplace/search": { "get": { "consumes": [ "application/json" ], - "description": "Searches Polymarket and returns event results. The `status` enum accepts `open`, `closed`, and `all`; the `sort` enum accepts `relevance`, `volume24hr`, `volume`, `liquidity`, and `endDate`.", - "operationId": "polymarket-search", + "description": "Returns products from Pristine Marketplace's (https://www.pristinemarketplace.com) own full-text search, distinct from `/pristine-marketplace/search/suggest`'s predictive suggestions. The storefront URL is fixed server-side. Per-page size is fixed (16 products per page) and is not adjustable; `limit` is honored only as an upper bound on the returned page.", + "operationId": "pristine-marketplace-search", "parameters": [ { - "description": "Search query", + "description": "Search query text", "in": "query", "name": "q", "required": true, "type": "string", - "x-example": "bitcoin" + "x-example": "jordan" }, { - "description": "Maximum events, defaults to 10 and supports up to 50", + "description": "1-based page, defaults to 1", "in": "query", - "name": "limit", + "name": "page", "type": "integer", - "x-example": 10 - }, - { - "default": "open", - "description": "Event status filter", - "enum": [ - "open", - "closed", - "all" - ], - "in": "query", - "name": "status", - "type": "string" - }, - { - "default": "relevance", - "description": "Search sort", - "enum": [ - "relevance", - "volume24hr", - "volume", - "liquidity", - "endDate" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": false, - "description": "Sort ascending when true", - "in": "query", - "name": "ascending", - "type": "boolean" - }, - { - "default": false, - "description": "Include matching tags", - "in": "query", - "name": "include_tags", - "type": "boolean" + "x-example": 1 }, { - "default": false, - "description": "Include matching profiles", + "description": "Maximum products, defaults to 50 and supports up to 250, but never exceeds the storefront's own fixed 16-per-page grid", "in": "query", - "name": "include_profiles", - "type": "boolean" + "name": "limit", + "type": "integer", + "x-example": 16 } ], "produces": [ @@ -435561,7 +451609,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.searchResponseDoc" + "$ref": "#/definitions/shopifybrands.siteSearchResponseDoc" } }, "400": { @@ -435570,12 +451618,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -435594,19 +451636,43 @@ "ApiKeyAuth": [] } ], - "summary": "Search Polymarket events", + "summary": "Search Pristine Marketplace products", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/sports": { + "/pristine-marketplace/search/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns Polymarket's sports reference list under `data`, with a `fetched_at` time. It takes no parameters. The data is reference data, not real-time trading data or investment advice.", - "operationId": "polymarket-sports", + "description": "Returns products, collections, and query suggestions from Pristine Marketplace's (https://www.pristinemarketplace.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "pristine-marketplace-search-suggest", + "parameters": [ + { + "description": "Search query", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "jordan" + }, + { + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "in": "query", + "name": "types", + "type": "string", + "x-example": "product,collection,query" + }, + { + "description": "Maximum results per type, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], "produces": [ "application/json" ], @@ -435614,7 +451680,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { @@ -435641,33 +451707,42 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket sports", + "summary": "Get Pristine Marketplace search suggestions", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/sports/by-partner": { + "/pristine-marketplace/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "Looks up Polymarket sports by a partner's identifiers, using `partner` (the partner name) and `external_id` (the partner's own id for the sport). Matching sports come back as rows under `data`, with a `fetched_at` time.", - "operationId": "polymarket-sports-by-partner", + "description": "Returns capped URL entries from Pristine Marketplace's (https://www.pristinemarketplace.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", + "operationId": "pristine-marketplace-sitemap-urls", "parameters": [ { - "description": "Partner name", + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], "in": "query", - "name": "partner", + "name": "type", "type": "string", - "x-example": "nba" + "x-example": "products" }, { - "description": "Partner external id", + "description": "Maximum URL entries, defaults to 50 and supports up to 250", "in": "query", - "name": "external_id", - "type": "string", - "x-example": "123" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -435677,7 +451752,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" } }, "400": { @@ -435704,19 +451779,19 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket sports by partner", + "summary": "List Pristine Marketplace sitemap URLs", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/sports/market-types": { + "/pristine-marketplace/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Returns the list of sports market types Polymarket uses, as reference data under `data`, together with a `fetched_at` time. It takes no parameters, so every call returns the same kind of reference list for the current moment.", - "operationId": "polymarket-sports-market-types", + "description": "Returns child sitemap URLs from Pristine Marketplace's (https://www.pristinemarketplace.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", + "operationId": "pristine-marketplace-sitemaps", "produces": [ "application/json" ], @@ -435724,7 +451799,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" } }, "400": { @@ -435751,19 +451826,19 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket sports market types", + "summary": "List Pristine Marketplace sitemaps", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/sports/summary": { + "/pristine-marketplace/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns Polymarket's sports summary under `data`, together with a `fetched_at` time. It takes no parameters. The result is a snapshot of the summary at request time and is not real-time trading data or investment advice.", - "operationId": "polymarket-sports-summary", + "description": "Returns storefront metadata for Pristine Marketplace (https://www.pristinemarketplace.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "pristine-marketplace-store", "produces": [ "application/json" ], @@ -435771,7 +451846,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, "400": { @@ -435798,27 +451873,27 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket sports summary", + "summary": "Get Pristine Marketplace store metadata", "tags": [ - "Polymarket" + "PristineMarketplace" ] } }, - "/polymarket/sports/{id}": { + "/producthunt/category/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the Polymarket reference record for one sport, identified by the required sport `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-sport", + "description": "Returns a Product Hunt category by its `slug`, such as `vibe-coding`: name, description, meta title, last update time, parent category and its sub-categories, hero products, questions with top answers, and related discussions.", + "operationId": "producthunt-category", "parameters": [ { - "description": "Polymarket sport id", + "description": "Product Hunt category slug", "in": "path", - "name": "id", + "name": "slug", "required": true, - "type": "integer", - "x-example": 1 + "type": "string", + "x-example": "\"vibe-coding\"" } ], "produces": [ @@ -435826,31 +451901,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped category payload", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/producthunt.categoryResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Category not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -435861,98 +451936,67 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket sport detail", + "summary": "Retrieve Product Hunt category details", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/sports/{id}/external-partners": { + "/producthunt/category/{slug}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns the external partner records linked to one Polymarket sport, identified by the required sport `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-sport-external-partners", + "description": "Returns the products in a Product Hunt category (now backed by Product Hunt topics), cursor-paginated. Pass the `cursor` from a previous response's `end_cursor` to page; `page_size` controls the batch size. `page`, `featured_only`, `order` and `tags` are accepted for compatibility but no longer affect the result.", + "operationId": "producthunt-category-products", "parameters": [ { - "description": "Polymarket sport id", + "description": "Product Hunt category slug", "in": "path", - "name": "id", + "name": "slug", "required": true, - "type": "integer", - "x-example": 1 - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" - } + "type": "string", + "x-example": "\"developer-tools\"" }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Pagination cursor from a previous response's end_cursor", + "in": "query", + "name": "cursor", + "type": "string" }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "default": 15, + "description": "Page size (number of products)", + "in": "query", + "name": "page_size", + "type": "integer" }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "default": true, + "description": "Accepted for compatibility; no longer affects results", + "in": "query", + "name": "featured_only", + "type": "boolean" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Polymarket sport external partners", - "tags": [ - "Polymarket" - ] - } - }, - "/polymarket/sports/{id}/external-partners/{partner_ref}": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the external partner record for one Polymarket sport, identified by the sport `id` and a `partner_ref`, both required. The record comes back under `data` with a `fetched_at` time. Invalid identifiers return an invalid-parameter error.", - "operationId": "polymarket-sport-external-partner", - "parameters": [ + "default": "highest_rated", + "description": "Accepted for compatibility; no longer affects results", + "in": "query", + "name": "order", + "type": "string" + }, { - "description": "Polymarket sport id", - "in": "path", - "name": "id", - "required": true, - "type": "integer", - "x-example": 1 + "default": 1, + "description": "Accepted for compatibility; use cursor to paginate", + "in": "query", + "name": "page", + "type": "integer" }, { - "description": "Partner reference", - "in": "path", - "name": "partner_ref", - "required": true, - "type": "string", - "x-example": "nba" + "description": "Accepted for compatibility; no longer affects results", + "in": "query", + "name": "tags", + "type": "string" } ], "produces": [ @@ -435960,31 +452004,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped category products payload", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/producthunt.categoryProductsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Category not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -435995,99 +452039,86 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket sport external partner", + "summary": "Retrieve Product Hunt category products", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/spotlights": { + "/producthunt/leaderboard": { "get": { "consumes": [ "application/json" ], - "description": "Returns Polymarket's list of spotlights under `data`, with a `fetched_at` time. It takes no parameters. The data is a reference list, not real-time trading data or investment advice.", - "operationId": "polymarket-spotlights", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } + "description": "Returns the Product Hunt leaderboard for a `scope` of `daily` (default), `weekly`, `monthly` or `yearly`, positioned with `date` (YYYY-MM-DD) or `year`, `month`, `day` and `week`. Only the first page is served, so a non-empty `cursor` returns an error. `featured` and `order` are accepted but do not change the default view.", + "operationId": "producthunt-leaderboard", + "parameters": [ + { + "default": "daily", + "description": "Leaderboard scope: daily, weekly, monthly, yearly", + "enum": [ + "daily", + "weekly", + "monthly", + "yearly" + ], + "in": "query", + "name": "scope", + "type": "string" }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Anchor date in YYYY-MM-DD format. Used to derive missing year/month/day/week values.", + "format": "date", + "in": "query", + "name": "date", + "type": "string", + "x-example": "2026-01-29" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Polymarket spotlights", - "tags": [ - "Polymarket" - ] - } - }, - "/polymarket/spotlights/keyset": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Polymarket spotlights as a cursor-paged list under `data`. Control the page with `limit`, `offset`, `order`, `ascending` and `after_cursor`. The response includes a `fetched_at` time.", - "operationId": "polymarket-spotlights-keyset", - "parameters": [ + "description": "Leaderboard year override", + "in": "query", + "name": "year", + "type": "integer", + "x-example": 2026 + }, { - "description": "Rows to return", + "description": "Daily/monthly month override", "in": "query", - "name": "limit", + "name": "month", "type": "integer", - "x-example": 25 + "x-example": 1 }, { - "description": "Result offset", + "description": "Daily day override", "in": "query", - "name": "offset", + "name": "day", "type": "integer", - "x-example": 0 + "x-example": 29 }, { - "description": "Optional upstream sort field", + "description": "Weekly ISO week override", "in": "query", - "name": "order", - "type": "string", - "x-example": "createdAt" + "name": "week", + "type": "integer", + "x-example": 5 }, { - "default": false, - "description": "Sort ascending when true", + "default": true, + "description": "Featured products only", "in": "query", - "name": "ascending", + "name": "featured", "type": "boolean" }, { - "description": "Optional upstream cursor", + "description": "Ranking order override. Defaults to scope rank enum.", "in": "query", - "name": "after_cursor", + "name": "order", + "type": "string" + }, + { + "description": "Pagination cursor", + "in": "query", + "name": "cursor", "type": "string" } ], @@ -436096,25 +452127,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped typed leaderboard payload", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/producthunt.leaderboardResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436125,27 +452162,27 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket spotlight keyset", + "summary": "Retrieve Product Hunt leaderboard", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/spotlights/{slug}": { + "/producthunt/product/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket spotlight, identified by the required `slug`, under `data`, together with a `fetched_at` time. A slug that fails validation returns an invalid-parameter error. The data is a snapshot and is not investment advice.", - "operationId": "polymarket-spotlight", + "description": "Returns the core Product Hunt product details. The path takes an exact Product Hunt slug; if you only know the product name, look the slug up first with `/producthunt/search` (live) or `/datasets/producthunt-products/search` (indexed). Unknown slugs return 404, and that 404 is cached for one hour.", + "operationId": "producthunt-product", "parameters": [ { - "description": "Spotlight slug", + "description": "Product Hunt slug or numeric ID", "in": "path", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "nfl-draft" + "x-example": "\"chronicle-6\"" } ], "produces": [ @@ -436153,78 +452190,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped product payload (map[string]any)", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/producthunt.productResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Polymarket spotlight detail", - "tags": [ - "Polymarket" - ] - } - }, - "/polymarket/status": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the service status reported by Polymarket's public market-data API. The payload is passed through unchanged in `data`, with the source URL and the time it was fetched. Takes no parameters.", - "operationId": "polymarket-status", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" - } - }, - "400": { - "description": "Bad Request", + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436235,34 +452225,27 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket status", + "summary": "Retrieve Product Hunt product details", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/tag/slug/{slug}": { + "/producthunt/product/{id}/about": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket tag by its required `slug` instead of an id: its id, label and slug. An optional `locale` adjusts the lookup. An invalid slug returns an invalid-parameter error.", - "operationId": "polymarket-tag-by-slug", + "description": "Returns the about-page data for a Product Hunt product, looked up by its slug in `id`. It covers the product's launch details with badges, ranks, comment count and detailed reviews with alternative products, along with the product's ad, forum and media information.", + "operationId": "producthunt-about", "parameters": [ { - "description": "Polymarket tag slug", + "description": "Product Hunt slug", "in": "path", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "crypto" - }, - { - "description": "Optional upstream locale", - "in": "query", - "name": "locale", - "type": "string", - "x-example": "en" + "x-example": "\"producthunt\"" } ], "produces": [ @@ -436270,31 +452253,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped typed about-page payload", "schema": { - "$ref": "#/definitions/polymarket.tagResponseDoc" + "$ref": "#/definitions/producthunt.aboutResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436305,51 +452288,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Polymarket tag by slug", + "summary": "Retrieve Product Hunt product about page", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/tag/slug/{slug}/related-tags": { + "/producthunt/product/{id}/alternatives": { "get": { "consumes": [ "application/json" ], - "description": "Lists the Polymarket tags related to one tag, identified by the required tag `slug` instead of an id. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each tag has its id, label and slug.", - "operationId": "polymarket-related-tags-by-slug", + "description": "Lists alternatives to a Product Hunt product, looked up by its slug in `id`. `first` sets the page size (default 10), `order` defaults to `most_relevant`, and `tags` takes comma-separated tag slugs. Returns alternative items with ratings, badges and scores, alternative tags with counts, and related discussions. Use `end_cursor` as `cursor` for the next page.", + "operationId": "producthunt-alternatives", "parameters": [ { - "description": "Polymarket tag slug", + "description": "Product Hunt slug", "in": "path", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "crypto" + "x-example": "\"clico\"" }, { - "description": "Omit empty related tags", - "enum": [ - "true", - "false" - ], + "default": 10, + "description": "Page size", "in": "query", - "name": "omit_empty", + "name": "first", + "type": "integer" + }, + { + "description": "Pagination cursor", + "in": "query", + "name": "cursor", "type": "string" }, { - "description": "Optional upstream status filter", + "default": "most_relevant", + "description": "Sort order", "in": "query", - "name": "status", - "type": "string", - "x-example": "active" + "name": "order", + "type": "string" }, { - "description": "Optional upstream locale", + "description": "Comma-separated tag slugs", "in": "query", - "name": "locale", - "type": "string", - "x-example": "en" + "name": "tags", + "type": "string" } ], "produces": [ @@ -436357,25 +452342,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped alternatives payload", "schema": { - "$ref": "#/definitions/polymarket.tagsResponseDoc" + "$ref": "#/definitions/producthunt.alternativesResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436386,51 +452377,52 @@ "ApiKeyAuth": [] } ], - "summary": "Get related Polymarket tags by slug", + "summary": "Retrieve Product Hunt product alternatives", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/tag/slug/{slug}/related-tags/tags": { + "/producthunt/product/{id}/customers": { "get": { "consumes": [ "application/json" ], - "description": "Returns the related-tag relationship rows for one Polymarket tag, identified by the required tag `slug` instead of an id. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each row has an id, label and slug.", - "operationId": "polymarket-related-tag-rows-by-slug", + "description": "Lists the customer products of a Product Hunt product, looked up by its slug in `id`. `order` is `customers` (default) or `latest_launch`, `page` defaults to 1 and `page_size` to 10. Each item has its name, categories, badges, review and follower counts, and founder shoutouts. An unknown slug returns 404.", + "operationId": "producthunt-customers", "parameters": [ { - "description": "Polymarket tag slug", + "description": "Product Hunt slug", "in": "path", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "crypto" + "x-example": "\"openai\"" }, { - "description": "Omit empty related tags", + "default": "customers", + "description": "Product Hunt customers order", "enum": [ - "true", - "false" + "customers", + "latest_launch" ], "in": "query", - "name": "omit_empty", + "name": "order", "type": "string" }, { - "description": "Optional upstream status filter", + "default": 1, + "description": "Page number", "in": "query", - "name": "status", - "type": "string", - "x-example": "active" + "name": "page", + "type": "integer" }, { - "description": "Optional upstream locale", + "default": 10, + "description": "Results per page", "in": "query", - "name": "locale", - "type": "string", - "x-example": "en" + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -436438,25 +452430,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped customers payload", "schema": { - "$ref": "#/definitions/polymarket.tagsResponseDoc" + "$ref": "#/definitions/producthunt.customersResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436467,41 +452465,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get related Polymarket tag rows by slug", + "summary": "Retrieve Product Hunt product customers", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/tag/{id}": { + "/producthunt/product/{id}/launches": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Polymarket tag by its required `id`: its id, label and slug. Optional `include_template` and `locale` adjust the lookup. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-tag", + "description": "Lists the launch posts of a Product Hunt product, looked up by its slug in `id`. `order` defaults to `DATE`; pass the returned `end_cursor` as `cursor` for the next page. Each launch has its name, tagline, ranks, scores, comment count, badges and dates. An unknown slug returns 404.", + "operationId": "producthunt-launches", "parameters": [ { - "description": "Polymarket tag id", + "description": "Product Hunt slug", "in": "path", "name": "id", "required": true, "type": "string", - "x-example": "21" + "x-example": "\"openai\"" }, { - "default": false, - "description": "Include upstream template data when supported", + "description": "Pagination cursor", "in": "query", - "name": "include_template", - "type": "boolean" + "name": "cursor", + "type": "string" }, { - "description": "Optional upstream locale", + "default": "DATE", + "description": "Product Hunt launch order", "in": "query", - "name": "locale", + "name": "order", "type": "string", - "x-example": "en" + "x-example": "DATE" } ], "produces": [ @@ -436509,31 +452507,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped launches payload", "schema": { - "$ref": "#/definitions/polymarket.tagResponseDoc" + "$ref": "#/definitions/producthunt.launchesResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436544,51 +452542,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Polymarket tag by id", + "summary": "Retrieve Product Hunt product launches", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/tag/{id}/related-tags": { + "/producthunt/product/{id}/makers": { "get": { "consumes": [ "application/json" ], - "description": "Lists the Polymarket tags related to one tag, identified by the required tag `id`. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each tag has its id, label and slug. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-related-tags", + "description": "Lists the makers of a Product Hunt product, looked up by its slug in `id`. Each maker has a name, username, headline, avatar, follower count and the posts they made. The response includes `total_count` and claim status, and the returned `end_cursor` can be passed as `cursor` for the next page.", + "operationId": "producthunt-makers", "parameters": [ { - "description": "Polymarket tag id", + "description": "Product Hunt slug", "in": "path", "name": "id", "required": true, "type": "string", - "x-example": "21" + "x-example": "\"clico\"" }, { - "description": "Omit empty related tags", - "enum": [ - "true", - "false" - ], + "description": "Pagination cursor", "in": "query", - "name": "omit_empty", + "name": "cursor", "type": "string" - }, - { - "description": "Optional upstream status filter", - "in": "query", - "name": "status", - "type": "string", - "x-example": "active" - }, - { - "description": "Optional upstream locale", - "in": "query", - "name": "locale", - "type": "string", - "x-example": "en" } ], "produces": [ @@ -436596,25 +452576,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped makers payload", "schema": { - "$ref": "#/definitions/polymarket.tagsResponseDoc" + "$ref": "#/definitions/producthunt.makersResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436625,51 +452611,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get related Polymarket tags by id", + "summary": "Retrieve Product Hunt product makers", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/tag/{id}/related-tags/tags": { + "/producthunt/product/{id}/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns the related-tag relationship rows for one Polymarket tag, identified by the required tag `id`. Optional `omit_empty` (`true` or `false`), `status` and `locale` narrow the result. Each row has an id, label and slug. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-related-tag-rows", + "description": "Lists the detailed reviews of a Product Hunt product, looked up by its slug in `id`. Each review has its ratings, such as ease of use and customization, comment count, creation time, the launch it came from and any alternative products named. The response also gives the review counts and an `end_cursor`.", + "operationId": "producthunt-reviews", "parameters": [ { - "description": "Polymarket tag id", + "description": "Product Hunt slug", "in": "path", "name": "id", "required": true, "type": "string", - "x-example": "21" - }, - { - "description": "Omit empty related tags", - "enum": [ - "true", - "false" - ], - "in": "query", - "name": "omit_empty", - "type": "string" - }, - { - "description": "Optional upstream status filter", - "in": "query", - "name": "status", - "type": "string", - "x-example": "active" - }, - { - "description": "Optional upstream locale", - "in": "query", - "name": "locale", - "type": "string", - "x-example": "en" + "x-example": "\"clico\"" } ], "produces": [ @@ -436677,25 +452639,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped detailed reviews payload", "schema": { - "$ref": "#/definitions/polymarket.tagsResponseDoc" + "$ref": "#/definitions/producthunt.reviewsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Product not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436706,70 +452674,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get related Polymarket tag rows by id", + "summary": "Retrieve Product Hunt product detailed reviews", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/tags": { + "/producthunt/search": { "get": { "consumes": [ "application/json" ], - "description": "Lists Polymarket tags, up to `limit` rows (default 25, max 100), starting at `offset` (default 0, max 10000). Sort with `order` and flip direction with `ascending` (`true` or `false`); `locale` is optional. Each tag has its id, label and slug.", - "operationId": "polymarket-tags", + "description": "Searches Product Hunt for the required `query`. `type` is `product` (default), `user` or `launch`, and `page` starts at 1. `featured` and `topics` apply to launch search only. Results come as `edges` with `pageInfo` and `pagesCount`; launch search also returns topic aggregations.", + "operationId": "producthunt-search", "parameters": [ { - "description": "Maximum tags, defaults to 25 and supports up to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 - }, - { - "description": "Result offset, defaults to 0 and supports up to 10000", + "description": "Search keywords", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "query", + "required": true, + "type": "string", + "x-example": "\"ai\"" }, { - "default": "label", - "description": "Sort field", + "default": "product", + "description": "Result type: **product** (default), **user**, or **launch**", "enum": [ - "volume24hr", - "volume", - "liquidity", - "endDate", - "updatedAt", - "createdAt", - "id", - "slug", - "title", - "question", - "label" + "product", + "user", + "launch" ], "in": "query", - "name": "order", + "name": "type", "type": "string" }, { - "description": "Sort ascending flag", - "enum": [ - "true", - "false" - ], + "description": "Page number (1-based)", "in": "query", - "name": "ascending", - "type": "string" + "minimum": 1, + "name": "page", + "type": "integer", + "x-example": 2 }, { - "description": "Optional upstream locale", + "default": false, + "description": "Launch search only: featured launches only", "in": "query", - "name": "locale", + "name": "featured", + "type": "boolean" + }, + { + "description": "Launch search only: comma-separated topic slugs", + "in": "query", + "name": "topics", "type": "string", - "x-example": "en" + "x-example": "ai-chatbots,chrome-extensions" } ], "produces": [ @@ -436777,25 +452736,31 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped search payload (map[string]any)", "schema": { - "$ref": "#/definitions/polymarket.tagsResponseDoc" + "$ref": "#/definitions/producthunt.searchResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "No results found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -436806,74 +452771,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Polymarket tags", + "summary": "Search for products, users, or launches on Product Hunt", "tags": [ - "Polymarket" + "ProductHunt" ] } }, - "/polymarket/teams": { + "/propublica/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists Polymarket sports teams as rows under `data`. Filter by `league`, `name`, `abbreviation` or `provider_id`, and page with `limit`, `offset`, `order` and `ascending`. The response includes a `fetched_at` time.", - "operationId": "polymarket-teams", + "description": "Returns a ProPublica article by canonical `url` (`propublica.org/article/`): title, authors, publication and update dates, the dek as `description`, lead image where available, section, a `paywalled` flag and the body `paragraphs`.", + "operationId": "propublica-article", "parameters": [ { - "description": "Optional league filter", - "in": "query", - "name": "league", - "type": "string", - "x-example": "NBA" - }, - { - "description": "Optional team name filter", - "in": "query", - "name": "name", - "type": "string", - "x-example": "Knicks" - }, - { - "description": "Optional abbreviation filter", - "in": "query", - "name": "abbreviation", - "type": "string", - "x-example": "NYK" - }, - { - "description": "Optional provider id filter", - "in": "query", - "name": "provider_id", - "type": "string" - }, - { - "description": "Rows to return", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 - }, - { - "description": "Result offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Optional upstream sort field", + "description": "Canonical ProPublica article URL", "in": "query", - "name": "order", + "name": "url", + "required": true, "type": "string", - "x-example": "name" - }, - { - "default": false, - "description": "Sort ascending when true", - "in": "query", - "name": "ascending", - "type": "boolean" + "x-example": "https://www.propublica.org/article/fbi-susan-collins-navatek-campaign-donations-investigation" } ], "produces": [ @@ -436883,7 +452798,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -436892,8 +452807,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -436910,33 +452825,31 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket teams", + "summary": "Get ProPublica article content", "tags": [ - "Polymarket" + "ProPublica" ] } }, - "/polymarket/teams/by-partner": { + "/propublica/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Looks up Polymarket teams by a partner's identifiers, using `partner` (the partner name) and `external_id` (the partner's own id for the team). Matching teams come back as rows under `data`, with a `fetched_at` time.", - "operationId": "polymarket-teams-by-partner", + "description": "Returns one ProPublica staff/contributor's public profile: name, bio, contact email and social accounts where published, and one page of their recent bylined stories.", + "operationId": "propublica-author", "parameters": [ { - "description": "Partner name", + "description": "Canonical propublica.org/people/ URL", "in": "query", - "name": "partner", + "name": "url", + "required": true, "type": "string", - "x-example": "nba" + "x-example": "https://www.propublica.org/people/william-turton" }, { - "description": "Partner external id", + "description": "1-based page of recent stories to return; defaults to 1", "in": "query", - "name": "external_id", - "type": "string", - "x-example": "123" + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -436946,7 +452859,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/publicnews.propublicaAuthorResponseDoc" } }, "400": { @@ -436955,8 +452868,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -436973,27 +452886,59 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket teams by partner", + "summary": "Get a ProPublica staff profile", "tags": [ - "Polymarket" + "ProPublica" ] } }, - "/polymarket/teams/{id}": { + "/propublica/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the Polymarket reference record for one sports team, identified by the required team `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-team", + "description": "Returns the latest ProPublica stories for one topic. `section` is required and takes one of 33 topic slugs, such as `politics`, `health-care`, `immigration`, `courts`, `environment` or `trump-administration`. Each item has its title, URL, publication time and author.", + "operationId": "propublica-headlines", "parameters": [ { - "description": "Polymarket team id", - "in": "path", - "name": "id", + "description": "ProPublica topic slug", + "enum": [ + "abortion", + "biden-administration", + "civil-rights", + "courts", + "criminal-justice", + "debt", + "democracy", + "department-of-governmental-efficiency", + "education", + "environment", + "health-care", + "health-insurance", + "immigration", + "jan-6", + "labor", + "mental-health", + "military", + "nonprofits", + "police", + "politics", + "pollution", + "pregnancy", + "prison", + "racial-justice", + "real-estate", + "regulation", + "sex-and-gender", + "sports", + "stock", + "taxes", + "technology", + "trump-administration", + "usaid" + ], + "in": "query", + "name": "section", "required": true, - "type": "integer", - "x-example": 3270556 + "type": "string", + "x-example": "abortion" } ], "produces": [ @@ -437003,7 +452948,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -437012,18 +452957,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -437036,29 +452969,16 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket team detail", + "summary": "Get ProPublica topic headlines", "tags": [ - "Polymarket" + "ProPublica" ] } }, - "/polymarket/teams/{id}/external-partners": { + "/propublica/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the external partner records linked to one Polymarket team, identified by the required team `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-team-external-partners", - "parameters": [ - { - "description": "Polymarket team id", - "in": "path", - "name": "id", - "required": true, - "type": "integer", - "x-example": 3270556 - } - ], + "description": "Returns the latest ProPublica top stories across topics. Takes no parameters. Each item has its title, URL, summary, publication time and image, plus the author byline, which can name more than one reporter.", + "operationId": "propublica-news", "produces": [ "application/json" ], @@ -437066,19 +452986,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -437099,37 +453007,16 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket team external partners", + "summary": "Get ProPublica top stories", "tags": [ - "Polymarket" + "ProPublica" ] } }, - "/polymarket/teams/{id}/external-partners/{partner_ref}": { + "/propublica/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the external partner record for one Polymarket team, identified by the team `id` and a `partner_ref`, both required. The record comes back under `data` with a `fetched_at` time. Invalid identifiers return an invalid-parameter error.", - "operationId": "polymarket-team-external-partner", - "parameters": [ - { - "description": "Polymarket team id", - "in": "path", - "name": "id", - "required": true, - "type": "integer", - "x-example": 3270556 - }, - { - "description": "Partner reference", - "in": "path", - "name": "partner_ref", - "required": true, - "type": "string", - "x-example": "nba" - } - ], + "description": "Lists the 33 topics from ProPublica's Browse Topics menu that `propublica-headlines` accepts. Each entry has a stable `slug`, a display `name` and the topic's feed `url`. Takes no parameters.", + "operationId": "propublica-sections", "produces": [ "application/json" ], @@ -437137,31 +453024,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -437170,29 +453033,19 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket team external partner", + "summary": "Get ProPublica topics", "tags": [ - "Polymarket" + "ProPublica" ] } }, - "/polymarket/token/{token_id}/midpoint": { + "/psa/autographfacts/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the current midpoint price for one Polymarket outcome token, identified by the required `token_id`, as a single `midpoint` number such as 0.285. It is a read-only snapshot, returned with a `fetched_at` time and the `token_id`, and is not investment advice.", - "operationId": "polymarket-token-midpoint", - "parameters": [ - { - "description": "Polymarket CLOB token id", - "in": "path", - "name": "token_id", - "required": true, - "type": "string", - "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" - } - ], + "description": "PSA AutographFacts' full subject-category list -- the discovery endpoint for the category_id parameter used to browse subjects. Categories span far beyond sports: Baseball, Basketball, Football, Boxing, Golf, Hockey, Soccer, Tennis, MMA, Miscellaneous Sports, Cycling, Olympics, Motorsports, Entertainment, Music, Writers/Authors/Artists, Space Exploration, U.S. Presidents, and Historical & Political Figures.", + "operationId": "psa-autographfacts-categories", "produces": [ "application/json" ], @@ -437200,29 +453053,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.tokenMidpointResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/psa.autographFactsCategoriesResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437233,27 +453068,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token midpoint", + "summary": "List PSA AutographFacts categories", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/token/{token_id}/orderbook": { + "/psa/autographfacts/gallery": { "get": { "consumes": [ "application/json" ], - "description": "Returns the order book for one Polymarket outcome token, identified by the required `token_id`. The `book` has `bids` and `asks` as price and size pairs, the last trade price, tick size, minimum order size, condition id and a timestamp. Prices and sizes are numbers.", - "operationId": "polymarket-token-orderbook", + "description": "One autograph subject's full exemplar image gallery: real, captioned examples of authenticated signed items PSA keeps on file for this subject (signed photos, cards, baseballs, letters, contracts, and more), used as authentication reference material. subject_id is the numeric id from a psa-autographfacts-subjects result.", + "operationId": "psa-autographfacts-gallery", "parameters": [ { - "description": "Polymarket CLOB token id", - "in": "path", - "name": "token_id", + "description": "Numeric subject id, from a psa-autographfacts-subjects result", + "in": "query", + "name": "subject_id", "required": true, "type": "string", - "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" + "x-example": "1" } ], "produces": [ @@ -437263,7 +453098,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.tokenOrderBookResponseDoc" + "$ref": "#/definitions/psa.autographFactsGalleryResponseDoc" } }, "400": { @@ -437278,8 +453113,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437296,38 +453131,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token order book", + "summary": "Get a PSA AutographFacts subject's exemplar image gallery", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/token/{token_id}/price": { + "/psa/autographfacts/subject": { "get": { "consumes": [ "application/json" ], - "description": "Returns the current price for one Polymarket outcome token, identified by the required `token_id`. `side` is `buy` or `sell` and defaults to `buy`. The response gives the `price` as a number, the `side` used and a `fetched_at` time. It is a snapshot, not trading advice.", - "operationId": "polymarket-token-price", + "description": "One autograph subject's full public reference page: PSA's own authentication notes (signing habits, forgery risk, signature evolution), a general biography, and a per-item-type price guide (e.g. 3x5/AP card, photo, check, letter, single-signed ball -- item types vary by subject). subject_id is the numeric id from a psa-autographfacts-subjects result.", + "operationId": "psa-autographfacts-subject", "parameters": [ { - "description": "Polymarket CLOB token id", - "in": "path", - "name": "token_id", + "description": "Numeric subject id, from a psa-autographfacts-subjects result", + "in": "query", + "name": "subject_id", "required": true, "type": "string", - "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" - }, - { - "default": "buy", - "description": "Order side used for the CLOB price", - "enum": [ - "buy", - "sell" - ], - "in": "query", - "name": "side", - "type": "string" + "x-example": "1" } ], "produces": [ @@ -437337,7 +453161,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.tokenPriceResponseDoc" + "$ref": "#/definitions/psa.autographFactsSubjectResponseDoc" } }, "400": { @@ -437352,8 +453176,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437370,64 +453194,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token price", + "summary": "Get a PSA AutographFacts subject's profile and price guide", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/token/{token_id}/price-history": { + "/psa/autographfacts/subjects": { "get": { "consumes": [ "application/json" ], - "description": "Returns price history points for one Polymarket outcome token, identified by the required `token_id`. `interval` is one of `1m`, `1h`, `6h`, `1d` (default), `1w`, `all` or `max`; `fidelity` sets minutes per point (0 means 60, max 1440); `start_ts` and `end_ts` bound the range. Each point has a Unix `timestamp` and `price`. No points returns 404.", - "operationId": "polymarket-token-price-history", + "description": "Every autograph subject PSA AutographFacts lists for one category, each with the numeric subject_id to pass to psa-autographfacts-subject for that subject's full profile and price guide.", + "operationId": "psa-autographfacts-subjects", "parameters": [ { - "description": "Polymarket CLOB token id", - "in": "path", - "name": "token_id", - "required": true, - "type": "string", - "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" - }, - { - "default": "1d", - "description": "History interval", - "enum": [ - "1m", - "1h", - "6h", - "1d", - "1w", - "all", - "max" - ], - "in": "query", - "name": "interval", - "type": "string" - }, - { - "description": "Data point resolution in minutes; 0 uses the default 60; maximum 1440", - "in": "query", - "name": "fidelity", - "type": "integer", - "x-example": 60 - }, - { - "description": "Optional Unix timestamp lower bound", - "in": "query", - "name": "start_ts", - "type": "integer", - "x-example": 1780754400 - }, - { - "description": "Optional Unix timestamp upper bound", + "description": "Category id, from psa-autographfacts-categories", "in": "query", - "name": "end_ts", + "name": "category_id", + "required": true, "type": "integer", - "x-example": 1780840800 + "x-example": 4 } ], "produces": [ @@ -437437,7 +453224,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.tokenPriceHistoryResponseDoc" + "$ref": "#/definitions/psa.autographFactsSubjectsResponseDoc" } }, "400": { @@ -437446,14 +453233,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437470,29 +453251,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token price history", + "summary": "List PSA AutographFacts subjects in a category", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/token/{token_id}/spread": { + "/psa/cardfacts/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the current bid-ask spread for one Polymarket outcome token, identified by the required `token_id`, as a single `spread` number. It is a read-only snapshot with a `fetched_at` time and is not investment advice.", - "operationId": "polymarket-token-spread", - "parameters": [ - { - "description": "Polymarket CLOB token id", - "in": "path", - "name": "token_id", - "required": true, - "type": "string", - "x-example": "81927025054404355287140018940169293739219157042658469116956164881873598220211" - } - ], + "description": "PSA CardFacts' full category list -- the discovery endpoint for the category_id parameter used to browse sets. Nine categories: Baseball, Basketball, Boxing, Football, Golf, Hockey, Misc Sports, Multi-Sport, and Non-Sports/TCG.", + "operationId": "psa-cardfacts-categories", "produces": [ "application/json" ], @@ -437500,29 +453271,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.tokenSpreadResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/psa.cardFactsCategoriesResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437533,28 +453286,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token spread", + "summary": "List PSA CardFacts categories", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/tokens/midpoints": { - "post": { + "/psa/cardfacts/checklist": { + "get": { "consumes": [ "application/json" ], - "description": "Returns public CLOB midpoints for up to 25 Polymarket token ids. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-tokens-midpoints", + "description": "One set's full card checklist: every card's name and printed number (number is empty for sets PSA lists without one, e.g. many autograph/player-only card sets). set_id is the numeric id from a psa-cardfacts-sets result.", + "operationId": "psa-cardfacts-checklist", "parameters": [ { - "description": "Token ids request body", - "in": "body", - "name": "body", + "description": "Numeric set id, from a psa-cardfacts-sets result", + "in": "query", + "name": "set_id", "required": true, - "schema": { - "$ref": "#/definitions/polymarket.BatchTokenMidpointsOption" - } + "type": "string", + "x-example": "34071" } ], "produces": [ @@ -437564,7 +453316,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.batchTokenMidpointsResponseDoc" + "$ref": "#/definitions/psa.cardFactsChecklistResponseDoc" } }, "400": { @@ -437573,14 +453325,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437597,28 +453343,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token midpoints", + "summary": "Get a PSA CardFacts set's card checklist", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/tokens/orderbooks": { - "post": { + "/psa/cardfacts/sets": { + "get": { "consumes": [ "application/json" ], - "description": "Returns public CLOB order-book depth for up to 25 Polymarket token ids. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-tokens-orderbooks", + "description": "Every card set PSA CardFacts lists for one category, each with the numeric set_id to pass to psa-cardfacts-checklist for that set's full card checklist.", + "operationId": "psa-cardfacts-sets", "parameters": [ { - "description": "Token ids request body", - "in": "body", - "name": "body", + "description": "Category id, from psa-cardfacts-categories", + "in": "query", + "name": "category_id", "required": true, - "schema": { - "$ref": "#/definitions/polymarket.BatchTokenOrderBooksOption" - } + "type": "integer", + "x-example": 13 } ], "produces": [ @@ -437628,7 +453373,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.batchTokenOrderBooksResponseDoc" + "$ref": "#/definitions/psa.cardFactsSetsResponseDoc" } }, "400": { @@ -437637,14 +453382,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437661,28 +453400,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token order books", + "summary": "List PSA CardFacts sets in a category", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/tokens/prices": { - "post": { + "/psa/cert-lookup": { + "get": { "consumes": [ "application/json" ], - "description": "Returns public CLOB buy and sell prices for up to 25 Polymarket token ids. The `side` enum accepts `buy` and `sell`; when omitted, both sides are returned. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-tokens-prices", + "description": "Looks up PSA's own public Cert Verification record for one PSA-graded card by its certification number: item title, grade, label type, reverse cert/barcode flag, year, brand/title, subject, card number, category, PSA's own price estimate, and this-cert's-own population figures (population for this exact card+grade, and pop-higher). Scoped to PSA's trading-card department; a cert number issued under a different PSA division (autographs, tickets) returns a not-found error. PSA's full Population Report and Auction Prices Realized both require a PSA/Collectors account login and are not available through this endpoint.", + "operationId": "psa-cert-lookup", "parameters": [ { - "description": "Token ids request body", - "in": "body", - "name": "body", + "description": "PSA certification number, numeric, e.g. \\", + "in": "query", + "name": "cert_number", "required": true, - "schema": { - "$ref": "#/definitions/polymarket.BatchTokenPricesOption" - } + "type": "string", + "x-example": "125866845" } ], "produces": [ @@ -437692,7 +453430,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.batchTokenPricesResponseDoc" + "$ref": "#/definitions/psa.certLookupResponseDoc" } }, "400": { @@ -437707,8 +453445,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437725,30 +453463,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token prices", + "summary": "Verify a PSA certification number", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/tokens/spreads": { - "post": { + "/psa/price-guide/categories": { + "get": { "consumes": [ "application/json" ], - "description": "Returns public CLOB spreads for up to 25 Polymarket token ids. This does not require a Polymarket user token, wallet signature, cookies, or personal account authentication.", - "operationId": "polymarket-tokens-spreads", - "parameters": [ - { - "description": "Token ids request body", - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/polymarket.BatchTokenSpreadsOption" - } - } - ], + "description": "PSA Price Guide's full category list -- the discovery endpoint for the category_path parameter used to browse or fetch a set's price table. Every category is a distinct collectible type (Baseball Cards, Basketball Cards, Boxing Cards, Football Cards, Golf Cards, Hockey Cards, Soccer Cards, Non-Sports/TCG Cards, Racing Cards, Sports Tickets, Tennis, Unopened Packs, Presidential Autographs, Sports Autographs, Professional Model/Game-Used Bats, Graded Baseballs).", + "operationId": "psa-price-guide-categories", "produces": [ "application/json" ], @@ -437756,29 +453483,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.batchTokenSpreadsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/psa.priceGuideCategoriesResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437789,47 +453498,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get Polymarket token spreads", + "summary": "List PSA Price Guide categories", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/tournaments": { + "/psa/price-guide/search": { "get": { "consumes": [ "application/json" ], - "description": "Lists Polymarket tournaments as rows under `data`, with a `fetched_at` time. Page with `limit` and `offset`, and sort with `order` and `ascending`. The data is reference data, not real-time trading data or investment advice.", - "operationId": "polymarket-tournaments", + "description": "Searches PSA Price Guide by free text (a player/subject name or set name), matching PSA's own site search box. Each result is a matching set with the query's matching cards/items inside it; use a result's category_path, set_path and set_id as the input to psa-price-guide-set to fetch that set's full price table.", + "operationId": "psa-price-guide-search", "parameters": [ { - "description": "Rows to return", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 - }, - { - "description": "Result offset", + "description": "Free-text search term, e.g. a player/subject name or set name", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "query", + "required": true, + "type": "string", + "x-example": "griffey" }, { - "description": "Optional upstream sort field", + "description": "One-based result page, default 1", "in": "query", - "name": "order", - "type": "string", - "x-example": "name" + "name": "page", + "type": "integer" }, { - "default": false, - "description": "Sort ascending when true", + "description": "Results per page, default 50, max 100", "in": "query", - "name": "ascending", - "type": "boolean" + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -437839,7 +453540,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/psa.priceGuideSearchResponseDoc" } }, "400": { @@ -437848,8 +453549,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437866,27 +453567,43 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket tournaments", + "summary": "Search PSA Price Guide", "tags": [ - "Polymarket" + "PSA" ] } }, - "/polymarket/tournaments/{id}": { + "/psa/price-guide/set": { "get": { "consumes": [ "application/json" ], - "description": "Returns the Polymarket reference record for one tournament, identified by the required tournament `id`, under `data`. The response includes a `fetched_at` time. An invalid id returns an invalid-parameter error.", - "operationId": "polymarket-tournament", + "description": "Fetches one PSA Price Guide set's full grade-by-grade price table: every card in the set with PSA's own formatted price per grade column (the set's own grade columns vary -- a vintage set may carry more/lower grade tiers than a modern one). category_path, set_path and set_id together identify the set; use the matching fields from a psa-price-guide-search result, or category_path from psa-price-guide-categories combined with a set_path/set_id found by browsing PSA's own category page.", + "operationId": "psa-price-guide-set", "parameters": [ { - "description": "Polymarket tournament id", - "in": "path", - "name": "id", + "description": "Category URL path segment, from psa-price-guide-categories or a psa-price-guide-search result", + "in": "query", + "name": "category_path", + "required": true, + "type": "string", + "x-example": "baseball-card-values" + }, + { + "description": "Set URL path segment, from a psa-price-guide-search result", + "in": "query", + "name": "set_path", + "required": true, + "type": "string", + "x-example": "1974-topps" + }, + { + "description": "PSA's own numeric set id, from a psa-price-guide-search result", + "in": "query", + "name": "set_id", "required": true, - "type": "integer", - "x-example": 2 + "type": "string", + "x-example": "1239" } ], "produces": [ @@ -437896,7 +453613,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/polymarket.publicDataResponseDoc" + "$ref": "#/definitions/psa.priceGuideSetResponseDoc" } }, "400": { @@ -437911,8 +453628,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437929,33 +453646,63 @@ "ApiKeyAuth": [] } ], - "summary": "Polymarket tournament detail", + "summary": "Get a PSA Price Guide set's price table", "tags": [ - "Polymarket" + "PSA" ] } }, - "/popeyes/faq": { + "/psa/price-guide/sets": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Popeyes' published customer-support FAQ -- questions and answers such as \"How do I remove items from my cart?\". This is public help-center content, not account/order-specific support state, and does not require an order id or any customer identifier.", - "operationId": "popeyes-faq", + "description": "Searches PSA Price Guide by set name (for example \"1974 topps\" or \"super bowl\") using PSA's own browse-by-category pages. It matches set names only: it does not search card or player names, and results carry no card items. Use psa-price-guide-search for card and player search while PSA's own search is available. Every word of the query must start a word of the set name; exact and leading matches rank first. Each result's category_path, set_path and set_id are the inputs to psa-price-guide-set. Set lists are cached for 12 hours, so a first call after a cold start can take longer. If a category's set list cannot be loaded, the other categories still answer and unavailable_categories names the missing ones.", + "operationId": "psa-price-guide-sets", "parameters": [ { - "description": "Maximum FAQ entries to return, 1-100 (default 20)", + "description": "Set-name search term, e.g. 1974 topps", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "name": "query", + "required": true, + "type": "string", + "x-example": "1974 topps" }, { - "description": "Number of FAQ entries to skip, for paging (default 0)", + "description": "Restrict to one category. Allowed values: baseball-card-values, basketball-card-values, boxing-card-values, football-card-values, golf-card-values, hockey-card-values, soccer-card-values, non-sports-tcg-card-values, racing-card-values, sports-ticket-values, tennis-card-values, unopened-pack-values, presidential-autograph-values, sports-autograph-values, game-used-bat-values, graded-baseball-values. Default: every category.", + "enum": [ + "baseball-card-values", + "basketball-card-values", + "boxing-card-values", + "football-card-values", + "golf-card-values", + "hockey-card-values", + "soccer-card-values", + "non-sports-tcg-card-values", + "racing-card-values", + "sports-ticket-values", + "tennis-card-values", + "unopened-pack-values", + "presidential-autograph-values", + "sports-autograph-values", + "game-used-bat-values", + "graded-baseball-values" + ], "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "category_path", + "type": "string" + }, + { + "description": "One-based result page, default 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Sets per page, default 50, max 100", + "in": "query", + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -437965,7 +453712,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.faqResponseDoc" + "$ref": "#/definitions/psa.priceGuideSetsResponseDoc" } }, "400": { @@ -437974,8 +453721,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -437992,36 +453739,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Popeyes' published customer-support FAQ", + "summary": "Search PSA Price Guide set names", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popeyes/location": { + "/psa/probatfacts/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns one restaurant's full detail -- the same fields /popeyes/locations returns per restaurant (address, coordinates, phone, operator, amenity flags, full published hours) -- looked up directly by its numeric store id instead of a coordinate/radius search. Useful when the store id is already known, e.g. from a prior /popeyes/locations call. An unknown store id returns a 404.", - "operationId": "popeyes-location", - "parameters": [ - { - "description": "Popeyes' numeric store id, from /popeyes/locations", - "in": "query", - "name": "store_id", - "required": true, - "type": "string", - "x-example": "14156" - }, - { - "description": "Restaurant market: `US` (default) or `CA`", - "in": "query", - "name": "market", - "type": "string", - "x-example": "US" - } - ], + "description": "PSA ProBatFacts' full player-category list -- the discovery endpoint for the category_id parameter used to browse players. Baseball-bat authentication only, split by Hall of Fame status: Hall of Fame Players, Star Players.", + "operationId": "psa-probatfacts-categories", "produces": [ "application/json" ], @@ -438029,29 +453759,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.locationResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/psa.probatFactsCategoriesResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -438062,56 +453774,27 @@ "ApiKeyAuth": [] } ], - "summary": "Look up one Popeyes restaurant directly by store id", + "summary": "List PSA ProBatFacts categories", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popeyes/locations": { + "/psa/probatfacts/gallery": { "get": { "consumes": [ "application/json" ], - "description": "Returns Popeyes restaurants near a latitude/longitude. Each restaurant carries its internal id and numeric store id (the value /popeyes/menu takes), full address with coordinates, phone, the operating franchise group, amenity flags (breakfast, delivery, drive-thru, playground, takeout, wifi, halal, dark kitchen) and the full published week of hours for dining room, drive-thru, delivery and curbside separately. A coordinate with no nearby Popeyes returns an empty list rather than an error.", - "operationId": "popeyes-locations", + "description": "One player's full exemplar image gallery: real, captioned examples of authenticated bats PSA keeps on file for this player, used as authentication reference material. subject_id is the numeric id from a psa-probatfacts-subjects result.", + "operationId": "psa-probatfacts-gallery", "parameters": [ { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 40.7128 - }, - { - "description": "Search center longitude", + "description": "Numeric subject id, from a psa-probatfacts-subjects result", "in": "query", - "name": "longitude", + "name": "subject_id", "required": true, - "type": "number", - "x-example": -74.006 - }, - { - "description": "Search radius in meters, 1-50000 (default 8000)", - "in": "query", - "name": "radius", - "type": "integer", - "x-example": 8000 - }, - { - "description": "Maximum restaurants to return, 1-50 (default 20)", - "in": "query", - "name": "max_results", - "type": "integer", - "x-example": 20 - }, - { - "description": "Restaurant market: `US` (default) or `CA`", - "in": "query", - "name": "market", "type": "string", - "x-example": "US" + "x-example": "1490" } ], "produces": [ @@ -438121,7 +453804,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.locationsResponseDoc" + "$ref": "#/definitions/psa.probatFactsGalleryResponseDoc" } }, "400": { @@ -438136,8 +453819,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -438154,34 +453837,27 @@ "ApiKeyAuth": [] } ], - "summary": "Find Popeyes restaurants near a location", + "summary": "Get a PSA ProBatFacts player's exemplar image gallery", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popeyes/menu": { + "/psa/probatfacts/subject": { "get": { "consumes": [ "application/json" ], - "description": "Returns one restaurant's menu grouped into categories (e.g. \"Big Box\", \"Chicken Wraps\"). Every entry is an item, a combo, a picker (a variant-choice product such as \"choose your side\") or a bundle, and carries a price reflecting this specific restaurant when Popeyes reports one for that exact entry -- a missing price does not mean the item is free, it means this restaurant's pricing call did not cover that entry. Some menu entries are published directly at the top level outside any named section; these are grouped into a synthetic \"Featured\" category (featured true). Entries of type ITEM also carry published nutrition facts and allergen data when Popeyes reports them for that item; COMBO/PICKER/BUNDLE entries do not carry their own nutrition/allergen data.", - "operationId": "popeyes-menu", + "description": "One player's full public reference page: PSA's own bat-authentication notes (professional models used, signature placement) and a general player biography. Unlike psa-autographfacts-subject, this carries no price guide. subject_id is the numeric id from a psa-probatfacts-subjects result.", + "operationId": "psa-probatfacts-subject", "parameters": [ { - "description": "Popeyes' numeric store id, from /popeyes/locations", + "description": "Numeric subject id, from a psa-probatfacts-subjects result", "in": "query", - "name": "store_id", + "name": "subject_id", "required": true, "type": "string", - "x-example": "14156" - }, - { - "description": "Restaurant market: `US` (default) or `CA`", - "in": "query", - "name": "market", - "type": "string", - "x-example": "US" + "x-example": "1490" } ], "produces": [ @@ -438191,7 +453867,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.menuResponseDoc" + "$ref": "#/definitions/psa.probatFactsSubjectResponseDoc" } }, "400": { @@ -438206,8 +453882,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -438224,40 +453900,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Popeyes restaurant's menu with real per-store pricing", + "summary": "Get a PSA ProBatFacts player's bat-authentication reference page", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popeyes/offers": { + "/psa/probatfacts/subjects": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Popeyes' promotional offers/deals catalog -- named value deals (e.g. \"3Pc Signature Chicken for $5\"), percentage-off combos, and paper coupons. This is CMS content describing the offer catalog, the same kind of public data /popeyes/menu already reads from -- not a personalized or store-specific list, and not account/loyalty state. A missing price does not mean free; a price of 0 means the offer's discount is not expressed as a flat price (see offer_tag/name instead, e.g. a percentage-off deal). requires_authentication reflects the offer's own published redemption rules, not any account state this endpoint reads. The catalog spans hundreds of entries including ones no longer running; there is no upstream \"currently active\" flag, so pages should be read as reference data, not a guarantee every entry is live right now.", - "operationId": "popeyes-offers", + "description": "Every player PSA ProBatFacts lists for one category, each with the numeric subject_id to pass to psa-probatfacts-subject for that player's full bat-authentication reference page.", + "operationId": "psa-probatfacts-subjects", "parameters": [ { - "description": "Maximum offers to return, 1-100 (default 20)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Number of offers to skip, for paging (default 0)", + "description": "Category id, from psa-probatfacts-categories", "in": "query", - "name": "offset", + "name": "category_id", + "required": true, "type": "integer", - "x-example": 0 - }, - { - "description": "Restaurant market: US (default) or CA", - "in": "query", - "name": "market", - "type": "string", - "x-example": "US" + "x-example": 29 } ], "produces": [ @@ -438267,7 +453930,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.offersResponseDoc" + "$ref": "#/definitions/psa.probatFactsSubjectsResponseDoc" } }, "400": { @@ -438276,8 +453939,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -438294,40 +453957,62 @@ "ApiKeyAuth": [] } ], - "summary": "List Popeyes' promotional deals and coupons", + "summary": "List PSA ProBatFacts subjects in a category", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popeyes/promotions": { + "/psa/ticketfacts/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Popeyes Rewards' bonus-points promotion catalog -- flat or multiplied points bonuses tied to a qualifying purchase (e.g. \"Get Double Bonus Points on Your Cart, minimum $20\"), distinct from /popeyes/offers (priced menu deals) and /popeyes/quests (multi-step challenges). This is public CMS content, not a signed-in member's own applied-promotions state. points_multiplier and bonus_points are mutually exclusive in practice -- a promotion is either an \"Nx points\" campaign or a flat bonus. start_date/end_date bound the promotion's published active window when Popeyes sets one; both empty means no published window restriction, not that the promotion is permanently active.", - "operationId": "popeyes-promotions", - "parameters": [ - { - "description": "Maximum promotions to return, 1-100 (default 20)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "description": "PSA TicketFacts' full event-category list -- the discovery endpoint for the category_id parameter used to browse events. Spans NFL, MLB and NBA historic events: Super Bowl, World Series, MLB All Star Game, Historic Baseball Events, and Historic Basketball Events.", + "operationId": "psa-ticketfacts-categories", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/psa.ticketFactsCategoriesResponseDoc" + } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Number of promotions to skip, for paging (default 0)", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, + "ApiKeyAuth": [] + } + ], + "summary": "List PSA TicketFacts categories", + "tags": [ + "PSA" + ] + } + }, + "/psa/ticketfacts/gallery": { + "get": { + "consumes": [ + "application/json" + ], + "description": "One event's full exemplar image gallery: real, captioned examples of authenticated tickets from this event PSA keeps on file, used as authentication reference material. subject_id is the numeric id from a psa-ticketfacts-subjects result.", + "operationId": "psa-ticketfacts-gallery", + "parameters": [ { - "description": "Restaurant market: US (default) or CA", + "description": "Numeric subject id, from a psa-ticketfacts-subjects result", "in": "query", - "name": "market", + "name": "subject_id", + "required": true, "type": "string", - "x-example": "US" + "x-example": "1147" } ], "produces": [ @@ -438337,7 +454022,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.promotionsResponseDoc" + "$ref": "#/definitions/psa.ticketFactsGalleryResponseDoc" } }, "400": { @@ -438346,8 +454031,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -438364,40 +454055,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Popeyes Rewards' bonus-points promotion catalog", + "summary": "Get a PSA TicketFacts event's exemplar image gallery", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popeyes/quests": { + "/psa/ticketfacts/subject": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Popeyes Rewards' loyalty-challenge catalog -- named multi-step challenges and their reward (e.g. \"Make Two Purchases, Get FREE Chicken Sandwich in the form of 550 Bonus Points\"). This is public CMS content describing the challenge and its incentive, the same class of public promotional data as /popeyes/offers -- not scoped to any signed-in member and does not report which quests a given account has completed or activated. step_count is how many steps make up the quest; this build does not expose each step's own purchase-requirement rules.", - "operationId": "popeyes-quests", + "description": "One event's full public ticket reference page: PSA's own historical writeup of the event and the ticket(s) involved. Unlike psa-autographfacts-subject, this carries no price guide. subject_id is the numeric id from a psa-ticketfacts-subjects result.", + "operationId": "psa-ticketfacts-subject", "parameters": [ { - "description": "Maximum quests to return, 1-100 (default 20)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Number of quests to skip, for paging (default 0)", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Restaurant market: US (default) or CA", + "description": "Numeric subject id, from a psa-ticketfacts-subjects result", "in": "query", - "name": "market", + "name": "subject_id", + "required": true, "type": "string", - "x-example": "US" + "x-example": "1147" } ], "produces": [ @@ -438407,7 +454085,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.questsResponseDoc" + "$ref": "#/definitions/psa.ticketFactsSubjectResponseDoc" } }, "400": { @@ -438416,8 +454094,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -438434,40 +454118,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Popeyes Rewards' loyalty-challenge catalog", + "summary": "Get a PSA TicketFacts event's ticket reference page", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popeyes/rewards": { + "/psa/ticketfacts/subjects": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Popeyes Rewards' points-redemption catalog -- menu items and combos a member can redeem directly for a fixed number of loyalty points (e.g. \"600 points for Cheese Bites\"), distinct from /popeyes/offers (priced deals), /popeyes/quests (challenges) and /popeyes/promotions (bonus-points campaigns). This is public CMS content, not a signed-in member's own points balance or redemption history. points is the loyalty points cost to redeem; other per-account/per-order redemption restrictions Popeyes may publish on a reward are not exposed by this endpoint.", - "operationId": "popeyes-rewards", + "description": "Every event PSA TicketFacts lists for one category, each with the numeric subject_id to pass to psa-ticketfacts-subject for that event's full ticket reference page.", + "operationId": "psa-ticketfacts-subjects", "parameters": [ { - "description": "Maximum rewards to return, 1-100 (default 20)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Number of rewards to skip, for paging (default 0)", + "description": "Category id, from psa-ticketfacts-categories", "in": "query", - "name": "offset", + "name": "category_id", + "required": true, "type": "integer", - "x-example": 0 - }, - { - "description": "Restaurant market: US (default) or CA", - "in": "query", - "name": "market", - "type": "string", - "x-example": "US" + "x-example": 21 } ], "produces": [ @@ -438477,7 +454148,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/popeyes.rewardsResponseDoc" + "$ref": "#/definitions/psa.ticketFactsSubjectsResponseDoc" } }, "400": { @@ -438486,8 +454157,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -438504,16 +454175,35 @@ "ApiKeyAuth": [] } ], - "summary": "List Popeyes Rewards' points-redemption catalog", + "summary": "List PSA TicketFacts subjects in a category", "tags": [ - "Popeyes" + "PSA" ] } }, - "/popularmechanics/news": { + "/psastore/collections": { "get": { - "description": "Returns current stories from Popular Mechanics' public all-stories RSS feed. Summaries are publisher teasers, not full article text. This feed-only route does not claim a complete section taxonomy or retrieve article bodies.", - "operationId": "popularmechanics-news", + "consumes": [ + "application/json" + ], + "description": "Returns collections from the PSA Team Store (https://store.psacard.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", + "operationId": "psastore-collections", + "parameters": [ + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum collections, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + } + ], "produces": [ "application/json" ], @@ -438521,7 +454211,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -438542,33 +454238,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get Popular Mechanics top stories", + "summary": "List PSA Store collections", "tags": [ - "Popular Mechanics" + "PSAStore" ] } }, - "/poshmark/brand/{name}": { + "/psastore/collections/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Poshmark listings for a given brand name (e.g. Nike), the same browsing view as Poshmark's own brand pages. Pass a previous response's next_max_id back as max_id to fetch the next page.", - "operationId": "poshmark-brand", + "description": "Returns products from one PSA Team Store (https://store.psacard.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", + "operationId": "psastore-collection-products", "parameters": [ { - "description": "Poshmark brand name, matching the path segment of a /brand/{name} URL", + "description": "Collection handle", "in": "path", - "name": "name", + "name": "handle", "required": true, "type": "string", - "x-example": "Nike" + "x-example": "collection-handle" }, { - "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", + "description": "1-based page, defaults to 1", "in": "query", - "name": "max_id", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -438578,7 +454282,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.BrandResponse" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { @@ -438593,8 +454297,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -438611,19 +454315,35 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Poshmark listings by brand", + "summary": "List PSA Store collection products", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/poshmark/brands": { + "/psastore/pages": { "get": { "consumes": [ "application/json" ], - "description": "Returns Poshmark's full brand directory: every brand Poshmark recognizes (name, slug, logo, known aliases), not just brands with active listings for a given search or category filter. Useful for resolving a brand name to the exact value the brand/search filters expect.", - "operationId": "poshmark-brands", + "description": "Lists static pages from the PSA Team Store, 50 per page by default (`limit` up to 250, `page` starts at 1). Each page has its `handle`, `title`, `url`, plain-text `content` and timestamps. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", + "operationId": "psastore-pages", + "parameters": [ + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum static pages, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + } + ], "produces": [ "application/json" ], @@ -438631,11 +454351,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.brandsResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -438652,19 +454378,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get the full Poshmark brand directory", + "summary": "List PSA Store static pages", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/poshmark/categories": { + "/psastore/pages/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Poshmark's full department/category browse taxonomy (e.g. Women > Shoes, Men > Jackets & Coats). Each entry's path resolves directly against the category endpoint. This is reference data that changes rarely, so responses are cached.", - "operationId": "poshmark-categories", + "description": "Returns one PSA Team Store static page by its `handle`: title, URL, plain-text `content` (HTML is stripped), and created, published and updated times. An unknown handle returns 404. When the store's standard page data is unavailable, `transport_mode` is `ssr_embedded` and `id` is omitted.", + "operationId": "psastore-page", + "parameters": [ + { + "description": "Page handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "page-handle" + } + ], "produces": [ "application/json" ], @@ -438672,11 +454408,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.categoriesResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -438693,33 +454441,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Poshmark department/category browse taxonomy", + "summary": "Get a PSA Store static page", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/poshmark/category/{path}": { + "/psastore/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Poshmark listings for a given category path (e.g. Women-Shoes, Men-Shirts), the same browsing view as Poshmark's own category pages. Pass a previous response's next_max_id back as max_id to fetch the next page.", - "operationId": "poshmark-category", + "description": "Returns products from the PSA Team Store's (https://store.psacard.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "psastore-products", "parameters": [ { - "description": "Poshmark category path segment, e.g. Women-Shoes, Men-Shirts", - "in": "path", - "name": "path", - "required": true, - "type": "string", - "x-example": "Women-Shoes" + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "max_id", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -438729,7 +454477,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.CategoryResponse" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" } }, "400": { @@ -438738,14 +454486,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -438762,33 +454504,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Poshmark listings by category", + "summary": "List PSA Store products", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/poshmark/closet/{username}": { + "/psastore/products/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Poshmark closet (seller storefront) page: the seller's public profile and reputation stats (followers, ratings, items sold) plus a first page of their currently available listings and total listing count. Pass a previous response's next_max_id back as max_id to fetch the next page of listings; paginated responses omit the seller profile, so fetch without max_id first to get seller fields.", - "operationId": "poshmark-closet", + "description": "Returns product detail for one PSA Team Store (https://store.psacard.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "psastore-product", "parameters": [ { - "description": "Poshmark seller username, the path segment of a /closet/{username} URL", + "description": "Product handle", "in": "path", - "name": "username", + "name": "handle", "required": true, "type": "string", - "x-example": "maltimar" - }, - { - "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", - "in": "query", - "name": "max_id", - "type": "string" + "x-example": "product-handle" } ], "produces": [ @@ -438798,7 +454534,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.ClosetResponse" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { @@ -438813,8 +454549,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -438831,27 +454567,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get Poshmark seller closet (storefront)", + "summary": "Get a PSA Store product", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/poshmark/listing/{id}": { + "/psastore/products/{handle}/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Poshmark item-detail page: the full listing (description, all photos, size/brand/condition, inventory), its seller's profile, public comments, and similar listings Poshmark itself surfaces on the same page.", - "operationId": "poshmark-listing", + "description": "Returns recommended products for one PSA Team Store (https://store.psacard.com) product handle. The storefront URL is fixed server-side.", + "operationId": "psastore-product-recommendations", "parameters": [ { - "description": "Poshmark listing id, the trailing id segment of a /listing/{slug}-{id} URL", + "description": "Product handle", "in": "path", - "name": "id", + "name": "handle", "required": true, "type": "string", - "x-example": "6a3fed1de9c77df92e2c0cc6" + "x-example": "product-handle" + }, + { + "description": "Maximum products, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", + "enum": [ + "related", + "complementary" + ], + "in": "query", + "name": "intent", + "type": "string", + "x-example": "related" } ], "produces": [ @@ -438861,7 +454615,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.ListingResponse" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -438876,8 +454630,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -438894,40 +454648,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get Poshmark listing detail", + "summary": "List PSA Store product recommendations", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/poshmark/search": { + "/psastore/search/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Searches Poshmark for clothing, shoes, and accessory listings, returning listing summaries (title, price, brand, size, condition, seller, images) plus the total matching count and an opaque pagination cursor. Pass a previous response's next_max_id back as max_id to fetch the next page.", - "operationId": "poshmark-search", + "description": "Returns products, collections, and query suggestions from the PSA Team Store's (https://store.psacard.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "psastore-search-suggest", "parameters": [ { - "description": "Free-text keyword search", + "description": "Search query", "in": "query", - "name": "query", + "name": "q", "required": true, "type": "string", - "x-example": "nike jacket" + "x-example": "case" }, { - "description": "Department filter, e.g. Women, Men, Kids", + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", "in": "query", - "name": "department", + "name": "types", "type": "string", - "x-example": "Men" + "x-example": "product,collection,query" }, { - "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", + "description": "Maximum results per type, defaults to 10 and supports up to 20", "in": "query", - "name": "max_id", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -438937,7 +454692,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.searchResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { @@ -438946,8 +454701,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -438964,33 +454719,42 @@ "ApiKeyAuth": [] } ], - "summary": "Search Poshmark listings", + "summary": "Get PSA Store search suggestions", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/poshmark/trend/{id}": { + "/psastore/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Poshmark listings for a curated trend/showroom collection (e.g. \"Vintage Celine Handbags\"), the same browsing view as Poshmark's own trend pages. Pass a previous response's next_max_id back as max_id to fetch the next page.", - "operationId": "poshmark-trend", + "description": "Returns capped URL entries from the PSA Team Store's (https://store.psacard.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", + "operationId": "psastore-sitemap-urls", "parameters": [ { - "description": "Poshmark trend/showroom id, the trailing id segment of a /trend/{slug}-{id} URL", - "in": "path", - "name": "id", - "required": true, + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], + "in": "query", + "name": "type", "type": "string", - "x-example": "964e80193927e69b518f631b" + "x-example": "products" }, { - "description": "Opaque pagination cursor from a previous response's next_max_id. Omit for the first page", + "description": "Maximum URL entries, defaults to 50 and supports up to 250", "in": "query", - "name": "max_id", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -439000,7 +454764,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/poshmark.TrendResponse" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" } }, "400": { @@ -439009,14 +454773,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -439033,19 +454791,19 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Poshmark trend/showroom collection", + "summary": "List PSA Store sitemap URLs", "tags": [ - "Poshmark" + "PSAStore" ] } }, - "/prada/categories": { + "/psastore/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Returns Prada's (prada.com) full category taxonomy -- every browsable category with its own breadcrumb path and canonical URL -- plus the two gender values products.prada.com currently carries. categories[].id is exactly the value prada-category accepts as its own category_id parameter; genders[].value is exactly what prada-search and prada-category accept as their own gender parameter.", - "operationId": "prada-categories", + "description": "Returns child sitemap URLs from the PSA Team Store's (https://store.psacard.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", + "operationId": "psastore-sitemaps", "produces": [ "application/json" ], @@ -439053,7 +454811,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/prada.categoriesResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -439074,67 +454838,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Prada's category taxonomy and gender filter values", + "summary": "List PSA Store sitemaps", "tags": [ - "Prada" + "PSAStore" ] } }, - "/prada/category": { + "/psastore/store": { "get": { "consumes": [ "application/json" ], - "description": "Browses one Prada category by ID, returning every product/color variant in it. category_id is required and must be one of prada-categories' own categories[].id values. gender optionally narrows to one of prada-categories' own genders[].value values. sort selects Prada's own relevance ranking or one of its price/newest orderings. A category with no products returns a well-formed empty result rather than an error.", - "operationId": "prada-category", - "parameters": [ - { - "description": "Category ID, from prada-categories' own categories[].id field", - "in": "query", - "name": "category_id", - "required": true, - "type": "string", - "x-example": "10062US" - }, - { - "description": "Gender filter. Allowed values: Woman, Man", - "enum": [ - "Woman", - "Man" - ], - "in": "query", - "name": "gender", - "type": "string", - "x-example": "Woman" - }, - { - "description": "Sort order. Allowed values: suggested, price_asc, price_desc, newest. Defaults to suggested (Prada's own relevance ranking)", - "enum": [ - "suggested", - "price_asc", - "price_desc", - "newest" - ], - "in": "query", - "name": "sort", - "type": "string", - "x-example": "price_asc" - }, - { - "description": "One-based page number, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Results per page, defaults to 24, maximum 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 24 - } - ], + "description": "Returns storefront metadata for the PSA Team Store (https://store.psacard.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "psastore-store", "produces": [ "application/json" ], @@ -439142,7 +454858,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/prada.categoryResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, "400": { @@ -439169,27 +454885,24 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Prada category", + "summary": "Get PSA Store store metadata", "tags": [ - "Prada" + "PSAStore" ] } }, - "/prada/product": { + "/punch/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns product-detail data for one Prada product/color variant: name, price, stock, available sizes, breadcrumb, alternate colors, and images. pv is the product/color identifier, returned by prada-search's, prada-category's, and this endpoint's own products[].pv/other_colors[] fields (also the trailing path segment of a Prada product URL). description and the full image gallery are populated on a best-effort basis and may be briefly absent even for a valid pv; every other field is always populated. An unknown pv returns a not-found error.", - "operationId": "prada-product", + "description": "Returns a Punch article by canonical `url` (`https://punchng.com//`): title, description, publication and update times, section, authors, image and the body `paragraphs`. Punch articles are free to read, so `paywalled` is never set. Video-led stories may have only a short text summary.", + "operationId": "punch-article", "parameters": [ { - "description": "Product/color identifier, from a search, category, or product result's own pv field", + "description": "Canonical Punch article URL", "in": "query", - "name": "pv", + "name": "url", "required": true, "type": "string", - "x-example": "1BA274_2CYS_F0002_V_YO0" + "x-example": "https://punchng.com/example-article-slug/" } ], "produces": [ @@ -439199,7 +454912,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/prada.productResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -439214,12 +454927,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -439232,65 +454939,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Prada product", + "summary": "Get Punch article content", "tags": [ - "Prada" + "Punch" ] } }, - "/prada/search": { + "/punch/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Prada's (prada.com) product catalog by keyword, through its own public search index. q is required; gender and sort are the same optional values prada-category accepts. Keyword search is typo-tolerant relevance ranking, not a guaranteed exact match. A query with genuinely zero matches returns a well-formed empty result rather than an error.", - "operationId": "prada-search", + "description": "Returns a Punch author's name and their most recent articles (the first archive page, about 30) from a canonical `url` (`https://punchng.com/author//`). `total_pages` is the number of archive pages. Punch author pages have no biography, photo or social links, so none are returned. An unknown author returns not-found.", + "operationId": "punch-author", "parameters": [ { - "description": "Free-text search query", + "description": "Canonical Punch author URL", "in": "query", - "name": "q", + "name": "url", "required": true, "type": "string", - "x-example": "galleria bag" - }, - { - "description": "Gender filter. Allowed values: Woman, Man", - "enum": [ - "Woman", - "Man" - ], - "in": "query", - "name": "gender", - "type": "string", - "x-example": "Woman" - }, - { - "description": "Sort order. Allowed values: suggested, price_asc, price_desc, newest. Defaults to suggested (Prada's own relevance ranking)", - "enum": [ - "suggested", - "price_asc", - "price_desc", - "newest" - ], - "in": "query", - "name": "sort", - "type": "string", - "x-example": "newest" - }, - { - "description": "One-based page number, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Results per page, defaults to 24, maximum 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 24 + "x-example": "https://punchng.com/author/example-author/" } ], "produces": [ @@ -439300,7 +454966,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/prada.searchResponseDoc" + "$ref": "#/definitions/publicnews.punchAuthorResponseDoc" } }, "400": { @@ -439309,8 +454975,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -439327,61 +454993,62 @@ "ApiKeyAuth": [] } ], - "summary": "Search Prada products", + "summary": "Get a Punch author archive", "tags": [ - "Prada" + "Punch" ] } }, - "/prada/stores": { + "/punch/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Locates Prada's (prada.com) physical retail stores worldwide, through its own public store-locator search. All parameters are optional: with none set, this returns Prada's full worldwide store list (up to limit). query is a free-text location search (city, country, or store name); lat/lng (both required together) narrow it to a geo-radius search, optionally sized with radius_km (defaults to 50, maximum 20000). A search with genuinely zero matches returns a well-formed empty result rather than an error.", - "operationId": "prada-stores", + "description": "Returns the current stories, about 30, from one Punch topic page. `section` is required and takes a topic slug such as `news`, `politics`, `business`, `sports`, `metro-plus` or `top-stories`; any other value is an invalid-parameter error. Each item has a title and article URL, plus summary, publication time and image URL when the page shows them.", + "operationId": "punch-headlines", "parameters": [ { - "description": "Free-text location search (city, country, or store name)", + "description": "Punch topic slug", + "enum": [ + "business", + "columns", + "continuation-from-print", + "diaspora", + "editorial", + "education", + "entertainment", + "feature", + "featured", + "foreign-news", + "health", + "healthwise", + "information-technology", + "interactive", + "interview", + "latest-news", + "law-digest-2", + "letters", + "metro-plus", + "news", + "opinion", + "osun-decides", + "panorama", + "politics", + "punch-lite", + "sex-relationship", + "smart-tips", + "society", + "special-features", + "spice", + "sponsored", + "sports", + "technology", + "top-stories", + "video", + "weekend-starter" + ], "in": "query", - "name": "query", + "name": "section", + "required": true, "type": "string", - "x-example": "New York" - }, - { - "description": "Search-center latitude, -90..90. Requires lng.", - "in": "query", - "name": "lat", - "type": "number", - "x-example": 40.7128 - }, - { - "description": "Search-center longitude, -180..180. Requires lat.", - "in": "query", - "name": "lng", - "type": "number", - "x-example": -74.006 - }, - { - "description": "Search radius in kilometers around lat/lng, defaults to 50, maximum 20000. Requires lat and lng.", - "in": "query", - "name": "radius_km", - "type": "number", - "x-example": 50 - }, - { - "description": "Maximum stores returned, defaults to 20, maximum 50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Result offset for pagination, defaults to 0", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "x-example": "business" } ], "produces": [ @@ -439391,7 +455058,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/prada.storesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -439400,12 +455067,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -439418,50 +455079,24 @@ "ApiKeyAuth": [] } ], - "summary": "Locate Prada retail stores", + "summary": "Get Punch section headlines", "tags": [ - "Prada" + "Punch" ] } }, - "/prada/suggest": { + "/punch/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Prada's own search-box typeahead suggestions for a partial query -- a ranked list of suggested search phrases with the live result count each one would return. Pass a suggestion straight through to prada-search's own q parameter for product results. A query with no genuine matches returns a well-formed empty result rather than an error.", - "operationId": "prada-suggest", - "parameters": [ - { - "description": "Partial search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "bag" - }, - { - "description": "Maximum suggestions, defaults to 10, maximum 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - } - ], + "description": "Returns the latest Punch stories from punchng.com: title, article URL, summary, author and publication time. Takes no parameters. Punch labels its times as UTC but publishes them in West Africa Time (UTC+1), and `published_at` is corrected for that one-hour skew.", + "operationId": "punch-news", "produces": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/prada.suggestResponseDoc" - } - }, - "400": { - "description": "Bad Request", + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -439482,19 +455117,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get Prada search-box suggestions", + "summary": "Get Punch top stories", "tags": [ - "Prada" + "Punch" ] } }, - "/pristine-auction/categories": { + "/punch/sections": { + "get": { + "description": "Lists the Punch topic slugs that `punch-headlines` accepts, such as `news`, `politics`, `business` and `sports`. Each entry has a `slug`, a display `name` and the topic page `url`. The list covers top-level topics linked from Punch's navigation or active in the 90 days before 2026-09-25.", + "operationId": "punch-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Punch sections", + "tags": [ + "Punch" + ] + } + }, + "/quince/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the whole value space for pristine-auction-search's category, auction_type, sort, and status params. categories[] is fetched live (with a current listing count per category, refreshed on every call); auction_types[], sort[], and statuses[] are pristineauction.com's own fixed, small search-form value sets.", - "operationId": "pristine-auction-categories", + "description": "Returns Quince's full product facet taxonomy: every business department (Women, Men, Kids & Baby, Home, CPG, Emerging), department, category, material, primary color, and size value Quince currently has products for, each with its own live product count. The returned business_departments[].value/categories[].value/materials[].value/colors[].value/sizes[].value values are exactly what quince-search accepts as its own department/category/material/color/size parameters. sizes spans every product type Quince sells (apparel letter sizes, shoe sizes, rug/furniture dimensions, bedding sizes, and more) since it is one catalog-wide facet.", + "operationId": "quince-categories", "produces": [ "application/json" ], @@ -439502,11 +455163,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pristineauction.categoriesResponseDoc" + "$ref": "#/definitions/quince.categoriesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -439523,29 +455184,19 @@ "ApiKeyAuth": [] } ], - "summary": "Discover Pristine Auction's search enum values", + "summary": "List Quince's product facet taxonomy", "tags": [ - "Pristine Auction" + "Quince" ] } }, - "/pristine-auction/lot/{lot_number}": { + "/quince/navigation": { "get": { "consumes": [ "application/json" ], - "description": "Returns one pristineauction.com lot's full detail: title, description, image gallery, price (current high bid, or realized/sold price once the auction has ended), auction end time, sport/collectible category, auction type, no-reserve flag, and view/watch/bid counts. lot_number comes from pristine-auction-search's results[].lot_number.", - "operationId": "pristine-auction-lot-detail", - "parameters": [ - { - "description": "A lot_number from pristine-auction-search's results", - "in": "path", - "name": "lot_number", - "required": true, - "type": "integer", - "x-example": 13154611 - } - ], + "description": "Returns Quince's full header navigation mega-menu: top-level tabs (Women, Men, Home, Baby & Kids, Travel, Bags & Accessories, Jewelry, Beauty & Wellness, Gifts, plus promotional tabs like New Arrivals/Best Sellers/$50 Cashmere), each broken into the same named subcategory groups (for example Apparel, Jewelry, Shoes) shown in Quince's own nav dropdown, with a directly browsable slug on every category and link. This is a distinct taxonomy from quince-categories' facets: navigation is Quince's own curated site structure, while quince-categories reports live per-value product counts for quince-search's own filter parameters.", + "operationId": "quince-navigation", "produces": [ "application/json" ], @@ -439553,23 +455204,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pristineauction.lotDetailResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/quince.navigationResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -439586,139 +455225,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pristine Auction lot's full detail", + "summary": "Get Quince's header navigation menu", "tags": [ - "Pristine Auction" + "Quince" ] } }, - "/pristine-auction/search": { + "/quince/product": { "get": { "consumes": [ "application/json" ], - "description": "Browses or searches pristineauction.com's current sports card and memorabilia auction lots. term or category is required, matching pristineauction.com's own search form. All enum values (category, auction_type, sort, status) come from pristine-auction-categories. status=completed browses ended/sold lots (a prices-realized view); the default (all statuses) mirrors the site's own default. Every filter is optional and combines with AND semantics.", - "operationId": "pristine-auction-search", + "description": "Returns product-detail data for one Quince product: title, description, review summary, every selectable option (color swatches with hex codes, sizes), and every color/size variant with its own price, original (\"traditional retail\") price, stock status, and SKU. handle is the product's URL path on quince.com (for example women/cashmere/cashmere-crewneck-sweater), returned by quince-search's own products[].handle field.", + "operationId": "quince-product", "parameters": [ { - "description": "Free-text search across lot titles. term or category is required.", - "in": "query", - "name": "term", - "type": "string", - "x-example": "mantle" - }, - { - "description": "One value from pristine-auction-categories' categories[].slug. term or category is required.", - "enum": [ - "fine-art", - "baseball", - "basketball", - "boxing-ufc", - "coins-bullion", - "comic-books", - "football", - "golf", - "historical", - "hockey", - "music", - "other-sports", - "pop-culture", - "racing", - "soccer", - "trading-cards", - "wrestling" - ], - "in": "query", - "name": "category", - "type": "string", - "x-example": "baseball" - }, - { - "description": "Comma-separated auction-type filter. Omit to include every auction type.", - "enum": [ - "previous_featured", - "ten_minute", - "daily", - "classic", - "fine_art", - "jewelry", - "pop_culture", - "tcg", - "helmet", - "nascar_foundation", - "sports_cards", - "coin", - "sports_gear", - "jersey", - "frame_it_up", - "fall_showcase", - "elite", - "live_stream" - ], - "in": "query", - "name": "auction_type", - "type": "string", - "x-example": "daily,classic" - }, - { - "description": "Comma-separated auction-status filter. status=completed browses ended/sold lots. Omit to include every status.", - "enum": [ - "future", - "active", - "canceled", - "completed", - "forfeited" - ], - "in": "query", - "name": "status", - "type": "string", - "x-example": "active" - }, - { - "description": "Result order, default newly-listed.", - "enum": [ - "newly-listed", - "bid-time-descending", - "price-descending", - "price-ascending", - "ending-soonest", - "ending-last", - "bid-count-descending", - "bid-count-ascending" - ], + "description": "Product URL handle, from a search result's products[].handle field", "in": "query", - "name": "sort", + "name": "handle", + "required": true, "type": "string", - "x-example": "ending-soonest" - }, - { - "description": "Minimum current bid price in USD, inclusive. Omit or 0 for no minimum.", - "in": "query", - "name": "min_price", - "type": "number" - }, - { - "description": "Maximum current bid price in USD, inclusive. Omit or 0 for no maximum.", - "in": "query", - "name": "max_price", - "type": "number" - }, - { - "description": "1-based page number, default 1", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Results per page. pristineauction.com only accepts 15, 30, or 60; any other value is rejected. Default 30.", - "enum": [ - 15, - 30, - 60 - ], - "in": "query", - "name": "per_page", - "type": "integer" + "x-example": "women/cashmere/cashmere-crewneck-sweater" } ], "produces": [ @@ -439728,7 +455255,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/pristineauction.searchResponseDoc" + "$ref": "#/definitions/quince.productResponseDoc" } }, "400": { @@ -439737,8 +455264,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -439755,33 +455288,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Pristine Auction's live auction inventory", + "summary": "Get a Quince product", "tags": [ - "Pristine Auction" + "Quince" ] } }, - "/pristine-marketplace/collections": { + "/quince/product/faq": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from Pristine Marketplace (https://www.pristinemarketplace.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", - "operationId": "pristine-marketplace-collections", + "description": "Returns a Quince product's own question/answer content (e.g. sizing, care, fit), from the same structured product data quince-product-reviews uses. handle is the same value quince-product accepts. Not every product carries FAQ content -- a product with none returns a well-formed empty result.", + "operationId": "quince-product-faq", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Product URL handle, from a search result's products[].handle field", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "handle", + "required": true, + "type": "string", + "x-example": "women/cashmere/cashmere-crewneck-sweater" } ], "produces": [ @@ -439791,7 +455318,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/quince.productFAQResponseDoc" } }, "400": { @@ -439800,6 +455327,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -439818,41 +455351,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace collections", + "summary": "Get a Quince product's FAQ content", "tags": [ - "PristineMarketplace" + "Quince" ] } }, - "/pristine-marketplace/collections/{handle}/products": { + "/quince/product/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one Pristine Marketplace (https://www.pristinemarketplace.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug (typically a player, team, or memorabilia-type collection, e.g. `pop-culture`).", - "operationId": "pristine-marketplace-collection-products", + "description": "Returns a sample of a Quince product's customer reviews (author, date, rating, review body), plus the product's overall aggregate rating and review count. handle is the same value quince-product accepts. The reviews returned are a sample (25 reviews on every product sampled), not a paginated feed of the full review history. A product with no reviews yet returns a well-formed empty result.", + "operationId": "quince-product-reviews", "parameters": [ { - "description": "Collection handle", - "in": "path", + "description": "Product URL handle, from a search result's products[].handle field", + "in": "query", "name": "handle", "required": true, "type": "string", - "x-example": "pop-culture" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "women/cashmere/cashmere-crewneck-sweater" } ], "produces": [ @@ -439862,7 +455381,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/quince.productReviewsResponseDoc" } }, "400": { @@ -439895,33 +455414,89 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace collection products", + "summary": "Get Quince product reviews", "tags": [ - "PristineMarketplace" + "Quince" ] } }, - "/pristine-marketplace/pages": { + "/quince/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns static pages from Pristine Marketplace (https://www.pristinemarketplace.com). The storefront URL is fixed server-side. The storefront's \"Shop by Sport\" navigation (NFL, MLB, NBA, NHL, NASCAR) resolves to pages here (handles `nfl`, `mlb`, `nba`, `nhl`, `nascar`), not to a separate collections-style resource -- each is a landing page linking into many player/team collections.", - "operationId": "pristine-marketplace-pages", + "description": "Searches or browses Quince's (quince.com) product catalog. q, department, category, material, color, size, min_price, and max_price are all optional and combine as an AND -- unlike some other families' search/category-browse split, a free-text q can be combined with any of the facet filters in the same request, or every field can be omitted to browse the full catalog by Quince's own relevance/popularity ranking. department accepts one of the values quince-categories' own business_departments[].value field returns (for example Women, Men, Kids & Baby, Home, CPG, Emerging); category, material, color, and size similarly accept values from quince-categories' own categories[].value/materials[].value/colors[].value/sizes[].value fields (or quince-navigation's own browsable category/subcategory slugs for a curated, hierarchical alternative to the flat category facet). Keyword search uses typo-tolerant relevance ranking, not a guaranteed exact match. A query with genuinely zero matches (for example a nonsense string) returns a well-formed empty result rather than an error.", + "operationId": "quince-search", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Free-text search query", + "in": "query", + "name": "q", + "type": "string", + "x-example": "cashmere sweater" + }, + { + "description": "Business department facet filter, from quince-categories' own business_departments[].value field", + "in": "query", + "name": "department", + "type": "string", + "x-example": "Women" + }, + { + "description": "Category facet filter, from quince-categories' own categories[].value field", + "in": "query", + "name": "category", + "type": "string", + "x-example": "Apparel" + }, + { + "description": "Material facet filter, from quince-categories' own materials[].value field", + "in": "query", + "name": "material", + "type": "string", + "x-example": "Cashmere" + }, + { + "description": "Primary color facet filter, from quince-categories' own colors[].value field", + "in": "query", + "name": "color", + "type": "string", + "x-example": "Grey" + }, + { + "description": "Size facet filter, from quince-categories' own sizes[].value field", + "in": "query", + "name": "size", + "type": "string", + "x-example": "M" + }, + { + "description": "Minimum price (inclusive), in USD", + "in": "query", + "name": "min_price", + "type": "number", + "x-example": 25 + }, + { + "description": "Maximum price (inclusive), in USD", + "in": "query", + "name": "max_price", + "type": "number", + "x-example": 100 + }, + { + "description": "One-based page number, defaults to 1", "in": "query", "name": "page", "type": "integer", "x-example": 1 }, { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Results per page, defaults to 24, maximum 100", "in": "query", "name": "limit", "type": "integer", - "x-example": 50 + "x-example": 24 } ], "produces": [ @@ -439931,7 +455506,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/quince.searchResponseDoc" } }, "400": { @@ -439958,27 +455533,40 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace static pages", + "summary": "Search or browse Quince products", "tags": [ - "PristineMarketplace" + "Quince" ] } }, - "/pristine-marketplace/pages/{handle}": { + "/quince/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "Returns static page detail for one Pristine Marketplace (https://www.pristinemarketplace.com) page handle. The storefront URL is fixed server-side. The \"Shop by Sport\" nav landing pages are reachable here as handles `nfl`, `mlb`, `nba`, `nhl`, and `nascar`.", - "operationId": "pristine-marketplace-page", + "description": "Returns capped URL entries from Quince's own sitemaps matching the requested type. Each entry's handle is populated from the URL's own path (tracking/variant query parameters stripped) -- for type products, this is directly the value quince-product's own handle parameter expects.", + "operationId": "quince-sitemap-urls", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", - "required": true, + "description": "Sitemap type. Allowed values: all, products, collections, subcollections, pages", + "enum": [ + "all", + "products", + "collections", + "subcollections", + "pages" + ], + "in": "query", + "name": "type", "type": "string", - "x-example": "nfl" + "x-example": "products" + }, + { + "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -439988,7 +455576,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/quince.sitemapURLsResponseDoc" } }, "400": { @@ -439997,12 +455585,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -440021,35 +455603,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pristine Marketplace static page", + "summary": "List Quince sitemap URLs", "tags": [ - "PristineMarketplace" + "Quince" ] } }, - "/pristine-marketplace/products": { + "/quince/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from Pristine Marketplace's (https://www.pristinemarketplace.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "pristine-marketplace-products", - "parameters": [ - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - } - ], + "description": "Returns Quince's US-region child sitemaps (products, collections, subcollections, and static pages) with an inferred type, from quince.com's own public sitemap index.", + "operationId": "quince-sitemaps", "produces": [ "application/json" ], @@ -440057,13 +455623,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/quince.sitemapsResponseDoc" } }, "429": { @@ -440084,27 +455644,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace products", + "summary": "List Quince sitemaps", "tags": [ - "PristineMarketplace" + "Quince" ] } }, - "/pristine-marketplace/products/{handle}": { + "/quince/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns product detail for one Pristine Marketplace (https://www.pristinemarketplace.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "pristine-marketplace-product", + "description": "Returns Quince's own search-box typeahead suggestions for a partial query: a flat list of suggested search phrases, no product data. Pass a suggestion straight through to quince-search's own q parameter for product results. A query with no genuine matches returns a well-formed empty result rather than an error.", + "operationId": "quince-suggest", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Search query prefix", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "cash" } ], "produces": [ @@ -440114,7 +455674,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" + "$ref": "#/definitions/quince.suggestResponseDoc" } }, "400": { @@ -440123,12 +455683,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -440147,45 +455701,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Pristine Marketplace product", + "summary": "Get Quince search suggestions", "tags": [ - "PristineMarketplace" + "Quince" ] } }, - "/pristine-marketplace/products/{handle}/recommendations": { + "/qwant/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns recommended products for one Pristine Marketplace (https://www.pristinemarketplace.com) product handle. The storefront URL is fixed server-side.", - "operationId": "pristine-marketplace-product-recommendations", + "description": "Returns Qwant search-box autocomplete completions for a query prefix, in Qwant's own ranking order. `locale` selects the Qwant market (en_US, fr_FR, de_DE, en_GB, ...); Qwant ignores locale codes it does not support and uses its default market.", + "operationId": "qwant-suggest", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Search query prefix", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "openai" }, { - "description": "Maximum products, defaults to 10 and supports up to 20", + "description": "Suggestions to return; defaults to 10, clamped to 1..10", "in": "query", - "name": "limit", + "maximum": 10, + "minimum": 1, + "name": "count", "type": "integer", "x-example": 10 }, { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], + "description": "Qwant market locale in ll_CC form, such as en_US, fr_FR, de_DE, or en_GB; defaults to en_US", "in": "query", - "name": "intent", + "name": "locale", "type": "string", - "x-example": "related" + "x-example": "en_US" } ], "produces": [ @@ -440195,29 +455747,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/qwant.suggestResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Qwant upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -440228,26 +455780,26 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace product recommendations", + "summary": "Suggest Qwant search queries", "tags": [ - "PristineMarketplace" + "Qwant" ] } }, - "/pristine-marketplace/reviews": { + "/raisingcanes/directory": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of Pristine Marketplace's (https://www.pristinemarketplace.com) public Judge.me store review feed. This is a store-wide, most-recent-first feed, not a per-product one: confirmed live, the storefront's own on-page review widget draws from and displays this same feed (labeled \"Reviews for other products\" on an individual product page), and no product/handle filter parameter narrows it. The storefront URL is fixed server-side. Judge.me fixes 5 reviews per upstream page regardless of any requested size, so this endpoint has no `limit` parameter -- `page` maps 1:1 onto Judge.me's own pagination.", - "operationId": "pristine-marketplace-reviews", + "description": "Returns one level of Raising Cane's store directory tree. Omit path for the root, which lists the US states Raising Cane's operates in; pass a child's path to descend (state to cities, city to stores). Each child carries its name, path, URL and how many stores sit under that branch. A child with is_store true is a store record rather than another directory level -- pass its path to GET /raisingcanes/store. This is a directory browse, not a proximity search: use GET /raisingcanes/nearby for a radius lookup.", + "operationId": "raisingcanes-directory", "parameters": [ { - "description": "1-based page, defaults to 1. 5 reviews per page.", + "description": "Directory path from a previous response's children[].path, e.g. la. Omit for the root state index.", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "path", + "type": "string", + "x-example": "la" } ], "produces": [ @@ -440257,7 +455809,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.reviewsResponseDoc" + "$ref": "#/definitions/raisingcanes.directoryResponseDoc" } }, "400": { @@ -440266,6 +455818,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -440284,43 +455842,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace store reviews", + "summary": "Browse the Raising Cane's store directory", "tags": [ - "PristineMarketplace" + "Raising Cane's" ] } }, - "/pristine-marketplace/search": { + "/raisingcanes/menu": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from Pristine Marketplace's (https://www.pristinemarketplace.com) own full-text search, distinct from `/pristine-marketplace/search/suggest`'s predictive suggestions. The storefront URL is fixed server-side. Per-page size is fixed (16 products per page) and is not adjustable; `limit` is honored only as an upper bound on the returned page.", - "operationId": "pristine-marketplace-search", - "parameters": [ - { - "description": "Search query text", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "jordan" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250, but never exceeds the storefront's own fixed 16-per-page grid", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 16 - } - ], + "description": "Returns Raising Cane's full published menu: every section (Combos, Tailgates, Extras, Drinks) and every item, each with its name, Raising Cane's own item description (commonly ending in a calorie count or range), and image. This is a single fixed national menu page, not a per-store or per-region menu -- it takes no parameters. Raising Cane's does not publish price on this page; pricing lives behind the separate order.raisingcanes.com ordering flow, which needs a selected store and is out of scope here.", + "operationId": "raisingcanes-menu", "produces": [ "application/json" ], @@ -440328,11 +455862,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.siteSearchResponseDoc" + "$ref": "#/definitions/raisingcanes.menuResponseDoc" } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -440355,41 +455889,56 @@ "ApiKeyAuth": [] } ], - "summary": "Search Pristine Marketplace products", + "summary": "Get Raising Cane's full published menu", "tags": [ - "PristineMarketplace" + "Raising Cane's" ] } }, - "/pristine-marketplace/search/suggest": { + "/raisingcanes/nearby": { "get": { "consumes": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from Pristine Marketplace's (https://www.pristinemarketplace.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "pristine-marketplace-search-suggest", + "description": "Returns Raising Cane's restaurants within a radius of a latitude/longitude, ordered nearest first, each with its distance in miles and kilometres, address, coordinates, timezone, price tier and which pickup/delivery services it offers. This proximity result carries less detail than GET /raisingcanes/store (Raising Cane's own nearby-search key is not configured with hours or phone) -- each result's `path` chains straight into GET /raisingcanes/store for the full record. `total_in_radius` reports how many stores fall inside the radius overall, which is usually far more than one page; use `offset` to walk it. A coordinate with no Raising Cane's nearby returns an empty list rather than an error.", + "operationId": "raisingcanes-nearby", "parameters": [ { - "description": "Search query", + "description": "Search center latitude", "in": "query", - "name": "q", + "name": "latitude", "required": true, - "type": "string", - "x-example": "jordan" + "type": "number", + "x-example": 40.7128 }, { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "description": "Search center longitude", "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" + "name": "longitude", + "required": true, + "type": "number", + "x-example": -74.006 }, { - "description": "Maximum results per type, defaults to 10 and supports up to 20", + "description": "Search radius in miles, 1-100 (default 25)", + "in": "query", + "name": "radius", + "type": "integer", + "x-example": 25 + }, + { + "description": "Maximum stores to return, 1-50 (default 10)", "in": "query", "name": "limit", "type": "integer", "x-example": 10 + }, + { + "description": "Result offset for paging through total_in_radius (default 0)", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -440399,7 +455948,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + "$ref": "#/definitions/raisingcanes.nearbyResponseDoc" } }, "400": { @@ -440408,6 +455957,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -440426,42 +455981,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Pristine Marketplace search suggestions", + "summary": "Find Raising Cane's stores near a coordinate, nearest first", "tags": [ - "PristineMarketplace" + "Raising Cane's" ] } }, - "/pristine-marketplace/sitemap/urls": { + "/raisingcanes/promotion": { "get": { "consumes": [ "application/json" ], - "description": "Returns capped URL entries from Pristine Marketplace's (https://www.pristinemarketplace.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", - "operationId": "pristine-marketplace-sitemap-urls", + "description": "Returns one Raising Cane's promotion's published official terms: title and official-rules text (eligibility, prize details, effective date), exactly as the promotion's own page publishes them, as separate paragraphs in publication order. Promotion paths come from GET /raisingcanes/promotions entries. A path with no promotion at it (expired, mistyped, or the empty path some index entries carry) returns a 404.", + "operationId": "raisingcanes-promotion", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", - "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" - ], + "description": "Promotion page slug from a /raisingcanes/promotions entry's path", "in": "query", - "name": "type", + "name": "path", + "required": true, "type": "string", - "x-example": "products" - }, - { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "first-50-promotion" } ], "produces": [ @@ -440471,7 +456011,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/raisingcanes.promotionResponseDoc" } }, "400": { @@ -440480,6 +456020,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -440498,19 +456044,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace sitemap URLs", + "summary": "Get one Raising Cane's promotion's terms", "tags": [ - "PristineMarketplace" + "Raising Cane's" ] } }, - "/pristine-marketplace/sitemaps": { + "/raisingcanes/promotions": { "get": { "consumes": [ "application/json" ], - "description": "Returns child sitemap URLs from Pristine Marketplace's (https://www.pristinemarketplace.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", - "operationId": "pristine-marketplace-sitemaps", + "description": "Returns Raising Cane's full promotions index: every current and past sweepstakes, giveaway, and other promotion the site links to, grouped under Raising Cane's own category headings (e.g. \"Sweepstakes & Giveaways\", \"Lucky Promotions\", \"First Promotions\"). Each entry's path chains into GET /raisingcanes/promotion for that promotion's full official-rules text. Some entries carry an empty path -- Raising Cane's own index links a since-expired promotion back to the homepage rather than removing the entry; treat an empty path as no longer resolvable rather than a bug.", + "operationId": "raisingcanes-promotions", "produces": [ "application/json" ], @@ -440518,11 +456064,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/raisingcanes.promotionsResponseDoc" } }, - "400": { - "description": "Bad Request", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -440545,19 +456091,29 @@ "ApiKeyAuth": [] } ], - "summary": "List Pristine Marketplace sitemaps", + "summary": "Browse Raising Cane's promotions index", "tags": [ - "PristineMarketplace" + "Raising Cane's" ] } }, - "/pristine-marketplace/store": { + "/raisingcanes/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for Pristine Marketplace (https://www.pristinemarketplace.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "pristine-marketplace-store", + "description": "Returns one Raising Cane's store: name, full postal address, phone, coordinates, its general weekly hours plus separately published dine-in and drive-thru hours, Raising Cane's own per-store amenity labels (e.g. DRIVE_THRU, CURBSIDE_PICKUP), which pickup/delivery services it offers, and its Google Place id. Store paths come from GET /raisingcanes/directory entries whose is_store is true. Passing a directory path here returns a 404 rather than a hollow record.", + "operationId": "raisingcanes-store", + "parameters": [ + { + "description": "Store path from a /raisingcanes/directory child with is_store true", + "in": "query", + "name": "path", + "required": true, + "type": "string", + "x-example": "la/gonzales/625-airline-hwy" + } + ], "produces": [ "application/json" ], @@ -440565,7 +456121,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/raisingcanes.storeResponseDoc" } }, "400": { @@ -440574,6 +456130,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -440592,27 +456154,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Pristine Marketplace store metadata", + "summary": "Get one Raising Cane's store's detail", "tags": [ - "PristineMarketplace" + "Raising Cane's" ] } }, - "/producthunt/category/{slug}": { + "/rappler/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Product Hunt category by its `slug`, such as `vibe-coding`: name, description, meta title, last update time, parent category and its sub-categories, hero products, questions with top answers, and related discussions.", - "operationId": "producthunt-category", + "description": "Returns public Rappler article metadata and body paragraphs from a canonical article URL. Rappler+ member-tier stories are flagged with paywalled.", + "operationId": "rappler-article", "parameters": [ { - "description": "Product Hunt category slug", - "in": "path", - "name": "slug", + "description": "Canonical Rappler article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "\"vibe-coding\"" + "x-example": "https://www.rappler.com/sports/tennis-alex-eala-tatiana-prozorova-singapore-open-september-24-2026/" } ], "produces": [ @@ -440620,31 +456179,25 @@ ], "responses": { "200": { - "description": "Wrapped category payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.categoryResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Category not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -440655,67 +456208,30 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt category details", + "summary": "Get Rappler article content", "tags": [ - "ProductHunt" + "Rappler" ] } }, - "/producthunt/category/{slug}/products": { + "/rappler/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the products in a Product Hunt category (now backed by Product Hunt topics), cursor-paginated. Pass the `cursor` from a previous response's `end_cursor` to page; `page_size` controls the batch size. `page`, `featured_only`, `order` and `tags` are accepted for compatibility but no longer affect the result.", - "operationId": "producthunt-category-products", + "description": "Returns a Rappler author's profile, looked up by `slug` (for example `delfin-dioquino`) or by canonical `url`; exactly one is required. The response has the name, `bio`, `social_links` and the 10 most recent articles, each with title, URL, section and publication time. There is no further paging. `bio` and `social_links` are omitted when empty; an unknown author returns not-found.", + "operationId": "rappler-author", "parameters": [ { - "description": "Product Hunt category slug", - "in": "path", + "description": "Author slug, e.g. delfin-dioquino", + "in": "query", "name": "slug", - "required": true, "type": "string", - "x-example": "\"developer-tools\"" - }, - { - "description": "Pagination cursor from a previous response's end_cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "default": 15, - "description": "Page size (number of products)", - "in": "query", - "name": "page_size", - "type": "integer" - }, - { - "default": true, - "description": "Accepted for compatibility; no longer affects results", - "in": "query", - "name": "featured_only", - "type": "boolean" - }, - { - "default": "highest_rated", - "description": "Accepted for compatibility; no longer affects results", - "in": "query", - "name": "order", - "type": "string" - }, - { - "default": 1, - "description": "Accepted for compatibility; use cursor to paginate", - "in": "query", - "name": "page", - "type": "integer" + "x-example": "delfin-dioquino" }, { - "description": "Accepted for compatibility; no longer affects results", + "description": "Canonical rappler.com/author// URL; alternative to slug", "in": "query", - "name": "tags", - "type": "string" + "name": "url", + "type": "string", + "x-example": "https://www.rappler.com/author/delfin-dioquino/" } ], "produces": [ @@ -440723,31 +456239,25 @@ ], "responses": { "200": { - "description": "Wrapped category products payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.categoryProductsResponseDoc" + "$ref": "#/definitions/publicnews.rapplerAuthorResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Category not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -440758,87 +456268,201 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt category products", + "summary": "Get a Rappler author profile", "tags": [ - "ProductHunt" + "Rappler" ] } }, - "/producthunt/leaderboard": { + "/rappler/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the Product Hunt leaderboard for a `scope` of `daily` (default), `weekly`, `monthly` or `yearly`, positioned with `date` (YYYY-MM-DD) or `year`, `month`, `day` and `week`. Only the first page is served, so a non-empty `cursor` returns an error. `featured` and `order` are accepted but do not change the default view.", - "operationId": "producthunt-leaderboard", + "description": "Returns the latest Rappler stories for one section. `section` is required and takes one of the site's category slugs, such as `business`, `nation`, `entertainment`, `fact-check`, `investigative` or `climate-change`. Each item has its title, URL, summary, publication time and author, plus an image when the outlet provides one.", + "operationId": "rappler-headlines", "parameters": [ { - "default": "daily", - "description": "Leaderboard scope: daily, weekly, monthly, yearly", + "description": "Rappler section slug", "enum": [ - "daily", - "weekly", - "monthly", - "yearly" + "about", + "awards-recognition", + "news-updates", + "policies", + "special-projects", + "team", + "brandrap", + "announcements", + "beyond-the-buy", + "communicart", + "data-stories", + "detours", + "finance-and-industries", + "first-look", + "food-drinks-dining", + "get-ready-with-me", + "goodrap", + "health-beauty-and-wellness", + "home-and-parenting", + "lifestyle-and-entertainment", + "profiles-and-advocacies", + "reading-book-recommendations", + "tech-and-innovation", + "travel-and-food", + "bulletin-board", + "advisories", + "campus", + "contests-awards", + "corrections", + "events", + "examination-results", + "philippine-government-job-openings", + "scholarships", + "trainings-workshops", + "business", + "consumer-issues", + "corporate", + "economy", + "industries", + "infrastructure", + "personal-finance", + "stocks-banking", + "culture-desk", + "astrology", + "careers", + "food-drinks", + "health-and-wellness", + "literature", + "noteworthy", + "relationships", + "style", + "travel", + "editors-pick", + "elections-philippines-stories", + "entertainment", + "celebrities", + "korean-popular-music", + "live-jam", + "movies", + "music", + "pageants", + "series", + "theater", + "environment", + "climate-change", + "disasters", + "nature", + "pollution", + "faith-religion", + "hustle", + "adulting", + "food", + "play", + "purpose", + "work", + "moveph", + "advocacies", + "agos", + "partners", + "social-good-summit", + "nation", + "newsbreak", + "data-documents", + "explainers", + "fact-check", + "in-depth", + "inside-track", + "investigative", + "iq", + "podcasts-videos", + "people", + "actors", + "artists", + "athletes", + "crimes", + "human-interest", + "neighbors", + "newsmakers", + "obituary", + "profiles", + "philippines", + "elections", + "government", + "luzon", + "metro-manila", + "mindanao", + "national-news", + "overseas-filipinos", + "rappler-talk", + "special-coverage", + "visayas", + "weather", + "plus-membership-program", + "exclusive-content", + "exclusive-events", + "science", + "discoveries-inventions", + "earth-space", + "life-health", + "society-culture", + "social-issues", + "sports", + "boxing", + "fiba", + "football", + "gilas-pilipinas", + "nba", + "ncaa", + "palarong-pambansa", + "pba", + "southeast-asian-games", + "uaap", + "volleyball", + "technology", + "apps", + "features", + "gadgets", + "gaming", + "innovations", + "internet-culture", + "reviews", + "social-media", + "the-wrap", + "top-stories", + "video", + "act-one", + "basagan-ng-trip", + "daily-wrap", + "documentaries", + "editorial", + "hold-the-line-maria-ressa-interview", + "rappler-live-jam", + "rappler-talk-video", + "reporters-vlogs", + "top-5-news-this-week", + "video-explainers", + "watch-now-live", + "voices", + "editorials", + "imho", + "ispeak", + "new-school", + "newsletters", + "rappler-blogs", + "thought-leaders", + "world", + "africa", + "asia-pacific", + "europe", + "global-affairs", + "indonesia", + "latin-america", + "middle-east", + "south-central-asia", + "us-canada" ], "in": "query", - "name": "scope", - "type": "string" - }, - { - "description": "Anchor date in YYYY-MM-DD format. Used to derive missing year/month/day/week values.", - "format": "date", - "in": "query", - "name": "date", + "name": "section", + "required": true, "type": "string", - "x-example": "2026-01-29" - }, - { - "description": "Leaderboard year override", - "in": "query", - "name": "year", - "type": "integer", - "x-example": 2026 - }, - { - "description": "Daily/monthly month override", - "in": "query", - "name": "month", - "type": "integer", - "x-example": 1 - }, - { - "description": "Daily day override", - "in": "query", - "name": "day", - "type": "integer", - "x-example": 29 - }, - { - "description": "Weekly ISO week override", - "in": "query", - "name": "week", - "type": "integer", - "x-example": 5 - }, - { - "default": true, - "description": "Featured products only", - "in": "query", - "name": "featured", - "type": "boolean" - }, - { - "description": "Ranking order override. Defaults to scope rank enum.", - "in": "query", - "name": "order", - "type": "string" - }, - { - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "string" + "x-example": "about" } ], "produces": [ @@ -440846,31 +456470,51 @@ ], "responses": { "200": { - "description": "Wrapped typed leaderboard payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.leaderboardResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Product not found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } - }, - "429": { - "description": "Rate limit exceeded", + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Rappler section headlines", + "tags": [ + "Rappler" + ] + } + }, + "/rappler/news": { + "get": { + "description": "Returns the newest Rappler stories across all sections. Takes no parameters. Each item has its title, canonical article URL, a short summary, publication time, author byline and lead image.", + "operationId": "rappler-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -440881,27 +456525,50 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt leaderboard", + "summary": "Get Rappler top stories", "tags": [ - "ProductHunt" + "Rappler" ] } }, - "/producthunt/product/{id}": { + "/rappler/sections": { "get": { - "consumes": [ + "description": "Lists the 175 Rappler categories that have a live feed and are accepted by `rappler-headlines`, such as `news-updates`, `business`, `nation`, `fact-check` and `climate-change`. Each entry has a `slug`, a display `name` and the category `url`.", + "operationId": "rappler-sections", + "produces": [ "application/json" ], - "description": "Returns the core Product Hunt product details. The path takes an exact Product Hunt slug; if you only know the product name, look the slug up first with `/producthunt/search` (live) or `/datasets/producthunt-products/search` (indexed). Unknown slugs return 404, and that 404 is cached for one hour.", - "operationId": "producthunt-product", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Rappler sections", + "tags": [ + "Rappler" + ] + } + }, + "/rawstory/article": { + "get": { + "description": "Returns a Raw Story article by canonical `url` on `rawstory.com`, for example `https://www.rawstory.com/trump-media-ban-2677933730/`: title, description, publication and update times, section, authors, image and body `paragraphs` (embedded videos excluded). `section` is omitted for slug-only URLs. Hub, tag and author URLs return an invalid-params error; a missing story returns not-found.", + "operationId": "rawstory-article", "parameters": [ { - "description": "Product Hunt slug or numeric ID", - "in": "path", - "name": "id", + "description": "Canonical Raw Story article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "\"chronicle-6\"" + "x-example": "https://www.rawstory.com/trump-media-ban-2677933730/" } ], "produces": [ @@ -440909,31 +456576,25 @@ ], "responses": { "200": { - "description": "Wrapped product payload (map[string]any)", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.productResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Product not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -440944,27 +456605,30 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt product details", + "summary": "Get Raw Story article content", "tags": [ - "ProductHunt" + "Raw Story" ] } }, - "/producthunt/product/{id}/about": { + "/rawstory/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the about-page data for a Product Hunt product, looked up by its slug in `id`. It covers the product's launch details with badges, ranks, comment count and detailed reviews with alternative products, along with the product's ad, forum and media information.", - "operationId": "producthunt-about", + "description": "Returns a Raw Story author's profile, looked up by `slug` (for example `bennitokelty`) or canonical `url`; exactly one is required. The response has the name, `bio`, avatar, social links and the 15 most recent stories, each with title, URL and a `YYYY-MM-DD` date. Older stories are not reachable, and an unknown author returns not-found.", + "operationId": "rawstory-author", "parameters": [ { - "description": "Product Hunt slug", - "in": "path", - "name": "id", - "required": true, + "description": "Author slug, e.g. bennitokelty", + "in": "query", + "name": "slug", "type": "string", - "x-example": "\"producthunt\"" + "x-example": "bennitokelty" + }, + { + "description": "Canonical rawstory.com/u/ URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.rawstory.com/u/bennitokelty" } ], "produces": [ @@ -440972,31 +456636,25 @@ ], "responses": { "200": { - "description": "Wrapped typed about-page payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.aboutResponseDoc" + "$ref": "#/definitions/publicnews.rawstoryAuthorResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Product not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -441007,53 +456665,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt product about page", + "summary": "Get a Raw Story author profile", "tags": [ - "ProductHunt" + "Raw Story" ] } }, - "/producthunt/product/{id}/alternatives": { + "/rawstory/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists alternatives to a Product Hunt product, looked up by its slug in `id`. `first` sets the page size (default 10), `order` defaults to `most_relevant`, and `tags` takes comma-separated tag slugs. Returns alternative items with ratings, badges and scores, alternative tags with counts, and related discussions. Use `end_cursor` as `cursor` for the next page.", - "operationId": "producthunt-alternatives", + "description": "Returns the latest Raw Story stories, up to 30, for one section hub. `section` is required and takes one of 15 slugs such as `us-news`, `trump-news`, `world`, `commentary` or `supreme-court`. Each item has its title, URL, lead-paragraph summary, publication time, author and image when given. The dormant `presidential-campaign-issues` hub returns 9 stories.", + "operationId": "rawstory-headlines", "parameters": [ { - "description": "Product Hunt slug", - "in": "path", - "name": "id", + "description": "Raw Story section slug", + "enum": [ + "us-news", + "trump-news", + "world", + "enviro-science", + "all-video", + "raw-investigates", + "also-read", + "commentary", + "blogs-media", + "2026-midterm-elections-section", + "presidential-campaign-issues", + "smartnews", + "super-head", + "jd-vance", + "supreme-court" + ], + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "\"clico\"" - }, - { - "default": 10, - "description": "Page size", - "in": "query", - "name": "first", - "type": "integer" - }, - { - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "default": "most_relevant", - "description": "Sort order", - "in": "query", - "name": "order", - "type": "string" - }, - { - "description": "Comma-separated tag slugs", - "in": "query", - "name": "tags", - "type": "string" + "x-example": "us-news" } ], "produces": [ @@ -441061,31 +456707,51 @@ ], "responses": { "200": { - "description": "Wrapped alternatives payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.alternativesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Product not found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } - }, - "429": { - "description": "Rate limit exceeded", + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Raw Story section headlines", + "tags": [ + "Raw Story" + ] + } + }, + "/rawstory/news": { + "get": { + "description": "Returns the 30 newest Raw Story stories across all sections. Takes no parameters. Each item has its title, story URL, a lead-paragraph summary capped at 500 characters, publication time, author byline and lead image.", + "operationId": "rawstory-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -441096,52 +456762,83 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt product alternatives", + "summary": "Get Raw Story top stories", "tags": [ - "ProductHunt" + "Raw Story" ] } }, - "/producthunt/product/{id}/customers": { + "/rawstory/sections": { + "get": { + "description": "Lists the 15 section and topic hubs that `rawstory-headlines` accepts. Each entry has a `slug`, a display `name` such as `U.S. News` or `Raw Exclusives`, and the hub page `url`. Hubs overlap: `us-news`, `trump-news` and `smartnews` share most recent stories, and `presidential-campaign-issues` is dormant.", + "operationId": "rawstory-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Raw Story sections", + "tags": [ + "Raw Story" + ] + } + }, + "/ready": { "get": { "consumes": [ "application/json" ], - "description": "Lists the customer products of a Product Hunt product, looked up by its slug in `id`. `order` is `customers` (default) or `latest_launch`, `page` defaults to 1 and `page_size` to 10. Each item has its name, categories, badges, review and follower counts, and founder shoutouts. An unknown slug returns 404.", - "operationId": "producthunt-customers", + "description": "Returns process readiness and lightweight dependency health. Dependency failures remain visible in the response but do not remove a serving pod from rotation. Root `/ready` returns the same payload as a compatibility alias, while `/ping` remains the lightweight liveness endpoint.", + "operationId": "ready", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/api.readinessResponseDoc" + } + } + }, + "summary": "Return API readiness", + "tags": [ + "Meta" + ] + } + }, + "/rebag/collections": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns collections from Rebag (https://shop.rebag.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", + "operationId": "rebag-collections", "parameters": [ { - "description": "Product Hunt slug", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "\"openai\"" - }, - { - "default": "customers", - "description": "Product Hunt customers order", - "enum": [ - "customers", - "latest_launch" - ], - "in": "query", - "name": "order", - "type": "string" - }, - { - "default": 1, - "description": "Page number", + "description": "1-based page, defaults to 1", "in": "query", "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 }, { - "default": 10, - "description": "Results per page", + "description": "Maximum collections, defaults to 50 and supports up to 250", "in": "query", - "name": "page_size", - "type": "integer" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -441149,31 +456846,25 @@ ], "responses": { "200": { - "description": "Wrapped customers payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.customersResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Product not found", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -441184,41 +456875,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt product customers", + "summary": "List Rebag collections", "tags": [ - "ProductHunt" + "Rebag" ] } }, - "/producthunt/product/{id}/launches": { + "/rebag/collections/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Lists the launch posts of a Product Hunt product, looked up by its slug in `id`. `order` defaults to `DATE`; pass the returned `end_cursor` as `cursor` for the next page. Each launch has its name, tagline, ranks, scores, comment count, badges and dates. An unknown slug returns 404.", - "operationId": "producthunt-launches", + "description": "Returns products from one Rebag (https://shop.rebag.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", + "operationId": "rebag-collection-products", "parameters": [ { - "description": "Product Hunt slug", + "description": "Collection handle", "in": "path", - "name": "id", + "name": "handle", "required": true, "type": "string", - "x-example": "\"openai\"" + "x-example": "collection-handle" }, { - "description": "Pagination cursor", + "description": "1-based page, defaults to 1", "in": "query", - "name": "cursor", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "default": "DATE", - "description": "Product Hunt launch order", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "order", - "type": "string", - "x-example": "DATE" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -441226,31 +456917,31 @@ ], "responses": { "200": { - "description": "Wrapped launches payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.launchesResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Product not found", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -441261,33 +456952,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt product launches", + "summary": "List Rebag collection products", "tags": [ - "ProductHunt" + "Rebag" ] } }, - "/producthunt/product/{id}/makers": { + "/rebag/pages": { "get": { "consumes": [ "application/json" ], - "description": "Lists the makers of a Product Hunt product, looked up by its slug in `id`. Each maker has a name, username, headline, avatar, follower count and the posts they made. The response includes `total_count` and claim status, and the returned `end_cursor` can be passed as `cursor` for the next page.", - "operationId": "producthunt-makers", + "description": "Lists the static pages on Rebag's storefront, paged with `page` (from 1) and `limit` (default 50, max 250). Each entry has `handle`, `title`, `url`, plain-text `content` and its dates. An empty page of results returns an empty `pages` array. In `ssr_embedded` mode only `handle`, `url` and `updated_at` are filled.", + "operationId": "rebag-pages", "parameters": [ { - "description": "Product Hunt slug", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "\"clico\"" + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Pagination cursor", + "description": "Maximum static pages, defaults to 50 and supports up to 250", "in": "query", - "name": "cursor", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -441295,31 +456986,25 @@ ], "responses": { "200": { - "description": "Wrapped makers payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.makersResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Product not found", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -441330,27 +457015,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt product makers", + "summary": "List Rebag static pages", "tags": [ - "ProductHunt" + "Rebag" ] } }, - "/producthunt/product/{id}/reviews": { + "/rebag/pages/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Lists the detailed reviews of a Product Hunt product, looked up by its slug in `id`. Each review has its ratings, such as ease of use and customization, comment count, creation time, the launch it came from and any alternative products named. The response also gives the review counts and an `end_cursor`.", - "operationId": "producthunt-reviews", + "description": "Looks up a single Rebag static page by `handle`, for example `welcome-trendlee`. The response has the page's id, title, URL, publication and update times, and its `content` as plain text. Unknown handles return 404. If `transport_mode` is `ssr_embedded`, `id` is left out.", + "operationId": "rebag-page", "parameters": [ { - "description": "Product Hunt slug", + "description": "Page handle", "in": "path", - "name": "id", + "name": "handle", "required": true, "type": "string", - "x-example": "\"clico\"" + "x-example": "page-handle" } ], "produces": [ @@ -441358,31 +457043,31 @@ ], "responses": { "200": { - "description": "Wrapped detailed reviews payload", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.reviewsResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Product not found", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -441393,61 +457078,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Product Hunt product detailed reviews", + "summary": "Get a Rebag static page", "tags": [ - "ProductHunt" + "Rebag" ] } }, - "/producthunt/search": { + "/rebag/products": { "get": { "consumes": [ "application/json" ], - "description": "Searches Product Hunt for the required `query`. `type` is `product` (default), `user` or `launch`, and `page` starts at 1. `featured` and `topics` apply to launch search only. Results come as `edges` with `pageInfo` and `pagesCount`; launch search also returns topic aggregations.", - "operationId": "producthunt-search", + "description": "Returns products from Rebag's (https://shop.rebag.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "rebag-products", "parameters": [ { - "description": "Search keywords", - "in": "query", - "name": "query", - "required": true, - "type": "string", - "x-example": "\"ai\"" - }, - { - "default": "product", - "description": "Result type: **product** (default), **user**, or **launch**", - "enum": [ - "product", - "user", - "launch" - ], - "in": "query", - "name": "type", - "type": "string" - }, - { - "description": "Page number (1-based)", + "description": "1-based page, defaults to 1", "in": "query", - "minimum": 1, "name": "page", "type": "integer", - "x-example": 2 - }, - { - "default": false, - "description": "Launch search only: featured launches only", - "in": "query", - "name": "featured", - "type": "boolean" + "x-example": 1 }, { - "description": "Launch search only: comma-separated topic slugs", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "topics", - "type": "string", - "x-example": "ai-chatbots,chrome-extensions" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -441455,31 +457112,25 @@ ], "responses": { "200": { - "description": "Wrapped search payload (map[string]any)", + "description": "OK", "schema": { - "$ref": "#/definitions/producthunt.searchResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "No results found", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -441490,24 +457141,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search for products, users, or launches on Product Hunt", + "summary": "List Rebag products", "tags": [ - "ProductHunt" + "Rebag" ] } }, - "/propublica/article": { + "/rebag/products/{handle}": { "get": { - "description": "Returns a ProPublica article by canonical `url` (`propublica.org/article/`): title, authors, publication and update dates, the dek as `description`, lead image where available, section, a `paywalled` flag and the body `paragraphs`.", - "operationId": "propublica-article", + "consumes": [ + "application/json" + ], + "description": "Returns product detail for one Rebag (https://shop.rebag.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "rebag-product", "parameters": [ { - "description": "Canonical ProPublica article URL", - "in": "query", - "name": "url", + "description": "Product handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "https://www.propublica.org/article/fbi-susan-collins-navatek-campaign-donations-investigation" + "x-example": "product-handle" } ], "produces": [ @@ -441517,7 +457171,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { @@ -441532,6 +457186,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -441544,31 +457204,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get ProPublica article content", + "summary": "Get a Rebag product", "tags": [ - "ProPublica" + "Rebag" ] } }, - "/propublica/author": { + "/rebag/products/{handle}/recommendations": { "get": { - "description": "Returns one ProPublica staff/contributor's public profile: name, bio, contact email and social accounts where published, and one page of their recent bylined stories.", - "operationId": "propublica-author", + "consumes": [ + "application/json" + ], + "description": "Returns recommended products for one Rebag (https://shop.rebag.com) product handle. The storefront URL is fixed server-side.", + "operationId": "rebag-product-recommendations", "parameters": [ { - "description": "Canonical propublica.org/people/ URL", - "in": "query", - "name": "url", + "description": "Product handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "https://www.propublica.org/people/william-turton" + "x-example": "product-handle" }, { - "description": "1-based page of recent stories to return; defaults to 1", + "description": "Maximum products, defaults to 10 and supports up to 20", "in": "query", - "name": "page", + "name": "limit", "type": "integer", - "x-example": 1 + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", + "enum": [ + "related", + "complementary" + ], + "in": "query", + "name": "intent", + "type": "string", + "x-example": "related" } ], "produces": [ @@ -441578,7 +457252,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.propublicaAuthorResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -441593,6 +457267,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -441605,59 +457285,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get a ProPublica staff profile", + "summary": "List Rebag product recommendations", "tags": [ - "ProPublica" + "Rebag" ] } }, - "/propublica/headlines": { + "/rebag/search": { "get": { - "description": "Returns the latest ProPublica stories for one topic. `section` is required and takes one of 33 topic slugs, such as `politics`, `health-care`, `immigration`, `courts`, `environment` or `trump-administration`. Each item has its title, URL, publication time and author.", - "operationId": "propublica-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns ranked products from Rebag's (https://shop.rebag.com) own full-text product search, including a best-effort condition grade and colour derived from the product's own catalog tags -- attributes not available from the other catalog endpoints in this family. The storefront URL is fixed server-side.", + "operationId": "rebag-search", "parameters": [ { - "description": "ProPublica topic slug", + "description": "Search query text", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "chanel" + }, + { + "description": "Sort order. Allowed values: relevance, price_asc, price_desc", "enum": [ - "abortion", - "biden-administration", - "civil-rights", - "courts", - "criminal-justice", - "debt", - "democracy", - "department-of-governmental-efficiency", - "education", - "environment", - "health-care", - "health-insurance", - "immigration", - "jan-6", - "labor", - "mental-health", - "military", - "nonprofits", - "police", - "politics", - "pollution", - "pregnancy", - "prison", - "racial-justice", - "real-estate", - "regulation", - "sex-and-gender", - "sports", - "stock", - "taxes", - "technology", - "trump-administration", - "usaid" + "relevance", + "price_asc", + "price_desc" ], "in": "query", - "name": "section", - "required": true, + "name": "sort", "type": "string", - "x-example": "abortion" + "x-example": "relevance" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 20 and supports up to 50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -441667,7 +457341,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopifybrands.searchResponseDoc" } }, "400": { @@ -441676,38 +457350,6 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get ProPublica topic headlines", - "tags": [ - "ProPublica" - ] - } - }, - "/propublica/news": { - "get": { - "description": "Returns the latest ProPublica top stories across topics. Takes no parameters. Each item has its title, URL, summary, publication time and image, plus the author byline, which can name more than one reporter.", - "operationId": "propublica-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -441726,88 +457368,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get ProPublica top stories", - "tags": [ - "ProPublica" - ] - } - }, - "/propublica/sections": { - "get": { - "description": "Lists the 33 topics from ProPublica's Browse Topics menu that `propublica-headlines` accepts. Each entry has a stable `slug`, a display `name` and the topic's feed `url`. Takes no parameters.", - "operationId": "propublica-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get ProPublica topics", - "tags": [ - "ProPublica" - ] - } - }, - "/psa/autographfacts/categories": { - "get": { - "consumes": [ - "application/json" - ], - "description": "PSA AutographFacts' full subject-category list -- the discovery endpoint for the category_id parameter used to browse subjects. Categories span far beyond sports: Baseball, Basketball, Football, Boxing, Golf, Hockey, Soccer, Tennis, MMA, Miscellaneous Sports, Cycling, Olympics, Motorsports, Entertainment, Music, Writers/Authors/Artists, Space Exploration, U.S. Presidents, and Historical & Political Figures.", - "operationId": "psa-autographfacts-categories", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/psa.autographFactsCategoriesResponseDoc" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List PSA AutographFacts categories", + "summary": "Search Rebag products", "tags": [ - "PSA" + "Rebag" ] } }, - "/psa/autographfacts/gallery": { + "/rebag/search/suggest": { "get": { "consumes": [ "application/json" ], - "description": "One autograph subject's full exemplar image gallery: real, captioned examples of authenticated signed items PSA keeps on file for this subject (signed photos, cards, baseballs, letters, contracts, and more), used as authentication reference material. subject_id is the numeric id from a psa-autographfacts-subjects result.", - "operationId": "psa-autographfacts-gallery", + "description": "Returns products, collections, and query suggestions from Rebag's (https://shop.rebag.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "rebag-search-suggest", "parameters": [ { - "description": "Numeric subject id, from a psa-autographfacts-subjects result", + "description": "Search query", "in": "query", - "name": "subject_id", + "name": "q", "required": true, "type": "string", - "x-example": "1" + "x-example": "wool" + }, + { + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "in": "query", + "name": "types", + "type": "string", + "x-example": "product,collection,query" + }, + { + "description": "Maximum results per type, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -441817,7 +457412,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.autographFactsGalleryResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { @@ -441826,14 +457421,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -441850,27 +457439,42 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA AutographFacts subject's exemplar image gallery", + "summary": "Get Rebag search suggestions", "tags": [ - "PSA" + "Rebag" ] } }, - "/psa/autographfacts/subject": { + "/rebag/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "One autograph subject's full public reference page: PSA's own authentication notes (signing habits, forgery risk, signature evolution), a general biography, and a per-item-type price guide (e.g. 3x5/AP card, photo, check, letter, single-signed ball -- item types vary by subject). subject_id is the numeric id from a psa-autographfacts-subjects result.", - "operationId": "psa-autographfacts-subject", + "description": "Lists URL entries from Rebag's sitemaps, filtered by `type` (`all`, `products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`; default `all`). Collection stops at `limit` entries (default 50, max 250). Each entry has `loc`, `type`, `handle`, `lastmod`, `changefreq` and, where present, `images` with caption, title and URL.", + "operationId": "rebag-sitemap-urls", "parameters": [ { - "description": "Numeric subject id, from a psa-autographfacts-subjects result", + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], "in": "query", - "name": "subject_id", - "required": true, + "name": "type", "type": "string", - "x-example": "1" + "x-example": "products" + }, + { + "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -441880,7 +457484,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.autographFactsSubjectResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" } }, "400": { @@ -441889,14 +457493,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -441913,29 +457511,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA AutographFacts subject's profile and price guide", + "summary": "List Rebag sitemap URLs", "tags": [ - "PSA" + "Rebag" ] } }, - "/psa/autographfacts/subjects": { + "/rebag/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Every autograph subject PSA AutographFacts lists for one category, each with the numeric subject_id to pass to psa-autographfacts-subject for that subject's full profile and price guide.", - "operationId": "psa-autographfacts-subjects", - "parameters": [ - { - "description": "Category id, from psa-autographfacts-categories", - "in": "query", - "name": "category_id", - "required": true, - "type": "integer", - "x-example": 4 - } - ], + "description": "Lists the child sitemaps in Rebag's sitemap index. Each entry has its `loc` and a `type` of `products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`, worked out from the sitemap URL. The endpoint takes no parameters.", + "operationId": "rebag-sitemaps", "produces": [ "application/json" ], @@ -441943,7 +457531,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.autographFactsSubjectsResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" } }, "400": { @@ -441952,8 +457540,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -441970,19 +457558,19 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA AutographFacts subjects in a category", + "summary": "List Rebag sitemaps", "tags": [ - "PSA" + "Rebag" ] } }, - "/psa/cardfacts/categories": { + "/rebag/store": { "get": { "consumes": [ "application/json" ], - "description": "PSA CardFacts' full category list -- the discovery endpoint for the category_id parameter used to browse sets. Nine categories: Baseball, Basketball, Boxing, Football, Golf, Hockey, Misc Sports, Multi-Sport, and Non-Sports/TCG.", - "operationId": "psa-cardfacts-categories", + "description": "Returns storefront metadata for Rebag (https://shop.rebag.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "rebag-store", "produces": [ "application/json" ], @@ -441990,11 +457578,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.cardFactsCategoriesResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -442005,27 +457605,27 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA CardFacts categories", + "summary": "Get Rebag store metadata", "tags": [ - "PSA" + "Rebag" ] } }, - "/psa/cardfacts/checklist": { + "/reddit/archive/comments/ids": { "get": { "consumes": [ "application/json" ], - "description": "One set's full card checklist: every card's name and printed number (number is empty for sets PSA lists without one, e.g. many autograph/player-only card sets). set_id is the numeric id from a psa-cardfacts-sets result.", - "operationId": "psa-cardfacts-checklist", + "description": "Looks up known Reddit comment ids in Arctic Shift's historical archive. Supply 1 to 1,000 comma-separated ids; duplicates are removed, results follow input order, and missing ids are listed separately. The service sends at most two upstream requests of up to 500 ids each. Archived scores are snapshots, and removed_by_category is included when available.", + "operationId": "reddit-archive-comments-ids", "parameters": [ { - "description": "Numeric set id, from a psa-cardfacts-sets result", + "description": "Comma-separated Reddit comment ids (1-1,000); optional t1_ prefixes are accepted", "in": "query", - "name": "set_id", + "name": "ids", "required": true, "type": "string", - "x-example": "34071" + "x-example": "c60n05h,abc123" } ], "produces": [ @@ -442035,7 +457635,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.cardFactsChecklistResponseDoc" + "$ref": "#/definitions/reddit.archiveCommentsIDsResponseDoc" } }, "400": { @@ -442044,8 +457644,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442062,27 +457662,78 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA CardFacts set's card checklist", + "summary": "Look up archived Reddit comments by ids", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/cardfacts/sets": { + "/reddit/archive/comments/search": { "get": { "consumes": [ "application/json" ], - "description": "Every card set PSA CardFacts lists for one category, each with the numeric set_id to pass to psa-cardfacts-checklist for that set's full card checklist.", - "operationId": "psa-cardfacts-sets", + "description": "Searches Arctic Shift's public historical comment archive. Supply at least one of query, author, subreddit, link_id, or parent_id; date bounds can further narrow that search. query searches comment body text and must be combined with author, subreddit, link_id, or parent_id; it maps to Arctic Shift's body parameter. Arctic Shift may time out or throttle broad searches, which return 503 with Retry-After. created_after/created_before are time boundaries, not Reddit listing cursors. Each comment includes created_utc and retrieved_on; archived scores can lag changes for roughly 36 hours. A valid query with no matches returns an empty comments array.", + "operationId": "reddit-archive-comments-search", "parameters": [ { - "description": "Category id, from psa-cardfacts-categories", + "description": "Public Reddit username filter", "in": "query", - "name": "category_id", - "required": true, - "type": "integer", - "x-example": 13 + "name": "author", + "type": "string" + }, + { + "description": "Subreddit name filter", + "in": "query", + "name": "subreddit", + "type": "string" + }, + { + "description": "Full-text search within comment bodies; requires author, subreddit, link_id, or parent_id", + "in": "query", + "name": "query", + "type": "string" + }, + { + "description": "Reddit post id to scope comments", + "in": "query", + "name": "link_id", + "type": "string" + }, + { + "description": "Parent comment id; an explicitly empty value selects top-level comments", + "in": "query", + "name": "parent_id", + "type": "string" + }, + { + "description": "Creation-time lower bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", + "in": "query", + "name": "created_after", + "type": "string" + }, + { + "description": "Creation-time upper bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", + "in": "query", + "name": "created_before", + "type": "string" + }, + { + "default": "desc", + "description": "Sort by creation time", + "enum": [ + "asc", + "desc" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Maximum comments, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -442092,7 +457743,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.cardFactsSetsResponseDoc" + "$ref": "#/definitions/reddit.archiveCommentsSearchResponseDoc" } }, "400": { @@ -442101,8 +457752,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442119,27 +457770,51 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA CardFacts sets in a category", + "summary": "Search archived Reddit comments", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/cert-lookup": { + "/reddit/archive/comments/{id}/tree": { "get": { "consumes": [ "application/json" ], - "description": "Looks up PSA's own public Cert Verification record for one PSA-graded card by its certification number: item title, grade, label type, reverse cert/barcode flag, year, brand/title, subject, card number, category, PSA's own price estimate, and this-cert's-own population figures (population for this exact card+grade, and pop-higher). Scoped to PSA's trading-card department; a cert number issued under a different PSA division (autographs, tickets) returns a not-found error. PSA's full Population Report and Auction Prices Realized both require a PSA/Collectors account login and are not available through this endpoint.", - "operationId": "psa-cert-lookup", + "description": "Returns a bounded nested comment tree from Arctic Shift's public archive. `t1` entries contain comments and their replies; `more` entries mark collapsed branches and include child ids/counts. Omitted parent_id requests the whole tree, while an explicitly empty parent_id requests top-level comments only. Empty archived trees return 200 with an empty comments array. Archived scores can lag changes for roughly 36 hours; slow or throttled upstream requests return 503 with Retry-After.", + "operationId": "reddit-archive-comments-tree", "parameters": [ { - "description": "PSA certification number, numeric, e.g. \\", - "in": "query", - "name": "cert_number", + "description": "Reddit post id or t3_ id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "125866845" + "x-example": "7cff0b" + }, + { + "description": "Parent comment id; an explicitly empty value selects top-level comments", + "in": "query", + "name": "parent_id", + "type": "string" + }, + { + "description": "Maximum archive comment nodes to expand, defaults to 50 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Initial breadth, defaults to 2 and must be between 0 and 8", + "in": "query", + "name": "start_breadth", + "type": "integer" + }, + { + "description": "Initial depth, defaults to 3 and must be between 0 and 8", + "in": "query", + "name": "start_depth", + "type": "integer" } ], "produces": [ @@ -442149,7 +457824,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.certLookupResponseDoc" + "$ref": "#/definitions/reddit.archiveCommentsTreeResponseDoc" } }, "400": { @@ -442164,8 +457839,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442182,19 +457857,29 @@ "ApiKeyAuth": [] } ], - "summary": "Verify a PSA certification number", + "summary": "Get an archived Reddit comment tree", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/price-guide/categories": { + "/reddit/archive/posts/ids": { "get": { "consumes": [ "application/json" ], - "description": "PSA Price Guide's full category list -- the discovery endpoint for the category_path parameter used to browse or fetch a set's price table. Every category is a distinct collectible type (Baseball Cards, Basketball Cards, Boxing Cards, Football Cards, Golf Cards, Hockey Cards, Soccer Cards, Non-Sports/TCG Cards, Racing Cards, Sports Tickets, Tennis, Unopened Packs, Presidential Autographs, Sports Autographs, Professional Model/Game-Used Bats, Graded Baseballs).", - "operationId": "psa-price-guide-categories", + "description": "Looks up known Reddit post ids in Arctic Shift's historical archive. Supply 1 to 1,000 comma-separated ids; duplicates are removed, results follow input order, and missing ids are listed separately. The service sends at most two upstream requests of up to 500 ids each. Archived scores and comment counts are snapshots, and removed_by_category is included when available.", + "operationId": "reddit-archive-posts-ids", + "parameters": [ + { + "description": "Comma-separated Reddit post ids (1-1,000); optional t3_ prefixes are accepted", + "in": "query", + "name": "ids", + "required": true, + "type": "string", + "x-example": "1wwa2ff,z1c9z" + } + ], "produces": [ "application/json" ], @@ -442202,11 +457887,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.priceGuideCategoriesResponseDoc" + "$ref": "#/definitions/reddit.archivePostsIDsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -442217,38 +457914,77 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Price Guide categories", + "summary": "Look up archived Reddit posts by ids", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/price-guide/search": { + "/reddit/archive/posts/search": { "get": { "consumes": [ "application/json" ], - "description": "Searches PSA Price Guide by free text (a player/subject name or set name), matching PSA's own site search box. Each result is a matching set with the query's matching cards/items inside it; use a result's category_path, set_path and set_id as the input to psa-price-guide-set to fetch that set's full price table.", - "operationId": "psa-price-guide-search", + "description": "Searches Arctic Shift's public historical post archive. Supply at least one of query, author, subreddit, or url; date bounds can further narrow that search. This is separate from the live Reddit search endpoint. created_after/created_before are time boundaries, not Reddit listing cursors; posts include created_utc and retrieved_on so callers can see when the archive captured each record. Archived scores and comment counts can lag changes for roughly 36 hours. A valid query with no matches returns an empty posts array. Slow or throttled upstream searches return 503 with Retry-After.", + "operationId": "reddit-archive-posts-search", "parameters": [ { - "description": "Free-text search term, e.g. a player/subject name or set name", + "description": "Text search across archived post titles and selftext", "in": "query", "name": "query", - "required": true, - "type": "string", - "x-example": "griffey" + "type": "string" }, { - "description": "One-based result page, default 1", + "description": "Public Reddit username filter", "in": "query", - "name": "page", - "type": "integer" + "name": "author", + "type": "string" }, { - "description": "Results per page, default 50, max 100", + "description": "Subreddit name filter", "in": "query", - "name": "page_size", + "name": "subreddit", + "type": "string" + }, + { + "description": "Linked URL prefix filter", + "in": "query", + "name": "url", + "type": "string" + }, + { + "description": "Require an exact URL match; requires url", + "in": "query", + "name": "url_exact", + "type": "boolean" + }, + { + "description": "Creation-time lower bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", + "in": "query", + "name": "created_after", + "type": "string" + }, + { + "description": "Creation-time upper bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", + "in": "query", + "name": "created_before", + "type": "string" + }, + { + "default": "desc", + "description": "Sort by creation time", + "enum": [ + "asc", + "desc" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Maximum posts, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", "type": "integer" } ], @@ -442259,7 +457995,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.priceGuideSearchResponseDoc" + "$ref": "#/definitions/reddit.archivePostsSearchResponseDoc" } }, "400": { @@ -442268,8 +458004,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442286,43 +458022,74 @@ "ApiKeyAuth": [] } ], - "summary": "Search PSA Price Guide", + "summary": "Search archived Reddit posts", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/price-guide/set": { + "/reddit/archive/subreddits/search": { "get": { "consumes": [ "application/json" ], - "description": "Fetches one PSA Price Guide set's full grade-by-grade price table: every card in the set with PSA's own formatted price per grade column (the set's own grade columns vary -- a vintage set may carry more/lower grade tiers than a modern one). category_path, set_path and set_id together identify the set; use the matching fields from a psa-price-guide-search result, or category_path from psa-price-guide-categories combined with a set_path/set_id found by browsing PSA's own category page.", - "operationId": "psa-price-guide-set", + "description": "Searches Arctic Shift's native subreddit directory by name prefix. Directory metadata is updated infrequently; subscriber counts are archived snapshots and retrieved_on indicates when the source captured the entry. The selectable fields are limited to the verified public directory fields.", + "operationId": "reddit-archive-subreddits-search", "parameters": [ { - "description": "Category URL path segment, from psa-price-guide-categories or a psa-price-guide-search result", + "description": "Subreddit name prefix, with or without r/", "in": "query", - "name": "category_path", + "name": "query", "required": true, "type": "string", - "x-example": "baseball-card-values" + "x-example": "OpenAI" }, { - "description": "Set URL path segment, from a psa-price-guide-search result", + "description": "Minimum archived subscriber count", "in": "query", - "name": "set_path", - "required": true, - "type": "string", - "x-example": "1974-topps" + "name": "min_subscribers", + "type": "integer" }, { - "description": "PSA's own numeric set id, from a psa-price-guide-search result", + "description": "Maximum archived subscriber count", "in": "query", - "name": "set_id", - "required": true, - "type": "string", - "x-example": "1239" + "name": "max_subscribers", + "type": "integer" + }, + { + "description": "Filter by archived NSFW status", + "in": "query", + "name": "over_18", + "type": "boolean" + }, + { + "default": "subscribers", + "description": "Sort field", + "enum": [ + "created_utc", + "subscribers", + "subreddit" + ], + "in": "query", + "name": "sort_by", + "type": "string" + }, + { + "default": "desc", + "description": "Sort direction", + "enum": [ + "asc", + "desc" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Maximum subreddits, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -442332,7 +458099,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.priceGuideSetResponseDoc" + "$ref": "#/definitions/reddit.archiveSubredditsSearchResponseDoc" } }, "400": { @@ -442341,14 +458108,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442365,19 +458126,78 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA Price Guide set's price table", + "summary": "Search Reddit's archived subreddit directory", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/probatfacts/categories": { + "/reddit/archive/time-series": { "get": { "consumes": [ "application/json" ], - "description": "PSA ProBatFacts' full player-category list -- the discovery endpoint for the category_id parameter used to browse players. Baseball-bat authentication only, split by Hall of Fame status: Hall of Fame Players, Star Players.", - "operationId": "psa-probatfacts-categories", + "description": "Returns Arctic Shift's native time-series values. Supply an absolute creation-time range and a precision; ranges that could exceed 1,000 points are rejected. Counts, score sums, and retrieval-delay sums are archive metrics, not current Reddit totals. Arctic Shift says time-series data may be approximate and take hours or days to update.", + "operationId": "reddit-archive-time-series", + "parameters": [ + { + "description": "Archive metric", + "enum": [ + "posts_count", + "comments_count", + "posts_score_sum", + "comments_score_sum", + "posts_retrieval_delay_seconds_sum", + "comments_retrieval_delay_seconds_sum", + "subreddit_subscribers" + ], + "in": "query", + "name": "metric", + "required": true, + "type": "string", + "x-example": "posts_count" + }, + { + "description": "Optional subreddit scope; required for subreddit_subscribers, and unsupported for retrieval-delay metrics", + "in": "query", + "name": "subreddit", + "type": "string", + "x-example": "OpenAI" + }, + { + "description": "Time bucket precision", + "enum": [ + "year", + "quarter", + "month", + "week", + "day", + "hour", + "minute" + ], + "in": "query", + "name": "precision", + "required": true, + "type": "string", + "x-example": "year" + }, + { + "description": "Absolute start time: epoch seconds/milliseconds or ISO 8601", + "in": "query", + "name": "created_after", + "required": true, + "type": "string", + "x-example": "2024-01-01" + }, + { + "description": "Absolute end time: epoch seconds/milliseconds or ISO 8601", + "in": "query", + "name": "created_before", + "required": true, + "type": "string", + "x-example": "2025-01-01" + } + ], "produces": [ "application/json" ], @@ -442385,11 +458205,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.probatFactsCategoriesResponseDoc" + "$ref": "#/definitions/reddit.archiveTimeSeriesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -442400,27 +458232,62 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA ProBatFacts categories", + "summary": "Get historical Reddit archive time series", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/probatfacts/gallery": { + "/reddit/comments/{id}": { "get": { "consumes": [ "application/json" ], - "description": "One player's full exemplar image gallery: real, captioned examples of authenticated bats PSA keeps on file for this player, used as authentication reference material. subject_id is the numeric id from a psa-probatfacts-subjects result.", - "operationId": "psa-probatfacts-gallery", + "description": "Returns a Reddit post with its public comments. The default mode is 1 credit. Set `include_metrics=true` to return the comments with public net score and award count plus post engagement metrics for 3 credits. Large threads may expose only an initial comment subset. Reddit does not expose per-comment upvote ratios or exact upvote/downvote totals anonymously. A post that exists but has no comments yet returns a 200 response with an empty comments list; a post that does not exist returns 404, and a temporary block or upstream failure returns 503 (retryable) rather than 404. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-comments", "parameters": [ { - "description": "Numeric subject id, from a psa-probatfacts-subjects result", - "in": "query", - "name": "subject_id", + "description": "Reddit post id or t3_ id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "1490" + "x-example": "1tka90t" + }, + { + "default": "confidence", + "description": "Comment order: confidence, top, new, controversial, old, or qa. Applied to the anonymous HTML request when metrics are enabled.", + "enum": [ + "confidence", + "top", + "new", + "controversial", + "old", + "qa" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Maximum comments returned, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "default": 3, + "description": "Maximum flat comment depth returned in metrics mode.", + "in": "query", + "name": "depth", + "type": "integer" + }, + { + "default": false, + "description": "Include public post and per-comment engagement metrics; costs 3 credits instead of 1", + "in": "query", + "name": "include_metrics", + "type": "boolean" } ], "produces": [ @@ -442430,7 +458297,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.probatFactsGalleryResponseDoc" + "$ref": "#/definitions/reddit.commentsResponseDoc" } }, "400": { @@ -442445,8 +458312,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442463,27 +458330,66 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA ProBatFacts player's exemplar image gallery", + "summary": "Get Reddit post comments", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/probatfacts/subject": { + "/reddit/domain/{domain}/posts": { "get": { "consumes": [ "application/json" ], - "description": "One player's full public reference page: PSA's own bat-authentication notes (professional models used, signature placement) and a general player biography. Unlike psa-autographfacts-subject, this carries no price guide. subject_id is the numeric id from a psa-probatfacts-subjects result.", - "operationId": "psa-probatfacts-subject", + "description": "Returns public posts submitted from a linked domain. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-domain-posts", "parameters": [ { - "description": "Numeric subject id, from a psa-probatfacts-subjects result", - "in": "query", - "name": "subject_id", + "description": "Domain hostname, without scheme or path", + "in": "path", + "name": "domain", "required": true, "type": "string", - "x-example": "1490" + "x-example": "openai.com" + }, + { + "default": "hot", + "description": "Sort: hot, new, top, or rising", + "enum": [ + "hot", + "new", + "top", + "rising" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Time window for top sort: hour, day, week, month, year, or all", + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "all" + ], + "in": "query", + "name": "time", + "type": "string" + }, + { + "description": "Maximum posts, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -442493,7 +458399,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.probatFactsSubjectResponseDoc" + "$ref": "#/definitions/reddit.domainPostsResponseDoc" } }, "400": { @@ -442508,8 +458414,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442526,27 +458432,86 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA ProBatFacts player's bat-authentication reference page", + "summary": "List Reddit domain posts", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/probatfacts/subjects": { + "/reddit/leads": { "get": { "consumes": [ "application/json" ], - "description": "Every player PSA ProBatFacts lists for one category, each with the numeric subject_id to pass to psa-probatfacts-subject for that player's full bat-authentication reference page.", - "operationId": "psa-probatfacts-subjects", + "description": "Scans a Reddit search page for people actively asking for a product or service, scores each post 0-10 for buying intent, and returns them ranked highest-first with the signals that fired. Self-promotion, hiring posts, freelancer service adverts, revenue-milestone posts, duplicate reposts, and Title Case article headlines are filtered out before scoring. A deterministic prefilter always runs; when `classifier` resolves to `llm` the surviving candidates are additionally refined in one batched model call. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. The lead-response fields and credit weights are preserved regardless of the underlying Reddit data source.", + "operationId": "reddit-leads", "parameters": [ { - "description": "Category id, from psa-probatfacts-categories", + "description": "What you offer, in plain language", "in": "query", - "name": "category_id", + "name": "q", "required": true, - "type": "integer", - "x-example": 29 + "type": "string", + "x-example": "crm for small teams" + }, + { + "description": "Restrict the search to a subreddit name, without r/", + "in": "query", + "name": "subreddit", + "type": "string" + }, + { + "default": "relevance", + "description": "Sort: relevance, hot, new, top, or comments", + "enum": [ + "relevance", + "hot", + "new", + "top", + "comments" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": "month", + "description": "Time window: hour, day, week, month, year, or all", + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "all" + ], + "in": "query", + "name": "time", + "type": "string" + }, + { + "description": "Maximum leads returned, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Minimum buying-intent score to return, 0-10, defaults to 4", + "in": "query", + "name": "min_score", + "type": "integer" + }, + { + "default": "auto", + "description": "Classifier: auto uses the model when configured, heuristic skips it, llm requires it", + "enum": [ + "auto", + "heuristic", + "llm" + ], + "in": "query", + "name": "classifier", + "type": "string" } ], "produces": [ @@ -442556,7 +458521,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.probatFactsSubjectsResponseDoc" + "$ref": "#/definitions/reddit.leadsResponseDoc" } }, "400": { @@ -442565,8 +458530,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442583,19 +458554,36 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA ProBatFacts subjects in a category", + "summary": "Find Reddit buying-intent leads", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/ticketfacts/categories": { + "/reddit/post/{id}": { "get": { "consumes": [ "application/json" ], - "description": "PSA TicketFacts' full event-category list -- the discovery endpoint for the category_id parameter used to browse events. Spans NFL, MLB and NBA historic events: Super Bowl, World Series, MLB All Star Game, Historic Baseball Events, and Historic Basketball Events.", - "operationId": "psa-ticketfacts-categories", + "description": "Returns a public Reddit post. The default mode is 1 credit. Set `include_metrics=true` to return public net score, upvote ratio, comment count, award count, and estimated upvote/downvote totals for 3 credits. Reddit fuzzes voting data, so estimates are approximate; share, repost/crosspost, and view counts are not exposed anonymously. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-post", + "parameters": [ + { + "description": "Reddit post id or t3_ id", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "1v8hy3q" + }, + { + "default": false, + "description": "Include public engagement metrics; costs 3 credits instead of 1", + "in": "query", + "name": "include_metrics", + "type": "boolean" + } + ], "produces": [ "application/json" ], @@ -442603,11 +458591,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.ticketFactsCategoriesResponseDoc" + "$ref": "#/definitions/reddit.postResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -442618,27 +458624,73 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA TicketFacts categories", + "summary": "Get Reddit post", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/ticketfacts/gallery": { + "/reddit/search": { "get": { "consumes": [ "application/json" ], - "description": "One event's full exemplar image gallery: real, captioned examples of authenticated tickets from this event PSA keeps on file, used as authentication reference material. subject_id is the numeric id from a psa-ticketfacts-subjects result.", - "operationId": "psa-ticketfacts-gallery", + "description": "Searches public Reddit content and returns public post entries. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-search", "parameters": [ { - "description": "Numeric subject id, from a psa-ticketfacts-subjects result", + "description": "Search keywords", "in": "query", - "name": "subject_id", + "name": "q", "required": true, "type": "string", - "x-example": "1147" + "x-example": "gpt" + }, + { + "description": "Restrict search to a subreddit name, without r/", + "in": "query", + "name": "subreddit", + "type": "string" + }, + { + "default": "relevance", + "description": "Sort: relevance, hot, new, top, or comments", + "enum": [ + "relevance", + "hot", + "new", + "top", + "comments" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Time window for top/comments sorts: hour, day, week, month, year, or all", + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "all" + ], + "in": "query", + "name": "time", + "type": "string" + }, + { + "description": "Maximum posts, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -442648,7 +458700,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.ticketFactsGalleryResponseDoc" + "$ref": "#/definitions/reddit.searchResponseDoc" } }, "400": { @@ -442663,8 +458715,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442681,27 +458733,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA TicketFacts event's exemplar image gallery", + "summary": "Search Reddit posts", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/ticketfacts/subject": { + "/reddit/subreddit/{subreddit}/about": { "get": { "consumes": [ "application/json" ], - "description": "One event's full public ticket reference page: PSA's own historical writeup of the event and the ticket(s) involved. Unlike psa-autographfacts-subject, this carries no price guide. subject_id is the numeric id from a psa-ticketfacts-subjects result.", - "operationId": "psa-ticketfacts-subject", + "description": "Returns public metadata and sample posts for a subreddit. Subscriber counts, icons, and banners are omitted because they are not available on anonymous Reddit pages. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-subreddit-about", "parameters": [ { - "description": "Numeric subject id, from a psa-ticketfacts-subjects result", - "in": "query", - "name": "subject_id", + "description": "Subreddit name, without r/", + "in": "path", + "name": "subreddit", "required": true, "type": "string", - "x-example": "1147" + "x-example": "OpenAI" + }, + { + "description": "Maximum sample posts inspected, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -442711,7 +458769,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.ticketFactsSubjectResponseDoc" + "$ref": "#/definitions/reddit.subredditAboutResponseDoc" } }, "400": { @@ -442726,8 +458784,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442744,27 +458802,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA TicketFacts event's ticket reference page", + "summary": "Get Reddit subreddit metadata", "tags": [ - "PSA" + "Reddit" ] } }, - "/psa/ticketfacts/subjects": { + "/reddit/subreddit/{subreddit}/comments": { "get": { "consumes": [ "application/json" ], - "description": "Every event PSA TicketFacts lists for one category, each with the numeric subject_id to pass to psa-ticketfacts-subject for that event's full ticket reference page.", - "operationId": "psa-ticketfacts-subjects", + "description": "Returns flat public comment entries from a subreddit latest-comments feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-subreddit-comments", "parameters": [ { - "description": "Category id, from psa-ticketfacts-categories", - "in": "query", - "name": "category_id", + "description": "Subreddit name, without r/", + "in": "path", + "name": "subreddit", "required": true, - "type": "integer", - "x-example": 21 + "type": "string", + "x-example": "OpenAI" + }, + { + "description": "Maximum comments, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -442774,7 +458844,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/psa.ticketFactsSubjectsResponseDoc" + "$ref": "#/definitions/reddit.subredditCommentsResponseDoc" } }, "400": { @@ -442783,8 +458853,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -442801,33 +458877,66 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA TicketFacts subjects in a category", + "summary": "List Reddit subreddit comments", "tags": [ - "PSA" + "Reddit" ] } }, - "/psastore/collections": { + "/reddit/subreddit/{subreddit}/posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from the PSA Team Store (https://store.psacard.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", - "operationId": "psastore-collections", + "description": "Returns public posts from a subreddit. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-subreddit-posts", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Subreddit name, without r/", + "in": "path", + "name": "subreddit", + "required": true, + "type": "string", + "x-example": "OpenAI" + }, + { + "default": "hot", + "description": "Sort: hot, new, top, or rising", + "enum": [ + "hot", + "new", + "top", + "rising" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "sort", + "type": "string" }, { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Time window for top sort: hour, day, week, month, year, or all", + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "all" + ], + "in": "query", + "name": "time", + "type": "string" + }, + { + "description": "Maximum posts, defaults to 25 and clamps to 100", "in": "query", "name": "limit", - "type": "integer", - "x-example": 50 + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -442837,7 +458946,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/reddit.subredditPostsResponseDoc" } }, "400": { @@ -442846,6 +458955,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -442864,41 +458979,66 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Store collections", + "summary": "List Reddit subreddit posts", "tags": [ - "PSAStore" + "Reddit" ] } }, - "/psastore/collections/{handle}/products": { + "/reddit/subreddits/posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one PSA Team Store (https://store.psacard.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", - "operationId": "psastore-collection-products", + "description": "Returns public posts from a combined multi-subreddit feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-subreddits-posts", "parameters": [ { - "description": "Collection handle", - "in": "path", - "name": "handle", + "description": "Comma-separated subreddit names, without r/, maximum 10", + "in": "query", + "name": "subreddits", "required": true, "type": "string", - "x-example": "collection-handle" + "x-example": "OpenAI,MachineLearning" }, { - "description": "1-based page, defaults to 1", + "default": "hot", + "description": "Sort: hot, new, top, or rising", + "enum": [ + "hot", + "new", + "top", + "rising" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "sort", + "type": "string" }, { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Time window for top sort: hour, day, week, month, year, or all", + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "all" + ], + "in": "query", + "name": "time", + "type": "string" + }, + { + "description": "Maximum posts, defaults to 25 and clamps to 100", "in": "query", "name": "limit", - "type": "integer", - "x-example": 50 + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -442908,7 +459048,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/reddit.multiSubredditPostsResponseDoc" } }, "400": { @@ -442941,33 +459081,58 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Store collection products", + "summary": "List Reddit multi-subreddit posts", "tags": [ - "PSAStore" + "Reddit" ] } }, - "/psastore/pages": { + "/reddit/trends": { "get": { "consumes": [ "application/json" ], - "description": "Lists static pages from the PSA Team Store, 50 per page by default (`limit` up to 250, `page` starts at 1). Each page has its `handle`, `title`, `url`, plain-text `content` and timestamps. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", - "operationId": "psastore-pages", + "description": "Returns public posts from broad Reddit hot, new, rising, or top feeds. For subreddit-specific trends, use `/reddit/subreddit/{subreddit}/posts` with `sort=hot`, `sort=new`, `sort=rising`, or `sort=top`. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-trends", "parameters": [ { - "description": "1-based page, defaults to 1", + "default": "hot", + "description": "Sort: hot, new, rising, or top", + "enum": [ + "hot", + "new", + "rising", + "top" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "sort", + "type": "string" }, { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Time window for top sort: hour, day, week, month, year, or all", + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "all" + ], + "in": "query", + "name": "time", + "type": "string" + }, + { + "description": "Maximum posts, defaults to 25 and clamps to 100", "in": "query", "name": "limit", - "type": "integer", - "x-example": 50 + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -442977,7 +459142,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/reddit.trendsResponseDoc" } }, "400": { @@ -442986,6 +459151,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -443004,27 +459175,39 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Store static pages", + "summary": "List Reddit trends", "tags": [ - "PSAStore" + "Reddit" ] } }, - "/psastore/pages/{handle}": { + "/reddit/user/{username}/comments": { "get": { "consumes": [ "application/json" ], - "description": "Returns one PSA Team Store static page by its `handle`: title, URL, plain-text `content` (HTML is stripped), and created, published and updated times. An unknown handle returns 404. When the store's standard page data is unavailable, `transport_mode` is `ssr_embedded` and `id` is omitted.", - "operationId": "psastore-page", + "description": "Returns flat public comment entries from a public Reddit user's comments feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-user-comments", "parameters": [ { - "description": "Page handle", + "description": "Public Reddit username, without u/", "in": "path", - "name": "handle", + "name": "username", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "reddit" + }, + { + "description": "Maximum comments, defaults to 25 and clamps to 100", + "in": "query", + "name": "limit", + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -443034,7 +459217,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/reddit.userCommentsResponseDoc" } }, "400": { @@ -443067,33 +459250,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA Store static page", + "summary": "List Reddit user comments", "tags": [ - "PSAStore" + "Reddit" ] } }, - "/psastore/products": { + "/reddit/user/{username}/posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from the PSA Team Store's (https://store.psacard.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "psastore-products", + "description": "Returns public posts from a public Reddit user's submitted feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", + "operationId": "reddit-user-posts", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "description": "Public Reddit username, without u/", + "in": "path", + "name": "username", + "required": true, + "type": "string", + "x-example": "reddit" }, { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Maximum posts, defaults to 25 and clamps to 100", "in": "query", "name": "limit", - "type": "integer", - "x-example": 50 + "type": "integer" + }, + { + "description": "Reddit pagination token", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -443103,7 +459292,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" + "$ref": "#/definitions/reddit.userPostsResponseDoc" } }, "400": { @@ -443112,6 +459301,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -443130,27 +459325,27 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Store products", + "summary": "List Reddit user posts", "tags": [ - "PSAStore" + "Reddit" ] } }, - "/psastore/products/{handle}": { + "/redfin/estimate": { "get": { "consumes": [ "application/json" ], - "description": "Returns product detail for one PSA Team Store (https://store.psacard.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "psastore-product", + "description": "Returns the Redfin Estimate for a property, including the current estimate, property facts, and the monthly estimate history with city/county/postal comparatives. Faithful pass-through of Redfin's public avm + avmHistoricalData resources.", + "operationId": "redfin-estimate", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Redfin property id", + "in": "query", + "name": "property_id", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "1715020" } ], "produces": [ @@ -443160,7 +459355,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" + "$ref": "#/definitions/redfin.EstimateResponse" } }, "400": { @@ -443169,12 +459364,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -443193,45 +459382,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get a PSA Store product", + "summary": "Get Redfin Estimate", "tags": [ - "PSAStore" + "Redfin" ] } }, - "/psastore/products/{handle}/recommendations": { + "/redfin/property": { "get": { "consumes": [ "application/json" ], - "description": "Returns recommended products for one PSA Team Store (https://store.psacard.com) product handle. The storefront URL is fixed server-side.", - "operationId": "psastore-product-recommendations", + "description": "Returns Redfin public property details. Provide a listing url, or a property_id (optionally with listing_id).", + "operationId": "redfin-property", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" + "description": "Redfin listing URL (primary key)", + "in": "query", + "name": "url", + "type": "string" }, { - "description": "Maximum products, defaults to 10 and supports up to 20", + "description": "Redfin property id, used when url is not provided", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "property_id", + "type": "string" }, { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], + "description": "Redfin listing id, improves completeness with property_id", "in": "query", - "name": "intent", - "type": "string", - "x-example": "related" + "name": "listing_id", + "type": "string" } ], "produces": [ @@ -443241,7 +459422,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/redfin.PropertyResponse" } }, "400": { @@ -443274,41 +459455,39 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Store product recommendations", + "summary": "Get Redfin property", "tags": [ - "PSAStore" + "Redfin" ] } }, - "/psastore/search/suggest": { + "/redfin/region-trends": { "get": { "consumes": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from the PSA Team Store's (https://store.psacard.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "psastore-search-suggest", + "description": "Returns Redfin's aggregate market trends for a region (median list/sale price, sale-to-list, offers, days on market, inventory, year-over-year). Faithful pass-through of Redfin's public aggregate-trends resource.", + "operationId": "redfin-region-trends", "parameters": [ { - "description": "Search query", + "description": "Redfin region id for a neighborhood, ZIP code, county, or city", "in": "query", - "name": "q", + "name": "region_id", "required": true, - "type": "string", - "x-example": "case" - }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" + "type": "integer", + "x-example": 17151 }, { - "description": "Maximum results per type, defaults to 10 and supports up to 20", + "description": "Redfin region type (defaults to 6, city)", + "enum": [ + 1, + 2, + 5, + 6 + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "region_type", + "type": "integer" } ], "produces": [ @@ -443318,7 +459497,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + "$ref": "#/definitions/redfin.RegionTrendsResponse" } }, "400": { @@ -443345,42 +459524,83 @@ "ApiKeyAuth": [] } ], - "summary": "Get PSA Store search suggestions", + "summary": "Get Redfin region market trends", "tags": [ - "PSAStore" + "Redfin" ] } }, - "/psastore/sitemap/urls": { + "/redfin/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns capped URL entries from the PSA Team Store's (https://store.psacard.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", - "operationId": "psastore-sitemap-urls", + "description": "Returns Redfin public listing search results. Pass region_id/region_type from autocomplete to skip location resolution.", + "operationId": "redfin-search", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "description": "Display location; resolved via autocomplete when region_id is omitted", + "in": "query", + "name": "location", + "type": "string" + }, + { + "description": "1-based page", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Redfin region id; skips location resolution when provided", + "in": "query", + "name": "region_id", + "type": "integer" + }, + { + "description": "Redfin region type, used with region_id (defaults to 6, city)", "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" + 1, + 2, + 5, + 6 ], "in": "query", - "name": "type", - "type": "string", - "x-example": "products" + "name": "region_type", + "type": "integer" }, { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "description": "Listing status: for_sale or sold", + "enum": [ + "for_sale", + "sold" + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "status", + "type": "string" + }, + { + "description": "Minimum price filter", + "in": "query", + "name": "min_price", + "type": "integer" + }, + { + "description": "Maximum price filter", + "in": "query", + "name": "max_price", + "type": "integer" + }, + { + "description": "Minimum bedrooms filter", + "in": "query", + "name": "min_beds", + "type": "integer" + }, + { + "description": "Minimum bathrooms filter", + "in": "query", + "name": "min_baths", + "type": "number" } ], "produces": [ @@ -443390,7 +459610,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/redfin.SearchResponse" } }, "400": { @@ -443417,19 +459637,29 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Store sitemap URLs", + "summary": "Search Redfin listings", "tags": [ - "PSAStore" + "Redfin" ] } }, - "/psastore/sitemaps": { + "/redfin/similar": { "get": { "consumes": [ "application/json" ], - "description": "Returns child sitemap URLs from the PSA Team Store's (https://store.psacard.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", - "operationId": "psastore-sitemaps", + "description": "Returns the comparable listings Redfin shows for a property, identified by the required `property_id`. Each row has the address, city, state, zip, price, beds, baths, `sqft`, `price_per_sqft`, days on market, MLS number, `hoa_monthly`, lot size, year built, status, image and URL, plus coordinates when present.", + "operationId": "redfin-similar", + "parameters": [ + { + "description": "Redfin property id", + "in": "query", + "name": "property_id", + "required": true, + "type": "string", + "x-example": "1715020" + } + ], "produces": [ "application/json" ], @@ -443437,7 +459667,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/redfin.SimilarResponse" } }, "400": { @@ -443464,19 +459694,19 @@ "ApiKeyAuth": [] } ], - "summary": "List PSA Store sitemaps", + "summary": "Get Redfin comparable listings", "tags": [ - "PSAStore" + "Redfin" ] } }, - "/psastore/store": { + "/reelshort/fandom-categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for the PSA Team Store (https://store.psacard.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "psastore-store", + "description": "Returns the categories of ReelShort's (reelshort.com) editorial site, Fandom (cast profiles, plot write-ups, streaming guides): id, slug, name, description, number of articles and link, read live from ReelShort. Pass a category slug to reelshort-fandom-posts. Only public editorial text is read.", + "operationId": "reelshort-fandom-categories", "produces": [ "application/json" ], @@ -443484,7 +459714,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/reelshort.fandomCategoriesResponseDoc" } }, "400": { @@ -443511,24 +459741,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get PSA Store store metadata", + "summary": "List ReelShort Fandom's article categories", "tags": [ - "PSAStore" + "ReelShort" ] } }, - "/punch/article": { + "/reelshort/fandom-post": { "get": { - "description": "Returns a Punch article by canonical `url` (`https://punchng.com//`): title, description, publication and update times, section, authors, image and the body `paragraphs`. Punch articles are free to read, so `paywalled` is never set. Video-led stories may have only a short text summary.", - "operationId": "punch-article", + "consumes": [ + "application/json" + ], + "description": "Returns one article from ReelShort's (reelshort.com) editorial site, Fandom: title, excerpt, link, image, publish and modify times, category names, the full article text as plain text, and the ids of the ReelShort titles it links to (pass them to reelshort-movie). id is the article id, its slug, or its reelshort.com/fandom URL. Only public editorial text is read. An unknown article returns not found.", + "operationId": "reelshort-fandom-post", "parameters": [ { - "description": "Canonical Punch article URL", + "description": "Article id (digits), article slug, or a reelshort.com/fandom URL", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://punchng.com/example-article-slug/" + "x-example": "54181" } ], "produces": [ @@ -443538,7 +459771,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/reelshort.fandomPostResponseDoc" } }, "400": { @@ -443553,6 +459786,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -443565,24 +459804,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get Punch article content", + "summary": "Get a ReelShort Fandom article", "tags": [ - "Punch" + "ReelShort" ] } }, - "/punch/author": { + "/reelshort/fandom-posts": { "get": { - "description": "Returns a Punch author's name and their most recent articles (the first archive page, about 30) from a canonical `url` (`https://punchng.com/author//`). `total_pages` is the number of archive pages. Punch author pages have no biography, photo or social links, so none are returned. An unknown author returns not-found.", - "operationId": "punch-author", + "consumes": [ + "application/json" + ], + "description": "Lists articles from ReelShort's (reelshort.com) editorial site, Fandom, newest first: id, slug, title, excerpt, link, image, publish and modify times and category names, with the total and page count. Filter by search text and by category slug (general-topic, movie-cast-list, top-movie-stories, where-to-watch or where-to-watch-2). Pass an article id to reelshort-fandom-post for its text. Only public editorial text is read.", + "operationId": "reelshort-fandom-posts", "parameters": [ { - "description": "Canonical Punch author URL", + "description": "Text to search articles for, up to 100 characters", "in": "query", - "name": "url", - "required": true, + "name": "search", "type": "string", - "x-example": "https://punchng.com/author/example-author/" + "x-example": "alpha" + }, + { + "description": "Category slug: general-topic, movie-cast-list, top-movie-stories, where-to-watch or where-to-watch-2", + "enum": [ + "general-topic", + "movie-cast-list", + "top-movie-stories", + "where-to-watch", + "where-to-watch-2" + ], + "in": "query", + "name": "category", + "type": "string", + "x-example": "movie-cast-list" + }, + { + "description": "Page number, 1 to 10000; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 2 + }, + { + "description": "Page size, 1 to 100; defaults to 10", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -443592,7 +459861,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.punchAuthorResponseDoc" + "$ref": "#/definitions/reelshort.fandomPostsResponseDoc" } }, "400": { @@ -443601,8 +459870,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -443619,62 +459888,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Punch author archive", + "summary": "List ReelShort Fandom articles", "tags": [ - "Punch" + "ReelShort" ] } }, - "/punch/headlines": { + "/reelshort/home": { "get": { - "description": "Returns the current stories, about 30, from one Punch topic page. `section` is required and takes a topic slug such as `news`, `politics`, `business`, `sports`, `metro-plus` or `top-stories`; any other value is an invalid-parameter error. Each item has a title and article URL, plus summary, publication time and image URL when the page shows them.", - "operationId": "punch-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns ReelShort's (reelshort.com) home page as ranked shelves of short dramas (New Release, TOP, Reel Original, Hidden Identity, and so on): shelf id and name, and for each title its id, title, description, cover, ReelShort link, episode count, tags, plays, favorites and the episode from which viewing is paid. Pass a shelf id to reelshort-shelf for the whole list. Only public catalog metadata is read; no playable video is returned.", + "operationId": "reelshort-home", "parameters": [ { - "description": "Punch topic slug", + "description": "Site locale, one of: en, es, pt, fr, de, it, ja, ko, th, id, tr, ar, ru, pl, ro, cs, bg, vi, zh-TW; defaults to en. Titles and tags are translated", "enum": [ - "business", - "columns", - "continuation-from-print", - "diaspora", - "editorial", - "education", - "entertainment", - "feature", - "featured", - "foreign-news", - "health", - "healthwise", - "information-technology", - "interactive", - "interview", - "latest-news", - "law-digest-2", - "letters", - "metro-plus", - "news", - "opinion", - "osun-decides", - "panorama", - "politics", - "punch-lite", - "sex-relationship", - "smart-tips", - "society", - "special-features", - "spice", - "sponsored", - "sports", - "technology", - "top-stories", - "video", - "weekend-starter" + "en", + "es", + "pt", + "fr", + "de", + "it", + "ja", + "ko", + "th", + "id", + "tr", + "ar", + "ru", + "pl", + "ro", + "cs", + "bg", + "vi", + "zh-TW" ], "in": "query", - "name": "section", - "required": true, + "name": "language", "type": "string", - "x-example": "business" + "x-example": "es" } ], "produces": [ @@ -443684,7 +459938,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/reelshort.homeResponseDoc" } }, "400": { @@ -443693,38 +459947,6 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Punch section headlines", - "tags": [ - "Punch" - ] - } - }, - "/punch/news": { - "get": { - "description": "Returns the latest Punch stories from punchng.com: title, article URL, summary, author and publication time. Takes no parameters. Punch labels its times as UTC but publishes them in West Africa Time (UTC+1), and `published_at` is corrected for that one-hour skew.", - "operationId": "punch-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -443743,45 +459965,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get Punch top stories", + "summary": "List ReelShort's home page shelves", "tags": [ - "Punch" + "ReelShort" ] } }, - "/punch/sections": { + "/reelshort/movie": { "get": { - "description": "Lists the Punch topic slugs that `punch-headlines` accepts, such as `news`, `politics`, `business` and `sports`. Each entry has a `slug`, a display `name` and the topic page `url`. The list covers top-level topics linked from Punch's navigation or active in the 90 days before 2026-09-25.", - "operationId": "punch-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ + "description": "Returns one ReelShort short drama: title, description, cover, link, language, episode count, plays, favorites, badge, dubbed and AI-generated flags, release times, tags with their kind (genre, style, mood, trope and more), cast with IMDb links, and the full episode list with each episode's id, number, link, likes, release time and whether it is free. Only public catalog metadata is read; no playable video is returned.", + "operationId": "reelshort-movie", + "parameters": [ { - "ApiKeyAuth": [] + "description": "Title id (24 hex characters) from reelshort-home, reelshort-shelf or reelshort-search, or a reelshort.com movie or episode URL", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "6a8752ac7c23cb02b40f062b" } ], - "summary": "Get Punch sections", - "tags": [ - "Punch" - ] - } - }, - "/quince/categories": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Quince's full product facet taxonomy: every business department (Women, Men, Kids & Baby, Home, CPG, Emerging), department, category, material, primary color, and size value Quince currently has products for, each with its own live product count. The returned business_departments[].value/categories[].value/materials[].value/colors[].value/sizes[].value values are exactly what quince-search accepts as its own department/category/material/color/size parameters. sizes spans every product type Quince sells (apparel letter sizes, shoe sizes, rug/furniture dimensions, bedding sizes, and more) since it is one catalog-wide facet.", - "operationId": "quince-categories", "produces": [ "application/json" ], @@ -443789,7 +459995,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/quince.categoriesResponseDoc" + "$ref": "#/definitions/reelshort.movieResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -443810,19 +460028,57 @@ "ApiKeyAuth": [] } ], - "summary": "List Quince's product facet taxonomy", + "summary": "Get a ReelShort short drama and its episodes", "tags": [ - "Quince" + "ReelShort" ] } }, - "/quince/navigation": { + "/reelshort/new-releases": { "get": { "consumes": [ "application/json" ], - "description": "Returns Quince's full header navigation mega-menu: top-level tabs (Women, Men, Home, Baby & Kids, Travel, Bags & Accessories, Jewelry, Beauty & Wellness, Gifts, plus promotional tabs like New Arrivals/Best Sellers/$50 Cashmere), each broken into the same named subcategory groups (for example Apparel, Jewelry, Shoes) shown in Quince's own nav dropdown, with a directly browsable slug on every category and link. This is a distinct taxonomy from quince-categories' facets: navigation is Quince's own curated site structure, while quince-categories reports live per-value product counts for quince-search's own filter parameters.", - "operationId": "quince-navigation", + "description": "Returns ReelShort's (reelshort.com) curated \"New Release\" list from its website's signed JSON API: up to 18 titles with id, name, description, cover, reelshort.com link, episode count, plays, favorites and the first paid episode. book_id is a 24-character title id required by ReelShort's own API; on 2026-10-26 four different values, including an unknown id, returned the same list, so it is not known to change the result. Only public catalogue data is read and no playable media is returned.", + "operationId": "reelshort-new-releases", + "parameters": [ + { + "description": "A 24-character title id, from reelshort-movie, reelshort-shelf or reelshort-home; required by ReelShort but not observed to change the result", + "in": "query", + "name": "book_id", + "required": true, + "type": "string", + "x-example": "6aac85383511c0b6df0eec87" + }, + { + "description": "Site language, one of en, es, pt, fr, de, it, ja, ko, th, id, tr, ar, ru, pl, ro, cs, bg, vi, zh-TW; defaults to en", + "enum": [ + "en", + "es", + "pt", + "fr", + "de", + "it", + "ja", + "ko", + "th", + "id", + "tr", + "ar", + "ru", + "pl", + "ro", + "cs", + "bg", + "vi", + "zh-TW" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "en" + } + ], "produces": [ "application/json" ], @@ -443830,7 +460086,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/quince.navigationResponseDoc" + "$ref": "#/definitions/reelshort.newReleasesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -443851,27 +460113,62 @@ "ApiKeyAuth": [] } ], - "summary": "Get Quince's header navigation menu", + "summary": "List ReelShort's curated New Release titles", "tags": [ - "Quince" + "ReelShort" ] } }, - "/quince/product": { + "/reelshort/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns product-detail data for one Quince product: title, description, review summary, every selectable option (color swatches with hex codes, sizes), and every color/size variant with its own price, original (\"traditional retail\") price, stock status, and SKU. handle is the product's URL path on quince.com (for example women/cashmere/cashmere-crewneck-sweater), returned by quince-search's own products[].handle field.", - "operationId": "quince-product", + "description": "Searches ReelShort (reelshort.com) short dramas by keyword and returns 12 titles per page: id, title, description, cover, link, episode count, tags, plays and favorites, with the page, page count and an approximate total. The search is fuzzy and the total varies between calls. Only public catalog metadata is read; no playable video is returned.", + "operationId": "reelshort-search", "parameters": [ { - "description": "Product URL handle, from a search result's products[].handle field", + "description": "Title text to search for, up to 100 characters", "in": "query", - "name": "handle", + "name": "keywords", "required": true, "type": "string", - "x-example": "women/cashmere/cashmere-crewneck-sweater" + "x-example": "billionaire" + }, + { + "description": "Page number, 1 to 200; defaults to 1. Each page holds 12 titles", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 2 + }, + { + "description": "Site locale, one of: en, es, pt, fr, de, it, ja, ko, th, id, tr, ar, ru, pl, ro, cs, bg, vi, zh-TW; defaults to en. Titles and tags are translated", + "enum": [ + "en", + "es", + "pt", + "fr", + "de", + "it", + "ja", + "ko", + "th", + "id", + "tr", + "ar", + "ru", + "pl", + "ro", + "cs", + "bg", + "vi", + "zh-TW" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "es" } ], "produces": [ @@ -443881,7 +460178,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/quince.productResponseDoc" + "$ref": "#/definitions/reelshort.searchResponseDoc" } }, "400": { @@ -443890,12 +460187,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -443914,27 +460205,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Quince product", + "summary": "Search ReelShort short dramas by title", "tags": [ - "Quince" + "ReelShort" ] } }, - "/quince/product/faq": { + "/reelshort/shelf": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Quince product's own question/answer content (e.g. sizing, care, fit), from the same structured product data quince-product-reviews uses. handle is the same value quince-product accepts. Not every product carries FAQ content -- a product with none returns a well-formed empty result.", - "operationId": "quince-product-faq", + "description": "Returns one whole ReelShort shelf, such as TOP (up to 200 titles) or New Release: shelf id, name and every title with its id, title, description, cover, link, episode count, tags, plays and favorites. Shelf ids come from reelshort-home. Only public catalog metadata is read; no playable video is returned.", + "operationId": "reelshort-shelf", "parameters": [ { - "description": "Product URL handle, from a search result's products[].handle field", + "description": "Shelf id from reelshort-home (for example 51003506), or a reelshort.com shelf URL", "in": "query", - "name": "handle", + "name": "id", "required": true, "type": "string", - "x-example": "women/cashmere/cashmere-crewneck-sweater" + "x-example": "51003506" } ], "produces": [ @@ -443944,7 +460235,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/quince.productFAQResponseDoc" + "$ref": "#/definitions/reelshort.shelfResponseDoc" } }, "400": { @@ -443977,27 +460268,69 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Quince product's FAQ content", + "summary": "Get a whole ReelShort shelf", "tags": [ - "Quince" + "ReelShort" ] } }, - "/quince/product/reviews": { + "/reelshort/tag-books": { "get": { "consumes": [ "application/json" ], - "description": "Returns a sample of a Quince product's customer reviews (author, date, rating, review body), plus the product's overall aggregate rating and review count. handle is the same value quince-product accepts. The reviews returned are a sample (25 reviews on every product sampled), not a paginated feed of the full review history. A product with no reviews yet returns a well-formed empty result.", - "operationId": "quince-product-reviews", + "description": "Returns a ReelShort (reelshort.com) tag and one page of the titles that carry it: the tag's id, kind and name, its top titles, related tags, and for each title its id, name, description, cover, reelshort.com link, plays and favorites. tag_id is a 24-character tag id from reelshort-tags, reelshort-tag-search or reelshort-movie. Pages hold up to 100 titles and ReelShort lists over a thousand titles for the biggest tags. Only public catalogue data is read and no playable media is returned. An unknown tag returns not found.", + "operationId": "reelshort-tag-books", "parameters": [ { - "description": "Product URL handle, from a search result's products[].handle field", + "description": "Tag id, 24 lowercase hex characters, from reelshort-tags, reelshort-tag-search or reelshort-movie", "in": "query", - "name": "handle", + "name": "tag_id", "required": true, "type": "string", - "x-example": "women/cashmere/cashmere-crewneck-sweater" + "x-example": "676d210e4582b53a14081aab" + }, + { + "description": "Page number, 1 to 10000; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Page size, 1 to 100; defaults to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Site language, one of en, es, pt, fr, de, it, ja, ko, th, id, tr, ar, ru, pl, ro, cs, bg, vi, zh-TW; defaults to en", + "enum": [ + "en", + "es", + "pt", + "fr", + "de", + "it", + "ja", + "ko", + "th", + "id", + "tr", + "ar", + "ru", + "pl", + "ro", + "cs", + "bg", + "vi", + "zh-TW" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "en" } ], "produces": [ @@ -444007,7 +460340,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/quince.productReviewsResponseDoc" + "$ref": "#/definitions/reelshort.tagBooksResponseDoc" } }, "400": { @@ -444040,89 +460373,62 @@ "ApiKeyAuth": [] } ], - "summary": "Get Quince product reviews", + "summary": "List the ReelShort titles carrying a tag", "tags": [ - "Quince" + "ReelShort" ] } }, - "/quince/search": { + "/reelshort/tag-search": { "get": { "consumes": [ "application/json" ], - "description": "Searches or browses Quince's (quince.com) product catalog. q, department, category, material, color, size, min_price, and max_price are all optional and combine as an AND -- unlike some other families' search/category-browse split, a free-text q can be combined with any of the facet filters in the same request, or every field can be omitted to browse the full catalog by Quince's own relevance/popularity ranking. department accepts one of the values quince-categories' own business_departments[].value field returns (for example Women, Men, Kids & Baby, Home, CPG, Emerging); category, material, color, and size similarly accept values from quince-categories' own categories[].value/materials[].value/colors[].value/sizes[].value fields (or quince-navigation's own browsable category/subcategory slugs for a curated, hierarchical alternative to the flat category facet). Keyword search uses typo-tolerant relevance ranking, not a guaranteed exact match. A query with genuinely zero matches (for example a nonsense string) returns a well-formed empty result rather than an error.", - "operationId": "quince-search", + "description": "Searches ReelShort's (reelshort.com) tags by text: an actor or actress name, an identity or a trope. Returns one page of up to 50 matches, each with its tag id, name, kind, the number of titles ReelShort's search lists for it and an image. A search with no match returns an empty list. Pass a tag id to reelshort-tag-books for the titles carrying it. Only public catalogue data is read and no playable media is returned.", + "operationId": "reelshort-tag-search", "parameters": [ { - "description": "Free-text search query", - "in": "query", - "name": "q", - "type": "string", - "x-example": "cashmere sweater" - }, - { - "description": "Business department facet filter, from quince-categories' own business_departments[].value field", - "in": "query", - "name": "department", - "type": "string", - "x-example": "Women" - }, - { - "description": "Category facet filter, from quince-categories' own categories[].value field", - "in": "query", - "name": "category", - "type": "string", - "x-example": "Apparel" - }, - { - "description": "Material facet filter, from quince-categories' own materials[].value field", - "in": "query", - "name": "material", - "type": "string", - "x-example": "Cashmere" - }, - { - "description": "Primary color facet filter, from quince-categories' own colors[].value field", - "in": "query", - "name": "color", - "type": "string", - "x-example": "Grey" - }, - { - "description": "Size facet filter, from quince-categories' own sizes[].value field", + "description": "Tag text to search for, up to 100 characters", "in": "query", - "name": "size", + "name": "word", + "required": true, "type": "string", - "x-example": "M" - }, - { - "description": "Minimum price (inclusive), in USD", - "in": "query", - "name": "min_price", - "type": "number", - "x-example": 25 + "x-example": "Billionaire" }, { - "description": "Maximum price (inclusive), in USD", - "in": "query", - "name": "max_price", - "type": "number", - "x-example": 100 - }, - { - "description": "One-based page number, defaults to 1", + "description": "Page number, 1 to 10000; defaults to 1", "in": "query", "name": "page", "type": "integer", "x-example": 1 }, { - "description": "Results per page, defaults to 24, maximum 100", + "description": "Site language, one of en, es, pt, fr, de, it, ja, ko, th, id, tr, ar, ru, pl, ro, cs, bg, vi, zh-TW; defaults to en", + "enum": [ + "en", + "es", + "pt", + "fr", + "de", + "it", + "ja", + "ko", + "th", + "id", + "tr", + "ar", + "ru", + "pl", + "ro", + "cs", + "bg", + "vi", + "zh-TW" + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 24 + "name": "language", + "type": "string", + "x-example": "en" } ], "produces": [ @@ -444132,7 +460438,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/quince.searchResponseDoc" + "$ref": "#/definitions/reelshort.tagSearchResponseDoc" } }, "400": { @@ -444159,40 +460465,61 @@ "ApiKeyAuth": [] } ], - "summary": "Search or browse Quince products", + "summary": "Search ReelShort tags by text", "tags": [ - "Quince" + "ReelShort" ] } }, - "/quince/sitemap/urls": { + "/reelshort/tags": { "get": { "consumes": [ "application/json" ], - "description": "Returns capped URL entries from Quince's own sitemaps matching the requested type. Each entry's handle is populated from the URL's own path (tracking/variant query parameters stripped) -- for type products, this is directly the value quince-product's own handle parameter expects.", - "operationId": "quince-sitemap-urls", + "description": "Returns ReelShort's (reelshort.com) featured tags for one category: actor, actress, identity (Billionaire, CEO, Werewolf...) or trope (Flash Marriage, Revenge...), about 48 per category, each with its tag id, kind and name. Pass a tag id to reelshort-tag-books for the titles carrying it. category is one of actor, actress, identity or trope; language is a site language and defaults to en. Only public catalogue data is read and no playable media is returned.", + "operationId": "reelshort-tags", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, subcollections, pages", + "description": "Tag category: actor, actress, identity or trope", "enum": [ - "all", - "products", - "collections", - "subcollections", - "pages" + "actor", + "actress", + "identity", + "trope" ], "in": "query", - "name": "type", + "name": "category", + "required": true, "type": "string", - "x-example": "products" + "x-example": "identity" }, { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "description": "Site language, one of en, es, pt, fr, de, it, ja, ko, th, id, tr, ar, ru, pl, ro, cs, bg, vi, zh-TW; defaults to en", + "enum": [ + "en", + "es", + "pt", + "fr", + "de", + "it", + "ja", + "ko", + "th", + "id", + "tr", + "ar", + "ru", + "pl", + "ro", + "cs", + "bg", + "vi", + "zh-TW" + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "language", + "type": "string", + "x-example": "en" } ], "produces": [ @@ -444202,7 +460529,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/quince.sitemapURLsResponseDoc" + "$ref": "#/definitions/reelshort.tagsResponseDoc" } }, "400": { @@ -444229,37 +460556,84 @@ "ApiKeyAuth": [] } ], - "summary": "List Quince sitemap URLs", + "summary": "List ReelShort's featured tags in one category", "tags": [ - "Quince" + "ReelShort" ] } }, - "/quince/sitemaps": { + "/referrals/click": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Records a click on a referral link. The body requires the referral `code`; `click_id`, `landing_path` and `utm_source`, `utm_medium` and `utm_campaign` are optional. Returns the `click_id` to keep in the referral click cookie. An invalid code returns the standard invalid-params error.", + "operationId": "referrals-click", + "parameters": [ + { + "description": "Referral click metadata", + "in": "body", + "name": "request", + "required": true, + "schema": { + "$ref": "#/definitions/referrals.referralClickRequestDoc" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Referral click id", + "schema": { + "$ref": "#/definitions/referrals.referralClickResponseDoc" + } + }, + "400": { + "description": "Invalid request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "summary": "Capture a referral click", + "tags": [ + "Referrals" + ] + } + }, + "/referrals/me": { "get": { "consumes": [ "application/json" ], - "description": "Returns Quince's US-region child sitemaps (products, collections, subcollections, and static pages) with an inferred type, from quince.com's own public sitemap index.", - "operationId": "quince-sitemaps", + "description": "Returns the signed-in user's referral summary: referral `code`, `share_path`, `reward_credits` and `referred_reward_credits`, `attribution_window_days` (30 by default), `monthly_referrer_reward_cap`, counts by status in `stats`, and recent `items` with the user's `role`. Creates the code on first use.", + "operationId": "referrals-me", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Referral summary", "schema": { - "$ref": "#/definitions/quince.sitemapsResponseDoc" + "$ref": "#/definitions/referrals.referralsMeResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -444267,30 +460641,28 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "List Quince sitemaps", + "summary": "Get current user's referral program summary", "tags": [ - "Quince" + "Referrals" ] } }, - "/quince/suggest": { + "/referrals/me/events": { "get": { "consumes": [ "application/json" ], - "description": "Returns Quince's own search-box typeahead suggestions for a partial query: a flat list of suggested search phrases, no product data. Pass a suggestion straight through to quince-search's own q parameter for product results. A query with no genuine matches returns a well-formed empty result rather than an error.", - "operationId": "quince-suggest", + "description": "Lists the signed-in user's recent referral records, newest first, whether they were the referrer or the referred account. `limit` caps the count at 100. Each item has its code, campaign, `role`, `status` (including `clawed_back`), `reward_credits` and created, qualified, rewarded and expiry times.", + "operationId": "referrals-me-events", "parameters": [ { - "description": "Search query prefix", + "description": "Maximum records to return, capped at 100", "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "cash" + "name": "limit", + "type": "integer" } ], "produces": [ @@ -444298,25 +460670,19 @@ ], "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/quince.suggestResponseDoc" - } - }, - "400": { - "description": "Bad Request", + "description": "Referral events", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/referrals.referralsEventsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -444324,78 +460690,57 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Get Quince search suggestions", + "summary": "List current user's referral events", "tags": [ - "Quince" + "Referrals" ] } }, - "/qwant/suggest": { - "get": { + "/research/jobs": { + "post": { "consumes": [ "application/json" ], - "description": "Returns Qwant search-box autocomplete completions for a query prefix, in Qwant's own ranking order. `locale` selects the Qwant market (en_US, fr_FR, de_DE, en_GB, ...); Qwant ignores locale codes it does not support and uses its default market.", - "operationId": "qwant-suggest", + "description": "Submits bounded research over the selected web, arXiv paper, and developer-document sources. Repeated owner-scoped idempotency requests return the original job.", + "operationId": "research-start", "parameters": [ { - "description": "Search query prefix", - "in": "query", - "name": "q", + "description": "Research request; `scope` is `web`, `papers`, `developer`, or `mixed`; `output_format` is `report` or `json`.", + "in": "body", + "name": "request", "required": true, - "type": "string", - "x-example": "openai" - }, - { - "description": "Suggestions to return; defaults to 10, clamped to 1..10", - "in": "query", - "maximum": 10, - "minimum": 1, - "name": "count", - "type": "integer", - "x-example": 10 - }, - { - "description": "Qwant market locale in ll_CC form, such as en_US, fr_FR, de_DE, or en_GB; defaults to en_US", - "in": "query", - "name": "locale", - "type": "string", - "x-example": "en_US" + "schema": { + "$ref": "#/definitions/researchjobs.researchStartRequestDoc" + } } ], "produces": [ "application/json" ], "responses": { - "200": { - "description": "OK", + "202": { + "description": "Queued research job", "schema": { - "$ref": "#/definitions/qwant.suggestResponseDoc" + "$ref": "#/definitions/researchjobs.researchStartResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Invalid request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Qwant upstream request failed", + "description": "Research service or billing admission unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -444406,26 +460751,24 @@ "ApiKeyAuth": [] } ], - "summary": "Suggest Qwant search queries", + "summary": "Start a durable cross-corpus research job", "tags": [ - "Qwant" + "Research Jobs" ] } }, - "/raisingcanes/directory": { + "/research/jobs/{job_id}": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one level of Raising Cane's store directory tree. Omit path for the root, which lists the US states Raising Cane's operates in; pass a child's path to descend (state to cities, city to stores). Each child carries its name, path, URL and how many stores sit under that branch. A child with is_store true is a store record rather than another directory level -- pass its path to GET /raisingcanes/store. This is a directory browse, not a proximity search: use GET /raisingcanes/nearby for a radius lookup.", - "operationId": "raisingcanes-directory", + "description": "Returns the state of a research job by `job_id`: queued, running, cancelling, succeeded, failed or cancelled. The response carries `progress` counts, `research` progress (round, searches completed, sources read, questions answered), usage, warnings, `partial`, `deadline_at` and any error. A job not started within 30 minutes fails with `timeout`.", + "operationId": "research-status", "parameters": [ { - "description": "Directory path from a previous response's children[].path, e.g. la. Omit for the root state index.", - "in": "query", - "name": "path", + "description": "Research job ID", + "in": "path", + "name": "job_id", + "required": true, "type": "string", - "x-example": "la" + "x-example": "job-123" } ], "produces": [ @@ -444433,31 +460776,19 @@ ], "responses": { "200": { - "description": "OK", + "description": "Research job status", "schema": { - "$ref": "#/definitions/raisingcanes.directoryResponseDoc" + "$ref": "#/definitions/researchjobs.researchStatusResponseDoc" } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "description": "Research job not found", "schema": { "$ref": "#/definitions/app.Response" } @@ -444468,43 +460799,44 @@ "ApiKeyAuth": [] } ], - "summary": "Browse the Raising Cane's store directory", + "summary": "Read a research job status", "tags": [ - "Raising Cane's" + "Research Jobs" ] } }, - "/raisingcanes/menu": { - "get": { - "consumes": [ - "application/json" + "/research/jobs/{job_id}/cancel": { + "post": { + "description": "Requests cancellation of the caller's own research job, given by `job_id`. Returns the job's current state (such as `cancelling`), `cancel_requested`, `partial`, progress counts, research progress and usage. Results already retained stay readable and are marked partial where appropriate.", + "operationId": "research-cancel", + "parameters": [ + { + "description": "Research job ID", + "in": "path", + "name": "job_id", + "required": true, + "type": "string", + "x-example": "job-123" + } ], - "description": "Returns Raising Cane's full published menu: every section (Combos, Tailgates, Extras, Drinks) and every item, each with its name, Raising Cane's own item description (commonly ending in a calorie count or range), and image. This is a single fixed national menu page, not a per-store or per-region menu -- it takes no parameters. Raising Cane's does not publish price on this page; pricing lives behind the separate order.raisingcanes.com ordering flow, which needs a selected store and is out of scope here.", - "operationId": "raisingcanes-menu", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/raisingcanes.menuResponseDoc" - } - }, - "404": { - "description": "Not Found", + "description": "Updated research job status", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/researchjobs.researchStatusResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Research job not found", "schema": { "$ref": "#/definitions/app.Response" } @@ -444515,56 +460847,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get Raising Cane's full published menu", + "summary": "Cancel a research job", "tags": [ - "Raising Cane's" + "Research Jobs" ] } }, - "/raisingcanes/nearby": { + "/research/jobs/{job_id}/events": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Raising Cane's restaurants within a radius of a latitude/longitude, ordered nearest first, each with its distance in miles and kilometres, address, coordinates, timezone, price tier and which pickup/delivery services it offers. This proximity result carries less detail than GET /raisingcanes/store (Raising Cane's own nearby-search key is not configured with hours or phone) -- each result's `path` chains straight into GET /raisingcanes/store for the full record. `total_in_radius` reports how many stores fall inside the radius overall, which is usually far more than one page; use `offset` to walk it. A coordinate with no Raising Cane's nearby returns an empty list rather than an error.", - "operationId": "raisingcanes-nearby", + "description": "Reads a page of events for one of the caller's research jobs, by `job_id`. `limit` is 1 to 100 (default 50); pass `next_cursor` back as `cursor` to continue, with `has_more` showing whether more remain. Each event has `sequence`, `type` (such as `source_fetched` or `round_completed`), `timestamp`, `message` and `source_id`.", + "operationId": "research-events", "parameters": [ { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 40.7128 - }, - { - "description": "Search center longitude", - "in": "query", - "name": "longitude", + "description": "Research job ID", + "in": "path", + "name": "job_id", "required": true, - "type": "number", - "x-example": -74.006 - }, - { - "description": "Search radius in miles, 1-100 (default 25)", - "in": "query", - "name": "radius", - "type": "integer", - "x-example": 25 + "type": "string", + "x-example": "job-123" }, { - "description": "Maximum stores to return, 1-50 (default 10)", + "description": "Signed event cursor", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "cursor", + "type": "string" }, { - "description": "Result offset for paging through total_in_radius (default 0)", + "description": "Page size from 1 through 100; default 50", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer" } ], "produces": [ @@ -444572,31 +460886,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Research job events", "schema": { - "$ref": "#/definitions/raisingcanes.nearbyResponseDoc" + "$ref": "#/definitions/researchjobs.researchEventsResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid page request or cursor", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Research job not found", "schema": { "$ref": "#/definitions/app.Response" } @@ -444607,27 +460915,24 @@ "ApiKeyAuth": [] } ], - "summary": "Find Raising Cane's stores near a coordinate, nearest first", + "summary": "Read research job events", "tags": [ - "Raising Cane's" + "Research Jobs" ] } }, - "/raisingcanes/promotion": { + "/research/jobs/{job_id}/results": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Raising Cane's promotion's published official terms: title and official-rules text (eligibility, prize details, effective date), exactly as the promotion's own page publishes them, as separate paragraphs in publication order. Promotion paths come from GET /raisingcanes/promotions entries. A path with no promotion at it (expired, mistyped, or the empty path some index entries carry) returns a 404.", - "operationId": "raisingcanes-promotion", + "description": "Returns the complete owner-scoped retained result prefix up to a consistent manifest sequence. Before a valid report or structured result exists, returns `ready=false` with `partial=true` and any retained evidence.", + "operationId": "research-results", "parameters": [ { - "description": "Promotion page slug from a /raisingcanes/promotions entry's path", - "in": "query", - "name": "path", + "description": "Research job ID", + "in": "path", + "name": "job_id", "required": true, "type": "string", - "x-example": "first-50-promotion" + "x-example": "job-123" } ], "produces": [ @@ -444635,31 +460940,19 @@ ], "responses": { "200": { - "description": "OK", + "description": "Research results or a partial result projection", "schema": { - "$ref": "#/definitions/raisingcanes.promotionResponseDoc" + "$ref": "#/definitions/researchjobs.researchResultsResponseDoc" } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "description": "Research job not found", "schema": { "$ref": "#/definitions/app.Response" } @@ -444670,19 +460963,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Raising Cane's promotion's terms", + "summary": "Read all retained research results", "tags": [ - "Raising Cane's" + "Research Jobs" ] } }, - "/raisingcanes/promotions": { + "/research/papers/metadata": { "get": { - "consumes": [ - "application/json" + "description": "Return paper records including titles, abstracts when available, authors, publication dates and verified identifier aliases. Europe PMC resolution is limited to MED-backed PMID, PMCID and DOI records; no full-text body is fetched.", + "operationId": "research-inspect-paper", + "parameters": [ + { + "description": "arXiv identifier, PMID, PMCID, DOI, Europe PMC primary ID or canonical paper ID", + "in": "query", + "maxLength": 4096, + "name": "paper_id", + "required": true, + "type": "string", + "x-example": "17299597" + } ], - "description": "Returns Raising Cane's full promotions index: every current and past sweepstakes, giveaway, and other promotion the site links to, grouped under Raising Cane's own category headings (e.g. \"Sweepstakes & Giveaways\", \"Lucky Promotions\", \"First Promotions\"). Each entry's path chains into GET /raisingcanes/promotion for that promotion's full official-rules text. Some entries carry an empty path -- Raising Cane's own index links a since-expired promotion back to the homepage rather than removing the entry; treat an empty path as no longer resolvable rather than a bug.", - "operationId": "raisingcanes-promotions", "produces": [ "application/json" ], @@ -444690,7 +460991,37 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/raisingcanes.promotionsResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/researchretrieval.PaperMetadataResponse" + } + }, + "type": "object" + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "402": { + "description": "Payment Required", + "schema": { + "$ref": "#/definitions/app.Response" } }, "404": { @@ -444705,6 +461036,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -444717,27 +461054,28 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Raising Cane's promotions index", + "summary": "Inspect paper metadata", "tags": [ - "Raising Cane's" + "Research" ] } }, - "/raisingcanes/store": { - "get": { + "/research/papers/read": { + "post": { "consumes": [ "application/json" ], - "description": "Returns one Raising Cane's store: name, full postal address, phone, coordinates, its general weekly hours plus separately published dine-in and drive-thru hours, Raising Cane's own per-store amenity labels (e.g. DRIVE_THRU, CURBSIDE_PICKUP), which pickup/delivery services it offers, and its Google Place id. Store paths come from GET /raisingcanes/directory entries whose is_store is true. Passing a directory path here returns a 404 rather than a hollow record.", - "operationId": "raisingcanes-store", + "description": "Return licensed Europe PMC body prose, question-ranked passages, byte locators, license and content provenance. Restricted or unavailable bodies return metadata-only availability; arXiv does not fetch PDFs. Full text costs 5 credits, metadata-only reads 1.", + "operationId": "research-read-paper", "parameters": [ { - "description": "Store path from a /raisingcanes/directory child with is_store true", - "in": "query", - "name": "path", + "description": "Paper read request", + "in": "body", + "name": "request", "required": true, - "type": "string", - "x-example": "la/gonzales/625-airline-hwy" + "schema": { + "$ref": "#/definitions/researchpapers.PaperReadRequest" + } } ], "produces": [ @@ -444747,7 +461085,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/raisingcanes.storeResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/researchretrieval.PaperReadResponse" + } + }, + "type": "object" + } + ] } }, "400": { @@ -444756,6 +461106,18 @@ "$ref": "#/definitions/app.Response" } }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "402": { + "description": "Payment Required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { @@ -444768,6 +461130,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -444780,24 +461148,28 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Raising Cane's store's detail", + "summary": "Read a research paper", "tags": [ - "Raising Cane's" + "Research" ] } }, - "/rappler/article": { - "get": { - "description": "Returns public Rappler article metadata and body paragraphs from a canonical article URL. Rappler+ member-tier stories are flagged with paywalled.", - "operationId": "rappler-article", + "/research/papers/related": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Return one-hop Europe PMC citation edges, canonical seed IDs, source provenance and a frozen owner-bound cursor. Modes are references and citers; intent is unsupported. Partial results explicitly report indexed-source and candidate-window limits.", + "operationId": "research-related-papers", "parameters": [ { - "description": "Canonical Rappler article URL", - "in": "query", - "name": "url", + "description": "Seed IDs and graph direction, or cursor and optional limit", + "in": "body", + "name": "request", "required": true, - "type": "string", - "x-example": "https://www.rappler.com/sports/tennis-alex-eala-tatiana-prozorova-singapore-open-september-24-2026/" + "schema": { + "$ref": "#/definitions/researchpapers.PaperRelatedRequest" + } } ], "produces": [ @@ -444807,7 +461179,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/researchretrieval.PaperRelatedResponse" + } + }, + "type": "object" + } + ] } }, "400": { @@ -444816,12 +461200,42 @@ "$ref": "#/definitions/app.Response" } }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "402": { + "description": "Payment Required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -444834,30 +461248,76 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rappler article content", + "summary": "Get paper references or citing papers", "tags": [ - "Rappler" + "Research" ] } }, - "/rappler/author": { + "/research/papers/search": { "get": { - "description": "Returns a Rappler author's profile, looked up by `slug` (for example `delfin-dioquino`) or by canonical `url`; exactly one is required. The response has the name, `bio`, `social_links` and the 10 most recent articles, each with title, URL, section and publication time. There is no further paging. `bio` and `social_links` are omitted when empty; an unknown author returns not-found.", - "operationId": "rappler-author", + "description": "Search arXiv papers with an owner-bound frozen result window and cursor-only continuation. When arXiv is rate limited or unavailable, an undated search is answered from OpenAlex's index of arXiv papers and the response says so in coverage and warnings.", + "operationId": "research-search-papers", "parameters": [ { - "description": "Author slug, e.g. delfin-dioquino", + "description": "Required for initial search; omit on cursor continuation", "in": "query", - "name": "slug", - "type": "string", - "x-example": "delfin-dioquino" + "maxLength": 1000, + "name": "q", + "type": "string" }, { - "description": "Canonical rappler.com/author// URL; alternative to slug", + "description": "Page size (1–50; default 10)", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.rappler.com/author/delfin-dioquino/" + "maximum": 50, + "minimum": 1, + "name": "limit", + "type": "integer" + }, + { + "collectionFormat": "multi", + "description": "Enabled paper sources", + "in": "query", + "items": { + "enum": [ + "arxiv" + ], + "type": "string" + }, + "name": "sources", + "type": "array" + }, + { + "collectionFormat": "multi", + "description": "Author names (up to five; 256 characters each)", + "in": "query", + "items": { + "type": "string" + }, + "maxLength": 256, + "name": "authors", + "type": "array" + }, + { + "description": "Inclusive publication date (YYYY-MM-DD)", + "format": "date", + "in": "query", + "name": "published_from", + "type": "string" + }, + { + "description": "Inclusive publication date (YYYY-MM-DD)", + "format": "date", + "in": "query", + "name": "published_to", + "type": "string" + }, + { + "description": "Owner-bound continuation cursor (cursor-only with optional limit)", + "in": "query", + "maxLength": 2048, + "name": "cursor", + "type": "string" } ], "produces": [ @@ -444867,7 +461327,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.rapplerAuthorResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/researchretrieval.PaperSearchResponse" + } + }, + "type": "object" + } + ] } }, "400": { @@ -444876,8 +461348,32 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "402": { + "description": "Payment Required", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -444894,203 +461390,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Rappler author profile", + "summary": "Search research papers", "tags": [ - "Rappler" + "Research" ] } }, - "/rappler/headlines": { + "/research/sources": { "get": { - "description": "Returns the latest Rappler stories for one section. `section` is required and takes one of the site's category slugs, such as `business`, `nation`, `entertainment`, `fact-check`, `investigative` or `climate-change`. Each item has its title, URL, summary, publication time and author, plus an image when the outlet provides one.", - "operationId": "rappler-headlines", - "parameters": [ - { - "description": "Rappler section slug", - "enum": [ - "about", - "awards-recognition", - "news-updates", - "policies", - "special-projects", - "team", - "brandrap", - "announcements", - "beyond-the-buy", - "communicart", - "data-stories", - "detours", - "finance-and-industries", - "first-look", - "food-drinks-dining", - "get-ready-with-me", - "goodrap", - "health-beauty-and-wellness", - "home-and-parenting", - "lifestyle-and-entertainment", - "profiles-and-advocacies", - "reading-book-recommendations", - "tech-and-innovation", - "travel-and-food", - "bulletin-board", - "advisories", - "campus", - "contests-awards", - "corrections", - "events", - "examination-results", - "philippine-government-job-openings", - "scholarships", - "trainings-workshops", - "business", - "consumer-issues", - "corporate", - "economy", - "industries", - "infrastructure", - "personal-finance", - "stocks-banking", - "culture-desk", - "astrology", - "careers", - "food-drinks", - "health-and-wellness", - "literature", - "noteworthy", - "relationships", - "style", - "travel", - "editors-pick", - "elections-philippines-stories", - "entertainment", - "celebrities", - "korean-popular-music", - "live-jam", - "movies", - "music", - "pageants", - "series", - "theater", - "environment", - "climate-change", - "disasters", - "nature", - "pollution", - "faith-religion", - "hustle", - "adulting", - "food", - "play", - "purpose", - "work", - "moveph", - "advocacies", - "agos", - "partners", - "social-good-summit", - "nation", - "newsbreak", - "data-documents", - "explainers", - "fact-check", - "in-depth", - "inside-track", - "investigative", - "iq", - "podcasts-videos", - "people", - "actors", - "artists", - "athletes", - "crimes", - "human-interest", - "neighbors", - "newsmakers", - "obituary", - "profiles", - "philippines", - "elections", - "government", - "luzon", - "metro-manila", - "mindanao", - "national-news", - "overseas-filipinos", - "rappler-talk", - "special-coverage", - "visayas", - "weather", - "plus-membership-program", - "exclusive-content", - "exclusive-events", - "science", - "discoveries-inventions", - "earth-space", - "life-health", - "society-culture", - "social-issues", - "sports", - "boxing", - "fiba", - "football", - "gilas-pilipinas", - "nba", - "ncaa", - "palarong-pambansa", - "pba", - "southeast-asian-games", - "uaap", - "volleyball", - "technology", - "apps", - "features", - "gadgets", - "gaming", - "innovations", - "internet-culture", - "reviews", - "social-media", - "the-wrap", - "top-stories", - "video", - "act-one", - "basagan-ng-trip", - "daily-wrap", - "documentaries", - "editorial", - "hold-the-line-maria-ressa-interview", - "rappler-live-jam", - "rappler-talk-video", - "reporters-vlogs", - "top-5-news-this-week", - "video-explainers", - "watch-now-live", - "voices", - "editorials", - "imho", - "ispeak", - "new-school", - "newsletters", - "rappler-blogs", - "thought-leaders", - "world", - "africa", - "asia-pacific", - "europe", - "global-affairs", - "indonesia", - "latin-america", - "middle-east", - "south-central-asia", - "us-canada" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "about" - } - ], + "description": "Return the stable authenticated paper source registry, including arXiv search and MED-backed Europe PMC metadata, licensed text and citation operations.", + "operationId": "research-sources", "produces": [ "application/json" ], @@ -445098,11 +461407,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/researchretrieval.PaperSourcesResponse" + } + }, + "type": "object" + } + ] } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "schema": { "$ref": "#/definitions/app.Response" } @@ -445119,16 +461440,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rappler section headlines", + "summary": "List paper sources", "tags": [ - "Rappler" + "Research" ] } }, - "/rappler/news": { + "/resy/availability": { "get": { - "description": "Returns the newest Rappler stories across all sections. Takes no parameters. Each item has its title, canonical article URL, a short summary, publication time, author byline and lead image.", - "operationId": "rappler-news", + "consumes": [ + "application/json" + ], + "description": "Returns the bookable reservation timeslots Resy currently shows for a restaurant, date, and party size -- the same read-only availability an anonymous visitor sees before signing in. The date is optional and defaults to the current date in UTC; the response echoes the date used. This is discovery only; it does not create, hold, modify, or cancel a reservation.", + "operationId": "resy-availability", + "parameters": [ + { + "description": "Resy restaurant id", + "in": "query", + "name": "restaurant_id", + "required": true, + "type": "string", + "x-example": "6194" + }, + { + "description": "Reservation date, YYYY-MM-DD. Defaults to the current date in UTC", + "in": "query", + "name": "date", + "type": "string", + "x-example": "2026-09-20" + }, + { + "description": "Party size, default 2", + "in": "query", + "name": "party_size", + "type": "integer", + "x-example": 2 + } + ], "produces": [ "application/json" ], @@ -445136,7 +461484,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/resy.availabilityResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -445151,50 +461517,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rappler top stories", + "summary": "Get a Resy restaurant's bookable reservation timeslots", "tags": [ - "Rappler" + "Resy" ] } }, - "/rappler/sections": { + "/resy/cuisines": { "get": { - "description": "Lists the 175 Rappler categories that have a live feed and are accepted by `rappler-headlines`, such as `news-updates`, `business`, `nation`, `fact-check` and `climate-change`. Each entry has a `slug`, a display `name` and the category `url`.", - "operationId": "rappler-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Rappler sections", - "tags": [ - "Rappler" - ] - } - }, - "/rawstory/article": { - "get": { - "description": "Returns a Raw Story article by canonical `url` on `rawstory.com`, for example `https://www.rawstory.com/trump-media-ban-2677933730/`: title, description, publication and update times, section, authors, image and body `paragraphs` (embedded videos excluded). `section` is omitted for slug-only URLs. Hub, tag and author URLs return an invalid-params error; a missing story returns not-found.", - "operationId": "rawstory-article", + "description": "Returns the cuisines present among restaurants in a Resy location. Location is a short city code or numeric location id -- both already returned inline as location_code on resy-search and resy-restaurant results; there is no separate closed list of every valid location on Resy's own API, so this value always comes from a prior search/restaurant response rather than a guessed input.", + "operationId": "resy-cuisines", "parameters": [ { - "description": "Canonical Raw Story article URL", + "description": "Resy location code or numeric id (from a prior resy-search/resy-restaurant response's location_code field)", "in": "query", - "name": "url", + "name": "location", "required": true, "type": "string", - "x-example": "https://www.rawstory.com/trump-media-ban-2677933730/" + "x-example": "ny" } ], "produces": [ @@ -445204,7 +461547,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/resy.cuisinesResponseDoc" } }, "400": { @@ -445213,8 +461556,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -445231,30 +461574,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get Raw Story article content", + "summary": "Get the cuisines present in a Resy location", "tags": [ - "Raw Story" + "Resy" ] } }, - "/rawstory/author": { + "/resy/event": { "get": { - "description": "Returns a Raw Story author's profile, looked up by `slug` (for example `bennitokelty`) or canonical `url`; exactly one is required. The response has the name, `bio`, avatar, social links and the 15 most recent stories, each with title, URL and a `YYYY-MM-DD` date. Older stories are not reachable, and an unknown author returns not-found.", - "operationId": "rawstory-author", + "consumes": [ + "application/json" + ], + "description": "Returns a ticketed dining event's full description, event-day instructions, and per-ticket-tier package breakdown (price, what's included, live ticket availability). All three identifiers come from a prior resy-events result: event_url_slug is that result's url_slug, restaurant_url_slug is its restaurant_url_slug, and location is the same city identifier resy-events was called with. Read-only discovery -- does not purchase a ticket.", + "operationId": "resy-event-detail", "parameters": [ { - "description": "Author slug, e.g. bennitokelty", + "description": "Event url_slug, from a prior resy-events result", "in": "query", - "name": "slug", + "name": "event_url_slug", + "required": true, "type": "string", - "x-example": "bennitokelty" + "x-example": "the-bonnie-brunch-citi-field-trip-2026-09-20-6" }, { - "description": "Canonical rawstory.com/u/ URL; alternative to slug", + "description": "Restaurant url_slug, from that same resy-events result's restaurant_url_slug", "in": "query", - "name": "url", + "name": "restaurant_url_slug", + "required": true, "type": "string", - "x-example": "https://www.rawstory.com/u/bennitokelty" + "x-example": "the-bonnie" + }, + { + "description": "Resy location code or numeric id, same value resy-events was called with", + "in": "query", + "name": "location", + "required": true, + "type": "string", + "x-example": "ny" + }, + { + "description": "Party size, default 2", + "in": "query", + "name": "party_size", + "type": "integer", + "x-example": 2 } ], "produces": [ @@ -445264,7 +461627,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.rawstoryAuthorResponseDoc" + "$ref": "#/definitions/resy.eventDetailResponseDoc" } }, "400": { @@ -445279,6 +461642,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -445291,41 +461660,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Raw Story author profile", + "summary": "Get a Resy ticketed dining event's full description and ticket packages", "tags": [ - "Raw Story" + "Resy" ] } }, - "/rawstory/headlines": { + "/resy/events": { "get": { - "description": "Returns the latest Raw Story stories, up to 30, for one section hub. `section` is required and takes one of 15 slugs such as `us-news`, `trump-news`, `world`, `commentary` or `supreme-court`. Each item has its title, URL, lead-paragraph summary, publication time, author and image when given. The dormant `presidential-campaign-issues` hub returns 9 stories.", - "operationId": "rawstory-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns ticketed dining events (fixed-price, fixed-capacity experiences a restaurant hosts and sells tickets for, distinct from a regular reservation) in a Resy location. Read-only discovery -- does not create, hold, or purchase a ticket.", + "operationId": "resy-events", "parameters": [ { - "description": "Raw Story section slug", - "enum": [ - "us-news", - "trump-news", - "world", - "enviro-science", - "all-video", - "raw-investigates", - "also-read", - "commentary", - "blogs-media", - "2026-midterm-elections-section", - "presidential-campaign-issues", - "smartnews", - "super-head", - "jd-vance", - "supreme-court" - ], + "description": "Resy location code or numeric id (from a prior resy-search/resy-restaurant response's location_code field)", "in": "query", - "name": "section", + "name": "location", "required": true, "type": "string", - "x-example": "us-news" + "x-example": "ny" + }, + { + "description": "Only return events starting on or after this date, YYYY-MM-DD; defaults to the next calendar day", + "in": "query", + "name": "date", + "type": "string", + "x-example": "2026-09-21" + }, + { + "description": "Max events returned, default 10", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Page past the first `limit` events, default 0", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -445335,7 +461711,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/resy.eventsResponseDoc" } }, "400": { @@ -445344,37 +461720,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Raw Story section headlines", - "tags": [ - "Raw Story" - ] - } - }, - "/rawstory/news": { - "get": { - "description": "Returns the 30 newest Raw Story stories across all sections. Takes no parameters. Each item has its title, story URL, a lead-paragraph summary capped at 500 characters, publication time, author byline and lead image.", - "operationId": "rawstory-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "503": { "description": "Service Unavailable", @@ -445388,83 +461738,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Raw Story top stories", - "tags": [ - "Raw Story" - ] - } - }, - "/rawstory/sections": { - "get": { - "description": "Lists the 15 section and topic hubs that `rawstory-headlines` accepts. Each entry has a `slug`, a display `name` such as `U.S. News` or `Raw Exclusives`, and the hub page `url`. Hubs overlap: `us-news`, `trump-news` and `smartnews` share most recent stories, and `presidential-campaign-issues` is dormant.", - "operationId": "rawstory-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Raw Story sections", - "tags": [ - "Raw Story" - ] - } - }, - "/ready": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns process readiness and lightweight dependency health. Dependency failures remain visible in the response but do not remove a serving pod from rotation. Root `/ready` returns the same payload as a compatibility alias, while `/ping` remains the lightweight liveness endpoint.", - "operationId": "ready", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/api.readinessResponseDoc" - } - } - }, - "summary": "Return API readiness", + "summary": "Get ticketed dining events in a Resy location", "tags": [ - "Meta" + "Resy" ] } }, - "/rebag/collections": { + "/resy/locations": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from Rebag (https://shop.rebag.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", - "operationId": "rebag-collections", + "description": "Returns Resy's full list of operating locations (cities), optionally filtered by a free-text substring and/or country. This is the discovery source for the location value used throughout the rest of this family (resy-search's/resy-restaurant's location_code, resy-cuisines'/resy-events'/resy-event-detail's location).", + "operationId": "resy-locations", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Case-insensitive substring match against a location's name, code, or url_slug", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "q", + "type": "string", + "x-example": "new york" }, { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Case-insensitive exact match against a location's country name", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "country", + "type": "string", + "x-example": "United States" } ], "produces": [ @@ -445474,17 +461774,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/resy.locationsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -445501,41 +461795,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Rebag collections", + "summary": "List Resy's operating locations (cities)", "tags": [ - "Rebag" + "Resy" ] } }, - "/rebag/collections/{handle}/products": { + "/resy/restaurant": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one Rebag (https://shop.rebag.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", - "operationId": "rebag-collection-products", + "description": "Returns a Resy restaurant's profile by the required `restaurant_id`: name, cuisine, `price_range` (1 to 4), rating, review count, address, neighborhood, coordinates, phone, website, menu URL, party size limits, description, `why_we_like_it`, `need_to_know` and images. `location_code` is a short city identifier.", + "operationId": "resy-restaurant", "parameters": [ { - "description": "Collection handle", - "in": "path", - "name": "handle", + "description": "Resy restaurant id", + "in": "query", + "name": "restaurant_id", "required": true, "type": "string", - "x-example": "collection-handle" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "6194" } ], "produces": [ @@ -445545,7 +461825,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/resy.restaurantResponseDoc" } }, "400": { @@ -445560,8 +461840,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -445578,33 +461858,63 @@ "ApiKeyAuth": [] } ], - "summary": "List Rebag collection products", + "summary": "Get a Resy restaurant's profile", "tags": [ - "Rebag" + "Resy" ] } }, - "/rebag/pages": { + "/resy/search": { "get": { "consumes": [ "application/json" ], - "description": "Lists the static pages on Rebag's storefront, paged with `page` (from 1) and `limit` (default 50, max 250). Each entry has `handle`, `title`, `url`, plain-text `content` and its dates. An empty page of results returns an empty `pages` array. In `ssr_embedded` mode only `handle`, `url` and `updated_at` are filled.", - "operationId": "rebag-pages", + "description": "Searches restaurants by free-text term (name, cuisine, or neighborhood) near a latitude/longitude, optionally including live bookable-timeslot availability for a given date and party size.", + "operationId": "resy-search", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Free-text search term (name, cuisine, or neighborhood)", "in": "query", - "name": "page", + "name": "term", + "type": "string", + "x-example": "carbone" + }, + { + "description": "Search center latitude", + "in": "query", + "name": "latitude", + "required": true, + "type": "number", + "x-example": 40.7128 + }, + { + "description": "Search center longitude", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": -74.006 + }, + { + "description": "Reservation date, YYYY-MM-DD; when set, results include live timeslots", + "in": "query", + "name": "date", + "type": "string", + "x-example": "2026-09-20" + }, + { + "description": "Party size, default 2", + "in": "query", + "name": "party_size", "type": "integer", - "x-example": 1 + "x-example": 2 }, { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Max results, default 10", "in": "query", - "name": "limit", + "name": "size", "type": "integer", - "x-example": 50 + "x-example": 10 } ], "produces": [ @@ -445614,7 +461924,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/resy.searchResponseDoc" } }, "400": { @@ -445623,8 +461933,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -445641,27 +461951,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Rebag static pages", + "summary": "Search Resy restaurants near a location", "tags": [ - "Rebag" + "Resy" ] } }, - "/rebag/pages/{handle}": { + "/retailmenot/autocomplete": { "get": { "consumes": [ "application/json" ], - "description": "Looks up a single Rebag static page by `handle`, for example `welcome-trendlee`. The response has the page's id, title, URL, publication and update times, and its `content` as plain text. Unknown handles return 404. If `transport_mode` is `ssr_embedded`, `id` is left out.", - "operationId": "rebag-page", + "description": "Returns RetailMeNot's search-box suggestions for a free-text term: matching stores (with domains usable with /retailmenot/store) and cash-back offers. Group names are returned as data.", + "operationId": "retailmenot-autocomplete", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", + "description": "Store or brand search term", + "in": "query", + "name": "term", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "nike" } ], "produces": [ @@ -445671,7 +461981,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/retailmenot.autocompleteResponseDoc" } }, "400": { @@ -445680,12 +461990,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -445704,35 +462008,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Rebag static page", + "summary": "Get RetailMeNot search suggestions", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/products": { + "/retailmenot/blog-categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from Rebag's (https://shop.rebag.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "rebag-products", - "parameters": [ - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - } - ], + "description": "Returns every category of RetailMeNot's shopping and savings blog with its slug, post count, description, and URL. Use a slug as the category filter of /retailmenot/blog-posts.", + "operationId": "retailmenot-blog-categories", "produces": [ "application/json" ], @@ -445740,13 +462028,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/retailmenot.blogCategoriesResponseDoc" } }, "429": { @@ -445767,27 +462049,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Rebag products", + "summary": "List RetailMeNot blog categories", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/products/{handle}": { + "/retailmenot/blog-post": { "get": { "consumes": [ "application/json" ], - "description": "Returns product detail for one Rebag (https://shop.rebag.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "rebag-product", + "description": "Returns one RetailMeNot blog post: metadata (title, author, dates, description, image, categories, tags), the article text as headed sections of paragraphs and lists, and the RetailMeNot stores and coupon categories the article links to (usable with /retailmenot/store and /retailmenot/category).", + "operationId": "retailmenot-blog-post", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Post slug from /retailmenot/blog-posts (a trailing .html is accepted)", + "in": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "black-friday-cyber-monday-restaurant-deals" } ], "produces": [ @@ -445797,7 +462079,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" + "$ref": "#/definitions/retailmenot.blogPostResponseDoc" } }, "400": { @@ -445830,45 +462112,78 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Rebag product", + "summary": "Get a RetailMeNot blog post", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/products/{handle}/recommendations": { + "/retailmenot/blog-posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns recommended products for one Rebag (https://shop.rebag.com) product handle. The storefront URL is fixed server-side.", - "operationId": "rebag-product-recommendations", + "description": "Returns one page of RetailMeNot blog posts (title, slug, URL, excerpt, description, author, published and modified dates, image, categories, and tags) with total and total pages, newest first by default. Filter by category slug, tag slug, and/or a search query; order by date, modified, title, or relevance (relevance requires query). A page past the end returns an empty list.", + "operationId": "retailmenot-blog-posts", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, + "description": "Search post text", + "in": "query", + "name": "query", "type": "string", - "x-example": "product-handle" + "x-example": "black friday" }, { - "description": "Maximum products, defaults to 10 and supports up to 20", + "description": "Category slug from /retailmenot/blog-categories", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "category", + "type": "string", + "x-example": "food" }, { - "description": "Recommendation intent. Allowed values: related, complementary", + "description": "Tag slug from /retailmenot/blog-tags", + "in": "query", + "name": "tag", + "type": "string", + "x-example": "black-friday" + }, + { + "default": "date", + "description": "Sort field", "enum": [ - "related", - "complementary" + "date", + "modified", + "title", + "relevance" ], "in": "query", - "name": "intent", - "type": "string", - "x-example": "related" + "name": "order_by", + "type": "string" + }, + { + "default": "desc", + "description": "Sort direction", + "enum": [ + "desc", + "asc" + ], + "in": "query", + "name": "order", + "type": "string" + }, + { + "default": 1, + "description": "Page number, starting at 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "default": 20, + "description": "Posts per page (1-100)", + "in": "query", + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -445878,7 +462193,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/retailmenot.blogPostsResponseDoc" } }, "400": { @@ -445911,53 +462226,40 @@ "ApiKeyAuth": [] } ], - "summary": "List Rebag product recommendations", + "summary": "List RetailMeNot blog posts", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/search": { + "/retailmenot/blog-tags": { "get": { "consumes": [ "application/json" ], - "description": "Returns ranked products from Rebag's (https://shop.rebag.com) own full-text product search, including a best-effort condition grade and colour derived from the product's own catalog tags -- attributes not available from the other catalog endpoints in this family. The storefront URL is fixed server-side.", - "operationId": "rebag-search", + "description": "Returns one page of RetailMeNot blog tags ordered by post count, with slug, name, post count, and URL, plus total and total pages; optionally only tags matching a query. Use a slug as the tag filter of /retailmenot/blog-posts.", + "operationId": "retailmenot-blog-tags", "parameters": [ { - "description": "Search query text", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "chanel" - }, - { - "description": "Sort order. Allowed values: relevance, price_asc, price_desc", - "enum": [ - "relevance", - "price_asc", - "price_desc" - ], + "description": "Match tag names", "in": "query", - "name": "sort", + "name": "query", "type": "string", - "x-example": "relevance" + "x-example": "black friday" }, { - "description": "1-based page, defaults to 1", + "default": 1, + "description": "Page number, starting at 1", "in": "query", "name": "page", - "type": "integer", - "x-example": 1 + "type": "integer" }, { - "description": "Maximum products, defaults to 20 and supports up to 50", + "default": 20, + "description": "Tags per page (1-100)", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -445967,7 +462269,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchResponseDoc" + "$ref": "#/definitions/retailmenot.blogTagsResponseDoc" } }, "400": { @@ -445994,43 +462296,60 @@ "ApiKeyAuth": [] } ], - "summary": "Search Rebag products", + "summary": "List RetailMeNot blog tags", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/search/suggest": { + "/retailmenot/cashback": { "get": { "consumes": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from Rebag's (https://shop.rebag.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "rebag-search-suggest", - "parameters": [ - { - "description": "Search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "wool" + "description": "Lists the offers on RetailMeNot's cash-back page, grouped into sections such as Today's Featured Cash Back, Top Cash Back and All Cash Back Offers. Each offer has its position, store name, domain and RetailMeNot URL, the cash-back rate in `discount`, and a title. It takes no parameters.", + "operationId": "retailmenot-cashback", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/retailmenot.cashBackResponseDoc" + } }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Maximum results per type, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "ApiKeyAuth": [] } ], + "summary": "List RetailMeNot cash-back offers", + "tags": [ + "RetailMeNot" + ] + } + }, + "/retailmenot/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Lists RetailMeNot's coupon category tree as a flat list with no parameters. Each entry has `name`, `slug`, `url` and `level` (1 parent, 2 child, 3 grandchild); levels 2 and 3 also carry `parent_slug`. The `slug` is what RetailMeNot's category endpoint takes.", + "operationId": "retailmenot-categories", "produces": [ "application/json" ], @@ -446038,13 +462357,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/retailmenot.categoriesResponseDoc" } }, "429": { @@ -446065,42 +462378,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rebag search suggestions", + "summary": "List RetailMeNot coupon categories", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/sitemap/urls": { + "/retailmenot/category": { "get": { "consumes": [ "application/json" ], - "description": "Lists URL entries from Rebag's sitemaps, filtered by `type` (`all`, `products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`; default `all`). Collection stops at `limit` entries (default 50, max 250). Each entry has `loc`, `type`, `handle`, `lastmod`, `changefreq` and, where present, `images` with caption, title and URL.", - "operationId": "rebag-sitemap-urls", + "description": "Returns one page of a RetailMeNot category landing page: the featured offers across stores (24 per page, with page and total_pages), offer counts, and similar stores. Use a slug from /retailmenot/categories; a page past the end returns an empty offer list.", + "operationId": "retailmenot-category", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", - "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" - ], + "description": "Category slug from /retailmenot/categories", "in": "query", - "name": "type", + "name": "slug", + "required": true, "type": "string", - "x-example": "products" + "x-example": "clothing" }, { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "default": 1, + "description": "Offer page (24 offers per page; see total_pages)", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "page", + "type": "integer" } ], "produces": [ @@ -446110,7 +462415,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/retailmenot.categoryResponseDoc" } }, "400": { @@ -446119,6 +462424,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -446137,19 +462448,29 @@ "ApiKeyAuth": [] } ], - "summary": "List Rebag sitemap URLs", + "summary": "Get a RetailMeNot category's offers", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/sitemaps": { + "/retailmenot/deal-event": { "get": { "consumes": [ "application/json" ], - "description": "Lists the child sitemaps in Rebag's sitemap index. Each entry has its `loc` and a `type` of `products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`, worked out from the sitemap URL. The endpoint takes no parameters.", - "operationId": "rebag-sitemaps", + "description": "Returns one seasonal deal event page's offers grouped into the page's sections (top deals and per-category sections). Use a slug from /retailmenot/deal-events.", + "operationId": "retailmenot-deal-event", + "parameters": [ + { + "description": "Event slug from /retailmenot/deal-events", + "in": "query", + "name": "slug", + "required": true, + "type": "string", + "x-example": "black-friday" + } + ], "produces": [ "application/json" ], @@ -446157,7 +462478,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/retailmenot.dealEventResponseDoc" } }, "400": { @@ -446166,6 +462487,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -446184,19 +462511,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Rebag sitemaps", + "summary": "Get a RetailMeNot deal event's offers", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/rebag/store": { + "/retailmenot/deal-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for Rebag (https://shop.rebag.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "rebag-store", + "description": "Lists the seasonal and holiday deal events linked from RetailMeNot's deals hub, such as Black Friday or Back-to-School, each with `name`, `slug` and `url`. The `slug` feeds the deal-event endpoint. Out-of-season events may list fewer offers. It takes no parameters.", + "operationId": "retailmenot-deal-events", "produces": [ "application/json" ], @@ -446204,13 +462531,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/retailmenot.dealEventsResponseDoc" } }, "429": { @@ -446231,29 +462552,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rebag store metadata", + "summary": "List RetailMeNot seasonal deal events", "tags": [ - "Rebag" + "RetailMeNot" ] } }, - "/reddit/archive/comments/ids": { + "/retailmenot/home": { "get": { "consumes": [ "application/json" ], - "description": "Looks up known Reddit comment ids in Arctic Shift's historical archive. Supply 1 to 1,000 comma-separated ids; duplicates are removed, results follow input order, and missing ids are listed separately. The service sends at most two upstream requests of up to 500 ids each. Archived scores are snapshots, and removed_by_category is included when available.", - "operationId": "reddit-archive-comments-ids", - "parameters": [ - { - "description": "Comma-separated Reddit comment ids (1-1,000); optional t1_ prefixes are accepted", - "in": "query", - "name": "ids", - "required": true, - "type": "string", - "x-example": "c60n05h,abc123" - } - ], + "description": "Returns RetailMeNot's homepage: featured offer sections (cash-back stores with rates, seasonal savings deals with store, offer type, discount, and title), today's top product deals (title, discount, image, and retailer product URL), and the help FAQ.", + "operationId": "retailmenot-home", "produces": [ "application/json" ], @@ -446261,13 +462572,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.archiveCommentsIDsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/retailmenot.homeResponseDoc" } }, "429": { @@ -446288,78 +462593,38 @@ "ApiKeyAuth": [] } ], - "summary": "Look up archived Reddit comments by ids", + "summary": "Get RetailMeNot's homepage offers", "tags": [ - "Reddit" + "RetailMeNot" ] } }, - "/reddit/archive/comments/search": { + "/retailmenot/store": { "get": { "consumes": [ "application/json" ], - "description": "Searches Arctic Shift's public historical comment archive. Supply at least one of query, author, subreddit, link_id, or parent_id; date bounds can further narrow that search. query searches comment body text and must be combined with author, subreddit, link_id, or parent_id; it maps to Arctic Shift's body parameter. Arctic Shift may time out or throttle broad searches, which return 503 with Retry-After. created_after/created_before are time boundaries, not Reddit listing cursors. Each comment includes created_utc and retrieved_on; archived scores can lag changes for roughly 36 hours. A valid query with no matches returns an empty comments array.", - "operationId": "reddit-archive-comments-search", + "description": "Returns a store's RetailMeNot page: store details, shopper rating, category, offer counts, every listed coupon, sale, cash-back, and in-store offer (including the offers behind the page's \"show more\" button), similar stores, and FAQs. Coupon codes are only revealed on RetailMeNot after a click and are not returned. Set market=ca for a RetailMeNot Canada store page.", + "operationId": "retailmenot-store", "parameters": [ { - "description": "Public Reddit username filter", - "in": "query", - "name": "author", - "type": "string" - }, - { - "description": "Subreddit name filter", - "in": "query", - "name": "subreddit", - "type": "string" - }, - { - "description": "Full-text search within comment bodies; requires author, subreddit, link_id, or parent_id", - "in": "query", - "name": "query", - "type": "string" - }, - { - "description": "Reddit post id to scope comments", - "in": "query", - "name": "link_id", - "type": "string" - }, - { - "description": "Parent comment id; an explicitly empty value selects top-level comments", - "in": "query", - "name": "parent_id", - "type": "string" - }, - { - "description": "Creation-time lower bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", - "in": "query", - "name": "created_after", - "type": "string" - }, - { - "description": "Creation-time upper bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", + "description": "Store domain or RetailMeNot store URL", "in": "query", - "name": "created_before", - "type": "string" + "name": "domain", + "required": true, + "type": "string", + "x-example": "target.com" }, { - "default": "desc", - "description": "Sort by creation time", + "default": "us", + "description": "us for RetailMeNot, ca for RetailMeNot Canada (stores from /retailmenot/stores with market=ca)", "enum": [ - "asc", - "desc" + "us", + "ca" ], "in": "query", - "name": "sort", + "name": "market", "type": "string" - }, - { - "description": "Maximum comments, defaults to 25 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" } ], "produces": [ @@ -446369,7 +462634,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.archiveCommentsSearchResponseDoc" + "$ref": "#/definitions/retailmenot.storeResponseDoc" } }, "400": { @@ -446378,6 +462643,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -446396,51 +462667,67 @@ "ApiKeyAuth": [] } ], - "summary": "Search archived Reddit comments", + "summary": "Get a RetailMeNot store's coupons and offers", "tags": [ - "Reddit" + "RetailMeNot" ] } }, - "/reddit/archive/comments/{id}/tree": { + "/retailmenot/stores": { "get": { "consumes": [ "application/json" ], - "description": "Returns a bounded nested comment tree from Arctic Shift's public archive. `t1` entries contain comments and their replies; `more` entries mark collapsed branches and include child ids/counts. Omitted parent_id requests the whole tree, while an explicitly empty parent_id requests top-level comments only. Empty archived trees return 200 with an empty comments array. Archived scores can lag changes for roughly 36 hours; slow or throttled upstream requests return 503 with Retry-After.", - "operationId": "reddit-archive-comments-tree", + "description": "Returns every store in one letter of RetailMeNot's A-Z store directory, or of RetailMeNot Canada's store list with market=ca, with the domain to pass to /retailmenot/store (with the same market).", + "operationId": "retailmenot-stores", "parameters": [ { - "description": "Reddit post id or t3_ id", - "in": "path", - "name": "id", + "description": "Directory letter", + "enum": [ + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "0-9" + ], + "in": "query", + "name": "letter", "required": true, "type": "string", - "x-example": "7cff0b" + "x-example": "a" }, { - "description": "Parent comment id; an explicitly empty value selects top-level comments", + "default": "us", + "description": "us for RetailMeNot, ca for RetailMeNot Canada", + "enum": [ + "us", + "ca" + ], "in": "query", - "name": "parent_id", + "name": "market", "type": "string" - }, - { - "description": "Maximum archive comment nodes to expand, defaults to 50 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Initial breadth, defaults to 2 and must be between 0 and 8", - "in": "query", - "name": "start_breadth", - "type": "integer" - }, - { - "description": "Initial depth, defaults to 3 and must be between 0 and 8", - "in": "query", - "name": "start_depth", - "type": "integer" } ], "produces": [ @@ -446450,7 +462737,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.archiveCommentsTreeResponseDoc" + "$ref": "#/definitions/retailmenot.storesResponseDoc" } }, "400": { @@ -446459,12 +462746,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -446483,27 +462764,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get an archived Reddit comment tree", + "summary": "List RetailMeNot stores by letter", "tags": [ - "Reddit" + "RetailMeNot" ] } }, - "/reddit/archive/posts/ids": { + "/reuters/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Looks up known Reddit post ids in Arctic Shift's historical archive. Supply 1 to 1,000 comma-separated ids; duplicates are removed, results follow input order, and missing ids are listed separately. The service sends at most two upstream requests of up to 500 ids each. Archived scores and comment counts are snapshots, and removed_by_category is included when available.", - "operationId": "reddit-archive-posts-ids", + "description": "Returns one normal Reuters article's public metadata and body paragraphs from a canonical article URL. Live blogs, video and podcast pages, and subscriber-only or bot-challenged responses are not supported.", + "operationId": "reuters-article", "parameters": [ { - "description": "Comma-separated Reddit post ids (1-1,000); optional t3_ prefixes are accepted", + "description": "Canonical Reuters article URL", "in": "query", - "name": "ids", + "name": "url", "required": true, "type": "string", - "x-example": "1wwa2ff,z1c9z" + "x-example": "https://www.reuters.com/world/china/us-denmark-close-greenland-deal-sources-say-2026-09-18/" } ], "produces": [ @@ -446513,7 +462791,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.archivePostsIDsResponseDoc" + "$ref": "#/definitions/reuters.articleResponseDoc" } }, "400": { @@ -446522,6 +462800,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -446540,77 +462824,23 @@ "ApiKeyAuth": [] } ], - "summary": "Look up archived Reddit posts by ids", + "summary": "Get a Reuters article's content", "tags": [ - "Reddit" + "Reuters" ] } }, - "/reddit/archive/posts/search": { + "/reuters/articles": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Arctic Shift's public historical post archive. Supply at least one of query, author, subreddit, or url; date bounds can further narrow that search. This is separate from the live Reddit search endpoint. created_after/created_before are time boundaries, not Reddit listing cursors; posts include created_utc and retrieved_on so callers can see when the archive captured each record. Archived scores and comment counts can lag changes for roughly 36 hours. A valid query with no matches returns an empty posts array. Slow or throttled upstream searches return 503 with Retry-After.", - "operationId": "reddit-archive-posts-search", + "description": "Returns a page of recent Reuters articles: canonical URL, update time, and the lead image URL when available, plus the title when Reuters publishes one in this index (currently it does not). The index covers the most recent 10,000 articles. Use /reuters/news for a title-bearing feed of fresh stories, or /reuters/article for one article's title and text.", + "operationId": "reuters-articles", "parameters": [ { - "description": "Text search across archived post titles and selftext", - "in": "query", - "name": "query", - "type": "string" - }, - { - "description": "Public Reddit username filter", - "in": "query", - "name": "author", - "type": "string" - }, - { - "description": "Subreddit name filter", - "in": "query", - "name": "subreddit", - "type": "string" - }, - { - "description": "Linked URL prefix filter", - "in": "query", - "name": "url", - "type": "string" - }, - { - "description": "Require an exact URL match; requires url", - "in": "query", - "name": "url_exact", - "type": "boolean" - }, - { - "description": "Creation-time lower bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", - "in": "query", - "name": "created_after", - "type": "string" - }, - { - "description": "Creation-time upper bound; accepts epoch seconds or milliseconds, ISO 8601 dates, or relative offsets such as 1year, 2d, or 5min", - "in": "query", - "name": "created_before", - "type": "string" - }, - { - "default": "desc", - "description": "Sort by creation time", - "enum": [ - "asc", - "desc" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Maximum posts, defaults to 25 and clamps to 100", + "description": "Results page, 100 items per page", "in": "query", - "name": "limit", + "maximum": 100, + "minimum": 1, + "name": "page", "type": "integer" } ], @@ -446621,7 +462851,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.archivePostsSearchResponseDoc" + "$ref": "#/definitions/reuters.articlesResponseDoc" } }, "400": { @@ -446630,6 +462860,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -446648,74 +462884,24 @@ "ApiKeyAuth": [] } ], - "summary": "Search archived Reddit posts", + "summary": "Get recent Reuters articles", "tags": [ - "Reddit" + "Reuters" ] } }, - "/reddit/archive/subreddits/search": { + "/reuters/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Arctic Shift's native subreddit directory by name prefix. Directory metadata is updated infrequently; subscriber counts are archived snapshots and retrieved_on indicates when the source captured the entry. The selectable fields are limited to the verified public directory fields.", - "operationId": "reddit-archive-subreddits-search", + "description": "Returns a Reuters author's profile by canonical `url` (`https://www.reuters.com/authors//`): name, company, editorial email, social accounts, profile image, `total_articles` and the first 20 recent articles, each with title, URL, summary, publication time and an image when the story card has one. Accounts the page does not list are absent.", + "operationId": "reuters-author", "parameters": [ { - "description": "Subreddit name prefix, with or without r/", + "description": "Canonical Reuters author URL", "in": "query", - "name": "query", + "name": "url", "required": true, "type": "string", - "x-example": "OpenAI" - }, - { - "description": "Minimum archived subscriber count", - "in": "query", - "name": "min_subscribers", - "type": "integer" - }, - { - "description": "Maximum archived subscriber count", - "in": "query", - "name": "max_subscribers", - "type": "integer" - }, - { - "description": "Filter by archived NSFW status", - "in": "query", - "name": "over_18", - "type": "boolean" - }, - { - "default": "subscribers", - "description": "Sort field", - "enum": [ - "created_utc", - "subscribers", - "subreddit" - ], - "in": "query", - "name": "sort_by", - "type": "string" - }, - { - "default": "desc", - "description": "Sort direction", - "enum": [ - "asc", - "desc" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Maximum subreddits, defaults to 25 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "https://www.reuters.com/authors/aditya-kalra/" } ], "produces": [ @@ -446725,7 +462911,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.archiveSubredditsSearchResponseDoc" + "$ref": "#/definitions/reuters.authorResponseDoc" } }, "400": { @@ -446734,8 +462920,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -446752,76 +462938,24 @@ "ApiKeyAuth": [] } ], - "summary": "Search Reddit's archived subreddit directory", + "summary": "Get a Reuters author profile", "tags": [ - "Reddit" + "Reuters" ] } }, - "/reddit/archive/time-series": { + "/reuters/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Arctic Shift's native time-series values. Supply an absolute creation-time range and a precision; ranges that could exceed 1,000 points are rejected. Counts, score sums, and retrieval-delay sums are archive metrics, not current Reddit totals. Arctic Shift says time-series data may be approximate and take hours or days to update.", - "operationId": "reddit-archive-time-series", + "description": "Returns fresh Reuters headlines with title, canonical URL, publication and update times, and the lead image when Reuters publishes one. Covers the most recent stories from Reuters' public news feed.", + "operationId": "reuters-news", "parameters": [ { - "description": "Archive metric", - "enum": [ - "posts_count", - "comments_count", - "posts_score_sum", - "comments_score_sum", - "posts_retrieval_delay_seconds_sum", - "comments_retrieval_delay_seconds_sum", - "subreddit_subscribers" - ], - "in": "query", - "name": "metric", - "required": true, - "type": "string", - "x-example": "posts_count" - }, - { - "description": "Optional subreddit scope; required for subreddit_subscribers, and unsupported for retrieval-delay metrics", - "in": "query", - "name": "subreddit", - "type": "string", - "x-example": "OpenAI" - }, - { - "description": "Time bucket precision", - "enum": [ - "year", - "quarter", - "month", - "week", - "day", - "hour", - "minute" - ], - "in": "query", - "name": "precision", - "required": true, - "type": "string", - "x-example": "year" - }, - { - "description": "Absolute start time: epoch seconds/milliseconds or ISO 8601", - "in": "query", - "name": "created_after", - "required": true, - "type": "string", - "x-example": "2024-01-01" - }, - { - "description": "Absolute end time: epoch seconds/milliseconds or ISO 8601", + "description": "Results page, 50 items per page", "in": "query", - "name": "created_before", - "required": true, - "type": "string", - "x-example": "2025-01-01" + "maximum": 60, + "minimum": 1, + "name": "page", + "type": "integer" } ], "produces": [ @@ -446831,7 +462965,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.archiveTimeSeriesResponseDoc" + "$ref": "#/definitions/reuters.newsResponseDoc" } }, "400": { @@ -446840,6 +462974,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -446858,62 +462998,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get historical Reddit archive time series", + "summary": "Get fresh Reuters headlines", "tags": [ - "Reddit" + "Reuters" ] } }, - "/reddit/comments/{id}": { + "/reuters/section": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Reddit post with its public comments. The default mode is 1 credit. Set `include_metrics=true` to return the comments with public net score and award count plus post engagement metrics for 3 credits. Large threads may expose only an initial comment subset. Reddit does not expose per-comment upvote ratios or exact upvote/downvote totals anonymously. A post that exists but has no comments yet returns a 200 response with an empty comments list; a post that does not exist returns 404, and a temporary block or upstream failure returns 503 (retryable) rather than 404. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-comments", + "description": "Returns a page of one top-level Reuters section's recent articles: canonical URL, update time, lead image URL, and image caption. This feed does not publish titles; use /reuters/news for a title-bearing feed of fresh stories.", + "operationId": "reuters-section", "parameters": [ { - "description": "Reddit post id or t3_ id", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "1tka90t" - }, - { - "default": "confidence", - "description": "Comment order: confidence, top, new, controversial, old, or qa. Applied to the anonymous HTML request when metrics are enabled.", + "description": "Top-level Reuters section", "enum": [ - "confidence", - "top", - "new", - "controversial", - "old", - "qa" + "world", + "business", + "markets", + "technology", + "sports", + "legal", + "sustainability", + "commentary", + "lifestyle", + "science", + "live", + "podcasts", + "media-center", + "investigations", + "fact-check", + "wider-image", + "city-memo", + "data", + "video" ], "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Maximum comments returned, defaults to 25 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" + "name": "section", + "required": true, + "type": "string", + "x-example": "world" }, { - "default": 3, - "description": "Maximum flat comment depth returned in metrics mode.", + "description": "Results page, 100 items per page", "in": "query", - "name": "depth", + "maximum": 50, + "minimum": 1, + "name": "page", "type": "integer" - }, - { - "default": false, - "description": "Include public post and per-comment engagement metrics; costs 3 credits instead of 1", - "in": "query", - "name": "include_metrics", - "type": "boolean" } ], "produces": [ @@ -446923,7 +463054,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.commentsResponseDoc" + "$ref": "#/definitions/reuters.sectionResponseDoc" } }, "400": { @@ -446956,68 +463087,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Reddit post comments", + "summary": "Get recent articles in a Reuters section", "tags": [ - "Reddit" + "Reuters" ] } }, - "/reddit/domain/{domain}/posts": { + "/reuters/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns public posts submitted from a linked domain. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-domain-posts", - "parameters": [ - { - "description": "Domain hostname, without scheme or path", - "in": "path", - "name": "domain", - "required": true, - "type": "string", - "x-example": "openai.com" - }, - { - "default": "hot", - "description": "Sort: hot, new, top, or rising", - "enum": [ - "hot", - "new", - "top", - "rising" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Time window for top sort: hour, day, week, month, year, or all", - "enum": [ - "hour", - "day", - "week", - "month", - "year", - "all" - ], - "in": "query", - "name": "time", - "type": "string" - }, - { - "description": "Maximum posts, defaults to 25 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Reddit pagination token", - "in": "query", - "name": "after", - "type": "string" - } - ], + "description": "Lists the top-level Reuters sections accepted by the `section` parameter of `/reuters/section`, returned under `items`. Each entry has a `slug`, a display `name` and the landing-page `url`. Takes no parameters.", + "operationId": "reuters-sections", "produces": [ "application/json" ], @@ -447025,7 +463104,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.domainPostsResponseDoc" + "$ref": "#/definitions/reuters.sectionsResponseDoc" } }, "400": { @@ -447034,12 +463113,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -447058,88 +463131,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Reddit domain posts", + "summary": "List Reuters sections", "tags": [ - "Reddit" + "Reuters" ] } }, - "/reddit/leads": { + "/reverb/categories": { "get": { "consumes": [ "application/json" ], - "description": "Scans a Reddit search page for people actively asking for a product or service, scores each post 0-10 for buying intent, and returns them ranked highest-first with the signals that fired. Self-promotion, hiring posts, freelancer service adverts, revenue-milestone posts, duplicate reposts, and Title Case article headlines are filtered out before scoring. A deterministic prefilter always runs; when `classifier` resolves to `llm` the surviving candidates are additionally refined in one batched model call. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. The lead-response fields and credit weights are preserved regardless of the underlying Reddit data source.", - "operationId": "reddit-leads", - "parameters": [ - { - "description": "What you offer, in plain language", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "crm for small teams" - }, - { - "description": "Restrict the search to a subreddit name, without r/", - "in": "query", - "name": "subreddit", - "type": "string" - }, - { - "default": "relevance", - "description": "Sort: relevance, hot, new, top, or comments", - "enum": [ - "relevance", - "hot", - "new", - "top", - "comments" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": "month", - "description": "Time window: hour, day, week, month, year, or all", - "enum": [ - "hour", - "day", - "week", - "month", - "year", - "all" - ], - "in": "query", - "name": "time", - "type": "string" - }, - { - "description": "Maximum leads returned, defaults to 25 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Minimum buying-intent score to return, 0-10, defaults to 4", - "in": "query", - "name": "min_score", - "type": "integer" - }, - { - "default": "auto", - "description": "Classifier: auto uses the model when configured, heuristic skips it, llm requires it", - "enum": [ - "auto", - "heuristic", - "llm" - ], - "in": "query", - "name": "classifier", - "type": "string" - } - ], + "description": "Returns Reverb's full category/product-type taxonomy -- the value space reverb-search's own category/product_type parameters accept. product_types is a fixed, exhaustive 14-value closed set; categories is the full, exhaustive leaf-category value space as of the request (306 values as of 2026-10-15). A leaf category's slug is NOT always globally unique across product types -- always pass a category's own product_type field alongside its slug to reverb-search, not category alone, when disambiguation matters.", + "operationId": "reverb-categories", "produces": [ "application/json" ], @@ -447147,19 +463151,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.leadsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/reverb.categoriesResponseDoc" } }, "429": { @@ -447180,34 +463172,27 @@ "ApiKeyAuth": [] } ], - "summary": "Find Reddit buying-intent leads", + "summary": "List Reverb's category/product-type taxonomy", "tags": [ - "Reddit" + "Reverb" ] } }, - "/reddit/post/{id}": { + "/reverb/listing": { "get": { "consumes": [ "application/json" ], - "description": "Returns a public Reddit post. The default mode is 1 credit. Set `include_metrics=true` to return public net score, upvote ratio, comment count, award count, and estimated upvote/downvote totals for 3 credits. Reddit fuzzes voting data, so estimates are approximate; share, repost/crosspost, and view counts are not exposed anonymously. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-post", + "description": "Returns full listing-detail data for one Reverb listing: description, every photo, shipping/payment/return policies, and the seller's shop reputation -- richer than the flattened summary reverb-search returns per listing. id is the listing's numeric id, from a search result's own listings[].id field.", + "operationId": "reverb-listing", "parameters": [ { - "description": "Reddit post id or t3_ id", - "in": "path", + "description": "Listing id, from a search result's own listings[].id field", + "in": "query", "name": "id", "required": true, - "type": "string", - "x-example": "1v8hy3q" - }, - { - "default": false, - "description": "Include public engagement metrics; costs 3 credits instead of 1", - "in": "query", - "name": "include_metrics", - "type": "boolean" + "type": "integer", + "x-example": 36356670 } ], "produces": [ @@ -447217,7 +463202,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.postResponseDoc" + "$ref": "#/definitions/reverb.listingResponseDoc" } }, "400": { @@ -447250,73 +463235,109 @@ "ApiKeyAuth": [] } ], - "summary": "Get Reddit post", + "summary": "Get a Reverb listing", "tags": [ - "Reddit" + "Reverb" ] } }, - "/reddit/search": { + "/reverb/makes": { "get": { "consumes": [ "application/json" ], - "description": "Searches public Reddit content and returns public post entries. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-search", + "description": "Returns Reverb's full manufacturer/make list -- the value space reverb-search's own make parameter accepts (2,795 values as of 2026-10-15). Does not include a model list -- Reverb's own /api/listings silently ignores a model filter value, so reverb-search has no Model parameter and a model list would have no corresponding filter to use it with.", + "operationId": "reverb-makes", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/reverb.makesResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List Reverb's manufacturer/make list", + "tags": [ + "Reverb" + ] + } + }, + "/reverb/price-guide": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one gear model's Reverb Price Guide detail: its specific finish/year variants, monthly average sale-price history, and a page of individual recent sales. slug is the model's slug, from reverb-price-guide-search's own models[].slug field. canonical_product_id optionally scopes to one specific variant from this model's own canonical_products[].id field (from a prior call without it); omitting it aggregates price history and recent sales across every variant, a broader, more heavily-sampled view. condition optionally scopes by Reverb's own Price Guide condition scale (listed below) -- a separate, 6-value enum from reverb-search's own listing condition field. range selects how far back the price history/recent-sales window looks. An unknown slug returns a typed not-found error.", + "operationId": "reverb-price-guide", "parameters": [ { - "description": "Search keywords", + "description": "Model slug, from reverb-price-guide-search's own models[].slug field", "in": "query", - "name": "q", + "name": "slug", "required": true, "type": "string", - "x-example": "gpt" + "x-example": "fender-american-professional-ii-stratocaster" }, { - "description": "Restrict search to a subreddit name, without r/", + "description": "Specific finish/year variant id, from this model's own canonical_products[].id field", "in": "query", - "name": "subreddit", - "type": "string" + "name": "canonical_product_id", + "type": "string", + "x-example": "320883" }, { - "default": "relevance", - "description": "Sort: relevance, hot, new, top, or comments", + "description": "Price Guide condition filter", "enum": [ - "relevance", - "hot", - "new", - "top", - "comments" + "mint", + "excellent", + "very-good", + "good", + "fair", + "poor" ], "in": "query", - "name": "sort", - "type": "string" + "name": "condition", + "type": "string", + "x-example": "excellent" }, { - "description": "Time window for top/comments sorts: hour, day, week, month, year, or all", + "description": "Date-range window, defaults to years_1", "enum": [ - "hour", - "day", - "week", - "month", - "year", - "all" + "months_6", + "years_1", + "years_2" ], "in": "query", - "name": "time", - "type": "string" + "name": "range", + "type": "string", + "x-example": "years_1" }, { - "description": "Maximum posts, defaults to 25 and clamps to 100", + "description": "Recent sales to return, defaults to 24, maximum 100", "in": "query", "name": "limit", - "type": "integer" - }, - { - "description": "Reddit pagination token", - "in": "query", - "name": "after", - "type": "string" + "type": "integer", + "x-example": 24 } ], "produces": [ @@ -447326,7 +463347,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.searchResponseDoc" + "$ref": "#/definitions/reverb.priceGuideResponseDoc" } }, "400": { @@ -447359,33 +463380,34 @@ "ApiKeyAuth": [] } ], - "summary": "Search Reddit posts", + "summary": "Get a gear model's Reverb Price Guide detail", "tags": [ - "Reddit" + "Reverb" ] } }, - "/reddit/subreddit/{subreddit}/about": { + "/reverb/price-guide-search": { "get": { "consumes": [ "application/json" ], - "description": "Returns public metadata and sample posts for a subreddit. Subscriber counts, icons, and banners are omitted because they are not available on anonymous Reddit pages. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-subreddit-about", + "description": "Searches Reverb's Price Guide (reverb.com/price-guide) for gear models by free-text brand/model query (e.g. \"fender stratocaster\"). Each result's slug is the value reverb-price-guide's own slug parameter accepts. query is full-text relevance search, not an exact match -- unlike reverb-search's own query, a nonsensical query is not guaranteed to return an empty result; the upstream can fall back to loosely related or generically popular models instead, so a low result count should be treated cautiously rather than read as \"no real matches.\"", + "operationId": "reverb-price-guide-search", "parameters": [ { - "description": "Subreddit name, without r/", - "in": "path", - "name": "subreddit", + "description": "Free-text brand/model search query", + "in": "query", + "name": "query", "required": true, "type": "string", - "x-example": "OpenAI" + "x-example": "fender stratocaster" }, { - "description": "Maximum sample posts inspected, defaults to 25 and clamps to 100", + "description": "Results to return, defaults to 24, maximum 100", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 24 } ], "produces": [ @@ -447395,7 +463417,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.subredditAboutResponseDoc" + "$ref": "#/definitions/reverb.priceGuideSearchResponseDoc" } }, "400": { @@ -447404,12 +463426,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -447428,39 +463444,91 @@ "ApiKeyAuth": [] } ], - "summary": "Get Reddit subreddit metadata", + "summary": "Search Reverb's Price Guide model catalog", "tags": [ - "Reddit" + "Reverb" ] } }, - "/reddit/subreddit/{subreddit}/comments": { + "/reverb/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns flat public comment entries from a subreddit latest-comments feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-subreddit-comments", + "description": "Searches or browses Reverb's (reverb.com) marketplace for new and used musical instruments and gear. query, category, product_type, make, min_price, and max_price are all optional and combine as an AND -- a free-text query can be combined with category/product_type/make/price filters in the same request, or every field can be omitted to browse the full active catalog. category accepts a leaf slug from reverb-categories' own categories[].slug field; product_type is a fixed, closed 14-value enum (listed below) that should be passed together with category from the SAME reverb-categories entry, since a category slug alone is not always globally unique (e.g. \"cables\" exists under both Accessories and Home Audio). An unrecognized category value is silently ignored by the upstream (returns the unfiltered catalog, not zero results or an error) -- a known upstream quirk. make accepts a manufacturer name from reverb-makes' own makes[] field and is a confirmed, real filter. A query with genuinely zero matches returns a well-formed empty result rather than an error.", + "operationId": "reverb-search", "parameters": [ { - "description": "Subreddit name, without r/", - "in": "path", - "name": "subreddit", - "required": true, + "description": "Free-text search query", + "in": "query", + "name": "query", "type": "string", - "x-example": "OpenAI" + "x-example": "fender stratocaster" }, { - "description": "Maximum comments, defaults to 25 and clamps to 100", + "description": "Category facet filter, from reverb-categories' own categories[].slug field -- pass together with product_type from the same entry", "in": "query", - "name": "limit", - "type": "integer" + "name": "category", + "type": "string", + "x-example": "amp-covers" }, { - "description": "Reddit pagination token", + "description": "Product-type filter", + "enum": [ + "accessories", + "acoustic-guitars", + "amps", + "band-and-orchestra", + "bass-guitars", + "dj-and-lighting-gear", + "drums-and-percussion", + "effects-and-pedals", + "electric-guitars", + "folk-instruments", + "home-audio", + "keyboards-and-synths", + "parts", + "pro-audio" + ], "in": "query", - "name": "after", - "type": "string" + "name": "product_type", + "type": "string", + "x-example": "accessories" + }, + { + "description": "Manufacturer name filter, from reverb-makes' own makes[] field", + "in": "query", + "name": "make", + "type": "string", + "x-example": "Fender" + }, + { + "description": "Minimum price (inclusive), in USD", + "in": "query", + "name": "min_price", + "type": "number", + "x-example": 50 + }, + { + "description": "Maximum price (inclusive), in USD", + "in": "query", + "name": "max_price", + "type": "number", + "x-example": 500 + }, + { + "description": "One-based page number, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Results per page, defaults to 24, maximum 50 (the upstream's own silent cap)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 24 } ], "produces": [ @@ -447470,7 +463538,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.subredditCommentsResponseDoc" + "$ref": "#/definitions/reverb.searchResponseDoc" } }, "400": { @@ -447479,12 +463547,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -447503,66 +463565,48 @@ "ApiKeyAuth": [] } ], - "summary": "List Reddit subreddit comments", + "summary": "Search or browse Reverb musical-instrument listings", "tags": [ - "Reddit" + "Reverb" ] } }, - "/reddit/subreddit/{subreddit}/posts": { + "/reverb/shop": { "get": { "consumes": [ "application/json" ], - "description": "Returns public posts from a subreddit. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-subreddit-posts", + "description": "Returns a Reverb shop's public profile plus a page of its current active listings (Reverb's own \"shop\" view of a seller). slug is the shop's slug, from a listing's own shop link or reverb.com/shop/{slug}. query is an optional free-text filter scoping the listings sub-page to a keyword within that shop. An unknown slug returns a typed not-found error.", + "operationId": "reverb-shop", "parameters": [ { - "description": "Subreddit name, without r/", - "in": "path", - "name": "subreddit", + "description": "Shop slug", + "in": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "OpenAI" + "x-example": "mtsmusic" }, { - "default": "hot", - "description": "Sort: hot, new, top, or rising", - "enum": [ - "hot", - "new", - "top", - "rising" - ], + "description": "Free-text filter scoping the shop's own listings sub-page", "in": "query", - "name": "sort", - "type": "string" + "name": "query", + "type": "string", + "x-example": "pickup" }, { - "description": "Time window for top sort: hour, day, week, month, year, or all", - "enum": [ - "hour", - "day", - "week", - "month", - "year", - "all" - ], + "description": "One-based page number for the shop's listings, defaults to 1", "in": "query", - "name": "time", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Maximum posts, defaults to 25 and clamps to 100", + "description": "Listings per page, defaults to 24, maximum 50", "in": "query", "name": "limit", - "type": "integer" - }, - { - "description": "Reddit pagination token", - "in": "query", - "name": "after", - "type": "string" + "type": "integer", + "x-example": 24 } ], "produces": [ @@ -447572,7 +463616,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.subredditPostsResponseDoc" + "$ref": "#/definitions/reverb.shopResponseDoc" } }, "400": { @@ -447605,66 +463649,34 @@ "ApiKeyAuth": [] } ], - "summary": "List Reddit subreddit posts", + "summary": "Get a Reverb shop's profile and active listings", "tags": [ - "Reddit" + "Reverb" ] } }, - "/reddit/subreddits/posts": { + "/reverb/shop-feedback": { "get": { "consumes": [ "application/json" ], - "description": "Returns public posts from a combined multi-subreddit feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-subreddits-posts", + "description": "Returns a page of a Reverb shop's individual buyer feedback entries (rating, message, and the order each review was left for) -- reputation detail reverb-shop does not carry (reverb-shop only exposes the aggregate feedback_count/rating_percentage). slug is the shop's slug, from a listing's own shop link or reverb.com/shop/{slug}. An unknown slug returns a typed not-found error.", + "operationId": "reverb-shop-feedback", "parameters": [ { - "description": "Comma-separated subreddit names, without r/, maximum 10", + "description": "Shop slug", "in": "query", - "name": "subreddits", + "name": "slug", "required": true, "type": "string", - "x-example": "OpenAI,MachineLearning" - }, - { - "default": "hot", - "description": "Sort: hot, new, top, or rising", - "enum": [ - "hot", - "new", - "top", - "rising" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Time window for top sort: hour, day, week, month, year, or all", - "enum": [ - "hour", - "day", - "week", - "month", - "year", - "all" - ], - "in": "query", - "name": "time", - "type": "string" - }, - { - "description": "Maximum posts, defaults to 25 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "mtsmusic" }, { - "description": "Reddit pagination token", + "description": "One-based page number, defaults to 1", "in": "query", - "name": "after", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -447674,7 +463686,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reddit.multiSubredditPostsResponseDoc" + "$ref": "#/definitions/reverb.shopFeedbackResponseDoc" } }, "400": { @@ -447707,58 +463719,33 @@ "ApiKeyAuth": [] } ], - "summary": "List Reddit multi-subreddit posts", + "summary": "Get a Reverb shop's buyer feedback", "tags": [ - "Reddit" + "Reverb" ] } }, - "/reddit/trends": { + "/rightmove/agents": { "get": { "consumes": [ "application/json" ], - "description": "Returns public posts from broad Reddit hot, new, rising, or top feeds. For subreddit-specific trends, use `/reddit/subreddit/{subreddit}/posts` with `sort=hot`, `sort=new`, `sort=rising`, or `sort=top`. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-trends", + "description": "Lists estate-agent branches from Rightmove's estate-agents directory for a location, with branch display name, brand, address, telephones, sales/lettings flags, logo, and a link to the branch profile. Pagination follows Rightmove's current directory pages, whose result counts can vary.", + "operationId": "rightmove-agents", "parameters": [ { - "default": "hot", - "description": "Sort: hot, new, rising, or top", - "enum": [ - "hot", - "new", - "rising", - "top" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Time window for top sort: hour, day, week, month, year, or all", - "enum": [ - "hour", - "day", - "week", - "month", - "year", - "all" - ], + "description": "Rightmove location identifier from autocomplete (numeric location id required)", "in": "query", - "name": "time", - "type": "string" + "name": "location", + "required": true, + "type": "string", + "x-example": "REGION^87490" }, { - "description": "Maximum posts, defaults to 25 and clamps to 100", + "description": "Result page (default 1)", "in": "query", - "name": "limit", + "name": "page", "type": "integer" - }, - { - "description": "Reddit pagination token", - "in": "query", - "name": "after", - "type": "string" } ], "produces": [ @@ -447766,31 +463753,37 @@ ], "responses": { "200": { - "description": "OK", + "description": "Estate agent directory", "schema": { - "$ref": "#/definitions/reddit.trendsResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.AgentsResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid query parameter", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -447801,39 +463794,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Reddit trends", + "summary": "List Rightmove estate agents for a location", "tags": [ - "Reddit" + "Rightmove" ] } }, - "/reddit/user/{username}/comments": { + "/rightmove/agents/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns flat public comment entries from a public Reddit user's comments feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-user-comments", + "description": "Returns one estate-agent branch profile from Rightmove, including address, telephones, service flags, industry affiliations, and the branch's own sales and lettings listing previews. The slug segments in Rightmove agent URLs are cosmetic; the branch resolves by numeric id alone.", + "operationId": "rightmove-agent-branch", "parameters": [ { - "description": "Public Reddit username, without u/", + "description": "Rightmove agent branch id", "in": "path", - "name": "username", + "name": "id", "required": true, "type": "string", - "x-example": "reddit" - }, - { - "description": "Maximum comments, defaults to 25 and clamps to 100", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Reddit pagination token", - "in": "query", - "name": "after", - "type": "string" + "x-example": "12070" } ], "produces": [ @@ -447841,31 +463822,37 @@ ], "responses": { "200": { - "description": "OK", + "description": "Agent branch details", "schema": { - "$ref": "#/definitions/reddit.userCommentsResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.AgentBranchResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid branch id", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -447876,39 +463863,33 @@ "ApiKeyAuth": [] } ], - "summary": "List Reddit user comments", + "summary": "Get Rightmove estate agent branch details", "tags": [ - "Reddit" + "Rightmove" ] } }, - "/reddit/user/{username}/posts": { + "/rightmove/autocomplete": { "get": { "consumes": [ "application/json" ], - "description": "Returns public posts from a public Reddit user's submitted feed. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. If source.type is redlib, public fields and credit weights are preserved.", - "operationId": "reddit-user-posts", + "description": "Returns Rightmove location suggestions for the required `query` (up to 200 characters). `limit` defaults to 10 and is capped at 20. Each result has an `id` such as `REGION^87490`, a `name`, a `full_name` when Rightmove gives one, and an `entity_type` such as `REGION` or `POSTCODE`. Use the `id` as `location` in Rightmove search.", + "operationId": "rightmove-autocomplete", "parameters": [ { - "description": "Public Reddit username, without u/", - "in": "path", - "name": "username", + "description": "Location query", + "in": "query", + "name": "query", "required": true, "type": "string", - "x-example": "reddit" + "x-example": "London" }, { - "description": "Maximum posts, defaults to 25 and clamps to 100", + "description": "Maximum suggestions to return (default 10, max 20)", "in": "query", "name": "limit", "type": "integer" - }, - { - "description": "Reddit pagination token", - "in": "query", - "name": "after", - "type": "string" } ], "produces": [ @@ -447916,31 +463897,37 @@ ], "responses": { "200": { - "description": "OK", + "description": "Autocomplete suggestions", "schema": { - "$ref": "#/definitions/reddit.userPostsResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.AutocompleteResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid query parameter", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -447951,27 +463938,119 @@ "ApiKeyAuth": [] } ], - "summary": "List Reddit user posts", + "summary": "Get Rightmove location autocomplete suggestions", "tags": [ - "Reddit" + "Rightmove" ] } }, - "/redfin/estimate": { + "/rightmove/commercial/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the Redfin Estimate for a property, including the current estimate, property facts, and the monthly estimate history with city/county/postal comparatives. Faithful pass-through of Redfin's public avm + avmHistoricalData resources.", - "operationId": "redfin-estimate", + "description": "Search Rightmove's commercial property listings for sale or to let, with price, floor-area (sq ft), and commercial-property-type filters. For to-let listings the price amount follows the listing's own frequency (monthly or yearly).", + "operationId": "rightmove-commercial-search", "parameters": [ { - "description": "Redfin property id", + "description": "Rightmove location identifier from autocomplete", "in": "query", - "name": "property_id", + "name": "location", "required": true, "type": "string", - "x-example": "1715020" + "x-example": "REGION^87490" + }, + { + "description": "Result page (default 1)", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Listing status (default buy)", + "enum": [ + "buy", + "let" + ], + "in": "query", + "name": "status", + "type": "string" + }, + { + "description": "Minimum price in whole GBP units, not pence", + "in": "query", + "name": "min_price", + "type": "integer" + }, + { + "description": "Maximum price in whole GBP units, not pence", + "in": "query", + "name": "max_price", + "type": "integer" + }, + { + "description": "Minimum floor area in square feet", + "in": "query", + "name": "min_size", + "type": "integer" + }, + { + "description": "Maximum floor area in square feet", + "in": "query", + "name": "max_size", + "type": "integer" + }, + { + "description": "Commercial property type filter. Accepts one or more comma-separated values.", + "enum": [ + "business-park", + "office", + "serviced-office", + "convenience-store", + "hairdresser-barber-shop", + "post-office", + "retail_property_high_street_", + "retail_property_out_of_town_", + "retail_property_pop_up_", + "retail_property_retail_park_", + "retail_property_shopping_centre_", + "shop", + "showroom", + "trade-counter", + "bar-nightclub", + "cafe", + "leisure-facility", + "guest-house", + "hotel", + "hospitality", + "pub", + "restaurant", + "takeaway", + "other", + "distribution-warehouse", + "factory", + "heavy-industrial", + "industrial-park", + "light-industrial", + "storage", + "warehouse", + "workshop", + "industrial-development", + "land", + "farm", + "residential-development", + "healthcare-facility", + "childcare-facility", + "commercial-property", + "garage", + "mixed-use", + "commercial-development", + "petrol_station", + "place_of_worship" + ], + "in": "query", + "name": "property_type", + "type": "string" } ], "produces": [ @@ -447979,25 +464058,37 @@ ], "responses": { "200": { - "description": "OK", + "description": "Commercial property search results", "schema": { - "$ref": "#/definitions/redfin.EstimateResponse" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.SearchResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Bad Request", + "description": "Invalid query parameter", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -448008,36 +464099,83 @@ "ApiKeyAuth": [] } ], - "summary": "Get Redfin Estimate", + "summary": "Search Rightmove commercial property", "tags": [ - "Redfin" + "Rightmove" ] } }, - "/redfin/property": { + "/rightmove/new-homes/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Redfin public property details. Provide a listing url, or a property_id (optionally with listing_id).", - "operationId": "redfin-property", + "description": "Search Rightmove's new-homes-for-sale listings for a location, with price, bedroom, bathroom, and property-type filters. Results are individual new-build homes and plots (with development flags), not development-level cards.", + "operationId": "rightmove-new-homes-search", "parameters": [ { - "description": "Redfin listing URL (primary key)", + "description": "Rightmove location identifier from autocomplete", "in": "query", - "name": "url", - "type": "string" + "name": "location", + "required": true, + "type": "string", + "x-example": "REGION^87490" }, { - "description": "Redfin property id, used when url is not provided", + "description": "Result page (default 1)", "in": "query", - "name": "property_id", - "type": "string" + "name": "page", + "type": "integer" }, { - "description": "Redfin listing id, improves completeness with property_id", + "description": "Minimum price in whole GBP units, not pence", "in": "query", - "name": "listing_id", + "name": "min_price", + "type": "integer" + }, + { + "description": "Maximum price in whole GBP units, not pence", + "in": "query", + "name": "max_price", + "type": "integer" + }, + { + "description": "Minimum bedrooms", + "in": "query", + "name": "min_bedrooms", + "type": "integer" + }, + { + "description": "Maximum bedrooms", + "in": "query", + "name": "max_bedrooms", + "type": "integer" + }, + { + "description": "Minimum bathrooms", + "in": "query", + "name": "min_bathrooms", + "type": "number" + }, + { + "description": "Maximum bathrooms", + "in": "query", + "name": "max_bathrooms", + "type": "number" + }, + { + "description": "Property type filter. Accepts one or more comma-separated values.", + "enum": [ + "detached", + "semi-detached", + "terraced", + "flat", + "bungalow", + "land", + "park-home" + ], + "in": "query", + "name": "property_type", "type": "string" } ], @@ -448046,31 +464184,37 @@ ], "responses": { "200": { - "description": "OK", + "description": "New homes search results", "schema": { - "$ref": "#/definitions/redfin.PropertyResponse" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.SearchResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid query parameter", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -448081,39 +464225,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Redfin property", + "summary": "Search Rightmove new homes for sale", "tags": [ - "Redfin" + "Rightmove" ] } }, - "/redfin/region-trends": { + "/rightmove/properties/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Redfin's aggregate market trends for a region (median list/sale price, sale-to-list, offers, days on market, inventory, year-over-year). Faithful pass-through of Redfin's public aggregate-trends resource.", - "operationId": "redfin-region-trends", + "description": "Returns one Rightmove listing by `id`: title, address, price and `price_text`, bedrooms, bathrooms, receptions, property type, status, description, features, floor plan, EPC rating, council tax band, tenure, agent reviews and nearby schools with Ofsted ratings. Removed or invalid ids return 404.", + "operationId": "rightmove-property", "parameters": [ { - "description": "Redfin region id for a neighborhood, ZIP code, county, or city", - "in": "query", - "name": "region_id", + "description": "Rightmove property ID", + "in": "path", + "name": "id", "required": true, - "type": "integer", - "x-example": 17151 - }, - { - "description": "Redfin region type (defaults to 6, city)", - "enum": [ - 1, - 2, - 5, - 6 - ], - "in": "query", - "name": "region_type", - "type": "integer" + "type": "string", + "x-example": "92527095" } ], "produces": [ @@ -448121,25 +464253,43 @@ ], "responses": { "200": { - "description": "OK", + "description": "Property details", "schema": { - "$ref": "#/definitions/redfin.RegionTrendsResponse" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.PropertyResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Bad Request", + "description": "Invalid property ID", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Property not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -448150,83 +464300,164 @@ "ApiKeyAuth": [] } ], - "summary": "Get Redfin region market trends", + "summary": "Get Rightmove property details", "tags": [ - "Redfin" + "Rightmove" ] } }, - "/redfin/search": { + "/rightmove/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Redfin public listing search results. Pass region_id/region_type from autocomplete to skip location resolution.", - "operationId": "redfin-search", + "description": "Searches Rightmove listings for a required `location` id, for sale (default) or `to_let`, 1-indexed by `page`. Filter by price, bedrooms, bathrooms, `property_type`, `radius`, `must_have`, `dont_show` and `tenure_types`; `sort` defaults to `newest_listed`. Returns `total` and results with price, address, beds, baths, size and tenure.", + "operationId": "rightmove-search", "parameters": [ { - "description": "Display location; resolved via autocomplete when region_id is omitted", + "description": "Rightmove location identifier from autocomplete", "in": "query", "name": "location", - "type": "string" + "required": true, + "type": "string", + "x-example": "REGION^87490" }, { - "description": "1-based page", + "description": "Result page (default 1)", "in": "query", "name": "page", "type": "integer" }, { - "description": "Redfin region id; skips location resolution when provided", + "description": "Listing status (default for_sale)", + "enum": [ + "for_sale", + "to_let" + ], "in": "query", - "name": "region_id", + "name": "status", + "type": "string", + "x-example": "for_sale" + }, + { + "description": "Minimum price in whole GBP units, not pence", + "in": "query", + "name": "min_price", "type": "integer" }, { - "description": "Redfin region type, used with region_id (defaults to 6, city)", - "enum": [ - 1, - 2, - 5, - 6 - ], + "description": "Maximum price in whole GBP units, not pence", "in": "query", - "name": "region_type", + "name": "max_price", "type": "integer" }, { - "description": "Listing status: for_sale or sold", + "description": "Minimum bedrooms", + "in": "query", + "name": "min_bedrooms", + "type": "integer" + }, + { + "description": "Maximum bedrooms", + "in": "query", + "name": "max_bedrooms", + "type": "integer" + }, + { + "description": "Minimum bathrooms", + "in": "query", + "name": "min_bathrooms", + "type": "number" + }, + { + "description": "Maximum bathrooms", + "in": "query", + "name": "max_bathrooms", + "type": "number" + }, + { + "description": "Property type filter. Accepts one or more comma-separated values. private-halls (Student Halls) mainly returns results for status=to_let.", "enum": [ - "for_sale", - "sold" + "detached", + "semi-detached", + "terraced", + "flat", + "bungalow", + "land", + "park-home", + "private-halls" ], "in": "query", - "name": "status", + "name": "property_type", "type": "string" }, { - "description": "Minimum price filter", + "description": "Search radius in miles around location, default 0 (this area only)", + "enum": [ + 0, + 0.25, + 0.5, + 1, + 3, + 5, + 10, + 15, + 20, + 30, + 40 + ], "in": "query", - "name": "min_price", - "type": "integer" + "name": "radius", + "type": "number" }, { - "description": "Maximum price filter", + "description": "Require listings to have these attributes. Accepts one or more comma-separated values.", + "enum": [ + "garden", + "parking", + "retirement", + "newHome", + "sharedOwnership", + "auction" + ], "in": "query", - "name": "max_price", - "type": "integer" + "name": "must_have", + "type": "string" }, { - "description": "Minimum bedrooms filter", + "description": "Exclude listings with these attributes. Accepts one or more comma-separated values.", + "enum": [ + "newHome", + "retirement", + "sharedOwnership", + "auction" + ], "in": "query", - "name": "min_beds", - "type": "integer" + "name": "dont_show", + "type": "string" }, { - "description": "Minimum bathrooms filter", + "description": "Tenure filter. Accepts one or more comma-separated values.", + "enum": [ + "FREEHOLD", + "LEASEHOLD", + "SHARE_OF_FREEHOLD" + ], + "in": "query", + "name": "tenure_types", + "type": "string" + }, + { + "description": "Result sort order, default newest_listed", + "enum": [ + "lowest_price", + "highest_price", + "newest_listed", + "oldest_listed" + ], "in": "query", - "name": "min_baths", - "type": "number" + "name": "sort", + "type": "string" } ], "produces": [ @@ -448234,25 +464465,37 @@ ], "responses": { "200": { - "description": "OK", + "description": "Property search results", "schema": { - "$ref": "#/definitions/redfin.SearchResponse" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.SearchResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Bad Request", + "description": "Invalid query parameter", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -448263,85 +464506,68 @@ "ApiKeyAuth": [] } ], - "summary": "Search Redfin listings", + "summary": "Search Rightmove properties", "tags": [ - "Redfin" + "Rightmove" ] } }, - "/redfin/similar": { + "/rightmove/student/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the comparable listings Redfin shows for a property, identified by the required `property_id`. Each row has the address, city, state, zip, price, beds, baths, `sqft`, `price_per_sqft`, days on market, MLS number, `hoa_monthly`, lot size, year built, status, image and URL, plus coordinates when present.", - "operationId": "redfin-similar", + "description": "Search Rightmove's student-accommodation listings for a location, with monthly-rent, bedroom, and furnishing filters. Prices are monthly rents in whole GBP units.", + "operationId": "rightmove-student-search", "parameters": [ { - "description": "Redfin property id", + "description": "Rightmove location identifier from autocomplete", "in": "query", - "name": "property_id", + "name": "location", "required": true, "type": "string", - "x-example": "1715020" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/redfin.SimilarResponse" - } + "x-example": "REGION^87490" }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Result page (default 1)", + "in": "query", + "name": "page", + "type": "integer" }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Minimum monthly rent in whole GBP units, not pence", + "in": "query", + "name": "min_price", + "type": "integer" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Get Redfin comparable listings", - "tags": [ - "Redfin" - ] - } - }, - "/referrals/click": { - "post": { - "consumes": [ - "application/json" - ], - "description": "Records a click on a referral link. The body requires the referral `code`; `click_id`, `landing_path` and `utm_source`, `utm_medium` and `utm_campaign` are optional. Returns the `click_id` to keep in the referral click cookie. An invalid code returns the standard invalid-params error.", - "operationId": "referrals-click", - "parameters": [ + "description": "Maximum monthly rent in whole GBP units, not pence", + "in": "query", + "name": "max_price", + "type": "integer" + }, { - "description": "Referral click metadata", - "in": "body", - "name": "request", - "required": true, - "schema": { - "$ref": "#/definitions/referrals.referralClickRequestDoc" - } + "description": "Minimum bedrooms", + "in": "query", + "name": "min_bedrooms", + "type": "integer" + }, + { + "description": "Maximum bedrooms", + "in": "query", + "name": "max_bedrooms", + "type": "integer" + }, + { + "description": "Furnishing filter", + "enum": [ + "furnished", + "unfurnished", + "part_furnished" + ], + "in": "query", + "name": "furnish_type", + "type": "string" } ], "produces": [ @@ -448349,13 +464575,25 @@ ], "responses": { "200": { - "description": "Referral click id", + "description": "Student accommodation search results", "schema": { - "$ref": "#/definitions/referrals.referralClickResponseDoc" + "allOf": [ + { + "$ref": "#/definitions/app.Response" + }, + { + "properties": { + "data": { + "$ref": "#/definitions/rightmove.SearchResponse" + } + }, + "type": "object" + } + ] } }, "400": { - "description": "Invalid request", + "description": "Invalid query parameter", "schema": { "$ref": "#/definitions/app.Response" } @@ -448365,39 +464603,9 @@ "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "summary": "Capture a referral click", - "tags": [ - "Referrals" - ] - } - }, - "/referrals/me": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the signed-in user's referral summary: referral `code`, `share_path`, `reward_credits` and `referred_reward_credits`, `attribution_window_days` (30 by default), `monthly_referrer_reward_cap`, counts by status in `stats`, and recent `items` with the user's `role`. Creates the code on first use.", - "operationId": "referrals-me", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "Referral summary", - "schema": { - "$ref": "#/definitions/referrals.referralsMeResponseDoc" - } - }, - "401": { - "description": "Authentication required", - "schema": { - "$ref": "#/definitions/app.Response" - } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Upstream error", "schema": { "$ref": "#/definitions/app.Response" } @@ -448405,106 +464613,53 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Get current user's referral program summary", + "summary": "Search Rightmove student accommodation", "tags": [ - "Referrals" + "Rightmove" ] } }, - "/referrals/me/events": { + "/rnz/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the signed-in user's recent referral records, newest first, whether they were the referrer or the referred account. `limit` caps the count at 100. Each item has its code, campaign, `role`, `status` (including `clawed_back`), `reward_credits` and created, qualified, rewarded and expiry times.", - "operationId": "referrals-me-events", + "description": "Returns public RNZ news article metadata and body paragraphs from a canonical rnz.co.nz/news/
// article URL. RNZ has no paywall, so the full body is returned.", + "operationId": "rnz-article", "parameters": [ { - "description": "Maximum records to return, capped at 100", + "description": "Canonical RNZ news article URL", "in": "query", - "name": "limit", - "type": "integer" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "Referral events", - "schema": { - "$ref": "#/definitions/referrals.referralsEventsResponseDoc" - } - }, - "401": { - "description": "Authentication required", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "JWTAuth": [] - } - ], - "summary": "List current user's referral events", - "tags": [ - "Referrals" - ] - } - }, - "/research/jobs": { - "post": { - "consumes": [ - "application/json" - ], - "description": "Submits bounded research over the selected web, arXiv paper, and developer-document sources. Repeated owner-scoped idempotency requests return the original job.", - "operationId": "research-start", - "parameters": [ - { - "description": "Research request; `scope` is `web`, `papers`, `developer`, or `mixed`; `output_format` is `report` or `json`.", - "in": "body", - "name": "request", + "name": "url", "required": true, - "schema": { - "$ref": "#/definitions/researchjobs.researchStartRequestDoc" - } + "type": "string", + "x-example": "https://www.rnz.co.nz/news/regions_auckland/1569602/auckland-man-used-missing-20-point-1-million-lotto-ticket-as-bookmark-for-almost-two-months" } ], "produces": [ "application/json" ], "responses": { - "202": { - "description": "Queued research job", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/researchjobs.researchStartResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Invalid request", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Authentication required", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Research service or billing admission unavailable", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -448515,24 +464670,30 @@ "ApiKeyAuth": [] } ], - "summary": "Start a durable cross-corpus research job", + "summary": "Get RNZ article content", "tags": [ - "Research Jobs" + "RNZ" ] } }, - "/research/jobs/{job_id}": { + "/rnz/author": { "get": { - "description": "Returns the state of a research job by `job_id`: queued, running, cancelling, succeeded, failed or cancelled. The response carries `progress` counts, `research` progress (round, searches completed, sources read, questions answered), usage, warnings, `partial`, `deadline_at` and any error. A job not started within 30 minutes fails with `timeout`.", - "operationId": "research-status", + "description": "Returns one RNZ reporter's public profile: name, role, bio, email, X/Twitter handle, photo, total story count, and the first page of their news stories.", + "operationId": "rnz-author", "parameters": [ { - "description": "Research job ID", - "in": "path", - "name": "job_id", - "required": true, + "description": "Author slug, e.g. ellen-o-dwyer", + "in": "query", + "name": "slug", "type": "string", - "x-example": "job-123" + "x-example": "ellen-o-dwyer" + }, + { + "description": "Canonical rnz.co.nz/authors/ URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.rnz.co.nz/authors/ellen-o-dwyer" } ], "produces": [ @@ -448540,19 +464701,25 @@ ], "responses": { "200": { - "description": "Research job status", + "description": "OK", "schema": { - "$ref": "#/definitions/researchjobs.researchStatusResponseDoc" + "$ref": "#/definitions/publicnews.rnzAuthorResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Research job not found", + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -448563,24 +464730,45 @@ "ApiKeyAuth": [] } ], - "summary": "Read a research job status", + "summary": "Get an RNZ author profile", "tags": [ - "Research Jobs" + "RNZ" ] } }, - "/research/jobs/{job_id}/cancel": { - "post": { - "description": "Requests cancellation of the caller's own research job, given by `job_id`. Returns the job's current state (such as `cancelling`), `cancel_requested`, `partial`, progress counts, research progress and usage. Results already retained stay readable and are marked partial where appropriate.", - "operationId": "research-cancel", + "/rnz/headlines": { + "get": { + "description": "Returns the latest RNZ (Radio New Zealand) stories for one section. `section` is required and takes one of 19 slugs such as `news`, `national`, `political`, `business`, `pacific`, `te-manu-korihi` or `weather`; others return a 400. Each item has its title, URL, summary and publication time. Smaller sections can carry items from earlier weeks, so check `published_at`.", + "operationId": "rnz-headlines", "parameters": [ { - "description": "Research job ID", - "in": "path", - "name": "job_id", + "description": "RNZ section slug", + "enum": [ + "news", + "national", + "world", + "political", + "business", + "pacific", + "sport", + "health", + "education", + "community", + "country", + "regional", + "te-manu-korihi", + "on-the-inside", + "in-depth", + "indonz", + "ldr", + "chinese", + "weather" + ], + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "job-123" + "x-example": "news" } ], "produces": [ @@ -448588,19 +464776,19 @@ ], "responses": { "200": { - "description": "Updated research job status", + "description": "OK", "schema": { - "$ref": "#/definitions/researchjobs.researchStatusResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Research job not found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -448611,64 +464799,28 @@ "ApiKeyAuth": [] } ], - "summary": "Cancel a research job", + "summary": "Get RNZ section headlines", "tags": [ - "Research Jobs" + "RNZ" ] } }, - "/research/jobs/{job_id}/events": { + "/rnz/news": { "get": { - "description": "Reads a page of events for one of the caller's research jobs, by `job_id`. `limit` is 1 to 100 (default 50); pass `next_cursor` back as `cursor` to continue, with `has_more` showing whether more remain. Each event has `sequence`, `type` (such as `source_fetched` or `round_completed`), `timestamp`, `message` and `source_id`.", - "operationId": "research-events", - "parameters": [ - { - "description": "Research job ID", - "in": "path", - "name": "job_id", - "required": true, - "type": "string", - "x-example": "job-123" - }, - { - "description": "Signed event cursor", - "in": "query", - "name": "cursor", - "type": "string" - }, - { - "description": "Page size from 1 through 100; default 50", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "limit", - "type": "integer" - } - ], + "description": "Returns RNZ (Radio New Zealand) top stories from its all-news feed: title, article URL, summary and publication time in UTC. Takes no parameters. Lifestyle guides, audio programme pages and section hubs are left out, and article URLs use RNZ's current section names.", + "operationId": "rnz-news", "produces": [ "application/json" ], "responses": { "200": { - "description": "Research job events", - "schema": { - "$ref": "#/definitions/researchjobs.researchEventsResponseDoc" - } - }, - "400": { - "description": "Invalid page request or cursor", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "401": { - "description": "Authentication required", + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "404": { - "description": "Research job not found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -448679,46 +464831,24 @@ "ApiKeyAuth": [] } ], - "summary": "Read research job events", + "summary": "Get RNZ top stories", "tags": [ - "Research Jobs" + "RNZ" ] } }, - "/research/jobs/{job_id}/results": { + "/rnz/sections": { "get": { - "description": "Returns the complete owner-scoped retained result prefix up to a consistent manifest sequence. Before a valid report or structured result exists, returns `ready=false` with `partial=true` and any retained evidence.", - "operationId": "research-results", - "parameters": [ - { - "description": "Research job ID", - "in": "path", - "name": "job_id", - "required": true, - "type": "string", - "x-example": "job-123" - } - ], + "description": "Lists the 19 RNZ news sections that `rnz-headlines` accepts, such as `news`, `national`, `political`, `pacific` and `te-manu-korihi`. Each entry has a `slug`, a display `name` and the section's feed `url`. RNZ's programme-schedule and recipe feeds are not included.", + "operationId": "rnz-sections", "produces": [ "application/json" ], "responses": { "200": { - "description": "Research results or a partial result projection", - "schema": { - "$ref": "#/definitions/researchjobs.researchResultsResponseDoc" - } - }, - "401": { - "description": "Authentication required", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Research job not found", + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -448727,25 +464857,31 @@ "ApiKeyAuth": [] } ], - "summary": "Read all retained research results", + "summary": "Get RNZ sections", "tags": [ - "Research Jobs" + "RNZ" ] } }, - "/research/papers/metadata": { + "/roblox/badges": { "get": { - "description": "Return paper records including titles, abstracts when available, authors, publication dates and verified identifier aliases. Europe PMC resolution is limited to MED-backed PMID, PMCID and DOI records; no full-text body is fetched.", - "operationId": "research-inspect-paper", + "description": "Returns one cursor-paginated page of public badge metadata for a Roblox experience. Pass next_cursor back unchanged as cursor. No user-awarded badge data is returned.", + "operationId": "roblox-badges", "parameters": [ { - "description": "arXiv identifier, PMID, PMCID, DOI, Europe PMC primary ID or canonical paper ID", + "description": "Positive Roblox universe id", "in": "query", - "maxLength": 4096, - "name": "paper_id", + "minimum": 1, + "name": "universe_id", "required": true, - "type": "string", - "x-example": "17299597" + "type": "integer", + "x-example": 383310974 + }, + { + "description": "Opaque cursor returned by a previous response", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -448755,19 +464891,7 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/researchretrieval.PaperMetadataResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/roblox.badgesResponseDoc" } }, "400": { @@ -448776,36 +464900,12 @@ "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "402": { - "description": "Payment Required", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -448818,28 +464918,25 @@ "ApiKeyAuth": [] } ], - "summary": "Inspect paper metadata", + "summary": "List Roblox experience badges", "tags": [ - "Research" + "Roblox" ] } }, - "/research/papers/read": { - "post": { - "consumes": [ - "application/json" - ], - "description": "Return licensed Europe PMC body prose, question-ranked passages, byte locators, license and content provenance. Restricted or unavailable bodies return metadata-only availability; arXiv does not fetch PDFs. Full text costs 5 credits, metadata-only reads 1.", - "operationId": "research-read-paper", + "/roblox/game": { + "get": { + "description": "Returns public catalog detail for one Roblox experience, including aggregate votes and its public icon. This endpoint does not return player, account, purchase, or server data.", + "operationId": "roblox-game", "parameters": [ { - "description": "Paper read request", - "in": "body", - "name": "request", + "description": "Positive Roblox universe id", + "in": "query", + "minimum": 1, + "name": "universe_id", "required": true, - "schema": { - "$ref": "#/definitions/researchpapers.PaperReadRequest" - } + "type": "integer", + "x-example": 383310974 } ], "produces": [ @@ -448849,19 +464946,7 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/researchretrieval.PaperReadResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/roblox.gameResponseDoc" } }, "400": { @@ -448870,18 +464955,6 @@ "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "402": { - "description": "Payment Required", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "404": { "description": "Not Found", "schema": { @@ -448894,12 +464967,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -448912,28 +464979,30 @@ "ApiKeyAuth": [] } ], - "summary": "Read a research paper", + "summary": "Get a Roblox experience", "tags": [ - "Research" + "Roblox" ] } }, - "/research/papers/related": { - "post": { - "consumes": [ - "application/json" - ], - "description": "Return one-hop Europe PMC citation edges, canonical seed IDs, source provenance and a frozen owner-bound cursor. Modes are references and citers; intent is unsupported. Partial results explicitly report indexed-source and candidate-window limits.", - "operationId": "research-related-papers", + "/roblox/rankings": { + "get": { + "description": "Returns one Roblox game ranking shelf, chosen by `sort_id`: `top-trending` (default), `up-and-coming`, `top-playing-now`, `fun-with-friends` or `top-revisited`. Each experience has its name, creator, genre, player count, up and down votes, maturity label, minimum age and URL. Shelves are global, not personalised.", + "operationId": "roblox-rankings", "parameters": [ { - "description": "Seed IDs and graph direction, or cursor and optional limit", - "in": "body", - "name": "request", - "required": true, - "schema": { - "$ref": "#/definitions/researchpapers.PaperRelatedRequest" - } + "default": "top-trending", + "description": "Ranking shelf: top-trending, up-and-coming, top-playing-now, fun-with-friends, top-revisited", + "enum": [ + "top-trending", + "up-and-coming", + "top-playing-now", + "fun-with-friends", + "top-revisited" + ], + "in": "query", + "name": "sort_id", + "type": "string" } ], "produces": [ @@ -448943,19 +465012,7 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/researchretrieval.PaperRelatedResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/roblox.rankingsResponseDoc" } }, "400": { @@ -448964,42 +465021,12 @@ "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "402": { - "description": "Payment Required", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "410": { - "description": "Gone", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -449012,75 +465039,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get paper references or citing papers", + "summary": "List Roblox game rankings", "tags": [ - "Research" + "Roblox" ] } }, - "/research/papers/search": { + "/roblox/search": { "get": { - "description": "Search arXiv papers with an owner-bound frozen result window and cursor-only continuation. When arXiv is rate limited or unavailable, an undated search is answered from OpenAlex's index of arXiv papers and the response says so in coverage and warnings.", - "operationId": "research-search-papers", + "description": "Searches Roblox experiences for `q` (1 to 256 characters). Each result has its universe and place ids, name, creator, genre, `player_count`, up and down votes, maturity and URL. Pass `next_page` back unchanged as `page_token` for the next page. No account, friend, purchase or inventory data is included.", + "operationId": "roblox-search", "parameters": [ { - "description": "Required for initial search; omit on cursor continuation", + "description": "Experience search query", "in": "query", - "maxLength": 1000, "name": "q", - "type": "string" - }, - { - "description": "Page size (1–50; default 10)", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "limit", - "type": "integer" - }, - { - "collectionFormat": "multi", - "description": "Enabled paper sources", - "in": "query", - "items": { - "enum": [ - "arxiv" - ], - "type": "string" - }, - "name": "sources", - "type": "array" - }, - { - "collectionFormat": "multi", - "description": "Author names (up to five; 256 characters each)", - "in": "query", - "items": { - "type": "string" - }, - "maxLength": 256, - "name": "authors", - "type": "array" - }, - { - "description": "Inclusive publication date (YYYY-MM-DD)", - "format": "date", - "in": "query", - "name": "published_from", - "type": "string" - }, - { - "description": "Inclusive publication date (YYYY-MM-DD)", - "format": "date", - "in": "query", - "name": "published_to", - "type": "string" + "required": true, + "type": "string", + "x-example": "Adopt Me" }, { - "description": "Owner-bound continuation cursor (cursor-only with optional limit)", + "description": "Opaque page token returned by a previous search", "in": "query", - "maxLength": 2048, - "name": "cursor", + "name": "page_token", "type": "string" } ], @@ -449091,19 +465072,7 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/researchretrieval.PaperSearchResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/roblox.searchResponseDoc" } }, "400": { @@ -449112,86 +465081,12 @@ "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "402": { - "description": "Payment Required", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "410": { - "description": "Gone", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Search research papers", - "tags": [ - "Research" - ] - } - }, - "/research/sources": { - "get": { - "description": "Return the stable authenticated paper source registry, including arXiv search and MED-backed Europe PMC metadata, licensed text and citation operations.", - "operationId": "research-sources", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/researchretrieval.PaperSourcesResponse" - } - }, - "type": "object" - } - ] - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -449204,41 +465099,24 @@ "ApiKeyAuth": [] } ], - "summary": "List paper sources", + "summary": "Search Roblox experiences", "tags": [ - "Research" + "Roblox" ] } }, - "/resy/availability": { + "/rollingstone/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the bookable reservation timeslots Resy currently shows for a restaurant, date, and party size -- the same read-only availability an anonymous visitor sees before signing in. The date is optional and defaults to the current date in UTC; the response echoes the date used. This is discovery only; it does not create, hold, modify, or cancel a reservation.", - "operationId": "resy-availability", + "description": "Returns a Rolling Stone article by canonical `url`, a `rollingstone.com` address ending in a numeric article id: title, description, section, authors, publication and update times, image, body `paragraphs` and a `paywalled` flag.", + "operationId": "rollingstone-article", "parameters": [ { - "description": "Resy restaurant id", + "description": "Canonical Rolling Stone article URL", "in": "query", - "name": "restaurant_id", + "name": "url", "required": true, "type": "string", - "x-example": "6194" - }, - { - "description": "Reservation date, YYYY-MM-DD. Defaults to the current date in UTC", - "in": "query", - "name": "date", - "type": "string", - "x-example": "2026-09-20" - }, - { - "description": "Party size, default 2", - "in": "query", - "name": "party_size", - "type": "integer", - "x-example": 2 + "x-example": "https://www.rollingstone.com/music/music-news/taylor-swift-the-life-of-a-showgirl-deluxe-album-1235630197/" } ], "produces": [ @@ -449248,7 +465126,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/resy.availabilityResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -449263,12 +465141,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -449281,27 +465153,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Resy restaurant's bookable reservation timeslots", + "summary": "Get Rolling Stone article content", "tags": [ - "Resy" + "Rolling Stone" ] } }, - "/resy/cuisines": { + "/rollingstone/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the cuisines present among restaurants in a Resy location. Location is a short city code or numeric location id -- both already returned inline as location_code on resy-search and resy-restaurant results; there is no separate closed list of every valid location on Resy's own API, so this value always comes from a prior search/restaurant response rather than a guessed input.", - "operationId": "resy-cuisines", + "description": "Returns a Rolling Stone author's byline metadata, biography, and recent articles (sourced from the author's own public RSS feed) from a canonical author URL.", + "operationId": "rollingstone-author", "parameters": [ { - "description": "Resy location code or numeric id (from a prior resy-search/resy-restaurant response's location_code field)", + "description": "Canonical Rolling Stone author URL", "in": "query", - "name": "location", + "name": "url", "required": true, "type": "string", - "x-example": "ny" + "x-example": "https://www.rollingstone.com/author/cheyenne-roundtree/" } ], "produces": [ @@ -449311,7 +465180,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/resy.cuisinesResponseDoc" + "$ref": "#/definitions/publicnews.rollingStoneAuthorResponseDoc" } }, "400": { @@ -449320,8 +465189,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -449338,50 +465207,60 @@ "ApiKeyAuth": [] } ], - "summary": "Get the cuisines present in a Resy location", + "summary": "Get a Rolling Stone author profile", "tags": [ - "Resy" + "Rolling Stone" ] } }, - "/resy/event": { + "/rollingstone/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a ticketed dining event's full description, event-day instructions, and per-ticket-tier package breakdown (price, what's included, live ticket availability). All three identifiers come from a prior resy-events result: event_url_slug is that result's url_slug, restaurant_url_slug is its restaurant_url_slug, and location is the same city identifier resy-events was called with. Read-only discovery -- does not purchase a ticket.", - "operationId": "resy-event-detail", + "description": "Returns the latest Rolling Stone stories for one section. `section` is required and takes one of 34 slugs, including `music`, `music-news`, `music-album-reviews`, `politics`, `tv-movie-reviews`, `culture` and `rs-gaming`. Each item has its title, URL, summary, publication time and author.", + "operationId": "rollingstone-headlines", "parameters": [ { - "description": "Event url_slug, from a prior resy-events result", - "in": "query", - "name": "event_url_slug", - "required": true, - "type": "string", - "x-example": "the-bonnie-brunch-citi-field-trip-2026-09-20-6" - }, - { - "description": "Restaurant url_slug, from that same resy-events result's restaurant_url_slug", - "in": "query", - "name": "restaurant_url_slug", - "required": true, - "type": "string", - "x-example": "the-bonnie" - }, - { - "description": "Resy location code or numeric id, same value resy-events was called with", + "description": "Rolling Stone section slug", + "enum": [ + "music", + "music-news", + "music-features", + "music-lists", + "music-album-reviews", + "music-live-reviews", + "music-country", + "music-latin", + "music-pictures", + "politics", + "politics-news", + "politics-features", + "politics-lists", + "tv-movies", + "tv-movie-news", + "tv-movie-features", + "tv-movie-lists", + "tv-movie-recaps", + "tv-movie-reviews", + "culture", + "culture-news", + "culture-features", + "culture-lists", + "rs-gaming", + "product-recommendations", + "pro", + "artist-you-need-to-know", + "song-to-know", + "photo-gallery", + "creators", + "rs-recommends", + "rs-essentials", + "audio-awards", + "gift-guide" + ], "in": "query", - "name": "location", + "name": "section", "required": true, "type": "string", - "x-example": "ny" - }, - { - "description": "Party size, default 2", - "in": "query", - "name": "party_size", - "type": "integer", - "x-example": 2 + "x-example": "music" } ], "produces": [ @@ -449391,7 +465270,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/resy.eventDetailResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -449400,18 +465279,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -449420,54 +465287,20 @@ } }, "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get a Resy ticketed dining event's full description and ticket packages", - "tags": [ - "Resy" - ] - } - }, - "/resy/events": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns ticketed dining events (fixed-price, fixed-capacity experiences a restaurant hosts and sells tickets for, distinct from a regular reservation) in a Resy location. Read-only discovery -- does not create, hold, or purchase a ticket.", - "operationId": "resy-events", - "parameters": [ - { - "description": "Resy location code or numeric id (from a prior resy-search/resy-restaurant response's location_code field)", - "in": "query", - "name": "location", - "required": true, - "type": "string", - "x-example": "ny" - }, - { - "description": "Only return events starting on or after this date, YYYY-MM-DD; defaults to the next calendar day", - "in": "query", - "name": "date", - "type": "string", - "x-example": "2026-09-21" - }, - { - "description": "Max events returned, default 10", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Page past the first `limit` events, default 0", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + { + "ApiKeyAuth": [] } ], + "summary": "Get Rolling Stone section headlines", + "tags": [ + "Rolling Stone" + ] + } + }, + "/rollingstone/news": { + "get": { + "description": "Returns Rolling Stone's latest top stories across the site. Takes no parameters, and `rollingstone-headlines` narrows by section instead. Each item has its title, URL, summary, publication time and author.", + "operationId": "rollingstone-news", "produces": [ "application/json" ], @@ -449475,17 +465308,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/resy.eventsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -449502,33 +465329,59 @@ "ApiKeyAuth": [] } ], - "summary": "Get ticketed dining events in a Resy location", + "summary": "Get Rolling Stone top stories", "tags": [ - "Resy" + "Rolling Stone" ] } }, - "/resy/locations": { + "/rollingstone/sections": { + "get": { + "description": "Returns the public Rolling Stone section inventory: every music, politics, TV & movies, and culture subsection plus the site's standalone verticals (Rolling Stone Pro, product recommendations) and tag hubs, each linking to its public RSS feed.", + "operationId": "rollingstone-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Rolling Stone sections", + "tags": [ + "Rolling Stone" + ] + } + }, + "/rothys/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns Resy's full list of operating locations (cities), optionally filtered by a free-text substring and/or country. This is the discovery source for the location value used throughout the rest of this family (resy-search's/resy-restaurant's location_code, resy-cuisines'/resy-events'/resy-event-detail's location).", - "operationId": "resy-locations", + "description": "Returns collections from Rothy's (https://www.rothys.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", + "operationId": "rothys-collections", "parameters": [ { - "description": "Case-insensitive substring match against a location's name, code, or url_slug", + "description": "1-based page, defaults to 1", "in": "query", - "name": "q", - "type": "string", - "x-example": "new york" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Case-insensitive exact match against a location's country name", + "description": "Maximum collections, defaults to 50 and supports up to 250", "in": "query", - "name": "country", - "type": "string", - "x-example": "United States" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -449538,11 +465391,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/resy.locationsResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -449559,27 +465418,41 @@ "ApiKeyAuth": [] } ], - "summary": "List Resy's operating locations (cities)", + "summary": "List Rothy's collections", "tags": [ - "Resy" + "Rothy's" ] } }, - "/resy/restaurant": { + "/rothys/collections/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Resy restaurant's profile by the required `restaurant_id`: name, cuisine, `price_range` (1 to 4), rating, review count, address, neighborhood, coordinates, phone, website, menu URL, party size limits, description, `why_we_like_it`, `need_to_know` and images. `location_code` is a short city identifier.", - "operationId": "resy-restaurant", + "description": "Returns products from one Rothy's (https://www.rothys.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", + "operationId": "rothys-collection-products", "parameters": [ { - "description": "Resy restaurant id", - "in": "query", - "name": "restaurant_id", + "description": "Collection handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "6194" + "x-example": "collection-handle" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -449589,7 +465462,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/resy.restaurantResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { @@ -449604,8 +465477,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -449622,63 +465495,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Resy restaurant's profile", + "summary": "List Rothy's collection products", "tags": [ - "Resy" + "Rothy's" ] } }, - "/resy/search": { + "/rothys/pages": { "get": { "consumes": [ "application/json" ], - "description": "Searches restaurants by free-text term (name, cuisine, or neighborhood) near a latitude/longitude, optionally including live bookable-timeslot availability for a given date and party size.", - "operationId": "resy-search", + "description": "Lists static pages from Rothy's. `page` starts at 1 and `limit` defaults to 50, up to 250. Each item has `handle`, `title`, `url`, plain-text `content` and dates. A valid but empty page returns an empty `pages` array. With `transport_mode` set to `ssr_embedded`, items hold only `handle`, `url` and `updated_at`.", + "operationId": "rothys-pages", "parameters": [ { - "description": "Free-text search term (name, cuisine, or neighborhood)", - "in": "query", - "name": "term", - "type": "string", - "x-example": "carbone" - }, - { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 40.7128 - }, - { - "description": "Search center longitude", - "in": "query", - "name": "longitude", - "required": true, - "type": "number", - "x-example": -74.006 - }, - { - "description": "Reservation date, YYYY-MM-DD; when set, results include live timeslots", - "in": "query", - "name": "date", - "type": "string", - "x-example": "2026-09-20" - }, - { - "description": "Party size, default 2", + "description": "1-based page, defaults to 1", "in": "query", - "name": "party_size", + "name": "page", "type": "integer", - "x-example": 2 + "x-example": 1 }, { - "description": "Max results, default 10", + "description": "Maximum static pages, defaults to 50 and supports up to 250", "in": "query", - "name": "size", + "name": "limit", "type": "integer", - "x-example": 10 + "x-example": 50 } ], "produces": [ @@ -449688,7 +465531,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/resy.searchResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { @@ -449697,8 +465540,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -449715,27 +465558,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Resy restaurants near a location", + "summary": "List Rothy's static pages", "tags": [ - "Resy" + "Rothy's" ] } }, - "/retailmenot/autocomplete": { + "/rothys/pages/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns RetailMeNot's search-box suggestions for a free-text term: matching stores (with domains usable with /retailmenot/store) and cash-back offers. Group names are returned as data.", - "operationId": "retailmenot-autocomplete", + "description": "Returns a single Rothy's static page for the given `handle`: its title, URL, created, published and updated times, and body as plain text in `content`. A handle that does not exist returns 404. In `ssr_embedded` mode `id` is absent, because that source has no numeric id.", + "operationId": "rothys-page", "parameters": [ { - "description": "Store or brand search term", - "in": "query", - "name": "term", + "description": "Page handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "nike" + "x-example": "page-handle" } ], "produces": [ @@ -449745,7 +465588,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.autocompleteResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, "400": { @@ -449754,6 +465597,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -449772,19 +465621,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get RetailMeNot search suggestions", + "summary": "Get a Rothy's static page", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/blog-categories": { + "/rothys/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns every category of RetailMeNot's shopping and savings blog with its slug, post count, description, and URL. Use a slug as the category filter of /retailmenot/blog-posts.", - "operationId": "retailmenot-blog-categories", + "description": "Returns products from Rothy's's (https://www.rothys.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "rothys-products", + "parameters": [ + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + } + ], "produces": [ "application/json" ], @@ -449792,7 +465657,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.blogCategoriesResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -449813,27 +465684,27 @@ "ApiKeyAuth": [] } ], - "summary": "List RetailMeNot blog categories", + "summary": "List Rothy's products", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/blog-post": { + "/rothys/products/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one RetailMeNot blog post: metadata (title, author, dates, description, image, categories, tags), the article text as headed sections of paragraphs and lists, and the RetailMeNot stores and coupon categories the article links to (usable with /retailmenot/store and /retailmenot/category).", - "operationId": "retailmenot-blog-post", + "description": "Returns product detail for one Rothy's (https://www.rothys.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "rothys-product", "parameters": [ { - "description": "Post slug from /retailmenot/blog-posts (a trailing .html is accepted)", - "in": "query", - "name": "slug", + "description": "Product handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "black-friday-cyber-monday-restaurant-deals" + "x-example": "product-handle" } ], "produces": [ @@ -449843,7 +465714,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.blogPostResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { @@ -449876,78 +465747,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get a RetailMeNot blog post", + "summary": "Get a Rothy's product", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/blog-posts": { + "/rothys/products/{handle}/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of RetailMeNot blog posts (title, slug, URL, excerpt, description, author, published and modified dates, image, categories, and tags) with total and total pages, newest first by default. Filter by category slug, tag slug, and/or a search query; order by date, modified, title, or relevance (relevance requires query). A page past the end returns an empty list.", - "operationId": "retailmenot-blog-posts", + "description": "Returns recommended products for one Rothy's (https://www.rothys.com) product handle. The storefront URL is fixed server-side.", + "operationId": "rothys-product-recommendations", "parameters": [ { - "description": "Search post text", - "in": "query", - "name": "query", - "type": "string", - "x-example": "black friday" - }, - { - "description": "Category slug from /retailmenot/blog-categories", - "in": "query", - "name": "category", - "type": "string", - "x-example": "food" - }, - { - "description": "Tag slug from /retailmenot/blog-tags", - "in": "query", - "name": "tag", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, "type": "string", - "x-example": "black-friday" + "x-example": "product-handle" }, { - "default": "date", - "description": "Sort field", - "enum": [ - "date", - "modified", - "title", - "relevance" - ], + "description": "Maximum products, defaults to 10 and supports up to 20", "in": "query", - "name": "order_by", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 10 }, { - "default": "desc", - "description": "Sort direction", + "description": "Recommendation intent. Allowed values: related, complementary", "enum": [ - "desc", - "asc" + "related", + "complementary" ], "in": "query", - "name": "order", - "type": "string" - }, - { - "default": 1, - "description": "Page number, starting at 1", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": 20, - "description": "Posts per page (1-100)", - "in": "query", - "name": "page_size", - "type": "integer" + "name": "intent", + "type": "string", + "x-example": "related" } ], "produces": [ @@ -449957,7 +465795,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.blogPostsResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -449990,40 +465828,41 @@ "ApiKeyAuth": [] } ], - "summary": "List RetailMeNot blog posts", + "summary": "List Rothy's product recommendations", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/blog-tags": { + "/rothys/search/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of RetailMeNot blog tags ordered by post count, with slug, name, post count, and URL, plus total and total pages; optionally only tags matching a query. Use a slug as the tag filter of /retailmenot/blog-posts.", - "operationId": "retailmenot-blog-tags", + "description": "Returns products, collections, and query suggestions from Rothy's's (https://www.rothys.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "rothys-search-suggest", "parameters": [ { - "description": "Match tag names", + "description": "Search query", "in": "query", - "name": "query", + "name": "q", + "required": true, "type": "string", - "x-example": "black friday" + "x-example": "wool" }, { - "default": 1, - "description": "Page number, starting at 1", + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", "in": "query", - "name": "page", - "type": "integer" + "name": "types", + "type": "string", + "x-example": "product,collection,query" }, { - "default": 20, - "description": "Tags per page (1-100)", + "description": "Maximum results per type, defaults to 10 and supports up to 20", "in": "query", - "name": "page_size", - "type": "integer" + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -450033,7 +465872,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.blogTagsResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { @@ -450060,19 +465899,44 @@ "ApiKeyAuth": [] } ], - "summary": "List RetailMeNot blog tags", + "summary": "Get Rothy's search suggestions", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/cashback": { + "/rothys/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "Lists the offers on RetailMeNot's cash-back page, grouped into sections such as Today's Featured Cash Back, Top Cash Back and All Cash Back Offers. Each offer has its position, store name, domain and RetailMeNot URL, the cash-back rate in `discount`, and a title. It takes no parameters.", - "operationId": "retailmenot-cashback", + "description": "Lists URL entries from Rothy's sitemaps for one `type` (`all` by default, or `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, `other`), up to `limit` entries (default 50, max 250). Each has `loc`, `type`, `handle`, `lastmod`, `changefreq` and optional `images`.", + "operationId": "rothys-sitemap-urls", + "parameters": [ + { + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], + "in": "query", + "name": "type", + "type": "string", + "x-example": "products" + }, + { + "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + } + ], "produces": [ "application/json" ], @@ -450080,7 +465944,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.cashBackResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -450101,19 +465971,19 @@ "ApiKeyAuth": [] } ], - "summary": "List RetailMeNot cash-back offers", + "summary": "List Rothy's sitemap URLs", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/categories": { + "/rothys/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Lists RetailMeNot's coupon category tree as a flat list with no parameters. Each entry has `name`, `slug`, `url` and `level` (1 parent, 2 child, 3 grandchild); levels 2 and 3 also carry `parent_slug`. The `slug` is what RetailMeNot's category endpoint takes.", - "operationId": "retailmenot-categories", + "description": "Lists the child sitemaps in Rothy's sitemap index, each with its `loc` and a `type` (`products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`) inferred from the URL. No parameters are needed.", + "operationId": "rothys-sitemaps", "produces": [ "application/json" ], @@ -450121,7 +465991,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.categoriesResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -450142,36 +466018,19 @@ "ApiKeyAuth": [] } ], - "summary": "List RetailMeNot coupon categories", + "summary": "List Rothy's sitemaps", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/category": { + "/rothys/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a RetailMeNot category landing page: the featured offers across stores (24 per page, with page and total_pages), offer counts, and similar stores. Use a slug from /retailmenot/categories; a page past the end returns an empty offer list.", - "operationId": "retailmenot-category", - "parameters": [ - { - "description": "Category slug from /retailmenot/categories", - "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "clothing" - }, - { - "default": 1, - "description": "Offer page (24 offers per page; see total_pages)", - "in": "query", - "name": "page", - "type": "integer" - } - ], + "description": "Returns storefront metadata for Rothy's (https://www.rothys.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "rothys-store", "produces": [ "application/json" ], @@ -450179,7 +466038,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.categoryResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, "400": { @@ -450188,12 +466047,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -450212,27 +466065,32 @@ "ApiKeyAuth": [] } ], - "summary": "Get a RetailMeNot category's offers", + "summary": "Get Rothy's store metadata", "tags": [ - "RetailMeNot" + "Rothy's" ] } }, - "/retailmenot/deal-event": { + "/rottentomatoes/browse/filters": { "get": { "consumes": [ "application/json" ], - "description": "Returns one seasonal deal event page's offers grouped into the page's sections (top deals and per-category sections). Use a slug from /retailmenot/deal-events.", - "operationId": "retailmenot-deal-event", + "description": "Returns every filter and accepted value exposed by the selected live Rotten Tomatoes browse page. Call this before building filtered movie or TV browse requests; values differ by list and update with the site's menus.", + "operationId": "rottentomatoes-browse-filters", "parameters": [ { - "description": "Event slug from /retailmenot/deal-events", + "description": "Browse list: movies_in_theaters, movies_at_home, movies_coming_soon, tv_series_browse", + "enum": [ + "movies_in_theaters", + "movies_at_home", + "movies_coming_soon", + "tv_series_browse" + ], "in": "query", - "name": "slug", - "required": true, + "name": "list", "type": "string", - "x-example": "black-friday" + "x-example": "movies_in_theaters" } ], "produces": [ @@ -450242,7 +466100,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.dealEventResponseDoc" + "$ref": "#/definitions/rottentomatoes.browseFiltersResponseDoc" } }, "400": { @@ -450263,6 +466121,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450275,19 +466139,173 @@ "ApiKeyAuth": [] } ], - "summary": "Get a RetailMeNot deal event's offers", + "summary": "Rotten Tomatoes browse filter discovery", "tags": [ - "RetailMeNot" + "Rotten Tomatoes" ] } }, - "/retailmenot/deal-events": { + "/rottentomatoes/browse/movies": { "get": { "consumes": [ "application/json" ], - "description": "Lists the seasonal and holiday deal events linked from RetailMeNot's deals hub, such as Black Friday or Back-to-School, each with `name`, `slug` and `url`. The `slug` feeds the deal-event endpoint. Out-of-season events may list fewer offers. It takes no parameters.", - "operationId": "retailmenot-deal-events", + "description": "Returns movie rows from Rotten Tomatoes' browse listing. Use `/rottentomatoes/browse/filters` to discover current values for each list. Filters accept comma-separated values; pagination uses the opaque `after` cursor from the previous response.", + "operationId": "rottentomatoes-browse-movies", + "parameters": [ + { + "description": "Movie browse list: movies_in_theaters, movies_at_home, movies_coming_soon", + "enum": [ + "movies_in_theaters", + "movies_at_home", + "movies_coming_soon" + ], + "in": "query", + "name": "list", + "type": "string", + "x-example": "movies_in_theaters" + }, + { + "description": "Sort value from the selected list's browse/filters response", + "enum": [ + "popular", + "newest", + "top_box_office", + "a_z", + "critic_highest", + "critic_lowest", + "audience_highest", + "audience_lowest" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "popular" + }, + { + "description": "Comma-separated genre values from browse/filters", + "enum": [ + "action", + "adventure", + "animation", + "anime", + "biography", + "comedy", + "crime", + "documentary", + "drama", + "entertainment", + "faith_and_spirituality", + "fantasy", + "game_show", + "lgbtq", + "health_and_wellness", + "history", + "holiday", + "horror", + "house_and_garden", + "kids_and_family", + "music", + "musical", + "mystery_and_thriller", + "nature", + "news", + "reality", + "romance", + "sci_fi", + "short", + "soap", + "special_interest", + "sports", + "stand_up", + "talk_show", + "travel", + "variety", + "war", + "western" + ], + "in": "query", + "name": "genres", + "type": "string", + "x-example": "action,drama" + }, + { + "description": "Comma-separated content ratings from browse/filters", + "enum": [ + "g", + "pg", + "pg_13", + "r", + "nc_17", + "nr", + "ur" + ], + "in": "query", + "name": "ratings", + "type": "string", + "x-example": "pg_13" + }, + { + "description": "Comma-separated Popcornmeter values from browse/filters", + "enum": [ + "verified_hot", + "upright", + "spilled" + ], + "in": "query", + "name": "audience", + "type": "string", + "x-example": "upright" + }, + { + "description": "Comma-separated Tomatometer values from browse/filters", + "enum": [ + "certified_fresh", + "fresh", + "rotten" + ], + "in": "query", + "name": "critics", + "type": "string", + "x-example": "certified_fresh" + }, + { + "description": "Comma-separated streaming/service values from browse/filters", + "enum": [ + "theaters", + "fandango", + "apple-tv-plus", + "netflix", + "prime-video", + "disney-plus", + "max", + "peacock", + "hulu", + "paramount-plus", + "amc-plus", + "acorn-tv", + "apple-tv" + ], + "in": "query", + "name": "affiliates", + "type": "string", + "x-example": "netflix" + }, + { + "description": "Opaque next-page cursor returned in data.page_info.end_cursor", + "in": "query", + "name": "after", + "type": "string", + "x-example": "Mjk=" + }, + { + "description": "Rows to return, default 10, max 30", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], "produces": [ "application/json" ], @@ -450295,49 +466313,20 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.dealEventsResponseDoc" + "$ref": "#/definitions/rottentomatoes.browseResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List RetailMeNot seasonal deal events", - "tags": [ - "RetailMeNot" - ] - } - }, - "/retailmenot/home": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns RetailMeNot's homepage: featured offer sections (cash-back stores with rates, seasonal savings deals with store, offer type, discount, and title), today's top product deals (title, discount, image, and retailer product URL), and the help FAQ.", - "operationId": "retailmenot-home", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/retailmenot.homeResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -450345,6 +466334,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450357,38 +466352,165 @@ "ApiKeyAuth": [] } ], - "summary": "Get RetailMeNot's homepage offers", + "summary": "Rotten Tomatoes movie discovery rows", "tags": [ - "RetailMeNot" + "Rotten Tomatoes" ] } }, - "/retailmenot/store": { + "/rottentomatoes/browse/tv": { "get": { "consumes": [ "application/json" ], - "description": "Returns a store's RetailMeNot page: store details, shopper rating, category, offer counts, every listed coupon, sale, cash-back, and in-store offer (including the offers behind the page's \"show more\" button), similar stores, and FAQs. Coupon codes are only revealed on RetailMeNot after a click and are not returned. Set market=ca for a RetailMeNot Canada store page.", - "operationId": "retailmenot-store", + "description": "Returns TV series rows from Rotten Tomatoes' browse listing. Use `/rottentomatoes/browse/filters?list=tv_series_browse` to discover current filters; pagination uses the opaque `after` cursor from the previous response.", + "operationId": "rottentomatoes-browse-tv", "parameters": [ { - "description": "Store domain or RetailMeNot store URL", + "description": "TV browse list: tv_series_browse", + "enum": [ + "tv_series_browse" + ], "in": "query", - "name": "domain", - "required": true, + "name": "list", "type": "string", - "x-example": "target.com" + "x-example": "tv_series_browse" }, { - "default": "us", - "description": "us for RetailMeNot, ca for RetailMeNot Canada (stores from /retailmenot/stores with market=ca)", + "description": "Sort value from browse/filters", "enum": [ - "us", - "ca" + "popular", + "newest", + "a_z", + "critic_highest", + "critic_lowest", + "audience_highest", + "audience_lowest" ], "in": "query", - "name": "market", - "type": "string" + "name": "sort", + "type": "string", + "x-example": "popular" + }, + { + "description": "Comma-separated genre values from browse/filters", + "enum": [ + "action", + "adventure", + "animation", + "anime", + "biography", + "comedy", + "crime", + "documentary", + "drama", + "entertainment", + "faith_and_spirituality", + "fantasy", + "game_show", + "lgbtq", + "health_and_wellness", + "history", + "holiday", + "horror", + "house_and_garden", + "kids_and_family", + "music", + "musical", + "mystery_and_thriller", + "nature", + "news", + "reality", + "romance", + "sci_fi", + "short", + "soap", + "special_interest", + "sports", + "stand_up", + "talk_show", + "travel", + "variety", + "war", + "western" + ], + "in": "query", + "name": "genres", + "type": "string", + "x-example": "action,drama" + }, + { + "description": "Comma-separated content ratings from browse/filters", + "enum": [ + "tvy", + "tvy7", + "tvg", + "tvpg", + "tv14", + "tvma" + ], + "in": "query", + "name": "ratings", + "type": "string", + "x-example": "tv14" + }, + { + "description": "Comma-separated Popcornmeter values from browse/filters", + "enum": [ + "upright", + "spilled" + ], + "in": "query", + "name": "audience", + "type": "string", + "x-example": "upright" + }, + { + "description": "Comma-separated Tomatometer values from browse/filters", + "enum": [ + "fresh", + "rotten" + ], + "in": "query", + "name": "critics", + "type": "string", + "x-example": "fresh" + }, + { + "description": "Comma-separated streaming/service values from browse/filters", + "enum": [ + "theaters", + "fandango", + "apple-tv-plus", + "netflix", + "prime-video", + "disney-plus", + "max", + "peacock", + "hulu", + "paramount-plus", + "amc-plus", + "acorn-tv", + "apple-tv" + ], + "in": "query", + "name": "affiliates", + "type": "string", + "x-example": "netflix" + }, + { + "description": "Opaque next-page cursor returned in data.page_info.end_cursor", + "in": "query", + "name": "after", + "type": "string", + "x-example": "Mjk=" + }, + { + "description": "Rows to return, default 10, max 30", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -450398,7 +466520,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.storeResponseDoc" + "$ref": "#/definitions/rottentomatoes.browseResponseDoc" } }, "400": { @@ -450419,6 +466541,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450431,23 +466559,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a RetailMeNot store's coupons and offers", + "summary": "Rotten Tomatoes TV discovery rows", "tags": [ - "RetailMeNot" + "Rotten Tomatoes" ] } }, - "/retailmenot/stores": { + "/rottentomatoes/critics/authors": { "get": { "consumes": [ "application/json" ], - "description": "Returns every store in one letter of RetailMeNot's A-Z store directory, or of RetailMeNot Canada's store list with market=ca, with the domain to pass to /retailmenot/store (with the same market).", - "operationId": "retailmenot-stores", + "description": "Returns current or inactive critics from Rotten Tomatoes' public author directory. Browse one letter or search by name; use `next_cursor` as `after` or `previous_cursor` as `before`, as indicated by the corresponding page flag. The letter values come from the live directory controls.", + "operationId": "rottentomatoes-critics-authors", "parameters": [ { - "description": "Directory letter", + "description": "Directory letter. Omit when using search; default a.", "enum": [ + "#", "a", "b", "c", @@ -450473,25 +466602,47 @@ "w", "x", "y", - "z", - "0-9" + "z" ], "in": "query", "name": "letter", - "required": true, "type": "string", "x-example": "a" }, { - "default": "us", - "description": "us for RetailMeNot, ca for RetailMeNot Canada", - "enum": [ - "us", - "ca" - ], + "description": "Search critics by name; cannot be combined with letter", "in": "query", - "name": "market", - "type": "string" + "name": "search", + "type": "string", + "x-example": "Mae Abdulbaki" + }, + { + "description": "Include the site's inactive critics list", + "in": "query", + "name": "inactive", + "type": "boolean", + "x-example": false + }, + { + "description": "Opaque cursor from data.next_cursor", + "in": "query", + "name": "after", + "type": "string", + "x-example": "MQ==" + }, + { + "description": "Opaque cursor from data.previous_cursor; cannot be combined with after", + "in": "query", + "name": "before", + "type": "string", + "x-example": "MA==" + }, + { + "description": "Rows per page, default 100, range 1 to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -450501,7 +466652,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/retailmenot.storesResponseDoc" + "$ref": "#/definitions/rottentomatoes.criticsAuthorsResponseDoc" } }, "400": { @@ -450510,12 +466661,24 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450528,24 +466691,105 @@ "ApiKeyAuth": [] } ], - "summary": "List RetailMeNot stores by letter", + "summary": "Rotten Tomatoes critic directory", "tags": [ - "RetailMeNot" + "Rotten Tomatoes" ] } }, - "/reuters/article": { + "/rottentomatoes/editorial/content": { "get": { - "description": "Returns one normal Reuters article's public metadata and body paragraphs from a canonical article URL. Live blogs, video and podcast pages, and subscriber-only or bot-challenged responses are not supported.", - "operationId": "reuters-article", + "consumes": [ + "application/json" + ], + "description": "Lists paginated editorial records from the selected public content type. The pages collection lists public editorial section and campaign indexes. Use the editorial types endpoint to discover accepted type values.", + "operationId": "rottentomatoes-editorial-content", "parameters": [ { - "description": "Canonical Reuters article URL", + "description": "Editorial content type", + "enum": [ + "article", + "guide", + "gallery", + "hub-subpage", + "non-rt-publication", + "rt-hub", + "how-to", + "otg-article", + "prev", + "rt_poll", + "pages" + ], + "in": "query", + "name": "type", + "required": true, + "type": "string", + "x-example": "guide" + }, + { + "description": "Optional text filter; maximum 200 bytes", + "in": "query", + "name": "query", + "type": "string", + "x-example": "horror" + }, + { + "description": "One-based result page from 1 to 10000; default 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Rows per page, default 20, range 1 to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Optional editorial taxonomy; discover type support from /rottentomatoes/editorial/taxonomies", + "enum": [ + "categories", + "tags", + "related-movie-id", + "related-tv-season-id", + "related-tv-series-id", + "related-tv-episode-id", + "related-celebrity-id", + "publication", + "franchise", + "coauthors" + ], + "in": "query", + "name": "taxonomy", + "type": "string", + "x-example": "related-movie-id" + }, + { + "description": "Comma-separated positive term IDs; required with taxonomy", + "in": "query", + "name": "term_ids", + "type": "string", + "x-example": "121877,121876" + }, + { + "description": "Whether any or all selected terms must match; default OR", + "enum": [ + "AND", + "OR" + ], "in": "query", - "name": "url", - "required": true, + "name": "operator", "type": "string", - "x-example": "https://www.reuters.com/world/china/us-denmark-close-greenland-deal-sources-say-2026-09-18/" + "x-example": "OR" + }, + { + "description": "For categories only, include child categories; default false", + "in": "query", + "name": "include_children", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -450555,7 +466799,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reuters.articleResponseDoc" + "$ref": "#/definitions/rottentomatoes.editorialContentResponseDoc" } }, "400": { @@ -450576,6 +466820,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450588,24 +466838,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Reuters article's content", + "summary": "Rotten Tomatoes editorial content listing", "tags": [ - "Reuters" + "Rotten Tomatoes" ] } }, - "/reuters/articles": { + "/rottentomatoes/editorial/detail": { "get": { - "description": "Returns a page of recent Reuters articles: canonical URL, update time, and the lead image URL when available, plus the title when Reuters publishes one in this index (currently it does not). The index covers the most recent 10,000 articles. Use /reuters/news for a title-bearing feed of fresh stories, or /reuters/article for one article's title and text.", - "operationId": "reuters-articles", + "consumes": [ + "application/json" + ], + "description": "Returns the public body, paragraphs, headings, links, images, and video embeds from an Editorial article, gallery, guide, on-the-go article, or preview. Discover paths from editorial content collections. The response body_html preserves public Gutenberg/ranked-list markup.", + "operationId": "rottentomatoes-editorial-detail", "parameters": [ { - "description": "Results page, 100 items per page", + "description": "Discovered Editorial content path", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "path", + "required": true, + "type": "string", + "x-example": "/guide/all-brad-pitt-movies-ranked-by-tomatometer/" } ], "produces": [ @@ -450615,7 +466868,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reuters.articlesResponseDoc" + "$ref": "#/definitions/rottentomatoes.editorialDetailResponseDoc" } }, "400": { @@ -450636,6 +466889,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450648,78 +466907,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get recent Reuters articles", + "summary": "Rotten Tomatoes editorial article detail", "tags": [ - "Reuters" + "Rotten Tomatoes" ] } }, - "/reuters/author": { + "/rottentomatoes/editorial/search": { "get": { - "description": "Returns a Reuters author's profile by canonical `url` (`https://www.reuters.com/authors//`): name, company, editorial email, social accounts, profile image, `total_articles` and the first 20 recent articles, each with title, URL, summary, publication time and an image when the story card has one. Accounts the page does not list are absent.", - "operationId": "reuters-author", + "consumes": [ + "application/json" + ], + "description": "Searches public Rotten Tomatoes editorial content, including articles and guides. Results include content subtype plus total-page metadata.", + "operationId": "rottentomatoes-editorial-search", "parameters": [ { - "description": "Canonical Reuters author URL", + "description": "Editorial search text; maximum 200 bytes", "in": "query", - "name": "url", + "name": "query", "required": true, "type": "string", - "x-example": "https://www.reuters.com/authors/aditya-kalra/" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/reuters.authorResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } + "x-example": "horror" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get a Reuters author profile", - "tags": [ - "Reuters" - ] - } - }, - "/reuters/news": { - "get": { - "description": "Returns fresh Reuters headlines with title, canonical URL, publication and update times, and the lead image when Reuters publishes one. Covers the most recent stories from Reuters' public news feed.", - "operationId": "reuters-news", - "parameters": [ { - "description": "Results page, 50 items per page", + "description": "One-based result page from 1 to 10000; default 1", "in": "query", - "maximum": 60, - "minimum": 1, "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 + }, + { + "description": "Rows per page, default 10, range 1 to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -450729,7 +466951,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reuters.newsResponseDoc" + "$ref": "#/definitions/rottentomatoes.editorialSearchResponseDoc" } }, "400": { @@ -450750,6 +466972,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450762,53 +466990,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get fresh Reuters headlines", + "summary": "Rotten Tomatoes editorial search", "tags": [ - "Reuters" + "Rotten Tomatoes" ] } }, - "/reuters/section": { + "/rottentomatoes/editorial/section": { "get": { - "description": "Returns a page of one top-level Reuters section's recent articles: canonical URL, update time, lead image URL, and image caption. This feed does not publish titles; use /reuters/news for a title-bearing feed of fresh stories.", - "operationId": "reuters-section", + "consumes": [ + "application/json" + ], + "description": "Returns the rendered article cards for a discovered editorial page, RT hub, or hub subpage. Discover paths through editorial content types `pages`, `rt-hub`, and `hub-subpage`. Static pages use `articles_page` pagination upstream; hubs use `/page/{n}/`.", + "operationId": "rottentomatoes-editorial-section", "parameters": [ { - "description": "Top-level Reuters section", - "enum": [ - "world", - "business", - "markets", - "technology", - "sports", - "legal", - "sustainability", - "commentary", - "lifestyle", - "science", - "live", - "podcasts", - "media-center", - "investigations", - "fact-check", - "wider-image", - "city-memo", - "data", - "video" - ], + "description": "Discovered editorial section path", "in": "query", - "name": "section", + "name": "path", "required": true, "type": "string", - "x-example": "world" + "x-example": "/countdown/" }, { - "description": "Results page, 100 items per page", + "description": "One-based page, default 1", "in": "query", - "maximum": 50, - "minimum": 1, "name": "page", - "type": "integer" + "type": "integer", + "x-example": 2 } ], "produces": [ @@ -450818,7 +467027,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reuters.sectionResponseDoc" + "$ref": "#/definitions/rottentomatoes.editorialSectionResponseDoc" } }, "400": { @@ -450839,46 +467048,8 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get recent articles in a Reuters section", - "tags": [ - "Reuters" - ] - } - }, - "/reuters/sections": { - "get": { - "description": "Lists the top-level Reuters sections accepted by the `section` parameter of `/reuters/section`, returned under `items`. Each entry has a `slug`, a display `name` and the landing-page `url`. Takes no parameters.", - "operationId": "reuters-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/reuters.sectionsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -450895,19 +467066,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Reuters sections", + "summary": "Rotten Tomatoes editorial section archive", "tags": [ - "Reuters" + "Rotten Tomatoes" ] } }, - "/reverb/categories": { + "/rottentomatoes/editorial/taxonomies": { "get": { "consumes": [ "application/json" ], - "description": "Returns Reverb's full category/product-type taxonomy -- the value space reverb-search's own category/product_type parameters accept. product_types is a fixed, exhaustive 14-value closed set; categories is the full, exhaustive leaf-category value space as of the request (306 values as of 2026-10-15). A leaf category's slug is NOT always globally unique across product types -- always pass a category's own product_type field alongside its slug to reverb-search, not category alone, when disambiguation matters.", - "operationId": "reverb-categories", + "description": "Returns the complete set of public editorial term vocabularies accepted by the term discovery endpoint, with the content types each taxonomy filters.", + "operationId": "rottentomatoes-editorial-taxonomies", "produces": [ "application/json" ], @@ -450915,7 +467086,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.categoriesResponseDoc" + "$ref": "#/definitions/rottentomatoes.editorialTaxonomiesResponseDoc" } }, "429": { @@ -450924,6 +467095,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450936,27 +467113,137 @@ "ApiKeyAuth": [] } ], - "summary": "List Reverb's category/product-type taxonomy", + "summary": "Rotten Tomatoes editorial taxonomy discovery", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/reverb/listing": { + "/rottentomatoes/editorial/terms": { "get": { "consumes": [ "application/json" ], - "description": "Returns full listing-detail data for one Reverb listing: description, every photo, shipping/payment/return policies, and the seller's shop reputation -- richer than the flattened summary reverb-search returns per listing. id is the listing's numeric id, from a search result's own listings[].id field.", - "operationId": "reverb-listing", + "description": "Pages public terms from one discovered editorial taxonomy. All taxonomy values are listed by `/rottentomatoes/editorial/taxonomies`; `parent` is accepted only for `categories`, while `offset` is supported by all other taxonomies.", + "operationId": "rottentomatoes-editorial-terms", "parameters": [ { - "description": "Listing id, from a search result's own listings[].id field", + "description": "Editorial taxonomy value", + "enum": [ + "categories", + "tags", + "related-movie-id", + "related-tv-season-id", + "related-tv-series-id", + "related-tv-episode-id", + "related-celebrity-id", + "publication", + "franchise", + "coauthors" + ], "in": "query", - "name": "id", + "name": "taxonomy", "required": true, + "type": "string", + "x-example": "coauthors" + }, + { + "description": "Optional term search; maximum 200 bytes", + "in": "query", + "name": "search", + "type": "string", + "x-example": "RT Staff" + }, + { + "description": "One-based page, default 1", + "in": "query", + "name": "page", "type": "integer", - "x-example": 36356670 + "x-example": 1 + }, + { + "description": "Terms per page, default 20, range 1 to 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "When true, omit terms with no assigned content", + "in": "query", + "name": "hide_empty", + "type": "boolean", + "x-example": true + }, + { + "description": "Term sort direction", + "enum": [ + "asc", + "desc" + ], + "in": "query", + "name": "order", + "type": "string", + "x-example": "desc" + }, + { + "description": "Term sort key", + "enum": [ + "id", + "include", + "name", + "slug", + "include_slugs", + "term_group", + "description", + "count" + ], + "in": "query", + "name": "orderby", + "type": "string", + "x-example": "count" + }, + { + "description": "Comma-separated positive term IDs to include", + "in": "query", + "name": "include", + "type": "string", + "x-example": "10732,10733" + }, + { + "description": "Comma-separated positive term IDs to exclude", + "in": "query", + "name": "exclude", + "type": "string", + "x-example": "10733" + }, + { + "description": "Optional term slug or comma-separated slugs", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "cap-rt-staff" + }, + { + "description": "Filter to terms assigned to this content record", + "in": "query", + "name": "post", + "type": "integer", + "x-example": 297765 + }, + { + "description": "Zero-based offset; accepted except for categories", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 100 + }, + { + "description": "Category parent ID; accepted only for categories", + "in": "query", + "name": "parent", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -450966,7 +467253,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.listingResponseDoc" + "$ref": "#/definitions/rottentomatoes.editorialTermsResponseDoc" } }, "400": { @@ -450987,6 +467274,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -450999,19 +467292,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Reverb listing", + "summary": "Rotten Tomatoes editorial taxonomy terms", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/reverb/makes": { + "/rottentomatoes/editorial/types": { "get": { "consumes": [ "application/json" ], - "description": "Returns Reverb's full manufacturer/make list -- the value space reverb-search's own make parameter accepts (2,795 values as of 2026-10-15). Does not include a model list -- Reverb's own /api/listings silently ignores a model filter value, so reverb-search has no Model parameter and a model list would have no corresponding filter to use it with.", - "operationId": "reverb-makes", + "description": "Lists the editorial content types Rotten Tomatoes accepts as `type` on its editorial content endpoint, each with a `value` and `label` (for example `article`, `guide`, `gallery`, `rt-hub` and `pages`). The set was last verified on 2026-09-26, shown in `verified_at`. The `pages` type returns metadata and permalinks, not page bodies.", + "operationId": "rottentomatoes-editorial-types", "produces": [ "application/json" ], @@ -451019,7 +467312,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.makesResponseDoc" + "$ref": "#/definitions/rottentomatoes.editorialContentTypesResponseDoc" } }, "429": { @@ -451028,6 +467321,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -451040,68 +467339,33 @@ "ApiKeyAuth": [] } ], - "summary": "List Reverb's manufacturer/make list", + "summary": "Rotten Tomatoes editorial content types", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/reverb/price-guide": { + "/rottentomatoes/episode": { "get": { "consumes": [ "application/json" ], - "description": "Returns one gear model's Reverb Price Guide detail: its specific finish/year variants, monthly average sale-price history, and a page of individual recent sales. slug is the model's slug, from reverb-price-guide-search's own models[].slug field. canonical_product_id optionally scopes to one specific variant from this model's own canonical_products[].id field (from a prior call without it); omitting it aggregates price history and recent sales across every variant, a broader, more heavily-sampled view. condition optionally scopes by Reverb's own Price Guide condition scale (listed below) -- a separate, 6-value enum from reverb-search's own listing condition field. range selects how far back the price history/recent-sales window looks. An unknown slug returns a typed not-found error.", - "operationId": "reverb-price-guide", + "description": "Returns Rotten Tomatoes TV episode metadata, scorecard data, parent series/season metadata, and public video metadata. Pass exactly one of `path` or `url`.", + "operationId": "rottentomatoes-episode", "parameters": [ { - "description": "Model slug, from reverb-price-guide-search's own models[].slug field", - "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "fender-american-professional-ii-stratocaster" - }, - { - "description": "Specific finish/year variant id, from this model's own canonical_products[].id field", - "in": "query", - "name": "canonical_product_id", - "type": "string", - "x-example": "320883" - }, - { - "description": "Price Guide condition filter", - "enum": [ - "mint", - "excellent", - "very-good", - "good", - "fair", - "poor" - ], + "description": "Rotten Tomatoes episode path", "in": "query", - "name": "condition", + "name": "path", "type": "string", - "x-example": "excellent" + "x-example": "/tv/breaking_bad/s01/e01" }, { - "description": "Date-range window, defaults to years_1", - "enum": [ - "months_6", - "years_1", - "years_2" - ], + "description": "Absolute https://www.rottentomatoes.com episode URL", "in": "query", - "name": "range", + "name": "url", "type": "string", - "x-example": "years_1" - }, - { - "description": "Recent sales to return, defaults to 24, maximum 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 24 + "x-example": "https://www.rottentomatoes.com/tv/breaking_bad/s01/e01" } ], "produces": [ @@ -451111,7 +467375,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.priceGuideResponseDoc" + "$ref": "#/definitions/rottentomatoes.episodeResponseDoc" } }, "400": { @@ -451132,6 +467396,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -451144,34 +467414,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a gear model's Reverb Price Guide detail", + "summary": "Rotten Tomatoes episode detail", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/reverb/price-guide-search": { + "/rottentomatoes/movie": { "get": { "consumes": [ "application/json" ], - "description": "Searches Reverb's Price Guide (reverb.com/price-guide) for gear models by free-text brand/model query (e.g. \"fender stratocaster\"). Each result's slug is the value reverb-price-guide's own slug parameter accepts. query is full-text relevance search, not an exact match -- unlike reverb-search's own query, a nonsensical query is not guaranteed to return an empty result; the upstream can fall back to loosely related or generically popular models instead, so a low result count should be treated cautiously rather than read as \"no real matches.\"", - "operationId": "reverb-price-guide-search", + "description": "Returns Rotten Tomatoes movie metadata, scorecard data, and representative audience reviews. Pass exactly one of `path` or `url`.", + "operationId": "rottentomatoes-movie", "parameters": [ { - "description": "Free-text brand/model search query", + "description": "Rotten Tomatoes movie path", "in": "query", - "name": "query", - "required": true, + "name": "path", "type": "string", - "x-example": "fender stratocaster" + "x-example": "/m/inception" }, { - "description": "Results to return, defaults to 24, maximum 100", + "description": "Absolute https://www.rottentomatoes.com movie URL", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 24 + "name": "url", + "type": "string", + "x-example": "https://www.rottentomatoes.com/m/inception" } ], "produces": [ @@ -451181,7 +467450,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.priceGuideSearchResponseDoc" + "$ref": "#/definitions/rottentomatoes.movieResponseDoc" } }, "400": { @@ -451190,12 +467459,24 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -451208,91 +467489,59 @@ "ApiKeyAuth": [] } ], - "summary": "Search Reverb's Price Guide model catalog", + "summary": "Rotten Tomatoes movie detail", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/reverb/search": { + "/rottentomatoes/movie/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Searches or browses Reverb's (reverb.com) marketplace for new and used musical instruments and gear. query, category, product_type, make, min_price, and max_price are all optional and combine as an AND -- a free-text query can be combined with category/product_type/make/price filters in the same request, or every field can be omitted to browse the full active catalog. category accepts a leaf slug from reverb-categories' own categories[].slug field; product_type is a fixed, closed 14-value enum (listed below) that should be passed together with category from the SAME reverb-categories entry, since a category slug alone is not always globally unique (e.g. \"cables\" exists under both Accessories and Home Audio). An unrecognized category value is silently ignored by the upstream (returns the unfiltered catalog, not zero results or an error) -- a known upstream quirk. make accepts a manufacturer name from reverb-makes' own makes[] field and is a confirmed, real filter. A query with genuinely zero matches returns a well-formed empty result rather than an error.", - "operationId": "reverb-search", + "description": "Returns critic or audience reviews from Rotten Tomatoes, including pagination metadata. Pass exactly one of `path` or `url`. Supported `type` values are `critics`, `top-critics`, `audience`, and `verified-audience`.", + "operationId": "rottentomatoes-movie-reviews", "parameters": [ { - "description": "Free-text search query", + "description": "Rotten Tomatoes movie path", "in": "query", - "name": "query", + "name": "path", "type": "string", - "x-example": "fender stratocaster" + "x-example": "/m/inception" }, { - "description": "Category facet filter, from reverb-categories' own categories[].slug field -- pass together with product_type from the same entry", + "description": "Absolute https://www.rottentomatoes.com movie URL", "in": "query", - "name": "category", + "name": "url", "type": "string", - "x-example": "amp-covers" + "x-example": "https://www.rottentomatoes.com/m/inception" }, { - "description": "Product-type filter", + "description": "Review type: critics, top-critics, audience, verified-audience", "enum": [ - "accessories", - "acoustic-guitars", - "amps", - "band-and-orchestra", - "bass-guitars", - "dj-and-lighting-gear", - "drums-and-percussion", - "effects-and-pedals", - "electric-guitars", - "folk-instruments", - "home-audio", - "keyboards-and-synths", - "parts", - "pro-audio" + "critics", + "top-critics", + "audience", + "verified-audience" ], "in": "query", - "name": "product_type", - "type": "string", - "x-example": "accessories" - }, - { - "description": "Manufacturer name filter, from reverb-makes' own makes[] field", - "in": "query", - "name": "make", + "name": "type", "type": "string", - "x-example": "Fender" - }, - { - "description": "Minimum price (inclusive), in USD", - "in": "query", - "name": "min_price", - "type": "number", - "x-example": 50 - }, - { - "description": "Maximum price (inclusive), in USD", - "in": "query", - "name": "max_price", - "type": "number", - "x-example": 500 + "x-example": "critics" }, { - "description": "One-based page number, defaults to 1", + "description": "Reviews to return, default 10, max 20", "in": "query", - "name": "page", + "name": "limit", "type": "integer", - "x-example": 1 + "x-example": 10 }, { - "description": "Results per page, defaults to 24, maximum 50 (the upstream's own silent cap)", + "description": "Pagination cursor from data.page_info.end_cursor", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 24 + "name": "after", + "type": "string" } ], "produces": [ @@ -451302,7 +467551,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.searchResponseDoc" + "$ref": "#/definitions/rottentomatoes.reviewsResponseDoc" } }, "400": { @@ -451311,12 +467560,24 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -451329,48 +467590,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search or browse Reverb musical-instrument listings", + "summary": "Rotten Tomatoes movie reviews", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/reverb/shop": { + "/rottentomatoes/person": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Reverb shop's public profile plus a page of its current active listings (Reverb's own \"shop\" view of a seller). slug is the shop's slug, from a listing's own shop link or reverb.com/shop/{slug}. query is an optional free-text filter scoping the listings sub-page to a keyword within that shop. An unknown slug returns a typed not-found error.", - "operationId": "reverb-shop", + "description": "Returns Rotten Tomatoes celebrity/person metadata and filmography rows. Pass exactly one of `path` or `url`.", + "operationId": "rottentomatoes-person", "parameters": [ { - "description": "Shop slug", + "description": "Rotten Tomatoes person path", "in": "query", - "name": "slug", - "required": true, + "name": "path", "type": "string", - "x-example": "mtsmusic" + "x-example": "/celebrity/christopher_nolan" }, { - "description": "Free-text filter scoping the shop's own listings sub-page", + "description": "Absolute https://www.rottentomatoes.com person URL", "in": "query", - "name": "query", + "name": "url", "type": "string", - "x-example": "pickup" - }, - { - "description": "One-based page number for the shop's listings, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Listings per page, defaults to 24, maximum 50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 24 + "x-example": "https://www.rottentomatoes.com/celebrity/christopher_nolan" } ], "produces": [ @@ -451380,7 +467626,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.shopResponseDoc" + "$ref": "#/definitions/rottentomatoes.personResponseDoc" } }, "400": { @@ -451401,6 +467647,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -451413,34 +467665,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Reverb shop's profile and active listings", + "summary": "Rotten Tomatoes person detail and filmography", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/reverb/shop-feedback": { + "/rottentomatoes/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of a Reverb shop's individual buyer feedback entries (rating, message, and the order each review was left for) -- reputation detail reverb-shop does not carry (reverb-shop only exposes the aggregate feedback_count/rating_percentage). slug is the shop's slug, from a listing's own shop link or reverb.com/shop/{slug}. An unknown slug returns a typed not-found error.", - "operationId": "reverb-shop-feedback", + "description": "Searches Rotten Tomatoes movies by the required `query`, returning up to `limit` rows (default 10, max 20). Each row has the title, URL, release year or start and end year, `tomatometer_score` and sentiment, `certified_fresh`, cast and image. No matches returns an empty `results` array.", + "operationId": "rottentomatoes-search", "parameters": [ { - "description": "Shop slug", + "description": "Search query", "in": "query", - "name": "slug", + "name": "query", "required": true, "type": "string", - "x-example": "mtsmusic" + "x-example": "inception" }, { - "description": "One-based page number, defaults to 1", + "description": "Rows to return, default 10, max 20", "in": "query", - "name": "page", + "name": "limit", "type": "integer", - "x-example": 1 + "x-example": 10 } ], "produces": [ @@ -451450,7 +467702,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/reverb.shopFeedbackResponseDoc" + "$ref": "#/definitions/rottentomatoes.searchResponseDoc" } }, "400": { @@ -451471,6 +467723,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -451483,33 +467741,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Reverb shop's buyer feedback", + "summary": "Rotten Tomatoes movie search", "tags": [ - "Reverb" + "Rotten Tomatoes" ] } }, - "/rightmove/agents": { + "/rottentomatoes/season": { "get": { "consumes": [ "application/json" ], - "description": "Lists estate-agent branches from Rightmove's estate-agents directory for a location, with branch display name, brand, address, telephones, sales/lettings flags, logo, and a link to the branch profile. Pagination follows Rightmove's current directory pages, whose result counts can vary.", - "operationId": "rightmove-agents", + "description": "Returns Rotten Tomatoes TV season metadata, scorecard data, parent series metadata, and episode rows. Pass exactly one of `path` or `url`.", + "operationId": "rottentomatoes-season", "parameters": [ { - "description": "Rightmove location identifier from autocomplete (numeric location id required)", + "description": "Rotten Tomatoes season path", "in": "query", - "name": "location", - "required": true, + "name": "path", "type": "string", - "x-example": "REGION^87490" + "x-example": "/tv/breaking_bad/s01" }, { - "description": "Result page (default 1)", + "description": "Absolute https://www.rottentomatoes.com season URL", "in": "query", - "name": "page", - "type": "integer" + "name": "url", + "type": "string", + "x-example": "https://www.rottentomatoes.com/tv/breaking_bad/s01" } ], "produces": [ @@ -451517,37 +467775,37 @@ ], "responses": { "200": { - "description": "Estate agent directory", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.AgentsResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rottentomatoes.seasonResponseDoc" } }, "400": { - "description": "Invalid query parameter", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -451558,27 +467816,33 @@ "ApiKeyAuth": [] } ], - "summary": "List Rightmove estate agents for a location", + "summary": "Rotten Tomatoes season detail", "tags": [ - "Rightmove" + "Rotten Tomatoes" ] } }, - "/rightmove/agents/{id}": { + "/rottentomatoes/series": { "get": { "consumes": [ "application/json" ], - "description": "Returns one estate-agent branch profile from Rightmove, including address, telephones, service flags, industry affiliations, and the branch's own sales and lettings listing previews. The slug segments in Rightmove agent URLs are cosmetic; the branch resolves by numeric id alone.", - "operationId": "rightmove-agent-branch", + "description": "Returns Rotten Tomatoes TV series metadata and scorecard data. Pass exactly one of `path` or `url`.", + "operationId": "rottentomatoes-series", "parameters": [ { - "description": "Rightmove agent branch id", - "in": "path", - "name": "id", - "required": true, + "description": "Rotten Tomatoes series path", + "in": "query", + "name": "path", "type": "string", - "x-example": "12070" + "x-example": "/tv/breaking_bad" + }, + { + "description": "Absolute https://www.rottentomatoes.com series URL", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.rottentomatoes.com/tv/breaking_bad" } ], "produces": [ @@ -451586,37 +467850,37 @@ ], "responses": { "200": { - "description": "Agent branch details", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.AgentBranchResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rottentomatoes.seriesResponseDoc" } }, "400": { - "description": "Invalid branch id", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -451627,33 +467891,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rightmove estate agent branch details", + "summary": "Rotten Tomatoes series detail", "tags": [ - "Rightmove" + "Rotten Tomatoes" ] } }, - "/rightmove/autocomplete": { + "/rottentomatoes/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "Returns Rightmove location suggestions for the required `query` (up to 200 characters). `limit` defaults to 10 and is capped at 20. Each result has an `id` such as `REGION^87490`, a `name`, a `full_name` when Rightmove gives one, and an `entity_type` such as `REGION` or `POSTCODE`. Use the `id` as `location` in Rightmove search.", - "operationId": "rightmove-autocomplete", + "description": "Returns a page of URLs from one child sitemap. Discover valid `name` values with `rottentomatoes-sitemaps`; use offset/limit to page through the complete sitemap.", + "operationId": "rottentomatoes-sitemap-urls", "parameters": [ { - "description": "Location query", + "description": "Sitemap name returned by /rottentomatoes/sitemaps", "in": "query", - "name": "query", + "name": "name", "required": true, "type": "string", - "x-example": "London" + "x-example": "movie_0" }, { - "description": "Maximum suggestions to return (default 10, max 20)", + "description": "Zero-based offset, default 0", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "URLs to return, default 100, max 500", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -451661,37 +467933,37 @@ ], "responses": { "200": { - "description": "Autocomplete suggestions", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.AutocompleteResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rottentomatoes.sitemapURLResponseDoc" } }, "400": { - "description": "Invalid query parameter", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -451702,157 +467974,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rightmove location autocomplete suggestions", + "summary": "Rotten Tomatoes sitemap URL page", "tags": [ - "Rightmove" + "Rotten Tomatoes" ] } }, - "/rightmove/commercial/search": { + "/rottentomatoes/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Search Rightmove's commercial property listings for sale or to let, with price, floor-area (sq ft), and commercial-property-type filters. For to-let listings the price amount follows the listing's own frequency (monthly or yearly).", - "operationId": "rightmove-commercial-search", - "parameters": [ - { - "description": "Rightmove location identifier from autocomplete", - "in": "query", - "name": "location", - "required": true, - "type": "string", - "x-example": "REGION^87490" - }, - { - "description": "Result page (default 1)", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Listing status (default buy)", - "enum": [ - "buy", - "let" - ], - "in": "query", - "name": "status", - "type": "string" - }, - { - "description": "Minimum price in whole GBP units, not pence", - "in": "query", - "name": "min_price", - "type": "integer" - }, - { - "description": "Maximum price in whole GBP units, not pence", - "in": "query", - "name": "max_price", - "type": "integer" - }, - { - "description": "Minimum floor area in square feet", - "in": "query", - "name": "min_size", - "type": "integer" - }, - { - "description": "Maximum floor area in square feet", - "in": "query", - "name": "max_size", - "type": "integer" - }, - { - "description": "Commercial property type filter. Accepts one or more comma-separated values.", - "enum": [ - "business-park", - "office", - "serviced-office", - "convenience-store", - "hairdresser-barber-shop", - "post-office", - "retail_property_high_street_", - "retail_property_out_of_town_", - "retail_property_pop_up_", - "retail_property_retail_park_", - "retail_property_shopping_centre_", - "shop", - "showroom", - "trade-counter", - "bar-nightclub", - "cafe", - "leisure-facility", - "guest-house", - "hotel", - "hospitality", - "pub", - "restaurant", - "takeaway", - "other", - "distribution-warehouse", - "factory", - "heavy-industrial", - "industrial-park", - "light-industrial", - "storage", - "warehouse", - "workshop", - "industrial-development", - "land", - "farm", - "residential-development", - "healthcare-facility", - "childcare-facility", - "commercial-property", - "garage", - "mixed-use", - "commercial-development", - "petrol_station", - "place_of_worship" - ], - "in": "query", - "name": "property_type", - "type": "string" - } - ], + "description": "Returns the live sitemap index and every named child sitemap, including movie, TV series, season, episode, person, critic, publication, browse-list, and static route inventories.", + "operationId": "rottentomatoes-sitemaps", "produces": [ "application/json" ], "responses": { "200": { - "description": "Commercial property search results", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.SearchResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rottentomatoes.sitemapIndexResponseDoc" } }, - "400": { - "description": "Invalid query parameter", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -451863,84 +468021,70 @@ "ApiKeyAuth": [] } ], - "summary": "Search Rightmove commercial property", + "summary": "Rotten Tomatoes sitemap discovery", "tags": [ - "Rightmove" + "Rotten Tomatoes" ] } }, - "/rightmove/new-homes/search": { + "/rover/search": { "get": { "consumes": [ "application/json" ], - "description": "Search Rightmove's new-homes-for-sale listings for a location, with price, bedroom, bathroom, and property-type filters. Results are individual new-build homes and plots (with development flags), not development-level cards.", - "operationId": "rightmove-new-homes-search", + "description": "Searches Rover's public sitter/walker listings by location and service type, returning sitter summaries (name, profile image, rating, review count, repeat-client count, years of experience, neighborhood/city/state, starting price, Star Sitter status, and a short bio).", + "operationId": "rover-sitter-search", "parameters": [ { - "description": "Rightmove location identifier from autocomplete", + "description": "Free-text address, city, or zip code, e.g. \\", "in": "query", "name": "location", "required": true, "type": "string", - "x-example": "REGION^87490" - }, - { - "description": "Result page (default 1)", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Minimum price in whole GBP units, not pence", - "in": "query", - "name": "min_price", - "type": "integer" + "x-example": "Seattle, WA" }, { - "description": "Maximum price in whole GBP units, not pence", + "description": "Service category to search. One of: `overnight-boarding`, `overnight-traveling`, `drop-in`, `doggy-day-care`, `dog-walking`.", "in": "query", - "name": "max_price", - "type": "integer" + "name": "service_type", + "required": true, + "type": "string", + "x-example": "overnight-boarding" }, { - "description": "Minimum bedrooms", + "description": "1-based result page. Defaults to 1.", "in": "query", - "name": "min_bedrooms", - "type": "integer" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Maximum bedrooms", + "description": "Filter by pet species. One of: `dog`, `cat`.", "in": "query", - "name": "max_bedrooms", - "type": "integer" + "name": "pet_type", + "type": "string", + "x-example": "dog" }, { - "description": "Minimum bathrooms", + "description": "Minimum starting rate in whole dollars.", "in": "query", - "name": "min_bathrooms", - "type": "number" + "name": "min_price", + "type": "integer", + "x-example": 20 }, { - "description": "Maximum bathrooms", + "description": "Maximum starting rate in whole dollars.", "in": "query", - "name": "max_bathrooms", - "type": "number" + "name": "max_price", + "type": "integer", + "x-example": 100 }, { - "description": "Property type filter. Accepts one or more comma-separated values.", - "enum": [ - "detached", - "semi-detached", - "terraced", - "flat", - "bungalow", - "land", - "park-home" - ], + "description": "Restrict results to Rover's \\", "in": "query", - "name": "property_type", - "type": "string" + "name": "star_sitter_only", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -451948,37 +468092,31 @@ ], "responses": { "200": { - "description": "New homes search results", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.SearchResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rover.searchResponseDoc" } }, "400": { - "description": "Invalid query parameter", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -451989,27 +468127,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Rightmove new homes for sale", + "summary": "Search Rover sitters and walkers", "tags": [ - "Rightmove" + "Rover" ] } }, - "/rightmove/properties/{id}": { + "/rover/sitter/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Rightmove listing by `id`: title, address, price and `price_text`, bedrooms, bathrooms, receptions, property type, status, description, features, floor plan, EPC rating, council tax band, tenure, agent reviews and nearby schools with Ofsted ratings. Removed or invalid ids return 404.", - "operationId": "rightmove-property", + "description": "Returns a Rover sitter/walker profile: name, photo, bio, star rating, review count, repeat-client count, years of experience, neighborhood/city/state, starting price, Star Sitter status, the services offered with per-service pricing, and public review excerpts from the sitter's own profile page.", + "operationId": "rover-sitter-profile", "parameters": [ { - "description": "Rightmove property ID", + "description": "Rover sitter profile slug, the trailing path segment of a search result's profile_url field", "in": "path", - "name": "id", + "name": "slug", "required": true, "type": "string", - "x-example": "92527095" + "x-example": "tianci-d-staycation-for-your-dog" } ], "produces": [ @@ -452017,43 +468155,31 @@ ], "responses": { "200": { - "description": "Property details", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.PropertyResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rover.profileResponseDoc" } }, "400": { - "description": "Invalid property ID", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Property not found", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -452064,164 +468190,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rightmove property details", + "summary": "Get Rover sitter profile", "tags": [ - "Rightmove" + "Rover" ] } }, - "/rightmove/search": { + "/rover/trainer-search": { "get": { "consumes": [ "application/json" ], - "description": "Searches Rightmove listings for a required `location` id, for sale (default) or `to_let`, 1-indexed by `page`. Filter by price, bedrooms, bathrooms, `property_type`, `radius`, `must_have`, `dont_show` and `tenure_types`; `sort` defaults to `newest_listed`. Returns `total` and results with price, address, beds, baths, size and tenure.", - "operationId": "rightmove-search", + "description": "Searches Rover's public dog trainer listings by location, returning trainer summaries (name, profile image, headline, experience details, rating, review count, repeat-client count, years of experience, city/state/zip, starting price, training methodology, and skill/behavior tags).", + "operationId": "rover-trainer-search", "parameters": [ { - "description": "Rightmove location identifier from autocomplete", + "description": "Free-text address, city, or zip code, e.g. \\", "in": "query", "name": "location", "required": true, "type": "string", - "x-example": "REGION^87490" - }, - { - "description": "Result page (default 1)", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Listing status (default for_sale)", - "enum": [ - "for_sale", - "to_let" - ], - "in": "query", - "name": "status", - "type": "string", - "x-example": "for_sale" - }, - { - "description": "Minimum price in whole GBP units, not pence", - "in": "query", - "name": "min_price", - "type": "integer" - }, - { - "description": "Maximum price in whole GBP units, not pence", - "in": "query", - "name": "max_price", - "type": "integer" - }, - { - "description": "Minimum bedrooms", - "in": "query", - "name": "min_bedrooms", - "type": "integer" - }, - { - "description": "Maximum bedrooms", - "in": "query", - "name": "max_bedrooms", - "type": "integer" - }, - { - "description": "Minimum bathrooms", - "in": "query", - "name": "min_bathrooms", - "type": "number" - }, - { - "description": "Maximum bathrooms", - "in": "query", - "name": "max_bathrooms", - "type": "number" - }, - { - "description": "Property type filter. Accepts one or more comma-separated values. private-halls (Student Halls) mainly returns results for status=to_let.", - "enum": [ - "detached", - "semi-detached", - "terraced", - "flat", - "bungalow", - "land", - "park-home", - "private-halls" - ], - "in": "query", - "name": "property_type", - "type": "string" - }, - { - "description": "Search radius in miles around location, default 0 (this area only)", - "enum": [ - 0, - 0.25, - 0.5, - 1, - 3, - 5, - 10, - 15, - 20, - 30, - 40 - ], - "in": "query", - "name": "radius", - "type": "number" - }, - { - "description": "Require listings to have these attributes. Accepts one or more comma-separated values.", - "enum": [ - "garden", - "parking", - "retirement", - "newHome", - "sharedOwnership", - "auction" - ], - "in": "query", - "name": "must_have", - "type": "string" - }, - { - "description": "Exclude listings with these attributes. Accepts one or more comma-separated values.", - "enum": [ - "newHome", - "retirement", - "sharedOwnership", - "auction" - ], - "in": "query", - "name": "dont_show", - "type": "string" - }, - { - "description": "Tenure filter. Accepts one or more comma-separated values.", - "enum": [ - "FREEHOLD", - "LEASEHOLD", - "SHARE_OF_FREEHOLD" - ], - "in": "query", - "name": "tenure_types", - "type": "string" - }, - { - "description": "Result sort order, default newest_listed", - "enum": [ - "lowest_price", - "highest_price", - "newest_listed", - "oldest_listed" - ], - "in": "query", - "name": "sort", - "type": "string" + "x-example": "Seattle, WA" } ], "produces": [ @@ -452229,37 +468218,31 @@ ], "responses": { "200": { - "description": "Property search results", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.SearchResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rover.trainerSearchResponseDoc" } }, "400": { - "description": "Invalid query parameter", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -452270,68 +468253,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Rightmove properties", + "summary": "Search Rover dog trainers", "tags": [ - "Rightmove" + "Rover" ] } }, - "/rightmove/student/search": { + "/rover/trainer/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Search Rightmove's student-accommodation listings for a location, with monthly-rent, bedroom, and furnishing filters. Prices are monthly rents in whole GBP units.", - "operationId": "rightmove-student-search", + "description": "Returns a Rover dog trainer profile: name, photo, headline, experience and availability details, training methodology, rating, review count, repeat-client count, years of training, skill/behavior tags, and education credentials.", + "operationId": "rover-trainer-profile", "parameters": [ { - "description": "Rightmove location identifier from autocomplete", - "in": "query", - "name": "location", + "description": "Rover trainer profile slug, the trailing path segment of a trainer search result's profile_url field", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "REGION^87490" - }, - { - "description": "Result page (default 1)", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Minimum monthly rent in whole GBP units, not pence", - "in": "query", - "name": "min_price", - "type": "integer" - }, - { - "description": "Maximum monthly rent in whole GBP units, not pence", - "in": "query", - "name": "max_price", - "type": "integer" - }, - { - "description": "Minimum bedrooms", - "in": "query", - "name": "min_bedrooms", - "type": "integer" - }, - { - "description": "Maximum bedrooms", - "in": "query", - "name": "max_bedrooms", - "type": "integer" - }, - { - "description": "Furnishing filter", - "enum": [ - "furnished", - "unfurnished", - "part_furnished" - ], - "in": "query", - "name": "furnish_type", - "type": "string" + "x-example": "madison-h-over-6-years-of-pet-care-experience" } ], "produces": [ @@ -452339,37 +468281,31 @@ ], "responses": { "200": { - "description": "Student accommodation search results", + "description": "OK", "schema": { - "allOf": [ - { - "$ref": "#/definitions/app.Response" - }, - { - "properties": { - "data": { - "$ref": "#/definitions/rightmove.SearchResponse" - } - }, - "type": "object" - } - ] + "$ref": "#/definitions/rover.trainerProfileResponseDoc" } }, "400": { - "description": "Invalid query parameter", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -452380,24 +468316,24 @@ "ApiKeyAuth": [] } ], - "summary": "Search Rightmove student accommodation", + "summary": "Get Rover dog trainer profile", "tags": [ - "Rightmove" + "Rover" ] } }, - "/rnz/article": { + "/rte/article": { "get": { - "description": "Returns public RNZ news article metadata and body paragraphs from a canonical rnz.co.nz/news/
// article URL. RNZ has no paywall, so the full body is returned.", - "operationId": "rnz-article", + "description": "Returns public RTÉ News article metadata and body paragraphs from a canonical rte.ie/news article URL. RTÉ News articles are free to read; paywalled is omitted.", + "operationId": "rte-article", "parameters": [ { - "description": "Canonical RNZ news article URL", + "description": "Canonical RTÉ News article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.rnz.co.nz/news/regions_auckland/1569602/auckland-man-used-missing-20-point-1-million-lotto-ticket-as-bookmark-for-almost-two-months" + "x-example": "https://www.rte.ie/news/politics/2026/0924/1592808-budget-fuel-excise/" } ], "produces": [ @@ -452434,30 +468370,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get RNZ article content", + "summary": "Get RTÉ News article content", "tags": [ - "RNZ" + "RTÉ News" ] } }, - "/rnz/author": { + "/rte/author": { "get": { - "description": "Returns one RNZ reporter's public profile: name, role, bio, email, X/Twitter handle, photo, total story count, and the first page of their news stories.", - "operationId": "rnz-author", + "description": "Returns an RTÉ News author's profile by canonical `url` (`https://www.rte.ie/author/-/`, the author link on an article byline): name, headshot, `role` and recent articles, each with title, URL, summary, publication time and image. `role` is the job title the page shows, for example Political Correspondent, and is omitted when there is none.", + "operationId": "rte-author", "parameters": [ { - "description": "Author slug, e.g. ellen-o-dwyer", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "ellen-o-dwyer" - }, - { - "description": "Canonical rnz.co.nz/authors/ URL; alternative to slug", + "description": "Canonical RTÉ author URL", "in": "query", "name": "url", + "required": true, "type": "string", - "x-example": "https://www.rnz.co.nz/authors/ellen-o-dwyer" + "x-example": "https://www.rte.ie/author/1110632-barry-lenihan/" } ], "produces": [ @@ -452467,7 +468397,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.rnzAuthorResponseDoc" + "$ref": "#/definitions/publicnews.rteAuthorResponseDoc" } }, "400": { @@ -452494,45 +468424,55 @@ "ApiKeyAuth": [] } ], - "summary": "Get an RNZ author profile", + "summary": "Get an RTÉ News author profile", "tags": [ - "RNZ" + "RTÉ News" ] } }, - "/rnz/headlines": { + "/rte/headlines": { "get": { - "description": "Returns the latest RNZ (Radio New Zealand) stories for one section. `section` is required and takes one of 19 slugs such as `news`, `national`, `political`, `business`, `pacific`, `te-manu-korihi` or `weather`; others return a 400. Each item has its title, URL, summary and publication time. Smaller sections can carry items from earlier weeks, so check `published_at`.", - "operationId": "rnz-headlines", + "description": "Returns the latest RTÉ News stories for one section. `section` is required and takes one of 29 slugs such as `ireland`, `world`, `politics`, `dublin`, `courts` or `nuacht` (Irish-language); others return a 400. Each item has its title, URL, summary, publication time and image. Small sections like `science` return only a handful of items.", + "operationId": "rte-headlines", "parameters": [ { - "description": "RNZ section slug", + "description": "RTÉ News section slug", "enum": [ - "news", - "national", + "ireland", "world", - "political", + "politics", "business", - "pacific", - "sport", - "health", - "education", - "community", - "country", "regional", - "te-manu-korihi", - "on-the-inside", - "in-depth", - "indonz", - "ldr", - "chinese", - "weather" + "connacht", + "dublin", + "leinster", + "munster", + "ulster", + "middle-east", + "europe", + "uk", + "us", + "ukraine", + "a-european-perspective", + "nuacht", + "newslens", + "analysis-and-comment", + "investigations-unit", + "crime", + "courts", + "education", + "health", + "environment", + "science", + "technology", + "weather", + "your-money" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "news" + "x-example": "ireland" } ], "produces": [ @@ -452563,16 +468503,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get RNZ section headlines", + "summary": "Get RTÉ News section headlines", "tags": [ - "RNZ" + "RTÉ News" ] } }, - "/rnz/news": { + "/rte/news": { "get": { - "description": "Returns RNZ (Radio New Zealand) top stories from its all-news feed: title, article URL, summary and publication time in UTC. Takes no parameters. Lifestyle guides, audio programme pages and section hubs are left out, and article URLs use RNZ's current section names.", - "operationId": "rnz-news", + "description": "Returns fresh RTÉ News top stories from its public news feed. Scope is RTÉ News (rte.ie/news) only, not the RTÉ Player, radio, sport or entertainment sections.", + "operationId": "rte-news", "produces": [ "application/json" ], @@ -452583,6 +468523,12 @@ "$ref": "#/definitions/publicnews.newsResponseDoc" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -452595,16 +468541,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get RNZ top stories", + "summary": "Get RTÉ News top stories", "tags": [ - "RNZ" + "RTÉ News" ] } }, - "/rnz/sections": { + "/rte/sections": { "get": { - "description": "Lists the 19 RNZ news sections that `rnz-headlines` accepts, such as `news`, `national`, `political`, `pacific` and `te-manu-korihi`. Each entry has a `slug`, a display `name` and the section's feed `url`. RNZ's programme-schedule and recipe feeds are not included.", - "operationId": "rnz-sections", + "description": "Lists the 29 RTÉ News section hubs that `rte-headlines` accepts, such as `ireland`, `politics`, `dublin`, `ukraine` and `investigations-unit`. Each entry has a `slug`, a display `name` and the feed `url`. The list is curated to hubs with their own article feed, so narrower topic pages are not included.", + "operationId": "rte-sections", "produces": [ "application/json" ], @@ -452621,31 +468567,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get RNZ sections", + "summary": "Get RTÉ News sections", "tags": [ - "RNZ" + "RTÉ News" ] } }, - "/roblox/badges": { + "/salon/article": { "get": { - "description": "Returns one cursor-paginated page of public badge metadata for a Roblox experience. Pass next_cursor back unchanged as cursor. No user-awarded badge data is returned.", - "operationId": "roblox-badges", + "description": "Returns a Salon article by canonical `url` on `www.salon.com` in the `/YYYY/MM/DD//` form: title, description, section, authors, publication and update times, image, body `paragraphs` and a `paywalled` flag.", + "operationId": "salon-article", "parameters": [ { - "description": "Positive Roblox universe id", + "description": "Canonical Salon article URL", "in": "query", - "minimum": 1, - "name": "universe_id", + "name": "url", "required": true, - "type": "integer", - "x-example": 383310974 - }, - { - "description": "Opaque cursor returned by a previous response", - "in": "query", - "name": "cursor", - "type": "string" + "type": "string", + "x-example": "https://www.salon.com/2026/09/23/trump-admin-spars-with-iran-at-un-meeting/" } ], "produces": [ @@ -452655,7 +468594,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/roblox.badgesResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -452664,8 +468603,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -452682,25 +468621,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Roblox experience badges", + "summary": "Get Salon article content", "tags": [ - "Roblox" + "Salon" ] } }, - "/roblox/game": { + "/salon/author": { "get": { - "description": "Returns public catalog detail for one Roblox experience, including aggregate votes and its public icon. This endpoint does not return player, account, purchase, or server data.", - "operationId": "roblox-game", + "description": "Returns a Salon writer's profile by canonical `url` (`https://www.salon.com/writer/`): name, `job_title`, `bio`, `image_url`, `same_as` links and a list of articles. Each article carries only a title and URL, with no date or category. Job title, photo and `same_as` appear only when the writer page shows them.", + "operationId": "salon-author", "parameters": [ { - "description": "Positive Roblox universe id", + "description": "Canonical Salon writer URL", "in": "query", - "minimum": 1, - "name": "universe_id", + "name": "url", "required": true, - "type": "integer", - "x-example": 383310974 + "type": "string", + "x-example": "https://www.salon.com/writer/troy_farah" } ], "produces": [ @@ -452710,7 +468648,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/roblox.gameResponseDoc" + "$ref": "#/definitions/publicnews.salonAuthorResponseDoc" } }, "400": { @@ -452725,12 +468663,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -452743,30 +468675,58 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Roblox experience", + "summary": "Get a Salon writer profile", "tags": [ - "Roblox" + "Salon" ] } }, - "/roblox/rankings": { + "/salon/headlines": { "get": { - "description": "Returns one Roblox game ranking shelf, chosen by `sort_id`: `top-trending` (default), `up-and-coming`, `top-playing-now`, `fun-with-friends` or `top-revisited`. Each experience has its name, creator, genre, player count, up and down votes, maturity label, minimum age and URL. Shelves are global, not personalised.", - "operationId": "roblox-rankings", + "description": "Returns the latest Salon stories for one section. `section` is required and takes one of 32 slugs, including `home`, `news-and-politics`, `politics`, `opinion`, `culture`, `science-and-health` and `technology`. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "salon-headlines", "parameters": [ { - "default": "top-trending", - "description": "Ranking shelf: top-trending, up-and-coming, top-playing-now, fun-with-friends, top-revisited", + "description": "Salon RSS section slug", "enum": [ - "top-trending", - "up-and-coming", - "top-playing-now", - "fun-with-friends", - "top-revisited" + "home", + "audio", + "blog", + "business", + "culture", + "economy", + "economy-and-innovation", + "elections", + "entertainment", + "food", + "guides", + "innovation", + "life", + "life-stories", + "media", + "money", + "news", + "news-and-politics", + "opinion", + "oscars_2012", + "politics", + "satire", + "science-and-health", + "sex-and-love", + "social", + "sustainability", + "sxsw_2013", + "technology", + "the_brief", + "video", + "vpn", + "working_ahead" ], "in": "query", - "name": "sort_id", - "type": "string" + "name": "section", + "required": true, + "type": "string", + "x-example": "home" } ], "produces": [ @@ -452776,7 +468736,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/roblox.rankingsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -452785,12 +468745,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -452803,32 +468757,16 @@ "ApiKeyAuth": [] } ], - "summary": "List Roblox game rankings", + "summary": "Get Salon section headlines", "tags": [ - "Roblox" + "Salon" ] } }, - "/roblox/search": { + "/salon/news": { "get": { - "description": "Searches Roblox experiences for `q` (1 to 256 characters). Each result has its universe and place ids, name, creator, genre, `player_count`, up and down votes, maturity and URL. Pass `next_page` back unchanged as `page_token` for the next page. No account, friend, purchase or inventory data is included.", - "operationId": "roblox-search", - "parameters": [ - { - "description": "Experience search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "Adopt Me" - }, - { - "description": "Opaque page token returned by a previous search", - "in": "query", - "name": "page_token", - "type": "string" - } - ], + "description": "Returns Salon's latest top stories across the site. Takes no parameters, and `salon-headlines` narrows by section instead. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "salon-news", "produces": [ "application/json" ], @@ -452836,13 +468774,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/roblox.searchResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -452863,26 +468795,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search Roblox experiences", + "summary": "Get Salon top stories", "tags": [ - "Roblox" + "Salon" ] } }, - "/rollingstone/article": { + "/salon/sections": { "get": { - "description": "Returns a Rolling Stone article by canonical `url`, a `rollingstone.com` address ending in a numeric article id: title, description, section, authors, publication and update times, image, body `paragraphs` and a `paywalled` flag.", - "operationId": "rollingstone-article", - "parameters": [ - { - "description": "Canonical Rolling Stone article URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.rollingstone.com/music/music-news/taylor-swift-the-life-of-a-showgirl-deluxe-album-1235630197/" - } - ], + "description": "Lists the 32 Salon sections that `salon-headlines` accepts, from `home` and `news-and-politics` to `working_ahead`. Each entry has a `slug`, a display `name` and the section's feed `url`. The list includes older event slugs such as `oscars_2012` and `sxsw_2013`.", + "operationId": "salon-sections", "produces": [ "application/json" ], @@ -452890,25 +468812,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -452917,24 +468821,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rolling Stone article content", + "summary": "Get Salon RSS sections", "tags": [ - "Rolling Stone" + "Salon" ] } }, - "/rollingstone/author": { + "/samsclub/category": { "get": { - "description": "Returns a Rolling Stone author's byline metadata, biography, and recent articles (sourced from the author's own public RSS feed) from a canonical author URL.", - "operationId": "rollingstone-author", + "consumes": [ + "application/json" + ], + "description": "Returns a Sam's Club category or collection page's product grid, with real page-based pagination. id accepts a bare numeric category id (from a nav link's /browse/{id} URL) or a full /browse/{slug}/{id} URL copied from samsclub.com -- only the trailing id is used. Returns products with name, brand, pricing, availability, rating, and image. An id samsclub.com does not recognize returns a genuine zero-result response rather than an error.", + "operationId": "samsclub-category", "parameters": [ { - "description": "Canonical Rolling Stone author URL", + "description": "Sam's Club category id, or a /browse/{slug}/{id} URL", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.rollingstone.com/author/cheyenne-roundtree/" + "x-example": "15660127" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -452944,7 +468858,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.rollingStoneAuthorResponseDoc" + "$ref": "#/definitions/samsclub.categoryResponseDoc" } }, "400": { @@ -452953,8 +468867,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -452971,60 +468885,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Rolling Stone author profile", + "summary": "Browse a Sam's Club category or collection", "tags": [ - "Rolling Stone" + "Sam's Club" ] } }, - "/rollingstone/headlines": { + "/samsclub/content/{id}": { "get": { - "description": "Returns the latest Rolling Stone stories for one section. `section` is required and takes one of 34 slugs, including `music`, `music-news`, `music-album-reviews`, `politics`, `tv-movie-reviews`, `culture` and `rs-gaming`. Each item has its title, URL, summary, publication time and author.", - "operationId": "rollingstone-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one Sam's Club curated content/landing page (e.g. a seasonal savings hub or a \"New Arrivals\" page) -- distinct data from GET /samsclub/category's flat, paginated product grid. id accepts a bare numeric content page id (from a nav link's /cp/{id} URL) or a full /cp/{slug}/{id} URL copied from samsclub.com -- only the trailing id is used. Returns a title, breadcrumb, named curated product shelves, and a category-navigation tile grid. There is no pagination -- a content page's shelves are a fixed, hand-curated set. An id samsclub.com does not recognize returns a 404, unlike GET /samsclub/category's zero-result response for the same situation.", + "operationId": "samsclub-content", "parameters": [ { - "description": "Rolling Stone section slug", - "enum": [ - "music", - "music-news", - "music-features", - "music-lists", - "music-album-reviews", - "music-live-reviews", - "music-country", - "music-latin", - "music-pictures", - "politics", - "politics-news", - "politics-features", - "politics-lists", - "tv-movies", - "tv-movie-news", - "tv-movie-features", - "tv-movie-lists", - "tv-movie-recaps", - "tv-movie-reviews", - "culture", - "culture-news", - "culture-features", - "culture-lists", - "rs-gaming", - "product-recommendations", - "pro", - "artist-you-need-to-know", - "song-to-know", - "photo-gallery", - "creators", - "rs-recommends", - "rs-essentials", - "audio-awards", - "gift-guide" - ], - "in": "query", - "name": "section", + "description": "Numeric Sam's Club content page id, from a /cp/{slug}/{id} URL", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "music" + "x-example": "16050279" } ], "produces": [ @@ -453034,7 +468915,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/samsclub.contentResponseDoc" } }, "400": { @@ -453043,6 +468924,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -453055,16 +468948,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rolling Stone section headlines", + "summary": "Get a Sam's Club curated content or landing page", "tags": [ - "Rolling Stone" + "Sam's Club" ] } }, - "/rollingstone/news": { + "/samsclub/departments": { "get": { - "description": "Returns Rolling Stone's latest top stories across the site. Takes no parameters, and `rollingstone-headlines` narrows by section instead. Each item has its title, URL, summary, publication time and author.", - "operationId": "rollingstone-news", + "consumes": [ + "application/json" + ], + "description": "Returns Sam's Club's full department/category taxonomy, as shown on its own \"All Departments\" page: every top-level department with its own subcategory list. Each link's type is \"browse\" (pairs directly with GET /samsclub/category), \"cp\" (a content/landing page that does not reliably carry a product grid), or empty (an unrecognized link shape).", + "operationId": "samsclub-departments", "produces": [ "application/json" ], @@ -453072,7 +468968,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/samsclub.departmentsResponseDoc" } }, "429": { @@ -453093,59 +468989,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rolling Stone top stories", - "tags": [ - "Rolling Stone" - ] - } - }, - "/rollingstone/sections": { - "get": { - "description": "Returns the public Rolling Stone section inventory: every music, politics, TV & movies, and culture subsection plus the site's standalone verticals (Rolling Stone Pro, product recommendations) and tag hubs, each linking to its public RSS feed.", - "operationId": "rollingstone-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Rolling Stone sections", + "summary": "List Sam's Club departments and categories", "tags": [ - "Rolling Stone" + "Sam's Club" ] } }, - "/rothys/collections": { + "/samsclub/product/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from Rothy's (https://www.rothys.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", - "operationId": "rothys-collections", + "description": "Returns one Sam's Club product's full detail: name, brand, description, category breadcrumb, pricing, availability, images, aggregate rating and review count, and the club's own item number. id is the numeric product id from a Sam's Club product page's /ip/ URL.", + "operationId": "samsclub-product", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum collections, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "description": "Numeric Sam's Club product id, from a product page's /ip/{slug}/{id} URL", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "13610014888" } ], "produces": [ @@ -453155,7 +469019,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/samsclub.productResponseDoc" } }, "400": { @@ -453164,6 +469028,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -453182,41 +469052,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Rothy's collections", + "summary": "Get a Sam's Club product's full detail", "tags": [ - "Rothy's" + "Sam's Club" ] } }, - "/rothys/collections/{handle}/products": { + "/samsclub/product/{id}/related": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one Rothy's (https://www.rothys.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", - "operationId": "rothys-collection-products", + "description": "Returns the related-item carousels shown on a Sam's Club product page, each a named shelf (e.g. \"Members also considered\", \"Items you may like\") of products with pricing, rating, and image. id is the numeric product id from a Sam's Club product page's /ip/ URL. An unrecognized id is not distinguished from a known one -- it still returns generic fallback shelves rather than an error.", + "operationId": "samsclub-product-related", "parameters": [ { - "description": "Collection handle", + "description": "Numeric Sam's Club product id, from a product page's /ip/{slug}/{id} URL", "in": "path", - "name": "handle", + "name": "id", "required": true, "type": "string", - "x-example": "collection-handle" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "13610014888" } ], "produces": [ @@ -453226,7 +469082,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/samsclub.relatedItemsResponseDoc" } }, "400": { @@ -453235,12 +469091,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -453259,33 +469109,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Rothy's collection products", + "summary": "Get a Sam's Club product's related items", "tags": [ - "Rothy's" + "Sam's Club" ] } }, - "/rothys/pages": { + "/sbsnews/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists static pages from Rothy's. `page` starts at 1 and `limit` defaults to 50, up to 250. Each item has `handle`, `title`, `url`, plain-text `content` and dates. A valid but empty page returns an empty `pages` array. With `transport_mode` set to `ssr_embedded`, items hold only `handle`, `url` and `updated_at`.", - "operationId": "rothys-pages", + "description": "Returns public SBS News article metadata and body paragraphs from a canonical article URL, including standard, Insight, and Dateline stories.", + "operationId": "sbsnews-article", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Canonical SBS News article URL", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.sbs.com.au/news/article/example-story/abc123xyz" } ], "produces": [ @@ -453295,7 +469136,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -453304,8 +469145,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -453322,27 +469163,31 @@ "ApiKeyAuth": [] } ], - "summary": "List Rothy's static pages", + "summary": "Get SBS News article content", "tags": [ - "Rothy's" + "SBS News" ] } }, - "/rothys/pages/{handle}": { + "/sbsnews/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a single Rothy's static page for the given `handle`: its title, URL, created, published and updated times, and body as plain text in `content`. A handle that does not exist returns 404. In `ssr_embedded` mode `id` is absent, because that source has no numeric id.", - "operationId": "rothys-page", + "description": "Returns an SBS News byline collection by canonical `url`, for example `https://www.sbs.com.au/news/collection/jennifer-scherer`: name, headshot, biography and the articles on the requested archive `page` (1-based, default 1), with `has_next_page` for paging. Articles are limited to SBS News article, Insight and Dateline links.", + "operationId": "sbsnews-author", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", + "description": "Canonical SBS News author collection URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "https://www.sbs.com.au/news/collection/jennifer-scherer" + }, + { + "default": 1, + "description": "1-based author archive page number", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -453352,7 +469197,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/publicnews.sbsnewsAuthorResponseDoc" } }, "400": { @@ -453367,12 +469212,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -453385,33 +469224,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Rothy's static page", + "summary": "Get an SBS News author profile", "tags": [ - "Rothy's" + "SBS News" ] } }, - "/rothys/products": { + "/sbsnews/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns products from Rothy's's (https://www.rothys.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "rothys-products", + "description": "Returns current SBS News headlines for one section. `section` is required and takes one of 15 slugs from `sbsnews-sections`, such as `top`, `latest`, `australia`, `world`, `politics`, `indigenous`, `cost-of-living` or `sport`. Every item has its title and URL. The `top`, `latest`, `australia` and `world` sections also include summary, publication time and image.", + "operationId": "sbsnews-headlines", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Section slug from sbsnews-sections", + "enum": [ + "top", + "latest", + "australia", + "world", + "politics", + "indigenous", + "environment", + "life", + "cost-of-living", + "immigration", + "health-and-wellbeing", + "sport", + "education", + "technology-and-social-media", + "arts-and-entertainment" + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "section", + "required": true, + "type": "string", + "x-example": "top" } ], "produces": [ @@ -453421,7 +469268,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -453430,12 +469277,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -453448,29 +469289,16 @@ "ApiKeyAuth": [] } ], - "summary": "List Rothy's products", + "summary": "Get SBS News section headlines", "tags": [ - "Rothy's" + "SBS News" ] } }, - "/rothys/products/{handle}": { + "/sbsnews/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns product detail for one Rothy's (https://www.rothys.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "rothys-product", - "parameters": [ - { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" - } - ], + "description": "Returns the current SBS News Top Stories. Takes no parameters. Each item has its title, canonical SBS News article URL and summary, with publication time, author and image when present.", + "operationId": "sbsnews-news", "produces": [ "application/json" ], @@ -453478,25 +469306,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "503": { @@ -453511,45 +469321,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Rothy's product", + "summary": "Get SBS News top stories", "tags": [ - "Rothy's" + "SBS News" ] } }, - "/rothys/products/{handle}/recommendations": { + "/sbsnews/sections": { "get": { - "consumes": [ + "description": "Lists the SBS News sections that `sbsnews-headlines` accepts: the seven primary navigation sections, the Top Stories feed and featured topic and collection pages. Each entry has a `slug`, a display `name` and a `url`. News Podcasts and video surfaces are not included.", + "operationId": "sbsnews-sections", + "produces": [ "application/json" ], - "description": "Returns recommended products for one Rothy's (https://www.rothys.com) product handle. The storefront URL is fixed server-side.", - "operationId": "rothys-product-recommendations", - "parameters": [ - { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" - }, + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ { - "description": "Maximum products, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, + "ApiKeyAuth": [] + } + ], + "summary": "Get SBS News sections", + "tags": [ + "SBS News" + ] + } + }, + "/sciencealert/article": { + "get": { + "description": "Returns a ScienceAlert article by absolute canonical `url`: title, description, section, authors, publication and update times, image, the cleaned body `paragraphs` and a `paywalled` flag. Section pages and author listing URLs are rejected.", + "operationId": "sciencealert-article", + "parameters": [ { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], + "description": "Canonical ScienceAlert article URL", "in": "query", - "name": "intent", + "name": "url", + "required": true, "type": "string", - "x-example": "related" + "x-example": "https://www.sciencealert.com/the-sun-and-moon-can-trigger-earthquakes-and-scientists-may-finally-know-how" } ], "produces": [ @@ -453559,7 +469374,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -453574,12 +469389,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -453592,41 +469401,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Rothy's product recommendations", + "summary": "Get ScienceAlert article content", "tags": [ - "Rothy's" + "ScienceAlert" ] } }, - "/rothys/search/suggest": { + "/sciencealert/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns products, collections, and query suggestions from Rothy's's (https://www.rothys.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "rothys-search-suggest", + "description": "Returns a ScienceAlert author's profile and one page of articles, from an author listing `url` in the form `https://www.sciencealert.com//page/`; the first observed page is `/page/0`. The response has the name, `slug`, biography, image, social links, that page's articles, and `page` and `has_next_page` for paging.", + "operationId": "sciencealert-author", "parameters": [ { - "description": "Search query", + "description": "Canonical ScienceAlert author listing URL, e.g. /michelle-starr/page/0", "in": "query", - "name": "q", + "name": "url", "required": true, "type": "string", - "x-example": "wool" - }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" - }, - { - "description": "Maximum results per type, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "x-example": "https://www.sciencealert.com/michelle-starr/page/0" } ], "produces": [ @@ -453636,7 +469428,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + "$ref": "#/definitions/publicnews.scienceAlertAuthorResponseDoc" } }, "400": { @@ -453645,8 +469437,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -453663,42 +469455,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rothy's search suggestions", + "summary": "Get a ScienceAlert author profile", "tags": [ - "Rothy's" + "ScienceAlert" ] } }, - "/rothys/sitemap/urls": { + "/sciencealert/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists URL entries from Rothy's sitemaps for one `type` (`all` by default, or `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, `other`), up to `limit` entries (default 50, max 250). Each has `loc`, `type`, `handle`, `lastmod`, `changefreq` and optional `images`.", - "operationId": "rothys-sitemap-urls", + "description": "Returns the latest ScienceAlert stories for one section. `section` is required and takes `space`, `health`, `environment`, `humans`, `tech`, `nature`, `physics` or `this-week-in-science`; other values are rejected. Each item has its title and URL.", + "operationId": "sciencealert-headlines", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "description": "Section slug", "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" + "space", + "health", + "environment", + "humans", + "tech", + "nature", + "physics", + "this-week-in-science" ], "in": "query", - "name": "type", + "name": "section", + "required": true, "type": "string", - "x-example": "products" - }, - { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "space" } ], "produces": [ @@ -453708,7 +469492,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -453717,12 +469501,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -453735,19 +469513,16 @@ "ApiKeyAuth": [] } ], - "summary": "List Rothy's sitemap URLs", + "summary": "Get ScienceAlert section headlines", "tags": [ - "Rothy's" + "ScienceAlert" ] } }, - "/rothys/sitemaps": { + "/sciencealert/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the child sitemaps in Rothy's sitemap index, each with its `loc` and a `type` (`products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`) inferred from the URL. No parameters are needed.", - "operationId": "rothys-sitemaps", + "description": "Returns ScienceAlert's latest top stories across the site. Takes no parameters, and `sciencealert-headlines` narrows by section instead. Each item has its title, URL, summary, author and publication time.", + "operationId": "sciencealert-news", "produces": [ "application/json" ], @@ -453755,13 +469530,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -453782,19 +469551,52 @@ "ApiKeyAuth": [] } ], - "summary": "List Rothy's sitemaps", + "summary": "Get ScienceAlert top stories", "tags": [ - "Rothy's" + "ScienceAlert" ] } }, - "/rothys/store": { + "/sciencealert/sections": { "get": { - "consumes": [ + "description": "Lists the eight top-level ScienceAlert sections that `sciencealert-headlines` accepts: `space`, `health`, `environment`, `humans`, `tech`, `nature`, `physics` and `this-week-in-science`. Each entry has a `slug`, a display `name` and the section page `url`.", + "operationId": "sciencealert-sections", + "produces": [ "application/json" ], - "description": "Returns storefront metadata for Rothy's (https://www.rothys.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "rothys-store", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get ScienceAlert sections", + "tags": [ + "ScienceAlert" + ] + } + }, + "/scmp/article": { + "get": { + "description": "Returns one public South China Morning Post article's metadata and body paragraphs from a canonical article URL. `content_locked` and `paywall_types` are the upstream's own restricted-access signals for that article, reported exactly as the site returns them; the body returned here is the same one the site's own page serves to an anonymous visitor. An article whose page genuinely withholds its body is reported as a restricted-access error instead of a hollow or truncated response.", + "operationId": "scmp-article", + "parameters": [ + { + "description": "Canonical SCMP article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.scmp.com/news/hong-kong/society/article/3368530/example-slug" + } + ], "produces": [ "application/json" ], @@ -453802,7 +469604,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/scmp.articleResponseDoc" } }, "400": { @@ -453811,6 +469613,18 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -453829,32 +469643,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rothy's store metadata", + "summary": "Get an SCMP article's content", "tags": [ - "Rothy's" + "SCMP" ] } }, - "/rottentomatoes/browse/filters": { + "/scmp/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns every filter and accepted value exposed by the selected live Rotten Tomatoes browse page. Call this before building filtered movie or TV browse requests; values differ by list and update with the site's menus.", - "operationId": "rottentomatoes-browse-filters", + "description": "Returns one South China Morning Post author/reporter's public profile -- name, role, biography, areas of expertise, languages, location, headshot, and contact/social links -- plus their recent articles, from a canonical author URL.", + "operationId": "scmp-author", "parameters": [ { - "description": "Browse list: movies_in_theaters, movies_at_home, movies_coming_soon, tv_series_browse", - "enum": [ - "movies_in_theaters", - "movies_at_home", - "movies_coming_soon", - "tv_series_browse" - ], + "description": "Canonical scmp.com/author/ URL", "in": "query", - "name": "list", + "name": "url", + "required": true, "type": "string", - "x-example": "movies_in_theaters" + "x-example": "https://www.scmp.com/author/matthew-cheng" } ], "produces": [ @@ -453864,7 +469670,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.browseFiltersResponseDoc" + "$ref": "#/definitions/scmp.authorResponseDoc" } }, "400": { @@ -453885,12 +469691,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -453903,171 +469703,114 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes browse filter discovery", + "summary": "Get an SCMP author/reporter profile", "tags": [ - "Rotten Tomatoes" + "SCMP" ] } }, - "/rottentomatoes/browse/movies": { + "/scmp/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns movie rows from Rotten Tomatoes' browse listing. Use `/rottentomatoes/browse/filters` to discover current values for each list. Filters accept comma-separated values; pagination uses the opaque `after` cursor from the previous response.", - "operationId": "rottentomatoes-browse-movies", + "description": "Returns the current article listing for one South China Morning Post section: each story's title, canonical URL, summary, byline, publication time, and lead image. Section must be a slug returned by /scmp/sections.", + "operationId": "scmp-headlines", "parameters": [ { - "description": "Movie browse list: movies_in_theaters, movies_at_home, movies_coming_soon", - "enum": [ - "movies_in_theaters", - "movies_at_home", - "movies_coming_soon" - ], - "in": "query", - "name": "list", - "type": "string", - "x-example": "movies_in_theaters" - }, - { - "description": "Sort value from the selected list's browse/filters response", - "enum": [ - "popular", - "newest", - "top_box_office", - "a_z", - "critic_highest", - "critic_lowest", - "audience_highest", - "audience_lowest" - ], - "in": "query", - "name": "sort", - "type": "string", - "x-example": "popular" - }, - { - "description": "Comma-separated genre values from browse/filters", + "description": "Section slug from /scmp/sections", "enum": [ - "action", - "adventure", - "animation", - "anime", - "biography", - "comedy", - "crime", - "documentary", - "drama", - "entertainment", - "faith_and_spirituality", - "fantasy", - "game_show", - "lgbtq", - "health_and_wellness", - "history", - "holiday", - "horror", - "house_and_garden", - "kids_and_family", - "music", - "musical", - "mystery_and_thriller", - "nature", "news", - "reality", - "romance", - "sci_fi", - "short", - "soap", - "special_interest", - "sports", - "stand_up", - "talk_show", - "travel", - "variety", - "war", - "western" - ], - "in": "query", - "name": "genres", - "type": "string", - "x-example": "action,drama" - }, - { - "description": "Comma-separated content ratings from browse/filters", - "enum": [ - "g", - "pg", - "pg_13", - "r", - "nc_17", - "nr", - "ur" - ], - "in": "query", - "name": "ratings", - "type": "string", - "x-example": "pg_13" - }, - { - "description": "Comma-separated Popcornmeter values from browse/filters", - "enum": [ - "verified_hot", - "upright", - "spilled" - ], - "in": "query", - "name": "audience", - "type": "string", - "x-example": "upright" - }, - { - "description": "Comma-separated Tomatometer values from browse/filters", - "enum": [ - "certified_fresh", - "fresh", - "rotten" - ], - "in": "query", - "name": "critics", - "type": "string", - "x-example": "certified_fresh" - }, - { - "description": "Comma-separated streaming/service values from browse/filters", - "enum": [ - "theaters", - "fandango", - "apple-tv-plus", - "netflix", - "prime-video", - "disney-plus", - "max", - "peacock", - "hulu", - "paramount-plus", - "amc-plus", - "acorn-tv", - "apple-tv" + "business", + "property", + "tech", + "lifestyle", + "culture", + "sport", + "postmag", + "style", + "this-week-in-asia", + "cooking", + "hong-kong", + "china", + "asia", + "world", + "people-culture", + "china-politics", + "china-diplomacy", + "china-economy", + "hong-kong-politics", + "hong-kong-economy", + "hong-kong-health-environment", + "hong-kong-education", + "world-us-canada", + "world-europe", + "world-middle-east", + "world-americas", + "world-africa", + "world-russia-central-asia", + "asia-australasia", + "asia-diplomacy", + "asia-east-asia", + "asia-southeast-asia", + "asia-south-asia", + "business-companies", + "business-investor-relations", + "business-global-economy", + "business-money-wealth", + "opinion-comment", + "opinion-harrys-view", + "opinion-blogs", + "opinion-polls", + "opinion-letters", + "property-hong-kong-china", + "property-international", + "tech-big-tech", + "tech-enterprises", + "tech-innovation", + "tech-leaders-founders", + "tech-science-research", + "lifestyle-fashion-beauty", + "lifestyle-travel-leisure", + "lifestyle-motoring", + "lifestyle-food-drink", + "lifestyle-health-wellness", + "lifestyle-watches", + "culture-books", + "culture-music", + "culture-film-tv", + "culture-arts", + "sport-hong-kong", + "sport-china", + "sport-golf", + "sport-racing", + "sport-rugby", + "sport-football", + "sport-tennis", + "sport-other", + "sport-boxing", + "sport-hong-kong-sevens", + "postmag-culture", + "postmag-travel", + "postmag-food-drink", + "postmag-passions", + "postmag-wellness", + "postmag-design-interiors", + "style-luxury", + "style-fashion", + "style-beauty", + "style-people", + "style-lifestyle", + "this-week-in-asia-politics", + "this-week-in-asia-geopolitics", + "this-week-in-asia-economics", + "this-week-in-asia-society", + "this-week-in-asia-opinion", + "this-week-in-asia-asia-buzz", + "this-week-in-asia-people" ], "in": "query", - "name": "affiliates", - "type": "string", - "x-example": "netflix" - }, - { - "description": "Opaque next-page cursor returned in data.page_info.end_cursor", - "in": "query", - "name": "after", + "name": "section", + "required": true, "type": "string", - "x-example": "Mjk=" - }, - { - "description": "Rows to return, default 10, max 30", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "x-example": "hong-kong" } ], "produces": [ @@ -454077,7 +469820,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.browseResponseDoc" + "$ref": "#/definitions/scmp.headlinesResponseDoc" } }, "400": { @@ -454098,12 +469841,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -454116,165 +469853,62 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes movie discovery rows", + "summary": "Get the latest stories in an SCMP section", "tags": [ - "Rotten Tomatoes" + "SCMP" ] } }, - "/rottentomatoes/browse/tv": { + "/scmp/sections": { "get": { - "consumes": [ + "description": "Lists every South China Morning Post section accepted by /scmp/headlines, with its slug, display name, feed URL, and (for a subsection) its parent section's slug and name. Values: `news`, `business`, `property`, `tech`, `lifestyle`, `culture`, `sport`, `postmag`, `style`, `this-week-in-asia`, `cooking`, `hong-kong`, `china`, `asia`, `world`, `people-culture`, `china-politics`, `china-diplomacy`, `china-economy`, `hong-kong-politics`, `hong-kong-economy`, `hong-kong-health-environment`, `hong-kong-education`, `world-us-canada`, `world-europe`, `world-middle-east`, `world-americas`, `world-africa`, `world-russia-central-asia`, `asia-australasia`, `asia-diplomacy`, `asia-east-asia`, `asia-southeast-asia`, `asia-south-asia`, `business-companies`, `business-investor-relations`, `business-global-economy`, `business-money-wealth`, `opinion-comment`, `opinion-harrys-view`, `opinion-blogs`, `opinion-polls`, `opinion-letters`, `property-hong-kong-china`, `property-international`, `tech-big-tech`, `tech-enterprises`, `tech-innovation`, `tech-leaders-founders`, `tech-science-research`, `lifestyle-fashion-beauty`, `lifestyle-travel-leisure`, `lifestyle-motoring`, `lifestyle-food-drink`, `lifestyle-health-wellness`, `lifestyle-watches`, `culture-books`, `culture-music`, `culture-film-tv`, `culture-arts`, `sport-hong-kong`, `sport-china`, `sport-golf`, `sport-racing`, `sport-rugby`, `sport-football`, `sport-tennis`, `sport-other`, `sport-boxing`, `sport-hong-kong-sevens`, `postmag-culture`, `postmag-travel`, `postmag-food-drink`, `postmag-passions`, `postmag-wellness`, `postmag-design-interiors`, `style-luxury`, `style-fashion`, `style-beauty`, `style-people`, `style-lifestyle`, `this-week-in-asia-politics`, `this-week-in-asia-geopolitics`, `this-week-in-asia-economics`, `this-week-in-asia-society`, `this-week-in-asia-opinion`, `this-week-in-asia-asia-buzz`, `this-week-in-asia-people`.", + "operationId": "scmp-sections", + "produces": [ "application/json" ], - "description": "Returns TV series rows from Rotten Tomatoes' browse listing. Use `/rottentomatoes/browse/filters?list=tv_series_browse` to discover current filters; pagination uses the opaque `after` cursor from the previous response.", - "operationId": "rottentomatoes-browse-tv", - "parameters": [ - { - "description": "TV browse list: tv_series_browse", - "enum": [ - "tv_series_browse" - ], - "in": "query", - "name": "list", - "type": "string", - "x-example": "tv_series_browse" - }, - { - "description": "Sort value from browse/filters", - "enum": [ - "popular", - "newest", - "a_z", - "critic_highest", - "critic_lowest", - "audience_highest", - "audience_lowest" - ], - "in": "query", - "name": "sort", - "type": "string", - "x-example": "popular" - }, - { - "description": "Comma-separated genre values from browse/filters", - "enum": [ - "action", - "adventure", - "animation", - "anime", - "biography", - "comedy", - "crime", - "documentary", - "drama", - "entertainment", - "faith_and_spirituality", - "fantasy", - "game_show", - "lgbtq", - "health_and_wellness", - "history", - "holiday", - "horror", - "house_and_garden", - "kids_and_family", - "music", - "musical", - "mystery_and_thriller", - "nature", - "news", - "reality", - "romance", - "sci_fi", - "short", - "soap", - "special_interest", - "sports", - "stand_up", - "talk_show", - "travel", - "variety", - "war", - "western" - ], - "in": "query", - "name": "genres", - "type": "string", - "x-example": "action,drama" - }, - { - "description": "Comma-separated content ratings from browse/filters", - "enum": [ - "tvy", - "tvy7", - "tvg", - "tvpg", - "tv14", - "tvma" - ], - "in": "query", - "name": "ratings", - "type": "string", - "x-example": "tv14" - }, - { - "description": "Comma-separated Popcornmeter values from browse/filters", - "enum": [ - "upright", - "spilled" - ], - "in": "query", - "name": "audience", - "type": "string", - "x-example": "upright" + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/scmp.sectionsResponseDoc" + } }, - { - "description": "Comma-separated Tomatometer values from browse/filters", - "enum": [ - "fresh", - "rotten" - ], - "in": "query", - "name": "critics", - "type": "string", - "x-example": "fresh" + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Comma-separated streaming/service values from browse/filters", - "enum": [ - "theaters", - "fandango", - "apple-tv-plus", - "netflix", - "prime-video", - "disney-plus", - "max", - "peacock", - "hulu", - "paramount-plus", - "amc-plus", - "acorn-tv", - "apple-tv" - ], - "in": "query", - "name": "affiliates", - "type": "string", - "x-example": "netflix" - }, + "ApiKeyAuth": [] + } + ], + "summary": "List SCMP sections", + "tags": [ + "SCMP" + ] + } + }, + "/screenrant/article": { + "get": { + "description": "Returns a ScreenRant article by canonical `url` of the form `https://screenrant.com//`: title, description, section, authors, publication and update times, image and body `paragraphs`. Warning and note callouts and Related cards are left out of `paragraphs`. Section hubs and multi-segment URLs such as `/video//` are rejected as invalid.", + "operationId": "screenrant-article", + "parameters": [ { - "description": "Opaque next-page cursor returned in data.page_info.end_cursor", + "description": "Canonical ScreenRant article URL", "in": "query", - "name": "after", + "name": "url", + "required": true, "type": "string", - "x-example": "Mjk=" - }, - { - "description": "Rows to return, default 10, max 30", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "x-example": "https://screenrant.com/charlie-harper-movie-review/" } ], "produces": [ @@ -454284,7 +469918,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.browseResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -454299,18 +469933,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -454323,90 +469945,24 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes TV discovery rows", + "summary": "Get ScreenRant article content", "tags": [ - "Rotten Tomatoes" + "ScreenRant" ] } }, - "/rottentomatoes/critics/authors": { + "/screenrant/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns current or inactive critics from Rotten Tomatoes' public author directory. Browse one letter or search by name; use `next_cursor` as `after` or `previous_cursor` as `before`, as indicated by the corresponding page flag. The letter values come from the live directory controls.", - "operationId": "rottentomatoes-critics-authors", + "description": "Returns a ScreenRant author's profile by canonical `url` (`https://screenrant.com/author//`): name, `title`, `biography`, image, social links (such as `x`, `linkedin`, `youtube` or `muckrack`) and about 20 articles from the profile's Latest module. Older pages are not available.", + "operationId": "screenrant-author", "parameters": [ { - "description": "Directory letter. Omit when using search; default a.", - "enum": [ - "#", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z" - ], - "in": "query", - "name": "letter", - "type": "string", - "x-example": "a" - }, - { - "description": "Search critics by name; cannot be combined with letter", - "in": "query", - "name": "search", - "type": "string", - "x-example": "Mae Abdulbaki" - }, - { - "description": "Include the site's inactive critics list", - "in": "query", - "name": "inactive", - "type": "boolean", - "x-example": false - }, - { - "description": "Opaque cursor from data.next_cursor", - "in": "query", - "name": "after", - "type": "string", - "x-example": "MQ==" - }, - { - "description": "Opaque cursor from data.previous_cursor; cannot be combined with after", + "description": "Canonical ScreenRant author URL", "in": "query", - "name": "before", + "name": "url", + "required": true, "type": "string", - "x-example": "MA==" - }, - { - "description": "Rows per page, default 100, range 1 to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 100 + "x-example": "https://screenrant.com/author/liam-crowley/" } ], "produces": [ @@ -454416,7 +469972,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.criticsAuthorsResponseDoc" + "$ref": "#/definitions/publicnews.screenrantAuthorResponseDoc" } }, "400": { @@ -454431,18 +469987,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -454455,105 +469999,60 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes critic directory", + "summary": "Get a ScreenRant author profile", "tags": [ - "Rotten Tomatoes" + "ScreenRant" ] } }, - "/rottentomatoes/editorial/content": { + "/screenrant/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists paginated editorial records from the selected public content type. The pages collection lists public editorial section and campaign indexes. Use the editorial types endpoint to discover accepted type values.", - "operationId": "rottentomatoes-editorial-content", + "description": "Returns about 10 of the most recent ScreenRant items for one section. `section` is required and takes one of 34 slugs such as `movie-news`, `tv-reviews`, `reality-tv`, `comics`, `game-news` or `anime`. Items in `videos`, and some in `interviews` and `movie-trailers`, link to `/video//` pages that `screenrant-article` rejects.", + "operationId": "screenrant-headlines", "parameters": [ { - "description": "Editorial content type", + "description": "ScreenRant RSS section slug", "enum": [ - "article", - "guide", - "gallery", - "hub-subpage", - "non-rt-publication", - "rt-hub", - "how-to", - "otg-article", - "prev", - "rt_poll", - "pages" + "movies", + "movie-news", + "movie-features", + "movie-reviews", + "movie-lists", + "movie-trailers", + "tv", + "tv-news", + "tv-features", + "tv-reviews", + "tv-lists", + "network-tv", + "reality-tv", + "reality-tv-news", + "reality-tv-features", + "reality-tv-lists", + "comics", + "comics-news", + "comics-features", + "comics-reviews", + "comics-lists", + "gaming", + "game-news", + "game-features", + "game-lists", + "game-reviews", + "anime", + "books", + "interviews", + "lists", + "videos", + "podcasts", + "exclusives", + "streaming-movies-and-tv-guide" ], "in": "query", - "name": "type", + "name": "section", "required": true, "type": "string", - "x-example": "guide" - }, - { - "description": "Optional text filter; maximum 200 bytes", - "in": "query", - "name": "query", - "type": "string", - "x-example": "horror" - }, - { - "description": "One-based result page from 1 to 10000; default 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Rows per page, default 20, range 1 to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Optional editorial taxonomy; discover type support from /rottentomatoes/editorial/taxonomies", - "enum": [ - "categories", - "tags", - "related-movie-id", - "related-tv-season-id", - "related-tv-series-id", - "related-tv-episode-id", - "related-celebrity-id", - "publication", - "franchise", - "coauthors" - ], - "in": "query", - "name": "taxonomy", - "type": "string", - "x-example": "related-movie-id" - }, - { - "description": "Comma-separated positive term IDs; required with taxonomy", - "in": "query", - "name": "term_ids", - "type": "string", - "x-example": "121877,121876" - }, - { - "description": "Whether any or all selected terms must match; default OR", - "enum": [ - "AND", - "OR" - ], - "in": "query", - "name": "operator", - "type": "string", - "x-example": "OR" - }, - { - "description": "For categories only, include child categories; default false", - "in": "query", - "name": "include_children", - "type": "boolean", - "x-example": false + "x-example": "movies" } ], "produces": [ @@ -454563,7 +470062,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.editorialContentResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -454572,24 +470071,12 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -454602,29 +470089,16 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes editorial content listing", + "summary": "Get ScreenRant section headlines", "tags": [ - "Rotten Tomatoes" + "ScreenRant" ] } }, - "/rottentomatoes/editorial/detail": { + "/screenrant/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the public body, paragraphs, headings, links, images, and video embeds from an Editorial article, gallery, guide, on-the-go article, or preview. Discover paths from editorial content collections. The response body_html preserves public Gutenberg/ranked-list markup.", - "operationId": "rottentomatoes-editorial-detail", - "parameters": [ - { - "description": "Discovered Editorial content path", - "in": "query", - "name": "path", - "required": true, - "type": "string", - "x-example": "/guide/all-brad-pitt-movies-ranked-by-tomatometer/" - } - ], + "description": "Returns ScreenRant's main feed of latest stories, about 10 items. Takes no parameters. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "screenrant-news", "produces": [ "application/json" ], @@ -454632,29 +470106,49 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.editorialDetailResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } - }, - "429": { - "description": "Too Many Requests", + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get ScreenRant top stories", + "tags": [ + "ScreenRant" + ] + } + }, + "/screenrant/sections": { + "get": { + "description": "Lists the 34 ScreenRant sections that `screenrant-headlines` accepts, spanning movies, TV, reality TV, comics, gaming, anime, books, interviews and videos. Each entry has a `slug`, a display `name` and the section's feed `url`.", + "operationId": "screenrant-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -454671,43 +470165,19 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes editorial article detail", + "summary": "Get ScreenRant RSS sections", "tags": [ - "Rotten Tomatoes" + "ScreenRant" ] } }, - "/rottentomatoes/editorial/search": { + "/seatgeek/categories": { "get": { "consumes": [ "application/json" ], - "description": "Searches public Rotten Tomatoes editorial content, including articles and guides. Results include content subtype plus total-page metadata.", - "operationId": "rottentomatoes-editorial-search", - "parameters": [ - { - "description": "Editorial search text; maximum 200 bytes", - "in": "query", - "name": "query", - "required": true, - "type": "string", - "x-example": "horror" - }, - { - "description": "One-based result page from 1 to 10000; default 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Rows per page, default 10, range 1 to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - } - ], + "description": "Returns SeatGeek's full event-category tree (e.g. Sports > Baseball > MLB, Concerts, Theater), root and leaf nodes together. Each category's id is the value seatgeek-events-by-category's taxonomy_id parameter accepts.", + "operationId": "seatgeek-categories", "produces": [ "application/json" ], @@ -454715,29 +470185,52 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.editorialSearchResponseDoc" + "$ref": "#/definitions/seatgeek.categoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } - }, - "429": { - "description": "Too Many Requests", + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List SeatGeek's event categories", + "tags": [ + "SeatGeek" + ] + } + }, + "/seatgeek/cities": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns SeatGeek's own curated \"browse by city\" directory (87 metro areas as of 2026-09-15): id, name, state, country, coordinates, and which verticals (concerts/sports/theater) it supports. Each city's lat/lon pairs directly with GET /seatgeek/events-near.", + "operationId": "seatgeek-cities", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/seatgeek.citiesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -454754,34 +470247,27 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes editorial search", + "summary": "List SeatGeek's curated metro areas", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/editorial/section": { + "/seatgeek/event": { "get": { "consumes": [ "application/json" ], - "description": "Returns the rendered article cards for a discovered editorial page, RT hub, or hub subpage. Discover paths through editorial content types `pages`, `rt-hub`, and `hub-subpage`. Static pages use `articles_page` pagination upstream; hubs use `/page/{n}/`.", - "operationId": "rottentomatoes-editorial-section", + "description": "Returns one SeatGeek event's full detail: title, timing, venue, performers, category taxonomy, and SeatGeek's own live secondary-market pricing snapshot (listing/ticket counts, average/median/lowest/highest price). id is SeatGeek's own numeric event id, obtained from a search or performer-events result. Pricing is an aggregate snapshot only -- no per-seat listing rows and no checkout/purchase flow.", + "operationId": "seatgeek-event", "parameters": [ { - "description": "Discovered editorial section path", + "description": "SeatGeek's own numeric event id", "in": "query", - "name": "path", + "name": "id", "required": true, - "type": "string", - "x-example": "/countdown/" - }, - { - "description": "One-based page, default 1", - "in": "query", - "name": "page", "type": "integer", - "x-example": 2 + "x-example": 17695775 } ], "produces": [ @@ -454791,7 +470277,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.editorialSectionResponseDoc" + "$ref": "#/definitions/seatgeek.eventResponseDoc" } }, "400": { @@ -454812,12 +470298,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -454830,19 +470310,43 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes editorial section archive", + "summary": "Get a SeatGeek event's detail", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/editorial/taxonomies": { + "/seatgeek/events-by-category": { "get": { "consumes": [ "application/json" ], - "description": "Returns the complete set of public editorial term vocabularies accepted by the term discovery endpoint, with the content types each taxonomy filters.", - "operationId": "rottentomatoes-editorial-taxonomies", + "description": "Returns one page of SeatGeek events under a category/taxonomy, soonest first. taxonomy_id is a SeatGeek category id from GET /seatgeek/categories, e.g. 1010100 for MLB.", + "operationId": "seatgeek-events-by-category", + "parameters": [ + { + "description": "A SeatGeek taxonomy id from GET /seatgeek/categories", + "in": "query", + "name": "taxonomy_id", + "required": true, + "type": "integer", + "x-example": 1010100 + }, + { + "default": 1, + "description": "1-based page number", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "default": 25, + "description": "Results per page, 1-50", + "in": "query", + "name": "per_page", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -454850,17 +470354,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.editorialTaxonomiesResponseDoc" + "$ref": "#/definitions/seatgeek.eventsByCategoryResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -454877,137 +470381,49 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes editorial taxonomy discovery", + "summary": "Browse SeatGeek events by category", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/editorial/terms": { + "/seatgeek/events-near": { "get": { "consumes": [ "application/json" ], - "description": "Pages public terms from one discovered editorial taxonomy. All taxonomy values are listed by `/rottentomatoes/editorial/taxonomies`; `parent` is accepted only for `categories`, while `offset` is supported by all other taxonomies.", - "operationId": "rottentomatoes-editorial-terms", + "description": "Returns one page of SeatGeek events near a coordinate, soonest first -- the same call its city pages and homepage location-based sections make. Pair with GET /seatgeek/cities for a curated list of coordinates, or pass any coordinate directly.", + "operationId": "seatgeek-events-near", "parameters": [ { - "description": "Editorial taxonomy value", - "enum": [ - "categories", - "tags", - "related-movie-id", - "related-tv-season-id", - "related-tv-series-id", - "related-tv-episode-id", - "related-celebrity-id", - "publication", - "franchise", - "coauthors" - ], + "description": "Latitude", "in": "query", - "name": "taxonomy", + "name": "lat", "required": true, - "type": "string", - "x-example": "coauthors" + "type": "number", + "x-example": 35.08794 }, { - "description": "Optional term search; maximum 200 bytes", + "description": "Longitude", "in": "query", - "name": "search", - "type": "string", - "x-example": "RT Staff" + "name": "lon", + "required": true, + "type": "number", + "x-example": -106.6357 }, { - "description": "One-based page, default 1", + "default": 1, + "description": "1-based page number", "in": "query", "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Terms per page, default 20, range 1 to 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "When true, omit terms with no assigned content", - "in": "query", - "name": "hide_empty", - "type": "boolean", - "x-example": true - }, - { - "description": "Term sort direction", - "enum": [ - "asc", - "desc" - ], - "in": "query", - "name": "order", - "type": "string", - "x-example": "desc" - }, - { - "description": "Term sort key", - "enum": [ - "id", - "include", - "name", - "slug", - "include_slugs", - "term_group", - "description", - "count" - ], - "in": "query", - "name": "orderby", - "type": "string", - "x-example": "count" - }, - { - "description": "Comma-separated positive term IDs to include", - "in": "query", - "name": "include", - "type": "string", - "x-example": "10732,10733" - }, - { - "description": "Comma-separated positive term IDs to exclude", - "in": "query", - "name": "exclude", - "type": "string", - "x-example": "10733" - }, - { - "description": "Optional term slug or comma-separated slugs", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "cap-rt-staff" - }, - { - "description": "Filter to terms assigned to this content record", - "in": "query", - "name": "post", - "type": "integer", - "x-example": 297765 - }, - { - "description": "Zero-based offset; accepted except for categories", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 100 + "type": "integer" }, { - "description": "Category parent ID; accepted only for categories", + "default": 25, + "description": "Results per page, 1-50", "in": "query", - "name": "parent", - "type": "integer", - "x-example": 0 + "name": "per_page", + "type": "integer" } ], "produces": [ @@ -455017,7 +470433,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.editorialTermsResponseDoc" + "$ref": "#/definitions/seatgeek.eventsNearResponseDoc" } }, "400": { @@ -455026,24 +470442,12 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455056,19 +470460,29 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes editorial taxonomy terms", + "summary": "Browse SeatGeek events near a coordinate", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/editorial/types": { + "/seatgeek/performer": { "get": { "consumes": [ "application/json" ], - "description": "Lists the editorial content types Rotten Tomatoes accepts as `type` on its editorial content endpoint, each with a `value` and `label` (for example `article`, `guide`, `gallery`, `rt-hub` and `pages`). The set was last verified on 2026-09-26, shown in `verified_at`. The `pages` type returns metadata and permalinks, not page bodies.", - "operationId": "rottentomatoes-editorial-types", + "description": "Returns one SeatGeek performer's (sports team, artist, or show) full detail by direct id lookup: name, type, image, popularity, home venue id, upcoming-event counts, and category taxonomy. id is SeatGeek's own numeric performer id, obtained from a search result. Use this when you already have a bare performer id and want to skip a search round-trip; seatgeek-search returns the same fields for a query.", + "operationId": "seatgeek-performer", + "parameters": [ + { + "description": "SeatGeek's own numeric performer id", + "in": "query", + "name": "id", + "required": true, + "type": "integer", + "x-example": 1 + } + ], "produces": [ "application/json" ], @@ -455076,17 +470490,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.editorialContentTypesResponseDoc" + "$ref": "#/definitions/seatgeek.performerResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -455103,33 +470523,41 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes editorial content types", + "summary": "Get a SeatGeek performer's detail", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/episode": { + "/seatgeek/performer-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns Rotten Tomatoes TV episode metadata, scorecard data, parent series/season metadata, and public video metadata. Pass exactly one of `path` or `url`.", - "operationId": "rottentomatoes-episode", + "description": "Returns one page of a SeatGeek performer's (sports team, artist, or show) upcoming event schedule, soonest first. performer_id is SeatGeek's own numeric performer id, obtained from a search result (e.g. 1 for the Los Angeles Dodgers).", + "operationId": "seatgeek-performer-events", "parameters": [ { - "description": "Rotten Tomatoes episode path", + "description": "SeatGeek's own numeric performer id", "in": "query", - "name": "path", - "type": "string", - "x-example": "/tv/breaking_bad/s01/e01" + "name": "performer_id", + "required": true, + "type": "integer", + "x-example": 1 }, { - "description": "Absolute https://www.rottentomatoes.com episode URL", + "default": 1, + "description": "1-based page number", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.rottentomatoes.com/tv/breaking_bad/s01/e01" + "name": "page", + "type": "integer" + }, + { + "default": 25, + "description": "Results per page, 1-50", + "in": "query", + "name": "per_page", + "type": "integer" } ], "produces": [ @@ -455139,7 +470567,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.episodeResponseDoc" + "$ref": "#/definitions/seatgeek.performerEventsResponseDoc" } }, "400": { @@ -455148,24 +470576,12 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455178,33 +470594,34 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes episode detail", + "summary": "Get a SeatGeek performer's event schedule", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/movie": { + "/seatgeek/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Rotten Tomatoes movie metadata, scorecard data, and representative audience reviews. Pass exactly one of `path` or `url`.", - "operationId": "rottentomatoes-movie", + "description": "Free-text search across SeatGeek's own catalog of events, performers (sports teams, artists, and shows), and venues -- the same call the site's own search box and search-results page use. Any of the three result lists may come back empty for a query with no matches in that type.", + "operationId": "seatgeek-search", "parameters": [ { - "description": "Rotten Tomatoes movie path", + "description": "Free-text search query", "in": "query", - "name": "path", + "name": "q", + "required": true, "type": "string", - "x-example": "/m/inception" + "x-example": "dodgers" }, { - "description": "Absolute https://www.rottentomatoes.com movie URL", + "default": 10, + "description": "Maximum results per result type (events/performers/venues), 1-50", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.rottentomatoes.com/m/inception" + "name": "limit", + "type": "integer" } ], "produces": [ @@ -455214,7 +470631,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.movieResponseDoc" + "$ref": "#/definitions/seatgeek.searchResponseDoc" } }, "400": { @@ -455223,24 +470640,12 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455253,59 +470658,35 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes movie detail", + "summary": "Search SeatGeek events, performers, and venues", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/movie/reviews": { + "/seatgeek/trending": { "get": { "consumes": [ "application/json" ], - "description": "Returns critic or audience reviews from Rotten Tomatoes, including pagination metadata. Pass exactly one of `path` or `url`. Supported `type` values are `critics`, `top-critics`, `audience`, and `verified-audience`.", - "operationId": "rottentomatoes-movie-reviews", + "description": "Returns SeatGeek's ranked \"trending near you\" events for the required `lat` and `lon`. Each item has the event name, URL and image, local and UTC start times, `lowest_price` on the secondary market where available, current `rank` and `rank_change`. The list is identified by `list_id`, `list_type` and `list_display_name`.", + "operationId": "seatgeek-trending", "parameters": [ { - "description": "Rotten Tomatoes movie path", - "in": "query", - "name": "path", - "type": "string", - "x-example": "/m/inception" - }, - { - "description": "Absolute https://www.rottentomatoes.com movie URL", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.rottentomatoes.com/m/inception" - }, - { - "description": "Review type: critics, top-critics, audience, verified-audience", - "enum": [ - "critics", - "top-critics", - "audience", - "verified-audience" - ], - "in": "query", - "name": "type", - "type": "string", - "x-example": "critics" - }, - { - "description": "Reviews to return, default 10, max 20", + "description": "Latitude", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "lat", + "required": true, + "type": "number", + "x-example": 40.7128 }, { - "description": "Pagination cursor from data.page_info.end_cursor", + "description": "Longitude", "in": "query", - "name": "after", - "type": "string" + "name": "lon", + "required": true, + "type": "number", + "x-example": -74.006 } ], "produces": [ @@ -455315,7 +470696,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.reviewsResponseDoc" + "$ref": "#/definitions/seatgeek.trendingResponseDoc" } }, "400": { @@ -455324,24 +470705,12 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455354,33 +470723,27 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes movie reviews", + "summary": "Get SeatGeek's trending-near-you events", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/person": { + "/seatgeek/venue": { "get": { "consumes": [ "application/json" ], - "description": "Returns Rotten Tomatoes celebrity/person metadata and filmography rows. Pass exactly one of `path` or `url`.", - "operationId": "rottentomatoes-person", + "description": "Returns one SeatGeek venue's full detail: address, city/state/country, timezone, capacity, coordinates, and upcoming-event counts. id is SeatGeek's own numeric venue id, obtained from a search or event result.", + "operationId": "seatgeek-venue", "parameters": [ { - "description": "Rotten Tomatoes person path", - "in": "query", - "name": "path", - "type": "string", - "x-example": "/celebrity/christopher_nolan" - }, - { - "description": "Absolute https://www.rottentomatoes.com person URL", + "description": "SeatGeek's own numeric venue id", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.rottentomatoes.com/celebrity/christopher_nolan" + "name": "id", + "required": true, + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -455390,7 +470753,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.personResponseDoc" + "$ref": "#/definitions/seatgeek.venueResponseDoc" } }, "400": { @@ -455411,12 +470774,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455429,34 +470786,41 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes person detail and filmography", + "summary": "Get a SeatGeek venue's detail", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/search": { + "/seatgeek/venue-events": { "get": { "consumes": [ "application/json" ], - "description": "Searches Rotten Tomatoes movies by the required `query`, returning up to `limit` rows (default 10, max 20). Each row has the title, URL, release year or start and end year, `tomatometer_score` and sentiment, `certified_fresh`, cast and image. No matches returns an empty `results` array.", - "operationId": "rottentomatoes-search", + "description": "Returns one page of a SeatGeek venue's upcoming event schedule, soonest first. venue_id is SeatGeek's own numeric venue id, obtained from a search or event result (e.g. 1 for UNIQLO Field at Dodger Stadium).", + "operationId": "seatgeek-venue-events", "parameters": [ { - "description": "Search query", + "description": "SeatGeek's own numeric venue id", "in": "query", - "name": "query", + "name": "venue_id", "required": true, - "type": "string", - "x-example": "inception" + "type": "integer", + "x-example": 1 }, { - "description": "Rows to return, default 10, max 20", + "default": 1, + "description": "1-based page number", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "page", + "type": "integer" + }, + { + "default": 25, + "description": "Results per page, 1-50", + "in": "query", + "name": "per_page", + "type": "integer" } ], "produces": [ @@ -455466,7 +470830,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.searchResponseDoc" + "$ref": "#/definitions/seatgeek.venueEventsResponseDoc" } }, "400": { @@ -455475,24 +470839,12 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455505,33 +470857,24 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes movie search", + "summary": "Get a SeatGeek venue's event schedule", "tags": [ - "Rotten Tomatoes" + "SeatGeek" ] } }, - "/rottentomatoes/season": { + "/seattletimes/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Rotten Tomatoes TV season metadata, scorecard data, parent series metadata, and episode rows. Pass exactly one of `path` or `url`.", - "operationId": "rottentomatoes-season", + "description": "Returns public Seattle Times story metadata and body paragraphs from a canonical story URL. The site's metered paywall is a client-side overlay: anonymous requests receive the full body, which is returned as-is.", + "operationId": "seattletimes-article", "parameters": [ { - "description": "Rotten Tomatoes season path", - "in": "query", - "name": "path", - "type": "string", - "x-example": "/tv/breaking_bad/s01" - }, - { - "description": "Absolute https://www.rottentomatoes.com season URL", + "description": "Canonical Seattle Times story URL", "in": "query", "name": "url", + "required": true, "type": "string", - "x-example": "https://www.rottentomatoes.com/tv/breaking_bad/s01" + "x-example": "https://www.seattletimes.com/seattle-news/transportation/sound-transit-ceo-claims-his-30k-bonus-and-wins-a-pay-raise/" } ], "produces": [ @@ -455541,7 +470884,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.seasonResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -455556,18 +470899,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455580,33 +470911,30 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes season detail", + "summary": "Get Seattle Times article content", "tags": [ - "Rotten Tomatoes" + "Seattle Times" ] } }, - "/rottentomatoes/series": { + "/seattletimes/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Rotten Tomatoes TV series metadata and scorecard data. Pass exactly one of `path` or `url`.", - "operationId": "rottentomatoes-series", + "description": "Returns one Seattle Times author's public profile: name, bio, newsroom-published email and X/Twitter link when listed, and their most recent stories.", + "operationId": "seattletimes-author", "parameters": [ { - "description": "Rotten Tomatoes series path", + "description": "Author slug, e.g. mike-lindblom", "in": "query", - "name": "path", + "name": "slug", "type": "string", - "x-example": "/tv/breaking_bad" + "x-example": "mike-lindblom" }, { - "description": "Absolute https://www.rottentomatoes.com series URL", + "description": "Canonical seattletimes.com/author// URL; alternative to slug", "in": "query", "name": "url", "type": "string", - "x-example": "https://www.rottentomatoes.com/tv/breaking_bad" + "x-example": "https://www.seattletimes.com/author/mike-lindblom/" } ], "produces": [ @@ -455616,7 +470944,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.seriesResponseDoc" + "$ref": "#/definitions/publicnews.seattleTimesAuthorResponseDoc" } }, "400": { @@ -455631,18 +470959,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455655,41 +470971,124 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes series detail", + "summary": "Get a Seattle Times author profile", "tags": [ - "Rotten Tomatoes" + "Seattle Times" ] } }, - "/rottentomatoes/sitemap/urls": { + "/seattletimes/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a page of URLs from one child sitemap. Discover valid `name` values with `rottentomatoes-sitemaps`; use offset/limit to page through the complete sitemap.", - "operationId": "rottentomatoes-sitemap-urls", + "description": "Returns about 30 to 35 of the latest Seattle Times stories for one section. `section` is required and takes a section slug such as `seattle-news`, `politics`, `boeing-aerospace`, `mariners`, `seahawks` or `obituaries`. Each item has its title, canonical URL without tracking parameters, summary, publication time and author. Only the newest page is available.", + "operationId": "seattletimes-headlines", "parameters": [ { - "description": "Sitemap name returned by /rottentomatoes/sitemaps", + "description": "Seattle Times section slug", + "enum": [ + "seattle-news", + "law-justice", + "politics", + "transportation", + "climate-lab", + "environment", + "weather", + "health", + "data", + "homeless", + "education-lab", + "education", + "times-watchdog", + "mental-health", + "eastside", + "puget-sound", + "business", + "boeing-aerospace", + "real-estate", + "amazon", + "technology", + "microsoft", + "alaska-airlines", + "costco", + "economy", + "starbucks", + "retail", + "nation-world", + "nation", + "world", + "nation-politics", + "oddities", + "sports", + "seahawks", + "mariners", + "uw-huskies", + "wsu-cougars", + "storm", + "kraken", + "sounders", + "reign", + "torrent", + "high-school", + "entertainment", + "music", + "movies", + "books", + "tv", + "theater", + "visual-arts", + "classical-music", + "local-media", + "events", + "life", + "food-drink", + "travel", + "outdoors", + "wellness", + "lifestyle", + "fashion", + "rant-and-rave", + "op-eds", + "opinion", + "editorials", + "letters-to-the-editor", + "pacific-nw-magazine", + "photo-video", + "video", + "photography", + "at-home", + "marijuana", + "northwest", + "obituaries", + "science", + "special-reports", + "agriculture", + "local-business", + "markets", + "auto-racing", + "college", + "wsu-cougar-basketball", + "wsu-cougar-football", + "golf", + "gonzaga-bulldogs", + "hockey", + "horse-racing", + "uw-husky-basketball", + "nba", + "ncaa-tournament", + "pac-12", + "seattle-university", + "snow-sports", + "world-cup", + "dance", + "video-games", + "fitness", + "garden", + "home-decor" + ], "in": "query", - "name": "name", + "name": "section", "required": true, "type": "string", - "x-example": "movie_0" - }, - { - "description": "Zero-based offset, default 0", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "URLs to return, default 100, max 500", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 100 + "x-example": "seattle-news" } ], "produces": [ @@ -455699,7 +471098,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.sitemapURLResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -455708,24 +471107,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -455738,19 +471119,16 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes sitemap URL page", + "summary": "Get Seattle Times section headlines", "tags": [ - "Rotten Tomatoes" + "Seattle Times" ] } }, - "/rottentomatoes/sitemaps": { + "/seattletimes/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the live sitemap index and every named child sitemap, including movie, TV series, season, episode, person, critic, publication, browse-list, and static route inventories.", - "operationId": "rottentomatoes-sitemaps", + "description": "Returns about 30 of the newest Seattle Times stories across all sections, including Associated Press wire stories. Takes no parameters. Each item has its title, canonical URL without tracking parameters, summary, publication time, author byline and lead image.", + "operationId": "seattletimes-news", "produces": [ "application/json" ], @@ -455758,19 +471136,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rottentomatoes.sitemapIndexResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "503": { @@ -455785,70 +471151,107 @@ "ApiKeyAuth": [] } ], - "summary": "Rotten Tomatoes sitemap discovery", + "summary": "Get Seattle Times top stories", "tags": [ - "Rotten Tomatoes" + "Seattle Times" ] } }, - "/rover/search": { + "/seattletimes/sections": { + "get": { + "description": "Returns the public Seattle Times section inventory: every category in the site's navigation and RSS feed list that publishes a live feed.", + "operationId": "seattletimes-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Seattle Times sections", + "tags": [ + "Seattle Times" + ] + } + }, + "/sec/company/intelligence": { "get": { "consumes": [ "application/json" ], - "description": "Searches Rover's public sitter/walker listings by location and service type, returning sitter summaries (name, profile image, rating, review count, repeat-client count, years of experience, neighborhood/city/state, starting price, Star Sitter status, and a short bio).", - "operationId": "rover-sitter-search", + "description": "Aggregates a company's profile, a latest-annual financial snapshot, the latest 10-K/10-Q/8-K, and recent material events into one call. Provide cik or ticker. Optionally fuse live cross-source data with enrich (a comma list of market, news, hiring): market and news are keyed on the ticker; hiring needs ats plus that ATS's careers slug (or tenant/datacenter/site for Workday). Enrichment is best-effort — requested-but-unavailable sources are listed under degraded and never fail the SEC-native response.", + "operationId": "sec-company-intelligence", "parameters": [ { - "description": "Free-text address, city, or zip code, e.g. \\", + "description": "SEC CIK (numeric or zero-padded)", "in": "query", - "name": "location", - "required": true, + "name": "cik", "type": "string", - "x-example": "Seattle, WA" + "x-example": "320193" }, { - "description": "Service category to search. One of: `overnight-boarding`, `overnight-traveling`, `drop-in`, `doggy-day-care`, `dog-walking`.", + "description": "Ticker symbol (alternative to cik)", "in": "query", - "name": "service_type", - "required": true, + "name": "ticker", "type": "string", - "x-example": "overnight-boarding" + "x-example": "AAPL" }, { - "description": "1-based result page. Defaults to 1.", + "description": "Comma list of cross-source enrichments", + "enum": [ + "market", + "news", + "hiring" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "enrich", + "type": "string" }, { - "description": "Filter by pet species. One of: `dog`, `cat`.", + "description": "ATS provider for hiring enrichment", + "enum": [ + "greenhouse", + "lever", + "ashby", + "workday", + "smartrecruiters" + ], "in": "query", - "name": "pet_type", - "type": "string", - "x-example": "dog" + "name": "ats", + "type": "string" }, { - "description": "Minimum starting rate in whole dollars.", + "description": "Careers board slug for hiring (greenhouse/lever/ashby/smartrecruiters)", "in": "query", - "name": "min_price", - "type": "integer", - "x-example": 20 + "name": "careers_slug", + "type": "string" }, { - "description": "Maximum starting rate in whole dollars.", + "description": "Workday tenant (hiring, when ats=workday)", "in": "query", - "name": "max_price", - "type": "integer", - "x-example": 100 + "name": "tenant", + "type": "string" }, { - "description": "Restrict results to Rover's \\", + "description": "Workday datacenter shard (hiring, when ats=workday)", "in": "query", - "name": "star_sitter_only", - "type": "boolean", - "x-example": false + "name": "datacenter", + "type": "string" + }, + { + "description": "Workday career site (hiring, when ats=workday)", + "in": "query", + "name": "site", + "type": "string" } ], "produces": [ @@ -455858,7 +471261,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rover.searchResponseDoc" + "$ref": "#/definitions/sec.intelligenceResponseDoc" } }, "400": { @@ -455891,27 +471294,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search Rover sitters and walkers", + "summary": "Company 360 overview from SEC data", "tags": [ - "Rover" + "SEC EDGAR" ] } }, - "/rover/sitter/{slug}": { + "/sec/company/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Rover sitter/walker profile: name, photo, bio, star rating, review count, repeat-client count, years of experience, neighborhood/city/state, starting price, Star Sitter status, the services offered with per-service pricing, and public review excerpts from the sitter's own profile page.", - "operationId": "rover-sitter-profile", + "description": "Resolves a ticker symbol or company-name query to SEC EDGAR companies (CIK, ticker, name).", + "operationId": "sec-company-search", "parameters": [ { - "description": "Rover sitter profile slug, the trailing path segment of a search result's profile_url field", - "in": "path", - "name": "slug", + "description": "Ticker symbol or company name", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "tianci-d-staycation-for-your-dog" + "x-example": "apple" + }, + { + "description": "Max matches, default 10, max 100", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -455921,7 +471330,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rover.profileResponseDoc" + "$ref": "#/definitions/sec.companySearchResponseDoc" } }, "400": { @@ -455930,12 +471339,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "500": { "description": "Internal Server Error", "schema": { @@ -455954,27 +471357,58 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rover sitter profile", + "summary": "Resolve a ticker or company name to EDGAR companies", "tags": [ - "Rover" + "SEC EDGAR" ] } }, - "/rover/trainer-search": { + "/sec/company/submissions": { "get": { "consumes": [ "application/json" ], - "description": "Searches Rover's public dog trainer listings by location, returning trainer summaries (name, profile image, headline, experience details, rating, review count, repeat-client count, years of experience, city/state/zip, starting price, training methodology, and skill/behavior tags).", - "operationId": "rover-trainer-search", + "description": "Returns a company's recent SEC filings (form, dates, primary document URL) filtered by form type and date range, plus company profile fields as reported by EDGAR: entity_type, former_names, exchanges, category, fiscal_year_end, state_of_incorporation. Provide cik or ticker.", + "operationId": "sec-company-submissions", "parameters": [ { - "description": "Free-text address, city, or zip code, e.g. \\", + "description": "SEC CIK (numeric or zero-padded)", "in": "query", - "name": "location", - "required": true, + "name": "cik", "type": "string", - "x-example": "Seattle, WA" + "x-example": "320193" + }, + { + "description": "Ticker symbol (alternative to cik)", + "in": "query", + "name": "ticker", + "type": "string", + "x-example": "AAPL" + }, + { + "description": "Filter by form type, e.g. 10-K, 10-Q, 8-K", + "in": "query", + "name": "form", + "type": "string", + "x-example": "10-K" + }, + { + "description": "Earliest filing date (YYYY-MM-DD)", + "in": "query", + "name": "from", + "type": "string" + }, + { + "description": "Latest filing date (YYYY-MM-DD)", + "in": "query", + "name": "to", + "type": "string" + }, + { + "description": "Max filings, default 50, max 500", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -455984,7 +471418,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rover.trainerSearchResponseDoc" + "$ref": "#/definitions/sec.submissionsResponseDoc" } }, "400": { @@ -456017,27 +471451,41 @@ "ApiKeyAuth": [] } ], - "summary": "Search Rover dog trainers", + "summary": "List a company's EDGAR filings", "tags": [ - "Rover" + "SEC EDGAR" ] } }, - "/rover/trainer/{slug}": { + "/sec/filing": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Rover dog trainer profile: name, photo, headline, experience and availability details, training methodology, rating, review count, repeat-client count, years of training, skill/behavior tags, and education credentials.", - "operationId": "rover-trainer-profile", + "description": "Returns a single SEC filing's metadata and primary document URL. Provide accession plus cik or ticker.", + "operationId": "sec-filing", "parameters": [ { - "description": "Rover trainer profile slug, the trailing path segment of a trainer search result's profile_url field", - "in": "path", - "name": "slug", + "description": "SEC CIK (numeric or zero-padded)", + "in": "query", + "name": "cik", + "type": "string", + "x-example": "320193" + }, + { + "description": "Ticker symbol (alternative to cik)", + "in": "query", + "name": "ticker", + "type": "string", + "x-example": "AAPL" + }, + { + "description": "Accession number", + "in": "query", + "name": "accession", "required": true, "type": "string", - "x-example": "madison-h-over-6-years-of-pet-care-experience" + "x-example": "0000320193-25-000079" } ], "produces": [ @@ -456047,7 +471495,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/rover.trainerProfileResponseDoc" + "$ref": "#/definitions/sec.filingResponseDoc" } }, "400": { @@ -456080,24 +471528,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get Rover dog trainer profile", + "summary": "Get a single filing by accession number", "tags": [ - "Rover" + "SEC EDGAR" ] } }, - "/rte/article": { + "/sec/filing/sections": { "get": { - "description": "Returns public RTÉ News article metadata and body paragraphs from a canonical rte.ie/news article URL. RTÉ News articles are free to read; paywalled is omitted.", - "operationId": "rte-article", + "consumes": [ + "application/json" + ], + "description": "Extracts item sections (e.g. 1A Risk Factors, 7 MD&A) from a 10-K/10-Q/8-K primary document as clean text. Provide accession plus cik or ticker.", + "operationId": "sec-filing-sections", "parameters": [ { - "description": "Canonical RTÉ News article URL", + "description": "SEC CIK (numeric or zero-padded)", "in": "query", - "name": "url", + "name": "cik", + "type": "string", + "x-example": "320193" + }, + { + "description": "Ticker symbol (alternative to cik)", + "in": "query", + "name": "ticker", + "type": "string", + "x-example": "AAPL" + }, + { + "description": "Accession number", + "in": "query", + "name": "accession", "required": true, "type": "string", - "x-example": "https://www.rte.ie/news/politics/2026/0924/1592808-budget-fuel-excise/" + "x-example": "0000320193-25-000079" + }, + { + "description": "Comma-separated item numbers to return, e.g. 1A,7", + "in": "query", + "name": "items", + "type": "string", + "x-example": "1A,7" + }, + { + "description": "Max characters per section, default 20000, max 200000", + "in": "query", + "name": "max_chars", + "type": "integer" } ], "produces": [ @@ -456107,7 +471585,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/sec.filingSectionsResponseDoc" } }, "400": { @@ -456122,6 +471600,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -456134,24 +471618,60 @@ "ApiKeyAuth": [] } ], - "summary": "Get RTÉ News article content", + "summary": "Extract 10-K/10-Q/8-K item sections", "tags": [ - "RTÉ News" + "SEC EDGAR" ] } }, - "/rte/author": { + "/sec/financials": { "get": { - "description": "Returns an RTÉ News author's profile by canonical `url` (`https://www.rte.ie/author/-/`, the author link on an article byline): name, headshot, `role` and recent articles, each with title, URL, summary, publication time and image. `role` is the job title the page shows, for example Political Correspondent, and is omitted when there is none.", - "operationId": "rte-author", + "consumes": [ + "application/json" + ], + "description": "Returns a company's financial statements across recent periods, resolving EDGAR's inconsistent XBRL tags to a stable schema. Provide cik or ticker.", + "operationId": "sec-financials", "parameters": [ { - "description": "Canonical RTÉ author URL", + "description": "SEC CIK (numeric or zero-padded)", "in": "query", - "name": "url", - "required": true, + "name": "cik", "type": "string", - "x-example": "https://www.rte.ie/author/1110632-barry-lenihan/" + "x-example": "320193" + }, + { + "description": "Ticker symbol (alternative to cik)", + "in": "query", + "name": "ticker", + "type": "string", + "x-example": "AAPL" + }, + { + "description": "Statement, default income", + "enum": [ + "income", + "balance", + "cash_flow" + ], + "in": "query", + "name": "statement", + "type": "string" + }, + { + "description": "Period basis, default annual", + "enum": [ + "annual", + "quarterly" + ], + "in": "query", + "name": "period", + "type": "string" + }, + { + "description": "Number of periods, default 5, max 20", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -456161,7 +471681,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.rteAuthorResponseDoc" + "$ref": "#/definitions/sec.financialsResponseDoc" } }, "400": { @@ -456176,6 +471696,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -456188,55 +471714,60 @@ "ApiKeyAuth": [] } ], - "summary": "Get an RTÉ News author profile", + "summary": "Normalized income statement, balance sheet, or cash flow", "tags": [ - "RTÉ News" + "SEC EDGAR" ] } }, - "/rte/headlines": { + "/sec/frames": { "get": { - "description": "Returns the latest RTÉ News stories for one section. `section` is required and takes one of 29 slugs such as `ireland`, `world`, `politics`, `dublin`, `courts` or `nuacht` (Irish-language); others return a 400. Each item has its title, URL, summary, publication time and image. Small sections like `science` return only a handful of items.", - "operationId": "rte-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns every filer's reported value for one XBRL concept in one reporting period (an EDGAR \"frame\").", + "operationId": "sec-frames", "parameters": [ { - "description": "RTÉ News section slug", - "enum": [ - "ireland", - "world", - "politics", - "business", - "regional", - "connacht", - "dublin", - "leinster", - "munster", - "ulster", - "middle-east", - "europe", - "uk", - "us", - "ukraine", - "a-european-perspective", - "nuacht", - "newslens", - "analysis-and-comment", - "investigations-unit", - "crime", - "courts", - "education", - "health", - "environment", - "science", - "technology", - "weather", - "your-money" - ], + "description": "XBRL concept tag, e.g. Assets, Revenues", "in": "query", - "name": "section", + "name": "concept", "required": true, "type": "string", - "x-example": "ireland" + "x-example": "Assets" + }, + { + "description": "Reporting frame, e.g. CY2024, CY2024Q1, CY2024Q4I", + "in": "query", + "name": "period", + "required": true, + "type": "string", + "x-example": "CY2024Q4I" + }, + { + "description": "Unit of measure, default USD", + "in": "query", + "name": "unit", + "type": "string", + "x-example": "USD" + }, + { + "description": "XBRL taxonomy, default us-gaap", + "enum": [ + "dei", + "ifrs-full", + "srt", + "us-gaap" + ], + "in": "query", + "name": "taxonomy", + "type": "string" + }, + { + "description": "Max companies, default 200, max 2000", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -456246,7 +471777,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/sec.framesResponseDoc" } }, "400": { @@ -456255,40 +471786,14 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get RTÉ News section headlines", - "tags": [ - "RTÉ News" - ] - } - }, - "/rte/news": { - "get": { - "description": "Returns fresh RTÉ News top stories from its public news feed. Scope is RTÉ News (rte.ie/news) only, not the RTÉ Player, radio, sport or entertainment sections.", - "operationId": "rte-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -456305,50 +471810,52 @@ "ApiKeyAuth": [] } ], - "summary": "Get RTÉ News top stories", + "summary": "Cross-company values for one XBRL concept and period", "tags": [ - "RTÉ News" + "SEC EDGAR" ] } }, - "/rte/sections": { + "/sec/full-text-search": { "get": { - "description": "Lists the 29 RTÉ News section hubs that `rte-headlines` accepts, such as `ireland`, `politics`, `dublin`, `ukraine` and `investigations-unit`. Each entry has a `slug`, a display `name` and the feed `url`. The list is curated to hubs with their own article feed, so narrower topic pages are not included.", - "operationId": "rte-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get RTÉ News sections", - "tags": [ - "RTÉ News" - ] - } - }, - "/salon/article": { - "get": { - "description": "Returns a Salon article by canonical `url` on `www.salon.com` in the `/YYYY/MM/DD//` form: title, description, section, authors, publication and update times, image, body `paragraphs` and a `paywalled` flag.", - "operationId": "salon-article", + "description": "Searches the full text of SEC EDGAR filings, filtered by form and date, with pagination. Free where incumbents gate full-text search behind paid tiers.", + "operationId": "sec-full-text-search", "parameters": [ { - "description": "Canonical Salon article URL", + "description": "Search query (supports quoted phrases)", "in": "query", - "name": "url", + "name": "q", "required": true, "type": "string", - "x-example": "https://www.salon.com/2026/09/23/trump-admin-spars-with-iran-at-un-meeting/" + "x-example": "artificial intelligence" + }, + { + "description": "Filter by form types, comma-separated", + "in": "query", + "name": "forms", + "type": "string", + "x-example": "10-K" + }, + { + "description": "Earliest filing date (YYYY-MM-DD)", + "in": "query", + "name": "from", + "type": "string" + }, + { + "description": "Latest filing date (YYYY-MM-DD)", + "in": "query", + "name": "to", + "type": "string" + }, + { + "description": "1-based page number, default 1", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -456358,7 +471865,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/sec.fullTextResponseDoc" } }, "400": { @@ -456367,8 +471874,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -456385,24 +471892,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get Salon article content", + "summary": "Full-text search across EDGAR filings", "tags": [ - "Salon" + "SEC EDGAR" ] } }, - "/salon/author": { + "/sec/insider": { "get": { - "description": "Returns a Salon writer's profile by canonical `url` (`https://www.salon.com/writer/`): name, `job_title`, `bio`, `image_url`, `same_as` links and a list of articles. Each article carries only a title and URL, with no date or category. Job title, photo and `same_as` appear only when the writer page shows them.", - "operationId": "salon-author", + "consumes": [ + "application/json" + ], + "description": "Returns a company's recent insider transactions from Form 3/4/5 ownership filings (owner, role, security, shares, price). Provide cik or ticker.", + "operationId": "sec-insider", "parameters": [ { - "description": "Canonical Salon writer URL", + "description": "SEC CIK (numeric or zero-padded)", "in": "query", - "name": "url", - "required": true, + "name": "cik", "type": "string", - "x-example": "https://www.salon.com/writer/troy_farah" + "x-example": "320193" + }, + { + "description": "Ticker symbol (alternative to cik)", + "in": "query", + "name": "ticker", + "type": "string", + "x-example": "AAPL" + }, + { + "description": "Max transactions, default 10, max 30", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -456412,7 +471934,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.salonAuthorResponseDoc" + "$ref": "#/definitions/sec.insiderResponseDoc" } }, "400": { @@ -456427,6 +471949,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -456439,58 +471967,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Salon writer profile", + "summary": "Insider transactions (Forms 3/4/5)", "tags": [ - "Salon" + "SEC EDGAR" ] } }, - "/salon/headlines": { + "/sec/institutional-holdings": { "get": { - "description": "Returns the latest Salon stories for one section. `section` is required and takes one of 32 slugs, including `home`, `news-and-politics`, `politics`, `opinion`, `culture`, `science-and-health` and `technology`. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "salon-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns the latest 13F-HR holdings for an institutional manager (by CIK): issuer, value, shares, sorted by value.", + "operationId": "sec-institutional-holdings", "parameters": [ { - "description": "Salon RSS section slug", - "enum": [ - "home", - "audio", - "blog", - "business", - "culture", - "economy", - "economy-and-innovation", - "elections", - "entertainment", - "food", - "guides", - "innovation", - "life", - "life-stories", - "media", - "money", - "news", - "news-and-politics", - "opinion", - "oscars_2012", - "politics", - "satire", - "science-and-health", - "sex-and-love", - "social", - "sustainability", - "sxsw_2013", - "technology", - "the_brief", - "video", - "vpn", - "working_ahead" - ], + "description": "Institutional manager CIK", "in": "query", - "name": "section", + "name": "cik", "required": true, "type": "string", - "x-example": "home" + "x-example": "1067983" + }, + { + "description": "Max holdings, default 50, max 1000", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -456500,7 +472003,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/sec.holdingsResponseDoc" } }, "400": { @@ -456509,6 +472012,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -456521,16 +472036,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Salon section headlines", + "summary": "Institutional holdings (13F-HR)", "tags": [ - "Salon" + "SEC EDGAR" ] } }, - "/salon/news": { + "/sephora/brands": { "get": { - "description": "Returns Salon's latest top stories across the site. Takes no parameters, and `salon-headlines` narrows by section instead. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "salon-news", + "consumes": [ + "application/json" + ], + "description": "Returns Sephora's full brand directory (373 brands at time of writing), sourced from the site's own A-Z brand list page. Each brand's `name` is the exact string GET /sephora/search and GET /sephora/category's repeatable `brand` filter parameter expect.", + "operationId": "sephora-brands", "produces": [ "application/json" ], @@ -456538,7 +472056,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/sephora.brandsResponseDoc" } }, "429": { @@ -456559,60 +472077,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get Salon top stories", - "tags": [ - "Salon" - ] - } - }, - "/salon/sections": { - "get": { - "description": "Lists the 32 Salon sections that `salon-headlines` accepts, from `home` and `news-and-politics` to `working_ahead`. Each entry has a `slug`, a display `name` and the section's feed `url`. The list includes older event slugs such as `oscars_2012` and `sxsw_2013`.", - "operationId": "salon-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Salon RSS sections", + "summary": "Sephora brand directory", "tags": [ - "Salon" + "Sephora" ] } }, - "/samsclub/category": { + "/sephora/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Sam's Club category or collection page's product grid, with real page-based pagination. id accepts a bare numeric category id (from a nav link's /browse/{id} URL) or a full /browse/{slug}/{id} URL copied from samsclub.com -- only the trailing id is used. Returns products with name, brand, pricing, availability, rating, and image. An id samsclub.com does not recognize returns a genuine zero-result response rather than an error.", - "operationId": "samsclub-category", + "description": "Returns Sephora's own live storefront category navigation (department, group, name, and slug for each), sourced from the site's own \"Shop\" mega-nav. Each entry's slug is directly usable as GET /sephora/category's own `slug` query parameter.", + "operationId": "sephora-categories", "parameters": [ { - "description": "Sam's Club category id, or a /browse/{slug}/{id} URL", + "description": "Filter to one storefront department", + "enum": [ + "new", + "makeup", + "skincare", + "fragrance", + "hair", + "bath-body", + "mini-size", + "brands", + "gifts-value-sets", + "sale-offers" + ], "in": "query", - "name": "id", - "required": true, + "name": "department", "type": "string", - "x-example": "15660127" - }, - { - "description": "Result page, 1-based, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "makeup" } ], "produces": [ @@ -456622,7 +472118,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/samsclub.categoryResponseDoc" + "$ref": "#/definitions/sephora.categoriesResponseDoc" } }, "400": { @@ -456649,27 +472145,99 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Sam's Club category or collection", + "summary": "Sephora storefront categories", "tags": [ - "Sam's Club" + "Sephora" ] } }, - "/samsclub/content/{id}": { + "/sephora/category": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Sam's Club curated content/landing page (e.g. a seasonal savings hub or a \"New Arrivals\" page) -- distinct data from GET /samsclub/category's flat, paginated product grid. id accepts a bare numeric content page id (from a nav link's /cp/{id} URL) or a full /cp/{slug}/{id} URL copied from samsclub.com -- only the trailing id is used. Returns a title, breadcrumb, named curated product shelves, and a category-navigation tile grid. There is no pagination -- a content page's shelves are a fixed, hand-curated set. An id samsclub.com does not recognize returns a 404, unlike GET /samsclub/category's zero-result response for the same situation.", - "operationId": "samsclub-content", + "description": "Returns one page of a Sephora category/browse listing (e.g. Makeup, Skincare), with the same sort and facet filters as /sephora/search. slug is the path segment after sephora.com/shop/, e.g. makeup-cosmetics. The response uses Sephora's public catalog search to keep browse listings available when the category page's legacy embedded data is absent.", + "operationId": "sephora-category", "parameters": [ { - "description": "Numeric Sam's Club content page id, from a /cp/{slug}/{id} URL", - "in": "path", - "name": "id", + "description": "Category-page slug", + "in": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "16050279" + "x-example": "makeup-cosmetics" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Sort order, defaults to featured", + "enum": [ + "featured", + "top_rated", + "new", + "best_selling", + "price_low_to_high", + "price_high_to_low" + ], + "in": "query", + "name": "sort_by", + "type": "string", + "x-example": "featured" + }, + { + "description": "Minimum price in whole dollars; must be set together with price_max", + "in": "query", + "name": "price_min", + "type": "integer", + "x-example": 15 + }, + { + "description": "Maximum price in whole dollars; must be set together with price_min", + "in": "query", + "name": "price_max", + "type": "integer", + "x-example": 30 + }, + { + "collectionFormat": "csv", + "description": "One or more exact brand names to filter to (OR'd together); repeat the param for multiple values", + "in": "query", + "items": { + "type": "string" + }, + "name": "brand", + "type": "array", + "x-example": "Lancôme" + }, + { + "description": "Minimum star rating, 1 to 4", + "in": "query", + "name": "rating_min", + "type": "integer", + "x-example": 4 + }, + { + "description": "When true, filters to products flagged New", + "in": "query", + "name": "is_new", + "type": "boolean", + "x-example": false + }, + { + "collectionFormat": "csv", + "description": "Additional facet:value filters, repeat the param for multiple; facet must be one of: benefits, ingredientpreferences, colorfamily, formulation, size, shoppingpreferences, agerange, skintype, finish, skinconcerns, coverage, hairtype, hairconcerns, hairtexture", + "in": "query", + "items": { + "type": "string" + }, + "name": "filter", + "type": "array", + "x-example": "formulation:serum" } ], "produces": [ @@ -456679,7 +472247,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/samsclub.contentResponseDoc" + "$ref": "#/definitions/sephora.categoryResponseDoc" } }, "400": { @@ -456712,68 +472280,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sam's Club curated content or landing page", - "tags": [ - "Sam's Club" - ] - } - }, - "/samsclub/departments": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Sam's Club's full department/category taxonomy, as shown on its own \"All Departments\" page: every top-level department with its own subcategory list. Each link's type is \"browse\" (pairs directly with GET /samsclub/category), \"cp\" (a content/landing page that does not reliably carry a product grid), or empty (an unrecognized link shape).", - "operationId": "samsclub-departments", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/samsclub.departmentsResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List Sam's Club departments and categories", + "summary": "Sephora category browse", "tags": [ - "Sam's Club" + "Sephora" ] } }, - "/samsclub/product/{id}": { + "/sephora/product": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Sam's Club product's full detail: name, brand, description, category breadcrumb, pricing, availability, images, aggregate rating and review count, and the club's own item number. id is the numeric product id from a Sam's Club product page's /ip/ URL.", - "operationId": "samsclub-product", + "description": "Returns one Sephora product's full detail (every color/shade variant with its own price and availability, rating, review count, and a sample of recent reviews). `product_id` is the full product-page slug, e.g. `lip-sleeping-mask-P420652` -- copy it from the path segment after sephora.com/product/ on any product page; unlike some other retailers, an arbitrary or partial slug does not resolve.", + "operationId": "sephora-product", "parameters": [ { - "description": "Numeric Sam's Club product id, from a product page's /ip/{slug}/{id} URL", - "in": "path", - "name": "id", + "description": "Full Sephora product-page slug", + "in": "query", + "name": "product_id", "required": true, "type": "string", - "x-example": "13610014888" + "x-example": "lip-sleeping-mask-P420652" } ], "produces": [ @@ -456783,7 +472310,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/samsclub.productResponseDoc" + "$ref": "#/definitions/sephora.productResponseDoc" } }, "400": { @@ -456816,27 +472343,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sam's Club product's full detail", + "summary": "Sephora product detail", "tags": [ - "Sam's Club" + "Sephora" ] } }, - "/samsclub/product/{id}/related": { + "/sephora/product/questions": { "get": { "consumes": [ "application/json" ], - "description": "Returns the related-item carousels shown on a Sam's Club product page, each a named shelf (e.g. \"Members also considered\", \"Items you may like\") of products with pricing, rating, and image. id is the numeric product id from a Sam's Club product page's /ip/ URL. An unrecognized id is not distinguished from a known one -- it still returns generic fallback shelves rather than an error.", - "operationId": "samsclub-product-related", + "description": "Returns one page of a Sephora product's customer Q&A: each question plus every answer it received (text, author, whether it's a brand answer, helpful votes). product_id is the Sephora productGroupID, e.g. P420652 -- the same value /sephora/product returns as product_group_id.", + "operationId": "sephora-product-questions", "parameters": [ { - "description": "Numeric Sam's Club product id, from a product page's /ip/{slug}/{id} URL", - "in": "path", - "name": "id", + "description": "Sephora productGroupID", + "in": "query", + "name": "product_id", "required": true, "type": "string", - "x-example": "13610014888" + "x-example": "P420652" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -456846,7 +472380,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/samsclub.relatedItemsResponseDoc" + "$ref": "#/definitions/sephora.productQuestionsResponseDoc" } }, "400": { @@ -456873,24 +472407,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sam's Club product's related items", + "summary": "Sephora product questions and answers", "tags": [ - "Sam's Club" + "Sephora" ] } }, - "/sbsnews/article": { + "/sephora/product/reviews": { "get": { - "description": "Returns public SBS News article metadata and body paragraphs from a canonical article URL, including standard, Insight, and Dateline stories.", - "operationId": "sbsnews-article", + "consumes": [ + "application/json" + ], + "description": "Returns one page of a Sephora product's full customer reviews (title, body, rating, author, helpful votes, secondary ratings, photos), plus the product's site-wide rating rollup (average rating, recommended ratio, star-count histogram). product_id is the Sephora productGroupID, e.g. P420652 -- the same value /sephora/product returns as product_group_id.", + "operationId": "sephora-product-reviews", "parameters": [ { - "description": "Canonical SBS News article URL", + "description": "Sephora productGroupID", "in": "query", - "name": "url", + "name": "product_id", "required": true, "type": "string", - "x-example": "https://www.sbs.com.au/news/article/example-story/abc123xyz" + "x-example": "P420652" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -456900,7 +472444,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/sephora.productReviewsResponseDoc" } }, "400": { @@ -456909,8 +472453,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -456927,31 +472471,106 @@ "ApiKeyAuth": [] } ], - "summary": "Get SBS News article content", + "summary": "Sephora product reviews", "tags": [ - "SBS News" + "Sephora" ] } }, - "/sbsnews/author": { + "/sephora/search": { "get": { - "description": "Returns an SBS News byline collection by canonical `url`, for example `https://www.sbs.com.au/news/collection/jennifer-scherer`: name, headshot, biography and the articles on the requested archive `page` (1-based, default 1), with `has_next_page` for paging. Articles are limited to SBS News article, Insight and Dateline links.", - "operationId": "sbsnews-author", + "consumes": [ + "application/json" + ], + "description": "Searches Sephora's product catalog by keyword, with real page-based pagination. Returns products with brand, pricing, rating, and review count. Sephora's own search never returns a genuine zero-result state for a nonempty keyword -- an unrecognized/nonsense keyword still returns a full, unrelated fallback result set rather than an empty one. price_min/price_max must be provided together (whole dollars) -- upstream silently ignores a one-sided price range rather than filtering or erroring, so this endpoint rejects a one-sided range as invalid instead of passing it through. brand and filter each accept multiple values (OR'd together within the same facet); brand/rating_min/is_new/filter/price_min/price_max can all be combined with each other (AND'd together across different facets).", + "operationId": "sephora-search", "parameters": [ { - "description": "Canonical SBS News author collection URL", + "description": "Search keyword", "in": "query", - "name": "url", + "name": "query", "required": true, "type": "string", - "x-example": "https://www.sbs.com.au/news/collection/jennifer-scherer" + "x-example": "mascara" }, { - "default": 1, - "description": "1-based author archive page number", + "description": "Result page, 1-based, defaults to 1", "in": "query", "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 + }, + { + "description": "Results per page, 1 to 100, defaults to 60", + "in": "query", + "name": "page_size", + "type": "integer", + "x-example": 60 + }, + { + "description": "Sort order, defaults to featured", + "enum": [ + "featured", + "top_rated", + "new", + "best_selling", + "price_low_to_high", + "price_high_to_low" + ], + "in": "query", + "name": "sort_by", + "type": "string", + "x-example": "featured" + }, + { + "description": "Minimum price in whole dollars; must be set together with price_max", + "in": "query", + "name": "price_min", + "type": "integer", + "x-example": 15 + }, + { + "description": "Maximum price in whole dollars; must be set together with price_min", + "in": "query", + "name": "price_max", + "type": "integer", + "x-example": 30 + }, + { + "collectionFormat": "csv", + "description": "One or more exact brand names to filter to (OR'd together); repeat the param for multiple values", + "in": "query", + "items": { + "type": "string" + }, + "name": "brand", + "type": "array", + "x-example": "Lancôme" + }, + { + "description": "Minimum star rating, 1 to 4", + "in": "query", + "name": "rating_min", + "type": "integer", + "x-example": 4 + }, + { + "description": "When true, filters to products flagged New", + "in": "query", + "name": "is_new", + "type": "boolean", + "x-example": false + }, + { + "collectionFormat": "csv", + "description": "Additional facet:value filters, repeat the param for multiple; facet must be one of: benefits, ingredientpreferences, colorfamily, formulation, size, shoppingpreferences, agerange, skintype, finish, skinconcerns, coverage, hairtype, hairconcerns, hairtexture", + "in": "query", + "items": { + "type": "string" + }, + "name": "filter", + "type": "array", + "x-example": "formulation:serum" } ], "produces": [ @@ -456961,7 +472580,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sbsnewsAuthorResponseDoc" + "$ref": "#/definitions/sephora.searchResponseDoc" } }, "400": { @@ -456970,8 +472589,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -456988,41 +472607,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get an SBS News author profile", + "summary": "Sephora product search", "tags": [ - "SBS News" + "Sephora" ] } }, - "/sbsnews/headlines": { + "/sephora/stores": { "get": { - "description": "Returns current SBS News headlines for one section. `section` is required and takes one of 15 slugs from `sbsnews-sections`, such as `top`, `latest`, `australia`, `world`, `politics`, `indigenous`, `cost-of-living` or `sport`. Every item has its title and URL. The `top`, `latest`, `australia` and `world` sections also include summary, publication time and image.", - "operationId": "sbsnews-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns Sephora physical store locations near a coordinate (address, hours, BOPIS/curbside/same-day flags). Renders through a JS-executing browser backend, unlike every other Sephora endpoint -- the store-locator data call itself is plain HTTP, but it requires a per-visit access token minted by an endpoint gated behind a bot-management JS challenge, so responses may take longer.", + "operationId": "sephora-stores", "parameters": [ { - "description": "Section slug from sbsnews-sections", - "enum": [ - "top", - "latest", - "australia", - "world", - "politics", - "indigenous", - "environment", - "life", - "cost-of-living", - "immigration", - "health-and-wellbeing", - "sport", - "education", - "technology-and-social-media", - "arts-and-entertainment" - ], + "description": "Latitude, -90 to 90", "in": "query", - "name": "section", + "name": "latitude", "required": true, - "type": "string", - "x-example": "top" + "type": "number", + "x-example": 41.88325 + }, + { + "description": "Longitude, -180 to 180", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": -87.6323879 + }, + { + "description": "Search radius in miles, 1 to 500, defaults to 50", + "in": "query", + "name": "radius", + "type": "integer", + "x-example": 50 + }, + { + "description": "Max stores to return, 1 to 50, defaults to 10", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -457032,7 +472659,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/sephora.storesResponseDoc" } }, "400": { @@ -457041,37 +472668,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get SBS News section headlines", - "tags": [ - "SBS News" - ] - } - }, - "/sbsnews/news": { - "get": { - "description": "Returns the current SBS News Top Stories. Takes no parameters. Each item has its title, canonical SBS News article URL and summary, with publication time, author and image when present.", - "operationId": "sbsnews-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "503": { "description": "Service Unavailable", @@ -457085,16 +472686,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get SBS News top stories", + "summary": "Sephora store locator", "tags": [ - "SBS News" + "Sephora" ] } }, - "/sbsnews/sections": { + "/sephora/suggest": { "get": { - "description": "Lists the SBS News sections that `sbsnews-headlines` accepts: the seven primary navigation sections, the Top Stories feed and featured topic and collection pages. Each entry has a `slug`, a display `name` and a `url`. News Podcasts and video surfaces are not included.", - "operationId": "sbsnews-sections", + "consumes": [ + "application/json" + ], + "description": "Returns Sephora's own search-box type-ahead suggestions for a partial keyword: keyword-completion terms, matching products, and trending/related categories. Sephora's own upstream never returns a genuine zero-result state for a nonempty query -- a deliberately nonsense query still returns unrelated product suggestions.", + "operationId": "sephora-suggest", + "parameters": [ + { + "description": "Partial search keywords", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "masc" + } + ], "produces": [ "application/json" ], @@ -457102,7 +472716,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/sephora.suggestResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -457111,24 +472743,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get SBS News sections", + "summary": "Sephora search suggestions", "tags": [ - "SBS News" + "Sephora" ] } }, - "/sciencealert/article": { + "/sevennewsau/article": { "get": { - "description": "Returns a ScienceAlert article by absolute canonical `url`: title, description, section, authors, publication and update times, image, the cleaned body `paragraphs` and a `paywalled` flag. Section pages and author listing URLs are rejected.", - "operationId": "sciencealert-article", + "description": "Returns public 7NEWS article metadata and body paragraphs from a canonical 7news.com.au article URL. 7NEWS articles are free to read; a non-free content tier, if one ever appears, is flagged as paywalled.", + "operationId": "sevennewsau-article", "parameters": [ { - "description": "Canonical ScienceAlert article URL", + "description": "Canonical 7NEWS article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.sciencealert.com/the-sun-and-moon-can-trigger-earthquakes-and-scientists-may-finally-know-how" + "x-example": "https://7news.com.au/news/world/susan-sarandon-and-hannah-einbinder-arrested-at-nyc-protests-against-benjamin-netanyahus-un-address-c-22923759" } ], "produces": [ @@ -457165,24 +472797,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get ScienceAlert article content", + "summary": "Get 7NEWS Australia article content", "tags": [ - "ScienceAlert" + "7NEWS Australia" ] } }, - "/sciencealert/author": { + "/sevennewsau/author": { "get": { - "description": "Returns a ScienceAlert author's profile and one page of articles, from an author listing `url` in the form `https://www.sciencealert.com//page/`; the first observed page is `/page/0`. The response has the name, `slug`, biography, image, social links, that page's articles, and `page` and `has_next_page` for paging.", - "operationId": "sciencealert-author", + "description": "Returns one 7NEWS journalist's public profile: name, job title, biography, portrait, public social links and the latest stories listed on the profile page.", + "operationId": "sevennewsau-author", "parameters": [ { - "description": "Canonical ScienceAlert author listing URL, e.g. /michelle-starr/page/0", + "description": "Author slug, e.g. aimee-edwards", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "aimee-edwards" + }, + { + "description": "Canonical 7news.com.au/profile/ URL; alternative to slug", "in": "query", "name": "url", - "required": true, "type": "string", - "x-example": "https://www.sciencealert.com/michelle-starr/page/0" + "x-example": "https://7news.com.au/profile/aimee-edwards" } ], "produces": [ @@ -457192,7 +472830,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.scienceAlertAuthorResponseDoc" + "$ref": "#/definitions/publicnews.sevennewsauAuthorResponseDoc" } }, "400": { @@ -457219,34 +472857,135 @@ "ApiKeyAuth": [] } ], - "summary": "Get a ScienceAlert author profile", + "summary": "Get a 7NEWS Australia author profile", "tags": [ - "ScienceAlert" + "7NEWS Australia" ] } }, - "/sciencealert/headlines": { + "/sevennewsau/headlines": { "get": { - "description": "Returns the latest ScienceAlert stories for one section. `section` is required and takes `space`, `health`, `environment`, `humans`, `tech`, `nature`, `physics` or `this-week-in-science`; other values are rejected. Each item has its title and URL.", - "operationId": "sciencealert-headlines", + "description": "Returns the 100 most recent 7NEWS Australia stories for one topic. `section` is required and takes a topic slug such as `news-sydney`, `sport-afl` or `business-property`, which is the site path with slashes replaced by hyphens. Each item has its title, URL, summary, publication time, author when credited, and lead image.", + "operationId": "sevennewsau-headlines", "parameters": [ { - "description": "Section slug", + "description": "7NEWS topic slug (the site path with slashes replaced by hyphens)", "enum": [ - "space", - "health", - "environment", - "humans", - "tech", - "nature", - "physics", - "this-week-in-science" + "7you", + "7you-beauty", + "7you-books", + "7you-fashion", + "7you-health-fitness", + "7you-home", + "7you-tech", + "7you-travel", + "business", + "business-economy", + "business-energy", + "business-property", + "business-retail", + "entertainment", + "entertainment-australian-idol", + "entertainment-celebrity", + "entertainment-farmer-wants-a-wife", + "entertainment-home-and-away", + "entertainment-movies", + "entertainment-music", + "entertainment-my-kitchen-rules", + "entertainment-the-voice-australia", + "entertainment-tv", + "lifestyle", + "lifestyle-fashion", + "lifestyle-food", + "lifestyle-health-wellbeing", + "lifestyle-parenting", + "lifestyle-personal-finance", + "lifestyle-pets", + "lifestyle-real-estate", + "lifestyle-recipes", + "lifestyle-relationships", + "lifestyle-shopping", + "lifestyle-sponsored", + "motoring", + "news", + "news-act", + "news-adelaide", + "news-asia", + "news-australia", + "news-brisbane", + "news-canberra", + "news-conflict", + "news-crime", + "news-darwin", + "news-disaster-and-emergency", + "news-education", + "news-europe", + "news-gold-coast", + "news-hobart", + "news-israel", + "news-melbourne", + "news-middle-east", + "news-missing-person", + "news-new-zealand", + "news-newcastle", + "news-nsw", + "news-nsw-police", + "news-nt", + "news-perth", + "news-protest", + "news-qld", + "news-russia", + "news-sa", + "news-sydney", + "news-ukraine", + "news-united-states", + "news-vic", + "news-wa", + "news-weather", + "news-world", + "opinion", + "politics", + "politics-federal-politics", + "politics-state-politics", + "sport", + "sport-afl", + "sport-aflw", + "sport-baseball", + "sport-basketball", + "sport-boxing", + "sport-cricket", + "sport-cycling", + "sport-f1", + "sport-golf", + "sport-horse-racing", + "sport-mixed-martial-arts", + "sport-motorsport", + "sport-netball", + "sport-nfl", + "sport-olympics", + "sport-rugby-league", + "sport-rugby-union", + "sport-soccer", + "sport-supercars", + "sport-tennis", + "sport-ufc", + "spotlight", + "sunrise", + "sunrise-cooking", + "sunrise-cooking-with-coles", + "sunrise-entertainment", + "technology", + "technology-gaming", + "the-morning-show", + "travel", + "travel-jetstar", + "travel-qantas" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "space" + "x-example": "7you" } ], "produces": [ @@ -457277,16 +473016,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get ScienceAlert section headlines", + "summary": "Get 7NEWS Australia section headlines", "tags": [ - "ScienceAlert" + "7NEWS Australia" ] } }, - "/sciencealert/news": { + "/sevennewsau/news": { "get": { - "description": "Returns ScienceAlert's latest top stories across the site. Takes no parameters, and `sciencealert-headlines` narrows by section instead. Each item has its title, URL, summary, author and publication time.", - "operationId": "sciencealert-news", + "description": "Returns the 100 most recent 7NEWS Australia stories across every section, with no input needed. Each item has its title, canonical URL, summary, publication time, lead image, and the author when one is credited. Agency copy is often credited to `Digital Staff`.", + "operationId": "sevennewsau-news", "produces": [ "application/json" ], @@ -457315,16 +473054,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get ScienceAlert top stories", + "summary": "Get 7NEWS Australia top stories", "tags": [ - "ScienceAlert" + "7NEWS Australia" ] } }, - "/sciencealert/sections": { + "/sevennewsau/sections": { "get": { - "description": "Lists the eight top-level ScienceAlert sections that `sciencealert-headlines` accepts: `space`, `health`, `environment`, `humans`, `tech`, `nature`, `physics` and `this-week-in-science`. Each entry has a `slug`, a display `name` and the section page `url`.", - "operationId": "sciencealert-sections", + "description": "Returns the public 7NEWS topic feed inventory accepted by the headlines endpoint: national and city news, sport, politics, business, entertainment, lifestyle and more.", + "operationId": "sevennewsau-sections", "produces": [ "application/json" ], @@ -457334,6 +473073,18 @@ "schema": { "$ref": "#/definitions/publicnews.sectionsResponseDoc" } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } } }, "security": [ @@ -457341,24 +473092,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get ScienceAlert sections", + "summary": "Get 7NEWS Australia sections", "tags": [ - "ScienceAlert" + "7NEWS Australia" ] } }, - "/scmp/article": { + "/sfgate/article": { "get": { - "description": "Returns one public South China Morning Post article's metadata and body paragraphs from a canonical article URL. `content_locked` and `paywall_types` are the upstream's own restricted-access signals for that article, reported exactly as the site returns them; the body returned here is the same one the site's own page serves to an anonymous visitor. An article whose page genuinely withholds its body is reported as a restricted-access error instead of a hollow or truncated response.", - "operationId": "scmp-article", + "description": "Returns public SFGATE article metadata and body paragraphs from a canonical article URL. Article pages are served through proxied browser renderers; the service does not bypass authentication or access controls, and marks paywalled=true when only a teaser is public.", + "operationId": "sfgate-article", "parameters": [ { - "description": "Canonical SCMP article URL", + "description": "Canonical SFGate article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.scmp.com/news/hong-kong/society/article/3368530/example-slug" + "x-example": "https://www.sfgate.com/bayarea/article/example-story-22400001.php" } ], "produces": [ @@ -457368,7 +473119,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/scmp.articleResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -457377,24 +473128,12 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -457407,24 +473146,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get an SCMP article's content", + "summary": "Get SFGate article content", "tags": [ - "SCMP" + "SFGate" ] } }, - "/scmp/author": { + "/sfgate/author": { "get": { - "description": "Returns one South China Morning Post author/reporter's public profile -- name, role, biography, areas of expertise, languages, location, headshot, and contact/social links -- plus their recent articles, from a canonical author URL.", - "operationId": "scmp-author", + "description": "Returns an SFGATE author's name, job title, biography, headshot, public profile links, and recent articles from a canonical author URL. Author pages are served through proxied browser renderers; the service does not bypass authentication or access controls.", + "operationId": "sfgate-author", "parameters": [ { - "description": "Canonical scmp.com/author/ URL", + "description": "Canonical SFGate author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.scmp.com/author/matthew-cheng" + "x-example": "https://www.sfgate.com/author/example-writer/" } ], "produces": [ @@ -457434,7 +473173,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/scmp.authorResponseDoc" + "$ref": "#/definitions/publicnews.sfgateAuthorResponseDoc" } }, "400": { @@ -457449,12 +473188,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -457467,114 +473200,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get an SCMP author/reporter profile", + "summary": "Get an SFGate author profile", "tags": [ - "SCMP" + "SFGate" ] } }, - "/scmp/headlines": { + "/sfgate/headlines": { "get": { - "description": "Returns the current article listing for one South China Morning Post section: each story's title, canonical URL, summary, byline, publication time, and lead image. Section must be a slug returned by /scmp/sections.", - "operationId": "scmp-headlines", + "description": "Returns the latest SFGATE stories for one section. `section` is required and takes `top-news`, `bay-area`, `business-technology`, `entertainment`, `celebrity`, `food-dining`, `travel`, `routes`, `top-sports`, `giants`, `49ers` or `warriors`. Feeds hold 12 to 30 items, and the `warriors` feed is quiet in the off-season.", + "operationId": "sfgate-headlines", "parameters": [ { - "description": "Section slug from /scmp/sections", + "description": "SFGate section slug", "enum": [ - "news", - "business", - "property", - "tech", - "lifestyle", - "culture", - "sport", - "postmag", - "style", - "this-week-in-asia", - "cooking", - "hong-kong", - "china", - "asia", - "world", - "people-culture", - "china-politics", - "china-diplomacy", - "china-economy", - "hong-kong-politics", - "hong-kong-economy", - "hong-kong-health-environment", - "hong-kong-education", - "world-us-canada", - "world-europe", - "world-middle-east", - "world-americas", - "world-africa", - "world-russia-central-asia", - "asia-australasia", - "asia-diplomacy", - "asia-east-asia", - "asia-southeast-asia", - "asia-south-asia", - "business-companies", - "business-investor-relations", - "business-global-economy", - "business-money-wealth", - "opinion-comment", - "opinion-harrys-view", - "opinion-blogs", - "opinion-polls", - "opinion-letters", - "property-hong-kong-china", - "property-international", - "tech-big-tech", - "tech-enterprises", - "tech-innovation", - "tech-leaders-founders", - "tech-science-research", - "lifestyle-fashion-beauty", - "lifestyle-travel-leisure", - "lifestyle-motoring", - "lifestyle-food-drink", - "lifestyle-health-wellness", - "lifestyle-watches", - "culture-books", - "culture-music", - "culture-film-tv", - "culture-arts", - "sport-hong-kong", - "sport-china", - "sport-golf", - "sport-racing", - "sport-rugby", - "sport-football", - "sport-tennis", - "sport-other", - "sport-boxing", - "sport-hong-kong-sevens", - "postmag-culture", - "postmag-travel", - "postmag-food-drink", - "postmag-passions", - "postmag-wellness", - "postmag-design-interiors", - "style-luxury", - "style-fashion", - "style-beauty", - "style-people", - "style-lifestyle", - "this-week-in-asia-politics", - "this-week-in-asia-geopolitics", - "this-week-in-asia-economics", - "this-week-in-asia-society", - "this-week-in-asia-opinion", - "this-week-in-asia-asia-buzz", - "this-week-in-asia-people" + "top-news", + "bay-area", + "business-technology", + "entertainment", + "celebrity", + "food-dining", + "travel", + "routes", + "top-sports", + "giants", + "49ers", + "warriors" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "hong-kong" + "x-example": "top-news" } ], "produces": [ @@ -457584,7 +473241,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/scmp.headlinesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -457593,18 +473250,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -457617,16 +473262,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get the latest stories in an SCMP section", + "summary": "Get SFGate section headlines", "tags": [ - "SCMP" + "SFGate" ] } }, - "/scmp/sections": { + "/sfgate/news": { "get": { - "description": "Lists every South China Morning Post section accepted by /scmp/headlines, with its slug, display name, feed URL, and (for a subsection) its parent section's slug and name. Values: `news`, `business`, `property`, `tech`, `lifestyle`, `culture`, `sport`, `postmag`, `style`, `this-week-in-asia`, `cooking`, `hong-kong`, `china`, `asia`, `world`, `people-culture`, `china-politics`, `china-diplomacy`, `china-economy`, `hong-kong-politics`, `hong-kong-economy`, `hong-kong-health-environment`, `hong-kong-education`, `world-us-canada`, `world-europe`, `world-middle-east`, `world-americas`, `world-africa`, `world-russia-central-asia`, `asia-australasia`, `asia-diplomacy`, `asia-east-asia`, `asia-southeast-asia`, `asia-south-asia`, `business-companies`, `business-investor-relations`, `business-global-economy`, `business-money-wealth`, `opinion-comment`, `opinion-harrys-view`, `opinion-blogs`, `opinion-polls`, `opinion-letters`, `property-hong-kong-china`, `property-international`, `tech-big-tech`, `tech-enterprises`, `tech-innovation`, `tech-leaders-founders`, `tech-science-research`, `lifestyle-fashion-beauty`, `lifestyle-travel-leisure`, `lifestyle-motoring`, `lifestyle-food-drink`, `lifestyle-health-wellness`, `lifestyle-watches`, `culture-books`, `culture-music`, `culture-film-tv`, `culture-arts`, `sport-hong-kong`, `sport-china`, `sport-golf`, `sport-racing`, `sport-rugby`, `sport-football`, `sport-tennis`, `sport-other`, `sport-boxing`, `sport-hong-kong-sevens`, `postmag-culture`, `postmag-travel`, `postmag-food-drink`, `postmag-passions`, `postmag-wellness`, `postmag-design-interiors`, `style-luxury`, `style-fashion`, `style-beauty`, `style-people`, `style-lifestyle`, `this-week-in-asia-politics`, `this-week-in-asia-geopolitics`, `this-week-in-asia-economics`, `this-week-in-asia-society`, `this-week-in-asia-opinion`, `this-week-in-asia-asia-buzz`, `this-week-in-asia-people`.", - "operationId": "scmp-sections", + "description": "Returns the latest stories from SFGATE's Top News Stories feed: title, canonical URL, summary, author and publication time in UTC. Takes no parameters. The feed carries no images.", + "operationId": "sfgate-news", "produces": [ "application/json" ], @@ -457634,7 +473279,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/scmp.sectionsResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -457655,26 +473300,16 @@ "ApiKeyAuth": [] } ], - "summary": "List SCMP sections", + "summary": "Get SFGate top stories", "tags": [ - "SCMP" + "SFGate" ] } }, - "/screenrant/article": { + "/sfgate/sections": { "get": { - "description": "Returns a ScreenRant article by canonical `url` of the form `https://screenrant.com//`: title, description, section, authors, publication and update times, image and body `paragraphs`. Warning and note callouts and Related cards are left out of `paragraphs`. Section hubs and multi-segment URLs such as `/video//` are rejected as invalid.", - "operationId": "screenrant-article", - "parameters": [ - { - "description": "Canonical ScreenRant article URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://screenrant.com/charlie-harper-movie-review/" - } - ], + "description": "Returns the SFGATE feed inventory (Top News, Bay Area, Business and Technology, Entertainment, Celebrity, Food and Dining, Travel, Routes, Top Sports, Giants, 49ers, Warriors), each linking to its public RSS feed.", + "operationId": "sfgate-sections", "produces": [ "application/json" ], @@ -457682,25 +473317,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -457709,24 +473326,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get ScreenRant article content", + "summary": "Get SFGate sections", "tags": [ - "ScreenRant" + "SFGate" ] } }, - "/screenrant/author": { + "/shakeshack/locations": { "get": { - "description": "Returns a ScreenRant author's profile by canonical `url` (`https://screenrant.com/author//`): name, `title`, `biography`, image, social links (such as `x`, `linkedin`, `youtube` or `muckrack`) and about 20 articles from the profile's Latest module. Older pages are not available.", - "operationId": "screenrant-author", + "consumes": [ + "application/json" + ], + "description": "Returns one page of Shake Shack's store index, parsed off the single, fully server-rendered /locations page. That page carries two independent sections: an interactive map (coordinates, no structured address) and an accessible \"Full List of Locations\" text index (structured address, no coordinates). Each entry's source field says which section it came from -- \"map\" or \"list\" -- not a business classification; both round-trip through GET /shakeshack/store by path, which always returns full structured address and coordinates regardless of source.", + "operationId": "shakeshack-locations", "parameters": [ { - "description": "Canonical ScreenRant author URL", + "description": "1-based page (default 1)", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://screenrant.com/author/liam-crowley/" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Entries per page, 1-500 (default 100)", + "in": "query", + "name": "page_size", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -457736,7 +473362,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.screenrantAuthorResponseDoc" + "$ref": "#/definitions/shakeshack.locationsResponseDoc" } }, "400": { @@ -457751,6 +473377,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -457763,60 +473395,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a ScreenRant author profile", + "summary": "Browse Shake Shack's store index", "tags": [ - "ScreenRant" + "Shake Shack" ] } }, - "/screenrant/headlines": { + "/shakeshack/menu": { "get": { - "description": "Returns about 10 of the most recent ScreenRant items for one section. `section` is required and takes one of 34 slugs such as `movie-news`, `tv-reviews`, `reality-tv`, `comics`, `game-news` or `anime`. Items in `videos`, and some in `interviews` and `movie-trailers`, link to `/video//` pages that `screenrant-article` rejects.", - "operationId": "screenrant-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one Shake Shack location's full menu as a category tree: every category and its products, with name, description, base calories, allergens, a promotional/dietary badge when published (e.g. \"LIMITED TIME ONLY\", \"VEGETARIAN\"), image, and a full customization tree (size, additions, removals, allergen flags), each choice carrying its own price and calorie delta. location_id comes from GET /shakeshack/nearby. Many items, most notably burgers, price entirely through a required size selection rather than a base price, so price is commonly 0 for those items -- the real price lives on the size modifier's own choices.", + "operationId": "shakeshack-menu", "parameters": [ { - "description": "ScreenRant RSS section slug", - "enum": [ - "movies", - "movie-news", - "movie-features", - "movie-reviews", - "movie-lists", - "movie-trailers", - "tv", - "tv-news", - "tv-features", - "tv-reviews", - "tv-lists", - "network-tv", - "reality-tv", - "reality-tv-news", - "reality-tv-features", - "reality-tv-lists", - "comics", - "comics-news", - "comics-features", - "comics-reviews", - "comics-lists", - "gaming", - "game-news", - "game-features", - "game-lists", - "game-reviews", - "anime", - "books", - "interviews", - "lists", - "videos", - "podcasts", - "exclusives", - "streaming-movies-and-tv-guide" - ], + "description": "Location id from /shakeshack/nearby", "in": "query", - "name": "section", + "name": "location_id", "required": true, - "type": "string", - "x-example": "movies" + "type": "integer", + "x-example": 14992 } ], "produces": [ @@ -457826,7 +473425,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shakeshack.menuResponseDoc" } }, "400": { @@ -457835,6 +473434,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -457853,54 +473458,51 @@ "ApiKeyAuth": [] } ], - "summary": "Get ScreenRant section headlines", + "summary": "Get one Shake Shack location's full menu", "tags": [ - "ScreenRant" + "Shake Shack" ] } }, - "/screenrant/news": { + "/shakeshack/nearby": { "get": { - "description": "Returns ScreenRant's main feed of latest stories, about 10 items. Takes no parameters. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "screenrant-news", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } + "description": "Returns Shake Shack locations within a radius of a coordinate, nearest first, using Shake Shack's own Olo-backed ordering API (a separate source from GET /shakeshack/locations, which reads the main site's store directory instead). Each result carries location_id, real-time weekly hours, which fulfillment modes are currently enabled (dine-in, pickup, delivery, curbside, drive-thru, walk-up, drive-up), and Shake Shack's own delivery fee schedule. Pass location_id to GET /shakeshack/menu for that location's full menu.", + "operationId": "shakeshack-nearby", + "parameters": [ + { + "description": "Search center latitude", + "in": "query", + "name": "latitude", + "required": true, + "type": "number", + "x-example": 40.758 }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Search center longitude", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": -73.9855 }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] + "description": "Search radius in miles, 1-50 (default 15)", + "in": "query", + "name": "radius", + "type": "integer", + "x-example": 15 + }, + { + "description": "Maximum locations to return, 1-50 (default 10)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], - "summary": "Get ScreenRant top stories", - "tags": [ - "ScreenRant" - ] - } - }, - "/screenrant/sections": { - "get": { - "description": "Lists the 34 ScreenRant sections that `screenrant-headlines` accepts, spanning movies, TV, reality TV, comics, gaming, anime, books, interviews and videos. Each entry has a `slug`, a display `name` and the section's feed `url`.", - "operationId": "screenrant-sections", "produces": [ "application/json" ], @@ -457908,7 +473510,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/shakeshack.nearbyResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -457929,19 +473537,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get ScreenRant RSS sections", + "summary": "Find Shake Shack locations near a coordinate", "tags": [ - "ScreenRant" + "Shake Shack" ] } }, - "/seatgeek/categories": { + "/shakeshack/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns SeatGeek's full event-category tree (e.g. Sports > Baseball > MLB, Concerts, Theater), root and leaf nodes together. Each category's id is the value seatgeek-events-by-category's taxonomy_id parameter accepts.", - "operationId": "seatgeek-categories", + "description": "Returns one Shake Shack store: postal address, coordinates, phone (when published), a Monday-first week of opening hours (omitted for a location that publishes no schedule, seen on venue/kiosk-shaped locations such as inside a stadium), and the order types Shake Shack publishes for it, e.g. \"Dine In\", \"Delivery\". Store paths come from GET /shakeshack/locations, either the aliased \"location/\" form or the legacy \"node/\" form -- both resolve to the same record, and the response's own path field always reports the canonical alias. A path with neither shape, or one that does not resolve to a real store page, returns a 404.", + "operationId": "shakeshack-store", + "parameters": [ + { + "description": "Store path from a /shakeshack/locations entry", + "in": "query", + "name": "path", + "required": true, + "type": "string", + "x-example": "location/meyerland-tx" + } + ], "produces": [ "application/json" ], @@ -457949,7 +473567,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.categoriesResponseDoc" + "$ref": "#/definitions/shakeshack.storeResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -457970,19 +473600,19 @@ "ApiKeyAuth": [] } ], - "summary": "List SeatGeek's event categories", + "summary": "Get one Shake Shack store's detail", "tags": [ - "SeatGeek" + "Shake Shack" ] } }, - "/seatgeek/cities": { + "/shein/brands": { "get": { "consumes": [ "application/json" ], - "description": "Returns SeatGeek's own curated \"browse by city\" directory (87 metro areas as of 2026-09-15): id, name, state, country, coordinates, and which verticals (concerts/sports/theater) it supports. Each city's lat/lon pairs directly with GET /seatgeek/events-near.", - "operationId": "seatgeek-cities", + "description": "Returns the brand channel's category tabs with ids usable with `/shein/category/goods` and `/shein/products/search`.", + "operationId": "shein-brands", "produces": [ "application/json" ], @@ -457990,11 +473620,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.citiesResponseDoc" + "$ref": "#/definitions/shein.brandsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458011,29 +473641,19 @@ "ApiKeyAuth": [] } ], - "summary": "List SeatGeek's curated metro areas", + "summary": "SHEIN brand channel categories", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/event": { + "/shein/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SeatGeek event's full detail: title, timing, venue, performers, category taxonomy, and SeatGeek's own live secondary-market pricing snapshot (listing/ticket counts, average/median/lowest/highest price). id is SeatGeek's own numeric event id, obtained from a search or performer-events result. Pricing is an aggregate snapshot only -- no per-seat listing rows and no checkout/purchase flow.", - "operationId": "seatgeek-event", - "parameters": [ - { - "description": "SeatGeek's own numeric event id", - "in": "query", - "name": "id", - "required": true, - "type": "integer", - "x-example": 17695775 - } - ], + "description": "Returns SHEIN's root category tree (11 top-level categories, nested to leaf ids) plus the global attribute filter taxonomy (sizes, colors, materials, …). Use the returned `cat_id` values with `/shein/category/nav`, `/shein/category/filters` and `/shein/category/goods`.", + "operationId": "shein-categories", "produces": [ "application/json" ], @@ -458041,23 +473661,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.eventResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/shein.categoriesResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458074,41 +473682,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SeatGeek event's detail", + "summary": "SHEIN category tree and global filters", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/events-by-category": { + "/shein/category/filters": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of SeatGeek events under a category/taxonomy, soonest first. taxonomy_id is a SeatGeek category id from GET /seatgeek/categories, e.g. 1010100 for MLB.", - "operationId": "seatgeek-events-by-category", + "description": "Returns the filter facets for a SHEIN category by the required numeric `cat_id`, such as sizes, colours and composition. Each group has a `node_id`, `node_name` and a list of options with their own ids and names. Also returns `min_price`, `max_price` and the `currency`.", + "operationId": "shein-category-filters", "parameters": [ { - "description": "A SeatGeek taxonomy id from GET /seatgeek/categories", + "description": "Numeric SHEIN category id", "in": "query", - "name": "taxonomy_id", + "name": "cat_id", "required": true, - "type": "integer", - "x-example": 1010100 - }, - { - "default": 1, - "description": "1-based page number", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": 25, - "description": "Results per page, 1-50", - "in": "query", - "name": "per_page", - "type": "integer" + "type": "string", + "x-example": "1766" } ], "produces": [ @@ -458118,7 +473712,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.eventsByCategoryResponseDoc" + "$ref": "#/definitions/shein.categoryFiltersResponseDoc" } }, "400": { @@ -458127,8 +473721,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458145,49 +473739,48 @@ "ApiKeyAuth": [] } ], - "summary": "Browse SeatGeek events by category", + "summary": "SHEIN category filter facets", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/events-near": { + "/shein/category/goods": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of SeatGeek events near a coordinate, soonest first -- the same call its city pages and homepage location-based sections make. Pair with GET /seatgeek/cities for a curated list of coordinates, or pass any coordinate directly.", - "operationId": "seatgeek-events-near", + "description": "Lists products in a SHEIN category, by the required numeric `cat_id`. `page` starts at 1 and `page_size` is 1-20 (default 20); `sort` is a non-negative integer, `0` by default. Each product has its id, name, images, sale, retail and USD prices, rating, review count, and `on_sale` and `sold_out` flags. `total` is the category's listing count.", + "operationId": "shein-category-goods", "parameters": [ { - "description": "Latitude", + "description": "Numeric SHEIN category id", "in": "query", - "name": "lat", + "name": "cat_id", "required": true, - "type": "number", - "x-example": 35.08794 + "type": "string", + "x-example": "1727" }, { - "description": "Longitude", + "description": "1-based page number", "in": "query", - "name": "lon", - "required": true, - "type": "number", - "x-example": -106.6357 + "name": "page", + "type": "integer", + "x-example": 1 }, { - "default": 1, - "description": "1-based page number", + "description": "Results per page, 1-20 (default 20)", "in": "query", - "name": "page", - "type": "integer" + "name": "page_size", + "type": "integer", + "x-example": 20 }, { - "default": 25, - "description": "Results per page, 1-50", + "description": "SHEIN sort code: a non-negative integer. `0` is the default (recommended). Other codes are accepted and forwarded as-is; the full code-to-meaning mapping has not been live-verified yet (see the endpoint markdown), so callers relying on a specific ordering should confirm behavior empirically.", "in": "query", - "name": "per_page", - "type": "integer" + "name": "sort", + "type": "string", + "x-example": "0" } ], "produces": [ @@ -458197,7 +473790,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.eventsNearResponseDoc" + "$ref": "#/definitions/shein.categoryGoodsResponseDoc" } }, "400": { @@ -458206,8 +473799,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458224,27 +473817,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse SeatGeek events near a coordinate", + "summary": "SHEIN category product listing", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/performer": { + "/shein/category/nav": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SeatGeek performer's (sports team, artist, or show) full detail by direct id lookup: name, type, image, popularity, home venue id, upcoming-event counts, and category taxonomy. id is SeatGeek's own numeric performer id, obtained from a search result. Use this when you already have a bare performer id and want to skip a search round-trip; seatgeek-search returns the same fields for a query.", - "operationId": "seatgeek-performer", + "description": "Returns the subcategory navigation tabs for a SHEIN category, by the required numeric `cat_id`. Each tab has its `nav_id`, `nav_name`, `nav_type`, `nav_img` and the `goods_id` of a representative product.", + "operationId": "shein-category-nav", "parameters": [ { - "description": "SeatGeek's own numeric performer id", + "description": "Numeric SHEIN category id", "in": "query", - "name": "id", + "name": "cat_id", "required": true, - "type": "integer", - "x-example": 1 + "type": "string", + "x-example": "1766" } ], "produces": [ @@ -458254,7 +473847,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.performerResponseDoc" + "$ref": "#/definitions/shein.categoryNavResponseDoc" } }, "400": { @@ -458263,14 +473856,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458287,41 +473874,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SeatGeek performer's detail", + "summary": "SHEIN category nav tabs", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/performer-events": { + "/shein/deals/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a SeatGeek performer's (sports team, artist, or show) upcoming event schedule, soonest first. performer_id is SeatGeek's own numeric performer id, obtained from a search result (e.g. 1 for the Los Angeles Dodgers).", - "operationId": "seatgeek-performer-events", + "description": "Returns one page of SHEIN's coupon/deal product pool (≈3,000 items at the time of writing), with the same normalized product-card fields as product search plus an `is_new_coupon` flag. Paging is 1-based; `page_size` is capped at 20 by the upstream.", + "operationId": "shein-deals-products", "parameters": [ { - "description": "SeatGeek's own numeric performer id", + "description": "1-based page number (default 1)", "in": "query", - "name": "performer_id", - "required": true, + "name": "page", "type": "integer", "x-example": 1 }, { - "default": 1, - "description": "1-based page number", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": 25, - "description": "Results per page, 1-50", + "description": "Products per page, 1-20 (default 10)", "in": "query", - "name": "per_page", - "type": "integer" + "name": "page_size", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -458331,7 +473910,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.performerEventsResponseDoc" + "$ref": "#/definitions/shein.dealsProductsResponseDoc" } }, "400": { @@ -458340,8 +473919,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458358,36 +473937,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SeatGeek performer's event schedule", + "summary": "SHEIN coupon and deal products", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/search": { + "/shein/deals/tabs": { "get": { "consumes": [ "application/json" ], - "description": "Free-text search across SeatGeek's own catalog of events, performers (sports teams, artists, and shows), and venues -- the same call the site's own search box and search-results page use. Any of the three result lists may come back empty for a query with no matches in that type.", - "operationId": "seatgeek-search", - "parameters": [ - { - "description": "Free-text search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "dodgers" - }, - { - "default": 10, - "description": "Maximum results per result type (events/performers/venues), 1-50", - "in": "query", - "name": "limit", - "type": "integer" - } - ], + "description": "Returns the deal-landing tabs and categories (ids usable with `/shein/category/goods` and `/shein/deals/products`).", + "operationId": "shein-deals-tabs", "produces": [ "application/json" ], @@ -458395,17 +473957,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.searchResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/shein.dealTabsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458422,35 +473978,34 @@ "ApiKeyAuth": [] } ], - "summary": "Search SeatGeek events, performers, and venues", + "summary": "SHEIN deal category tabs", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/trending": { - "get": { + "/shein/products/aggregation-filters": { + "post": { "consumes": [ "application/json" ], - "description": "Returns SeatGeek's ranked \"trending near you\" events for the required `lat` and `lon`. Each item has the event name, URL and image, local and UTC start times, `lowest_price` on the secondary market where available, current `rank` and `rank_change`. The list is identified by `list_id`, `list_type` and `list_display_name`.", - "operationId": "seatgeek-trending", + "description": "Returns the filter facets for a SHEIN search, given the required `keyword` and an optional `cat_id` that narrows them. The response has filter groups (id, name, options), a recursive `category` drill-down with `children`, and the `min_price` and `max_price` for the query.", + "operationId": "shein-products-aggregation-filters", "parameters": [ { - "description": "Latitude", + "description": "Free-text search query", "in": "query", - "name": "lat", + "name": "keyword", "required": true, - "type": "number", - "x-example": 40.7128 + "type": "string", + "x-example": "dress" }, { - "description": "Longitude", + "description": "Numeric SHEIN category id, narrows the facets", "in": "query", - "name": "lon", - "required": true, - "type": "number", - "x-example": -74.006 + "name": "cat_id", + "type": "string", + "x-example": "12476" } ], "produces": [ @@ -458460,7 +474015,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.trendingResponseDoc" + "$ref": "#/definitions/shein.aggregationFiltersResponseDoc" } }, "400": { @@ -458469,8 +474024,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458487,27 +474042,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get SeatGeek's trending-near-you events", + "summary": "SHEIN search aggregation filters", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/venue": { + "/shein/products/detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SeatGeek venue's full detail: address, city/state/country, timezone, capacity, coordinates, and upcoming-event counts. id is SeatGeek's own numeric venue id, obtained from a search or event result.", - "operationId": "seatgeek-venue", + "description": "Returns a SHEIN product by the required numeric `goods_id`; `goods_sn` is accepted but currently ignored. The response has the name, description, category, brand code, sale, retail and USD prices, images, video URL, size options, per-SKU stock and prices, and colour variants.", + "operationId": "shein-products-detail", "parameters": [ { - "description": "SeatGeek's own numeric venue id", + "description": "Numeric SHEIN goods id (from a search result's goods_id)", "in": "query", - "name": "id", + "name": "goods_id", "required": true, - "type": "integer", - "x-example": 1 + "type": "string", + "x-example": "163003837" + }, + { + "description": "SHEIN goods serial number (accepted but currently ignored)", + "in": "query", + "name": "goods_sn", + "type": "string", + "x-example": "sz25081193234595996" } ], "produces": [ @@ -458517,7 +474079,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.venueResponseDoc" + "$ref": "#/definitions/shein.productDetailResponseDoc" } }, "400": { @@ -458526,14 +474088,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458550,41 +474106,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SeatGeek venue's detail", + "summary": "SHEIN product detail", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seatgeek/venue-events": { - "get": { + "/shein/products/search": { + "post": { "consumes": [ "application/json" ], - "description": "Returns one page of a SeatGeek venue's upcoming event schedule, soonest first. venue_id is SeatGeek's own numeric venue id, obtained from a search or event result (e.g. 1 for UNIQLO Field at Dodger Stadium).", - "operationId": "seatgeek-venue-events", + "description": "Searches SHEIN products for the required `keyword`. `page` starts at 1, `page_size` is 1-20 and defaults to 20, and `sort` is a non-negative integer, `0` by default. A query with no matches returns an empty `products` list with `total` 0. Each product card has its id, name, images, prices, rating, review count and stock flags. Also returns `total` and spelling suggestions in `suggest_words`.", + "operationId": "shein-products-search", "parameters": [ { - "description": "SeatGeek's own numeric venue id", + "description": "Free-text search query", "in": "query", - "name": "venue_id", + "name": "keyword", "required": true, - "type": "integer", - "x-example": 1 + "type": "string", + "x-example": "dress" }, { - "default": 1, "description": "1-based page number", "in": "query", "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 }, { - "default": 25, - "description": "Results per page, 1-50", + "description": "Results per page, 1-20 (default 20)", "in": "query", - "name": "per_page", - "type": "integer" + "name": "page_size", + "type": "integer", + "x-example": 20 + }, + { + "description": "SHEIN sort code: a non-negative integer. `0` is the default (recommended). Other codes are accepted and forwarded as-is; the full code-to-meaning mapping has not been live-verified yet (see the endpoint markdown), so callers relying on a specific ordering should confirm behavior empirically.", + "in": "query", + "name": "sort", + "type": "string", + "x-example": "0" } ], "produces": [ @@ -458594,7 +474157,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/seatgeek.venueEventsResponseDoc" + "$ref": "#/definitions/shein.productsSearchResponseDoc" } }, "400": { @@ -458603,8 +474166,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458621,24 +474184,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SeatGeek venue's event schedule", + "summary": "SHEIN product search", "tags": [ - "SeatGeek" + "SHEIN" ] } }, - "/seattletimes/article": { - "get": { - "description": "Returns public Seattle Times story metadata and body paragraphs from a canonical story URL. The site's metered paywall is a client-side overlay: anonymous requests receive the full body, which is returned as-is.", - "operationId": "seattletimes-article", + "/shein/search/autocomplete": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Returns SHEIN search suggestions for a partial query in the required `word`. Each suggestion has its `word`, `word_id` and `type`. A word with no matching phrase returns an empty list, not an error.", + "operationId": "shein-search-autocomplete", "parameters": [ { - "description": "Canonical Seattle Times story URL", + "description": "Partial search query", "in": "query", - "name": "url", + "name": "word", "required": true, "type": "string", - "x-example": "https://www.seattletimes.com/seattle-news/transportation/sound-transit-ceo-claims-his-30k-bonus-and-wins-a-pay-raise/" + "x-example": "dres" } ], "produces": [ @@ -458648,7 +474214,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shein.autocompleteResponseDoc" } }, "400": { @@ -458657,8 +474223,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458675,30 +474241,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Seattle Times article content", + "summary": "SHEIN search autocomplete", "tags": [ - "Seattle Times" + "SHEIN" ] } }, - "/seattletimes/author": { - "get": { - "description": "Returns one Seattle Times author's public profile: name, bio, newsroom-published email and X/Twitter link when listed, and their most recent stories.", - "operationId": "seattletimes-author", + "/shein/search/keywords": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Returns the trending search keywords SHEIN shows in its search box. `scene` defaults to `trendStoreChannel` and `word_type` to `1`. Each keyword has its `word`, `word_id`, `type` and `from`.", + "operationId": "shein-search-keywords", "parameters": [ { - "description": "Author slug, e.g. mike-lindblom", + "description": "Keyword scene: 1-64 letters, digits or underscores. Only trendStoreChannel is verified.", "in": "query", - "name": "slug", + "name": "scene", "type": "string", - "x-example": "mike-lindblom" + "x-example": "trendStoreChannel" }, { - "description": "Canonical seattletimes.com/author// URL; alternative to slug", + "description": "Keyword type: a 1-3 digit number. Only 1 is verified.", "in": "query", - "name": "url", + "name": "word_type", "type": "string", - "x-example": "https://www.seattletimes.com/author/mike-lindblom/" + "x-example": "1" } ], "produces": [ @@ -458708,7 +474277,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.seattleTimesAuthorResponseDoc" + "$ref": "#/definitions/shein.searchKeywordsResponseDoc" } }, "400": { @@ -458717,8 +474286,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -458735,124 +474304,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Seattle Times author profile", + "summary": "SHEIN trending search keywords", "tags": [ - "Seattle Times" + "SHEIN" ] } }, - "/seattletimes/headlines": { + "/shein/store": { "get": { - "description": "Returns about 30 to 35 of the latest Seattle Times stories for one section. `section` is required and takes a section slug such as `seattle-news`, `politics`, `boeing-aerospace`, `mariners`, `seahawks` or `obituaries`. Each item has its title, canonical URL without tracking parameters, summary, publication time and author. Only the newest page is available.", - "operationId": "seattletimes-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a SHEIN store/seller profile — name, logo, follower count, seller label, store-type flags — plus the categories the store sells into, by the numeric `store_code` that product search/category/detail results already return. Use the returned `category_id` with `/shein/store/products` to list that category's products.", + "operationId": "shein-store", "parameters": [ { - "description": "Seattle Times section slug", - "enum": [ - "seattle-news", - "law-justice", - "politics", - "transportation", - "climate-lab", - "environment", - "weather", - "health", - "data", - "homeless", - "education-lab", - "education", - "times-watchdog", - "mental-health", - "eastside", - "puget-sound", - "business", - "boeing-aerospace", - "real-estate", - "amazon", - "technology", - "microsoft", - "alaska-airlines", - "costco", - "economy", - "starbucks", - "retail", - "nation-world", - "nation", - "world", - "nation-politics", - "oddities", - "sports", - "seahawks", - "mariners", - "uw-huskies", - "wsu-cougars", - "storm", - "kraken", - "sounders", - "reign", - "torrent", - "high-school", - "entertainment", - "music", - "movies", - "books", - "tv", - "theater", - "visual-arts", - "classical-music", - "local-media", - "events", - "life", - "food-drink", - "travel", - "outdoors", - "wellness", - "lifestyle", - "fashion", - "rant-and-rave", - "op-eds", - "opinion", - "editorials", - "letters-to-the-editor", - "pacific-nw-magazine", - "photo-video", - "video", - "photography", - "at-home", - "marijuana", - "northwest", - "obituaries", - "science", - "special-reports", - "agriculture", - "local-business", - "markets", - "auto-racing", - "college", - "wsu-cougar-basketball", - "wsu-cougar-football", - "golf", - "gonzaga-bulldogs", - "hockey", - "horse-racing", - "uw-husky-basketball", - "nba", - "ncaa-tournament", - "pac-12", - "seattle-university", - "snow-sports", - "world-cup", - "dance", - "video-games", - "fitness", - "garden", - "home-decor" - ], + "description": "Numeric SHEIN store code, as returned in product cards", "in": "query", - "name": "section", + "name": "store_code", "required": true, "type": "string", - "x-example": "seattle-news" + "x-example": "1813776918" } ], "produces": [ @@ -458862,7 +474334,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shein.storeResponseDoc" } }, "400": { @@ -458871,37 +474343,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Seattle Times section headlines", - "tags": [ - "Seattle Times" - ] - } - }, - "/seattletimes/news": { - "get": { - "description": "Returns about 30 of the newest Seattle Times stories across all sections, including Associated Press wire stories. Takes no parameters. Each item has its title, canonical URL without tracking parameters, summary, publication time, author byline and lead image.", - "operationId": "seattletimes-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "503": { "description": "Service Unavailable", @@ -458915,107 +474361,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get Seattle Times top stories", - "tags": [ - "Seattle Times" - ] - } - }, - "/seattletimes/sections": { - "get": { - "description": "Returns the public Seattle Times section inventory: every category in the site's navigation and RSS feed list that publishes a live feed.", - "operationId": "seattletimes-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Seattle Times sections", + "summary": "SHEIN store profile and categories", "tags": [ - "Seattle Times" + "SHEIN" ] } }, - "/sec/company/intelligence": { + "/shein/store/products": { "get": { "consumes": [ "application/json" ], - "description": "Aggregates a company's profile, a latest-annual financial snapshot, the latest 10-K/10-Q/8-K, and recent material events into one call. Provide cik or ticker. Optionally fuse live cross-source data with enrich (a comma list of market, news, hiring): market and news are keyed on the ticker; hiring needs ats plus that ATS's careers slug (or tenant/datacenter/site for Workday). Enrichment is best-effort — requested-but-unavailable sources are listed under degraded and never fail the SEC-native response.", - "operationId": "sec-company-intelligence", + "description": "Returns the product listing for one category of a SHEIN store. `store_code` comes from a product card or `/shein/store`; `category_id` from `/shein/store`. `page_size` is capped at 20 (the upstream limit). Product cards use the same normalized fields as product search.", + "operationId": "shein-store-products", "parameters": [ { - "description": "SEC CIK (numeric or zero-padded)", + "description": "Numeric SHEIN store code", "in": "query", - "name": "cik", + "name": "store_code", + "required": true, "type": "string", - "x-example": "320193" + "x-example": "1813776918" }, { - "description": "Ticker symbol (alternative to cik)", + "description": "Numeric store category id from /shein/store", "in": "query", - "name": "ticker", + "name": "category_id", + "required": true, "type": "string", - "x-example": "AAPL" - }, - { - "description": "Comma list of cross-source enrichments", - "enum": [ - "market", - "news", - "hiring" - ], - "in": "query", - "name": "enrich", - "type": "string" - }, - { - "description": "ATS provider for hiring enrichment", - "enum": [ - "greenhouse", - "lever", - "ashby", - "workday", - "smartrecruiters" - ], - "in": "query", - "name": "ats", - "type": "string" - }, - { - "description": "Careers board slug for hiring (greenhouse/lever/ashby/smartrecruiters)", - "in": "query", - "name": "careers_slug", - "type": "string" - }, - { - "description": "Workday tenant (hiring, when ats=workday)", - "in": "query", - "name": "tenant", - "type": "string" + "x-example": "1766" }, { - "description": "Workday datacenter shard (hiring, when ats=workday)", + "description": "1-based page number (default 1)", "in": "query", - "name": "datacenter", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Workday career site (hiring, when ats=workday)", + "description": "Products per page, 1-20 (default 20)", "in": "query", - "name": "site", - "type": "string" + "name": "page_size", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -459025,7 +474413,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.intelligenceResponseDoc" + "$ref": "#/definitions/shein.storeProductsResponseDoc" } }, "400": { @@ -459034,12 +474422,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "500": { "description": "Internal Server Error", "schema": { @@ -459058,35 +474440,19 @@ "ApiKeyAuth": [] } ], - "summary": "Company 360 overview from SEC data", + "summary": "SHEIN store category products", "tags": [ - "SEC EDGAR" + "SHEIN" ] } }, - "/sec/company/search": { + "/shein/trending/categories": { "get": { "consumes": [ "application/json" ], - "description": "Resolves a ticker symbol or company-name query to SEC EDGAR companies (CIK, ticker, name).", - "operationId": "sec-company-search", - "parameters": [ - { - "description": "Ticker symbol or company name", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "apple" - }, - { - "description": "Max matches, default 10, max 100", - "in": "query", - "name": "limit", - "type": "integer" - } - ], + "description": "Returns SHEIN's trending-category cards: the category id/name list with a representative `store_code` and `goods_id` per category. Pair with `/shein/category/goods` (by `cat_id`) or `/shein/store` (by `store_code`).", + "operationId": "shein-trending-categories", "produces": [ "application/json" ], @@ -459094,14 +474460,49 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.companySearchResponseDoc" + "$ref": "#/definitions/shein.trendingCategoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "SHEIN trending categories", + "tags": [ + "SHEIN" + ] + } + }, + "/shein/trending/filters": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the trending channel's collection tabs (e.g. \"#Dot Charm\") and the category filters available on the trending surface. Pair with `/shein/trending/categories` and `/shein/category/goods`.", + "operationId": "shein-trending-filters", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/shein.trendingFiltersResponseDoc" + } }, "500": { "description": "Internal Server Error", @@ -459121,58 +474522,58 @@ "ApiKeyAuth": [] } ], - "summary": "Resolve a ticker or company name to EDGAR companies", + "summary": "SHEIN trending filters", "tags": [ - "SEC EDGAR" + "SHEIN" ] } }, - "/sec/company/submissions": { + "/shop-app/analysis": { "get": { "consumes": [ "application/json" ], - "description": "Returns a company's recent SEC filings (form, dates, primary document URL) filtered by form type and date range, plus company profile fields as reported by EDGAR: entity_type, former_names, exchanges, category, fiscal_year_end, state_of_incorporation. Provide cik or ticker.", - "operationId": "sec-company-submissions", + "description": "Returns a market snapshot derived from Shop.app search results, including price ranges, currencies, sale counts, discounts, and top shops. Limit defaults to 20 and accepts values up to 50.", + "operationId": "shop-app-analysis", "parameters": [ { - "description": "SEC CIK (numeric or zero-padded)", - "in": "query", - "name": "cik", - "type": "string", - "x-example": "320193" - }, - { - "description": "Ticker symbol (alternative to cik)", + "description": "Search query", "in": "query", - "name": "ticker", + "name": "query", + "required": true, "type": "string", - "x-example": "AAPL" + "x-example": "sneakers" }, { - "description": "Filter by form type, e.g. 10-K, 10-Q, 8-K", + "description": "Maximum products to analyze, defaults to 20 and supports up to 50", "in": "query", - "name": "form", - "type": "string", - "x-example": "10-K" + "name": "limit", + "type": "integer", + "x-example": 20 }, { - "description": "Earliest filing date (YYYY-MM-DD)", + "default": true, + "description": "Request in-stock products", "in": "query", - "name": "from", - "type": "string" + "name": "in_stock", + "type": "boolean", + "x-example": true }, { - "description": "Latest filing date (YYYY-MM-DD)", + "default": false, + "description": "Request sale products", "in": "query", - "name": "to", - "type": "string" + "name": "on_sale", + "type": "boolean", + "x-example": false }, { - "description": "Max filings, default 50, max 500", + "default": false, + "description": "Accepted for compatibility; Shop.app no longer offers a separate deep search mode, so results are unchanged", "in": "query", - "name": "limit", - "type": "integer" + "name": "deep_search", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -459182,7 +474583,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.submissionsResponseDoc" + "$ref": "#/definitions/shopapp.analysisResponseDoc" } }, "400": { @@ -459191,14 +474592,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459215,43 +474610,19 @@ "ApiKeyAuth": [] } ], - "summary": "List a company's EDGAR filings", + "summary": "Analyze Shop.app query results", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sec/filing": { + "/shop-app/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns a single SEC filing's metadata and primary document URL. Provide accession plus cik or ticker.", - "operationId": "sec-filing", - "parameters": [ - { - "description": "SEC CIK (numeric or zero-padded)", - "in": "query", - "name": "cik", - "type": "string", - "x-example": "320193" - }, - { - "description": "Ticker symbol (alternative to cik)", - "in": "query", - "name": "ticker", - "type": "string", - "x-example": "AAPL" - }, - { - "description": "Accession number", - "in": "query", - "name": "accession", - "required": true, - "type": "string", - "x-example": "0000320193-25-000079" - } - ], + "description": "Returns the Shop.app product category tree, with no parameters. Each category has its `id`, `gid`, `name`, `slug`, `image`, `has_children`, nested `children` and a `path` of ancestors. Ids are taken from Shopify product category GIDs where present.", + "operationId": "shop-app-categories", "produces": [ "application/json" ], @@ -459259,23 +474630,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.filingResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/shopapp.categoriesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459292,54 +474651,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a single filing by accession number", + "summary": "List Shop.app categories", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sec/filing/sections": { + "/shop-app/products/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Extracts item sections (e.g. 1A Risk Factors, 7 MD&A) from a 10-K/10-Q/8-K primary document as clean text. Provide accession plus cik or ticker.", - "operationId": "sec-filing-sections", + "description": "Returns a Shop.app product by `id`: title, description, price and original price, currency, availability, images, option groups, rating, review count with reviews, related products and the selling shop. Pass `variant_id` to mark a variant as selected. Missing products return an error.", + "operationId": "shop-app-product", "parameters": [ { - "description": "SEC CIK (numeric or zero-padded)", - "in": "query", - "name": "cik", - "type": "string", - "x-example": "320193" - }, - { - "description": "Ticker symbol (alternative to cik)", - "in": "query", - "name": "ticker", - "type": "string", - "x-example": "AAPL" - }, - { - "description": "Accession number", - "in": "query", - "name": "accession", + "description": "Product id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "0000320193-25-000079" + "x-example": "4596217053229" }, { - "description": "Comma-separated item numbers to return, e.g. 1A,7", + "description": "Variant id", "in": "query", - "name": "items", + "name": "variant_id", "type": "string", - "x-example": "1A,7" - }, - { - "description": "Max characters per section, default 20000, max 200000", - "in": "query", - "name": "max_chars", - "type": "integer" + "x-example": "34761278160941" } ], "produces": [ @@ -459349,7 +474688,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.filingSectionsResponseDoc" + "$ref": "#/definitions/shopapp.productResponseDoc" } }, "400": { @@ -459364,8 +474703,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459382,60 +474721,34 @@ "ApiKeyAuth": [] } ], - "summary": "Extract 10-K/10-Q/8-K item sections", + "summary": "Get Shop.app product", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sec/financials": { + "/shop-app/products/{id}/related": { "get": { "consumes": [ "application/json" ], - "description": "Returns a company's financial statements across recent periods, resolving EDGAR's inconsistent XBRL tags to a stable schema. Provide cik or ticker.", - "operationId": "sec-financials", + "description": "Lists products related to a Shop.app product, by `id`. `limit` defaults to 20 and is capped at 50. Each card has the product's id, title, price, original price, currency, `on_sale` flag, image, shop name and URL. A product page with no related items returns an error.", + "operationId": "shop-app-product-related", "parameters": [ { - "description": "SEC CIK (numeric or zero-padded)", - "in": "query", - "name": "cik", - "type": "string", - "x-example": "320193" - }, - { - "description": "Ticker symbol (alternative to cik)", - "in": "query", - "name": "ticker", + "description": "Product id", + "in": "path", + "name": "id", + "required": true, "type": "string", - "x-example": "AAPL" - }, - { - "description": "Statement, default income", - "enum": [ - "income", - "balance", - "cash_flow" - ], - "in": "query", - "name": "statement", - "type": "string" - }, - { - "description": "Period basis, default annual", - "enum": [ - "annual", - "quarterly" - ], - "in": "query", - "name": "period", - "type": "string" + "x-example": "4596217053229" }, { - "description": "Number of periods, default 5, max 20", + "description": "Maximum products, defaults to 20 and supports up to 50", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -459445,7 +474758,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.financialsResponseDoc" + "$ref": "#/definitions/shopapp.relatedResponseDoc" } }, "400": { @@ -459454,14 +474767,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459478,60 +474785,34 @@ "ApiKeyAuth": [] } ], - "summary": "Normalized income statement, balance sheet, or cash flow", + "summary": "List Shop.app related products", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sec/frames": { + "/shop-app/products/{id}/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns every filer's reported value for one XBRL concept in one reporting period (an EDGAR \"frame\").", - "operationId": "sec-frames", + "description": "Lists customer reviews for a Shop.app product, by `id`, up to `limit` (default 20, max 50). Each review has its rating, title, body, author, date, helpful count and variant label, where present. A product with no reviews returns an error.", + "operationId": "shop-app-product-reviews", "parameters": [ { - "description": "XBRL concept tag, e.g. Assets, Revenues", - "in": "query", - "name": "concept", - "required": true, - "type": "string", - "x-example": "Assets" - }, - { - "description": "Reporting frame, e.g. CY2024, CY2024Q1, CY2024Q4I", - "in": "query", - "name": "period", + "description": "Product id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "CY2024Q4I" - }, - { - "description": "Unit of measure, default USD", - "in": "query", - "name": "unit", - "type": "string", - "x-example": "USD" - }, - { - "description": "XBRL taxonomy, default us-gaap", - "enum": [ - "dei", - "ifrs-full", - "srt", - "us-gaap" - ], - "in": "query", - "name": "taxonomy", - "type": "string" + "x-example": "4596217053229" }, { - "description": "Max companies, default 200, max 2000", + "description": "Maximum reviews, defaults to 20 and supports up to 50", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -459541,7 +474822,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.framesResponseDoc" + "$ref": "#/definitions/shopapp.reviewsResponseDoc" } }, "400": { @@ -459550,14 +474831,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459574,52 +474849,27 @@ "ApiKeyAuth": [] } ], - "summary": "Cross-company values for one XBRL concept and period", + "summary": "List Shop.app product reviews", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sec/full-text-search": { + "/shop-app/products/{id}/shop": { "get": { "consumes": [ "application/json" ], - "description": "Searches the full text of SEC EDGAR filings, filtered by form and date, with pagination. Free where incumbents gate full-text search behind paid tiers.", - "operationId": "sec-full-text-search", + "description": "Finds the Shop.app merchant that sells a product, by the product `id`. Returns the shop's handle, name, description, logo, banner, rating, review count, storefront URL, and its collections. Unknown products, or ones with no public shop, return not found.", + "operationId": "shop-app-product-shop", "parameters": [ { - "description": "Search query (supports quoted phrases)", - "in": "query", - "name": "q", + "description": "Product id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "artificial intelligence" - }, - { - "description": "Filter by form types, comma-separated", - "in": "query", - "name": "forms", - "type": "string", - "x-example": "10-K" - }, - { - "description": "Earliest filing date (YYYY-MM-DD)", - "in": "query", - "name": "from", - "type": "string" - }, - { - "description": "Latest filing date (YYYY-MM-DD)", - "in": "query", - "name": "to", - "type": "string" - }, - { - "description": "1-based page number, default 1", - "in": "query", - "name": "page", - "type": "integer" + "x-example": "4596217053229" } ], "produces": [ @@ -459629,7 +474879,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.fullTextResponseDoc" + "$ref": "#/definitions/shopapp.productShopResponseDoc" } }, "400": { @@ -459638,8 +474888,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459656,39 +474912,34 @@ "ApiKeyAuth": [] } ], - "summary": "Full-text search across EDGAR filings", + "summary": "Get the Shop.app shop for a product", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sec/insider": { + "/shop-app/products/{id}/variant": { "get": { "consumes": [ "application/json" ], - "description": "Returns a company's recent insider transactions from Form 3/4/5 ownership filings (owner, role, security, shares, price). Provide cik or ticker.", - "operationId": "sec-insider", + "description": "Returns the exact public product variant matching selected options. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.", + "operationId": "shop-app-product-variant", "parameters": [ { - "description": "SEC CIK (numeric or zero-padded)", - "in": "query", - "name": "cik", + "description": "Product id", + "in": "path", + "name": "id", + "required": true, "type": "string", - "x-example": "320193" + "x-example": "4596217053229" }, { - "description": "Ticker symbol (alternative to cik)", + "description": "Selected options JSON object", "in": "query", - "name": "ticker", + "name": "selected_options", "type": "string", - "x-example": "AAPL" - }, - { - "description": "Max transactions, default 10, max 30", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "{\"Colour\":\"Black\",\"Size\":\"7\",\"Width\":\"6E\"}" } ], "produces": [ @@ -459698,7 +474949,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.insiderResponseDoc" + "$ref": "#/definitions/shopapp.productVariantResponseDoc" } }, "400": { @@ -459713,8 +474964,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459731,33 +474982,41 @@ "ApiKeyAuth": [] } ], - "summary": "Insider transactions (Forms 3/4/5)", + "summary": "Get a Shop.app product variant by selected options", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sec/institutional-holdings": { + "/shop-app/products/{id}/variants": { "get": { "consumes": [ "application/json" ], - "description": "Returns the latest 13F-HR holdings for an institutional manager (by CIK): issuer, value, shares, sorted by value.", - "operationId": "sec-institutional-holdings", + "description": "Returns adjacent variants for a Shop.app product. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.", + "operationId": "shop-app-product-variants", "parameters": [ { - "description": "Institutional manager CIK", - "in": "query", - "name": "cik", + "description": "Product id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "1067983" + "x-example": "4596217053229" }, { - "description": "Max holdings, default 50, max 1000", + "description": "Selected options JSON object", + "in": "query", + "name": "selected_options", + "type": "string", + "x-example": "{\"Size\":\"7\"}" + }, + { + "description": "Maximum variants, defaults to 50 and supports up to 100", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -459767,7 +475026,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sec.holdingsResponseDoc" + "$ref": "#/definitions/shopapp.variantsResponseDoc" } }, "400": { @@ -459776,14 +475035,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -459800,19 +475053,60 @@ "ApiKeyAuth": [] } ], - "summary": "Institutional holdings (13F-HR)", + "summary": "List Shop.app product variants", "tags": [ - "SEC EDGAR" + "Shop.app" ] } }, - "/sephora/brands": { + "/shop-app/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Sephora's full brand directory (373 brands at time of writing), sourced from the site's own A-Z brand list page. Each brand's `name` is the exact string GET /sephora/search and GET /sephora/category's repeatable `brand` filter parameter expect.", - "operationId": "sephora-brands", + "description": "Searches Shop.app product results. Limit defaults to 20 and accepts values up to 50.", + "operationId": "shop-app-search", + "parameters": [ + { + "description": "Search query", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "sneakers" + }, + { + "description": "Maximum products, defaults to 20 and supports up to 50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "default": true, + "description": "Request in-stock products", + "in": "query", + "name": "in_stock", + "type": "boolean", + "x-example": true + }, + { + "default": false, + "description": "Request sale products", + "in": "query", + "name": "on_sale", + "type": "boolean", + "x-example": false + }, + { + "default": false, + "description": "Accepted for compatibility; Shop.app no longer offers a separate deep search mode, so results are unchanged", + "in": "query", + "name": "deep_search", + "type": "boolean", + "x-example": false + } + ], "produces": [ "application/json" ], @@ -459820,7 +475114,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.brandsResponseDoc" + "$ref": "#/definitions/shopapp.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -459841,38 +475141,27 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora brand directory", + "summary": "Search Shop.app products", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/categories": { + "/shop-app/shops/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Sephora's own live storefront category navigation (department, group, name, and slug for each), sourced from the site's own \"Shop\" mega-nav. Each entry's slug is directly usable as GET /sephora/category's own `slug` query parameter.", - "operationId": "sephora-categories", + "description": "Returns a Shop.app merchant profile by shop `handle`: name, description, logo, banner, rating, review count, storefront and Shop.app URLs, and collection summaries when the shop page lists them. Unknown handles return an error.", + "operationId": "shop-app-shop", "parameters": [ { - "description": "Filter to one storefront department", - "enum": [ - "new", - "makeup", - "skincare", - "fragrance", - "hair", - "bath-body", - "mini-size", - "brands", - "gifts-value-sets", - "sale-offers" - ], - "in": "query", - "name": "department", + "description": "Shop handle", + "in": "path", + "name": "handle", + "required": true, "type": "string", - "x-example": "makeup" + "x-example": "marcnolan" } ], "produces": [ @@ -459882,7 +475171,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.categoriesResponseDoc" + "$ref": "#/definitions/shopapp.shopResponseDoc" } }, "400": { @@ -459891,6 +475180,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -459909,99 +475204,64 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora storefront categories", + "summary": "Get Shop.app shop", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/category": { + "/shop-app/shops/{handle}/collections/{collection_id}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a Sephora category/browse listing (e.g. Makeup, Skincare), with the same sort and facet filters as /sephora/search. slug is the path segment after sephora.com/shop/, e.g. makeup-cosmetics. The response uses Sephora's public catalog search to keep browse listings available when the category page's legacy embedded data is absent.", - "operationId": "sephora-category", + "description": "Lists products in one collection of a Shop.app merchant, by shop `handle` and `collection_id`. `limit` defaults to 30 (max 60), `sort_by` is `MOST_SALES` (default), `PRICE_LOW_TO_HIGH`, `PRICE_HIGH_TO_LOW` or `RELEVANCE`, and `in_stock` defaults to true. Each card has its title, price, original price, image and URL.", + "operationId": "shop-app-collection-products", "parameters": [ { - "description": "Category-page slug", - "in": "query", - "name": "slug", + "description": "Shop handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "makeup-cosmetics" - }, - { - "description": "Result page, 1-based, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "marcnolan" }, { - "description": "Sort order, defaults to featured", - "enum": [ - "featured", - "top_rated", - "new", - "best_selling", - "price_low_to_high", - "price_high_to_low" - ], - "in": "query", - "name": "sort_by", + "description": "Collection id", + "in": "path", + "name": "collection_id", + "required": true, "type": "string", - "x-example": "featured" - }, - { - "description": "Minimum price in whole dollars; must be set together with price_max", - "in": "query", - "name": "price_min", - "type": "integer", - "x-example": 15 + "x-example": "292518002767" }, { - "description": "Maximum price in whole dollars; must be set together with price_min", + "description": "Maximum products, defaults to 30 and supports up to 60", "in": "query", - "name": "price_max", + "name": "limit", "type": "integer", "x-example": 30 }, { - "collectionFormat": "csv", - "description": "One or more exact brand names to filter to (OR'd together); repeat the param for multiple values", - "in": "query", - "items": { - "type": "string" - }, - "name": "brand", - "type": "array", - "x-example": "Lancôme" - }, - { - "description": "Minimum star rating, 1 to 4", + "default": "MOST_SALES", + "description": "Sort mode", + "enum": [ + "MOST_SALES", + "PRICE_LOW_TO_HIGH", + "PRICE_HIGH_TO_LOW", + "RELEVANCE" + ], "in": "query", - "name": "rating_min", - "type": "integer", - "x-example": 4 + "name": "sort_by", + "type": "string", + "x-example": "MOST_SALES" }, { - "description": "When true, filters to products flagged New", + "default": true, + "description": "Request in-stock products", "in": "query", - "name": "is_new", + "name": "in_stock", "type": "boolean", - "x-example": false - }, - { - "collectionFormat": "csv", - "description": "Additional facet:value filters, repeat the param for multiple; facet must be one of: benefits, ingredientpreferences, colorfamily, formulation, size, shoppingpreferences, agerange, skintype, finish, skinconcerns, coverage, hairtype, hairconcerns, hairtexture", - "in": "query", - "items": { - "type": "string" - }, - "name": "filter", - "type": "array", - "x-example": "formulation:serum" + "x-example": true } ], "produces": [ @@ -460011,7 +475271,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.categoryResponseDoc" + "$ref": "#/definitions/shopapp.shopProductsResponseDoc" } }, "400": { @@ -460020,12 +475280,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -460044,27 +475298,34 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora category browse", + "summary": "List Shop.app collection products", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/product": { + "/shop-app/shops/{handle}/locations": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Sephora product's full detail (every color/shade variant with its own price and availability, rating, review count, and a sample of recent reviews). `product_id` is the full product-page slug, e.g. `lip-sleeping-mask-P420652` -- copy it from the path segment after sephora.com/product/ on any product page; unlike some other retailers, an arbitrary or partial slug does not resolve.", - "operationId": "sephora-product", + "description": "Returns the public retail locations of a Shop.app merchant by shop handle, up to `limit` (default 10, max 50). Each location has its id, name, latitude and longitude, and street address; the response also carries the total count and a cursor for the next page. A shop with no public retail locations returns an error.", + "operationId": "shop-app-shop-locations", "parameters": [ { - "description": "Full Sephora product-page slug", - "in": "query", - "name": "product_id", + "description": "Shop handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "lip-sleeping-mask-P420652" + "x-example": "marcnolan" + }, + { + "description": "Maximum locations, defaults to 10 and supports up to 50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -460074,7 +475335,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.productResponseDoc" + "$ref": "#/definitions/shopapp.shopLocationsResponseDoc" } }, "400": { @@ -460107,34 +475368,56 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora product detail", + "summary": "List Shop.app shop locations", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/product/questions": { + "/shop-app/shops/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a Sephora product's customer Q&A: each question plus every answer it received (text, author, whether it's a brand answer, helpful votes). product_id is the Sephora productGroupID, e.g. P420652 -- the same value /sephora/product returns as product_group_id.", - "operationId": "sephora-product-questions", + "description": "Lists products from a Shop.app merchant, by shop `handle`. `limit` defaults to 30 (max 60), `sort_by` is `MOST_SALES` (default), `PRICE_LOW_TO_HIGH`, `PRICE_HIGH_TO_LOW` or `RELEVANCE`, and `in_stock` defaults to true. Each card has its id, title, price, original price, image and URL. An invalid `sort_by` is rejected.", + "operationId": "shop-app-shop-products", "parameters": [ { - "description": "Sephora productGroupID", - "in": "query", - "name": "product_id", + "description": "Shop handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "P420652" + "x-example": "marcnolan" }, { - "description": "Result page, 1-based, defaults to 1", + "description": "Maximum products, defaults to 30 and supports up to 60", "in": "query", - "name": "page", + "name": "limit", "type": "integer", - "x-example": 1 + "x-example": 30 + }, + { + "default": "MOST_SALES", + "description": "Sort mode", + "enum": [ + "MOST_SALES", + "PRICE_LOW_TO_HIGH", + "PRICE_HIGH_TO_LOW", + "RELEVANCE" + ], + "in": "query", + "name": "sort_by", + "type": "string", + "x-example": "MOST_SALES" + }, + { + "default": true, + "description": "Request in-stock products", + "in": "query", + "name": "in_stock", + "type": "boolean", + "x-example": true } ], "produces": [ @@ -460144,7 +475427,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.productQuestionsResponseDoc" + "$ref": "#/definitions/shopapp.shopProductsResponseDoc" } }, "400": { @@ -460171,34 +475454,34 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora product questions and answers", + "summary": "List Shop.app shop products", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/product/reviews": { + "/shop-app/shops/{handle}/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a Sephora product's full customer reviews (title, body, rating, author, helpful votes, secondary ratings, photos), plus the product's site-wide rating rollup (average rating, recommended ratio, star-count histogram). product_id is the Sephora productGroupID, e.g. P420652 -- the same value /sephora/product returns as product_group_id.", - "operationId": "sephora-product-reviews", + "description": "Lists customer reviews for a Shop.app merchant, by shop `handle`, up to `limit` (default 20, max 50). Each review has its rating, body, author, date, helpful count and the product reviewed. Also returns `total_count` and `next_cursor`. Unknown shops return not found.", + "operationId": "shop-app-shop-reviews", "parameters": [ { - "description": "Sephora productGroupID", - "in": "query", - "name": "product_id", + "description": "Shop handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "P420652" + "x-example": "marcnolan" }, { - "description": "Result page, 1-based, defaults to 1", + "description": "Maximum reviews, defaults to 20 and supports up to 50", "in": "query", - "name": "page", + "name": "limit", "type": "integer", - "x-example": 1 + "x-example": 20 } ], "produces": [ @@ -460208,7 +475491,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.productReviewsResponseDoc" + "$ref": "#/definitions/shopapp.shopReviewsResponseDoc" } }, "400": { @@ -460217,6 +475500,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -460235,106 +475524,42 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora product reviews", + "summary": "List Shop.app shop reviews", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/search": { + "/shop-app/shops/{handle}/typeahead": { "get": { "consumes": [ "application/json" ], - "description": "Searches Sephora's product catalog by keyword, with real page-based pagination. Returns products with brand, pricing, rating, and review count. Sephora's own search never returns a genuine zero-result state for a nonempty keyword -- an unrecognized/nonsense keyword still returns a full, unrelated fallback result set rather than an empty one. price_min/price_max must be provided together (whole dollars) -- upstream silently ignores a one-sided price range rather than filtering or erroring, so this endpoint rejects a one-sided range as invalid instead of passing it through. brand and filter each accept multiple values (OR'd together within the same facet); brand/rating_min/is_new/filter/price_min/price_max can all be combined with each other (AND'd together across different facets).", - "operationId": "sephora-search", + "description": "Returns search suggestions inside one Shop.app shop, for the shop `handle` and required `query`. `limit` defaults to 20, which is also the maximum. Suggestions are `type` term, product or collection, with text, position and a product or collection object where relevant. Unknown shops return not found.", + "operationId": "shop-app-shop-typeahead", "parameters": [ { - "description": "Search keyword", - "in": "query", - "name": "query", + "description": "Shop handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "mascara" - }, - { - "description": "Result page, 1-based, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Results per page, 1 to 100, defaults to 60", - "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 60 + "x-example": "marcnolan" }, { - "description": "Sort order, defaults to featured", - "enum": [ - "featured", - "top_rated", - "new", - "best_selling", - "price_low_to_high", - "price_high_to_low" - ], + "description": "Typeahead query", "in": "query", - "name": "sort_by", + "name": "query", + "required": true, "type": "string", - "x-example": "featured" - }, - { - "description": "Minimum price in whole dollars; must be set together with price_max", - "in": "query", - "name": "price_min", - "type": "integer", - "x-example": 15 - }, - { - "description": "Maximum price in whole dollars; must be set together with price_min", - "in": "query", - "name": "price_max", - "type": "integer", - "x-example": 30 - }, - { - "collectionFormat": "csv", - "description": "One or more exact brand names to filter to (OR'd together); repeat the param for multiple values", - "in": "query", - "items": { - "type": "string" - }, - "name": "brand", - "type": "array", - "x-example": "Lancôme" + "x-example": "loafer" }, { - "description": "Minimum star rating, 1 to 4", + "description": "Maximum suggestions, defaults to 20 and supports up to 20", "in": "query", - "name": "rating_min", + "name": "limit", "type": "integer", - "x-example": 4 - }, - { - "description": "When true, filters to products flagged New", - "in": "query", - "name": "is_new", - "type": "boolean", - "x-example": false - }, - { - "collectionFormat": "csv", - "description": "Additional facet:value filters, repeat the param for multiple; facet must be one of: benefits, ingredientpreferences, colorfamily, formulation, size, shoppingpreferences, agerange, skintype, finish, skinconcerns, coverage, hairtype, hairconcerns, hairtexture", - "in": "query", - "items": { - "type": "string" - }, - "name": "filter", - "type": "array", - "x-example": "formulation:serum" + "x-example": 20 } ], "produces": [ @@ -460344,7 +475569,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.searchResponseDoc" + "$ref": "#/definitions/shopapp.shopTypeaheadResponseDoc" } }, "400": { @@ -460353,6 +475578,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -460371,45 +475602,30 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora product search", + "summary": "Suggest products and collections inside a Shop.app shop", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/stores": { + "/shop-app/suggestions": { "get": { "consumes": [ "application/json" ], - "description": "Returns Sephora physical store locations near a coordinate (address, hours, BOPIS/curbside/same-day flags). Renders through a JS-executing browser backend, unlike every other Sephora endpoint -- the store-locator data call itself is plain HTTP, but it requires a per-visit access token minted by an endpoint gated behind a bot-management JS challenge, so responses may take longer.", - "operationId": "sephora-stores", + "description": "Returns Shop.app autocomplete suggestions for the required `query`. `limit` defaults to 10 and is capped at 20. Each suggestion is either a search query or a shop, with its `text`, `type`, URL and, for shops, the shop handle, name, rating and image.", + "operationId": "shop-app-suggestions", "parameters": [ { - "description": "Latitude, -90 to 90", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 41.88325 - }, - { - "description": "Longitude, -180 to 180", + "description": "Search query", "in": "query", - "name": "longitude", + "name": "query", "required": true, - "type": "number", - "x-example": -87.6323879 - }, - { - "description": "Search radius in miles, 1 to 500, defaults to 50", - "in": "query", - "name": "radius", - "type": "integer", - "x-example": 50 + "type": "string", + "x-example": "sneakers" }, { - "description": "Max stores to return, 1 to 50, defaults to 10", + "description": "Maximum suggestions, defaults to 10 and supports up to 20", "in": "query", "name": "limit", "type": "integer", @@ -460423,7 +475639,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.storesResponseDoc" + "$ref": "#/definitions/shopapp.suggestionsResponseDoc" } }, "400": { @@ -460450,27 +475666,41 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora store locator", + "summary": "Suggest Shop.app searches", "tags": [ - "Sephora" + "Shop.app" ] } }, - "/sephora/suggest": { + "/shopify/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns Sephora's own search-box type-ahead suggestions for a partial keyword: keyword-completion terms, matching products, and trending/related categories. Sephora's own upstream never returns a genuine zero-result state for a nonempty query -- a deliberately nonsense query still returns unrelated product suggestions.", - "operationId": "sephora-suggest", + "description": "Returns collections from a public Shopify storefront. Valid empty result pages return `200` with an empty collections array.", + "operationId": "shopify-collections", "parameters": [ { - "description": "Partial search keywords", + "description": "Shopify storefront URL", "in": "query", - "name": "query", + "name": "url", "required": true, "type": "string", - "x-example": "masc" + "x-example": "https://www.allbirds.com" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum collections, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -460480,7 +475710,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sephora.suggestResponseDoc" + "$ref": "#/definitions/shopify.collectionsResponseDoc" } }, "400": { @@ -460507,24 +475737,113 @@ "ApiKeyAuth": [] } ], - "summary": "Sephora search suggestions", + "summary": "List Shopify collections", "tags": [ - "Sephora" + "Shopify" ] } }, - "/sevennewsau/article": { + "/shopify/collections/{handle}/products": { "get": { - "description": "Returns public 7NEWS article metadata and body paragraphs from a canonical 7news.com.au article URL. 7NEWS articles are free to read; a non-free content tier, if one ever appears, is flagged as paywalled.", - "operationId": "sevennewsau-article", + "consumes": [ + "application/json" + ], + "description": "Returns products from a Shopify collection. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic store, since classic Shopify storefronts have no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic and headless stores; supplying any of these takes precedence over sortBy/dynamic facet filters.", + "operationId": "shopify-collection-products", "parameters": [ { - "description": "Canonical 7NEWS article URL", + "description": "Collection handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "mens" + }, + { + "description": "Shopify storefront URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://7news.com.au/news/world/susan-sarandon-and-hannah-einbinder-arrested-at-nyc-protests-against-benjamin-netanyahus-un-address-c-22923759" + "x-example": "https://www.allbirds.com" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + }, + { + "description": "SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.", + "enum": [ + "sortLTH", + "sortHTL", + "newest" + ], + "in": "query", + "name": "sortBy", + "type": "string", + "x-example": "sortLTH" + }, + { + "description": "Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.", + "enum": [ + "manual", + "best-selling", + "title-ascending", + "title-descending", + "price-ascending", + "price-descending", + "created-ascending", + "created-descending" + ], + "in": "query", + "name": "sort_by", + "type": "string", + "x-example": "price-ascending" + }, + { + "description": "Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.", + "in": "query", + "name": "min_price", + "type": "number", + "x-example": 10 + }, + { + "description": "Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.", + "in": "query", + "name": "max_price", + "type": "number", + "x-example": 100 + }, + { + "description": "Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.", + "in": "query", + "name": "product_type", + "type": "string", + "x-example": "Hats,T-Shirts" + }, + { + "description": "Storefront-filtering transport. true restricts to currently in-stock items only.", + "in": "query", + "name": "in_stock_only", + "type": "boolean", + "x-example": true + }, + { + "description": "Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.", + "in": "query", + "name": "option_size", + "type": "string", + "x-example": "Small,Medium" } ], "produces": [ @@ -460534,7 +475853,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopify.collectionProductsResponseDoc" } }, "400": { @@ -460549,6 +475868,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -460561,30 +475886,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get 7NEWS Australia article content", + "summary": "List Shopify collection products", "tags": [ - "7NEWS Australia" + "Shopify" ] } }, - "/sevennewsau/author": { + "/shopify/pages": { "get": { - "description": "Returns one 7NEWS journalist's public profile: name, job title, biography, portrait, public social links and the latest stories listed on the profile page.", - "operationId": "sevennewsau-author", + "consumes": [ + "application/json" + ], + "description": "Lists static pages from a Shopify storefront given by the required `url`, paged with `page` (from 1) and `limit` (default 50, max 250). Each has `handle`, `title`, `url`, plain-text `content` and dates. If `transport_mode` is `ssr_embedded`, items hold only `handle`, `url` and `updated_at`.", + "operationId": "shopify-pages", "parameters": [ { - "description": "Author slug, e.g. aimee-edwards", + "description": "Shopify storefront URL", "in": "query", - "name": "slug", + "name": "url", + "required": true, "type": "string", - "x-example": "aimee-edwards" + "x-example": "https://www.allbirds.com" }, { - "description": "Canonical 7news.com.au/profile/ URL; alternative to slug", + "description": "1-based page, defaults to 1", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://7news.com.au/profile/aimee-edwards" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum pages, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -460594,7 +475930,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sevennewsauAuthorResponseDoc" + "$ref": "#/definitions/shopify.pagesResponseDoc" } }, "400": { @@ -460603,8 +475939,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -460621,135 +475957,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get a 7NEWS Australia author profile", + "summary": "List Shopify pages", "tags": [ - "7NEWS Australia" + "Shopify" ] } }, - "/sevennewsau/headlines": { + "/shopify/pages/{handle}": { "get": { - "description": "Returns the 100 most recent 7NEWS Australia stories for one topic. `section` is required and takes a topic slug such as `news-sydney`, `sport-afl` or `business-property`, which is the site path with slashes replaced by hyphens. Each item has its title, URL, summary, publication time, author when credited, and lead image.", - "operationId": "sevennewsau-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one static page from any public Shopify storefront, by path `handle` and the required `url` of the store. The response has the page's title, URL, times and its `content` as plain text. Unknown handles return 404. Localhost, private-network and credentialed URLs are rejected.", + "operationId": "shopify-page", "parameters": [ { - "description": "7NEWS topic slug (the site path with slashes replaced by hyphens)", - "enum": [ - "7you", - "7you-beauty", - "7you-books", - "7you-fashion", - "7you-health-fitness", - "7you-home", - "7you-tech", - "7you-travel", - "business", - "business-economy", - "business-energy", - "business-property", - "business-retail", - "entertainment", - "entertainment-australian-idol", - "entertainment-celebrity", - "entertainment-farmer-wants-a-wife", - "entertainment-home-and-away", - "entertainment-movies", - "entertainment-music", - "entertainment-my-kitchen-rules", - "entertainment-the-voice-australia", - "entertainment-tv", - "lifestyle", - "lifestyle-fashion", - "lifestyle-food", - "lifestyle-health-wellbeing", - "lifestyle-parenting", - "lifestyle-personal-finance", - "lifestyle-pets", - "lifestyle-real-estate", - "lifestyle-recipes", - "lifestyle-relationships", - "lifestyle-shopping", - "lifestyle-sponsored", - "motoring", - "news", - "news-act", - "news-adelaide", - "news-asia", - "news-australia", - "news-brisbane", - "news-canberra", - "news-conflict", - "news-crime", - "news-darwin", - "news-disaster-and-emergency", - "news-education", - "news-europe", - "news-gold-coast", - "news-hobart", - "news-israel", - "news-melbourne", - "news-middle-east", - "news-missing-person", - "news-new-zealand", - "news-newcastle", - "news-nsw", - "news-nsw-police", - "news-nt", - "news-perth", - "news-protest", - "news-qld", - "news-russia", - "news-sa", - "news-sydney", - "news-ukraine", - "news-united-states", - "news-vic", - "news-wa", - "news-weather", - "news-world", - "opinion", - "politics", - "politics-federal-politics", - "politics-state-politics", - "sport", - "sport-afl", - "sport-aflw", - "sport-baseball", - "sport-basketball", - "sport-boxing", - "sport-cricket", - "sport-cycling", - "sport-f1", - "sport-golf", - "sport-horse-racing", - "sport-mixed-martial-arts", - "sport-motorsport", - "sport-netball", - "sport-nfl", - "sport-olympics", - "sport-rugby-league", - "sport-rugby-union", - "sport-soccer", - "sport-supercars", - "sport-tennis", - "sport-ufc", - "spotlight", - "sunrise", - "sunrise-cooking", - "sunrise-cooking-with-coles", - "sunrise-entertainment", - "technology", - "technology-gaming", - "the-morning-show", - "travel", - "travel-jetstar", - "travel-qantas" - ], + "description": "Page handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "accessibility" + }, + { + "description": "Shopify storefront URL", "in": "query", - "name": "section", + "name": "url", "required": true, "type": "string", - "x-example": "7you" + "x-example": "https://www.allbirds.com" } ], "produces": [ @@ -460759,7 +475995,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopify.pageResponseDoc" } }, "400": { @@ -460768,37 +476004,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get 7NEWS Australia section headlines", - "tags": [ - "7NEWS Australia" - ] - } - }, - "/sevennewsau/news": { - "get": { - "description": "Returns the 100 most recent 7NEWS Australia stories across every section, with no input needed. Each item has its title, canonical URL, summary, publication time, lead image, and the author when one is credited. Agency copy is often credited to `Digital Staff`.", - "operationId": "sevennewsau-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -460818,16 +476028,107 @@ "ApiKeyAuth": [] } ], - "summary": "Get 7NEWS Australia top stories", + "summary": "Get Shopify page", "tags": [ - "7NEWS Australia" + "Shopify" ] } }, - "/sevennewsau/sections": { + "/shopify/products": { "get": { - "description": "Returns the public 7NEWS topic feed inventory accepted by the headlines endpoint: national and city news, sport, politics, business, entertainment, lifestyle and more.", - "operationId": "sevennewsau-sections", + "consumes": [ + "application/json" + ], + "description": "Returns products from a public Shopify storefront. Valid empty result pages return `200` with an empty products array. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic store, since classic Shopify storefronts have no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic and headless stores; supplying any of these takes precedence over sortBy/dynamic facet filters.", + "operationId": "shopify-products", + "parameters": [ + { + "description": "Shopify storefront URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.allbirds.com" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + }, + { + "description": "SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.", + "enum": [ + "sortLTH", + "sortHTL", + "newest" + ], + "in": "query", + "name": "sortBy", + "type": "string", + "x-example": "sortLTH" + }, + { + "description": "Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.", + "enum": [ + "manual", + "best-selling", + "title-ascending", + "title-descending", + "price-ascending", + "price-descending", + "created-ascending", + "created-descending" + ], + "in": "query", + "name": "sort_by", + "type": "string", + "x-example": "price-ascending" + }, + { + "description": "Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.", + "in": "query", + "name": "min_price", + "type": "number", + "x-example": 10 + }, + { + "description": "Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.", + "in": "query", + "name": "max_price", + "type": "number", + "x-example": 100 + }, + { + "description": "Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.", + "in": "query", + "name": "product_type", + "type": "string", + "x-example": "Hats,T-Shirts" + }, + { + "description": "Storefront-filtering transport. true restricts to currently in-stock items only.", + "in": "query", + "name": "in_stock_only", + "type": "boolean", + "x-example": true + }, + { + "description": "Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.", + "in": "query", + "name": "option_size", + "type": "string", + "x-example": "Small,Medium" + } + ], "produces": [ "application/json" ], @@ -460835,7 +476136,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/shopify.productsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -460856,24 +476163,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get 7NEWS Australia sections", + "summary": "List Shopify products", "tags": [ - "7NEWS Australia" + "Shopify" ] } }, - "/sfgate/article": { + "/shopify/products/{handle}": { "get": { - "description": "Returns public SFGATE article metadata and body paragraphs from a canonical article URL. Article pages are served through proxied browser renderers; the service does not bypass authentication or access controls, and marks paywalled=true when only a teaser is public.", - "operationId": "sfgate-article", + "consumes": [ + "application/json" + ], + "description": "Returns one product from any Shopify storefront, given the store URL and the product handle: title, description, product type, tags, price and compare-at price, availability, options, images, and each variant with its own price, availability and barcode. Prices are in decimal currency units; an unknown handle returns `404`.", + "operationId": "shopify-product", "parameters": [ { - "description": "Canonical SFGate article URL", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "mens-wool-runners" + }, + { + "description": "Shopify storefront URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.sfgate.com/bayarea/article/example-story-22400001.php" + "x-example": "https://www.allbirds.com" } ], "produces": [ @@ -460883,7 +476201,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopify.productResponseDoc" } }, "400": { @@ -460898,6 +476216,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -460910,24 +476234,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get SFGate article content", + "summary": "Get Shopify product", "tags": [ - "SFGate" + "Shopify" ] } }, - "/sfgate/author": { + "/shopify/products/{handle}/recommendations": { "get": { - "description": "Returns an SFGATE author's name, job title, biography, headshot, public profile links, and recent articles from a canonical author URL. Author pages are served through proxied browser renderers; the service does not bypass authentication or access controls.", - "operationId": "sfgate-author", + "consumes": [ + "application/json" + ], + "description": "Returns recommended products from Shopify's product recommendations.", + "operationId": "shopify-product-recommendations", "parameters": [ { - "description": "Canonical SFGate author URL", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "mens-wool-runners" + }, + { + "description": "Shopify storefront URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.sfgate.com/author/example-writer/" + "x-example": "https://www.allbirds.com" + }, + { + "description": "Maximum products, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", + "enum": [ + "related", + "complementary" + ], + "in": "query", + "name": "intent", + "type": "string", + "x-example": "related" } ], "produces": [ @@ -460937,7 +476290,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sfgateAuthorResponseDoc" + "$ref": "#/definitions/shopify.productRecommendationsResponseDoc" } }, "400": { @@ -460952,6 +476305,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -460964,38 +476323,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get an SFGate author profile", + "summary": "List Shopify product recommendations", "tags": [ - "SFGate" + "Shopify" ] } }, - "/sfgate/headlines": { + "/shopify/search/suggest": { "get": { - "description": "Returns the latest SFGATE stories for one section. `section` is required and takes `top-news`, `bay-area`, `business-technology`, `entertainment`, `celebrity`, `food-dining`, `travel`, `routes`, `top-sports`, `giants`, `49ers` or `warriors`. Feeds hold 12 to 30 items, and the `warriors` feed is quiet in the off-season.", - "operationId": "sfgate-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns predictive search suggestions from any Shopify storefront for a query: matching products, collections and suggested queries. Choose which with `types` (default all three) and cap results per type with `limit` (default 10, max 20). Products carry price, availability, images and options; collections carry title, handle, description and product count.", + "operationId": "shopify-search-suggest", "parameters": [ { - "description": "SFGate section slug", - "enum": [ - "top-news", - "bay-area", - "business-technology", - "entertainment", - "celebrity", - "food-dining", - "travel", - "routes", - "top-sports", - "giants", - "49ers", - "warriors" - ], + "description": "Shopify storefront URL", "in": "query", - "name": "section", + "name": "url", "required": true, "type": "string", - "x-example": "top-news" + "x-example": "https://www.allbirds.com" + }, + { + "description": "Search query", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "wool" + }, + { + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "in": "query", + "name": "types", + "type": "string", + "x-example": "product,collection,query" + }, + { + "description": "Maximum results per type, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -461005,7 +476375,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopify.searchSuggestResponseDoc" } }, "400": { @@ -461014,38 +476384,6 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get SFGate section headlines", - "tags": [ - "SFGate" - ] - } - }, - "/sfgate/news": { - "get": { - "description": "Returns the latest stories from SFGATE's Top News Stories feed: title, canonical URL, summary, author and publication time in UTC. Takes no parameters. The feed carries no images.", - "operationId": "sfgate-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -461064,59 +476402,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get SFGate top stories", - "tags": [ - "SFGate" - ] - } - }, - "/sfgate/sections": { - "get": { - "description": "Returns the SFGATE feed inventory (Top News, Bay Area, Business and Technology, Entertainment, Celebrity, Food and Dining, Travel, Routes, Top Sports, Giants, 49ers, Warriors), each linking to its public RSS feed.", - "operationId": "sfgate-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get SFGate sections", + "summary": "Get Shopify search suggestions", "tags": [ - "SFGate" + "Shopify" ] } }, - "/shakeshack/locations": { + "/shopify/sitemap/urls": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of Shake Shack's store index, parsed off the single, fully server-rendered /locations page. That page carries two independent sections: an interactive map (coordinates, no structured address) and an accessible \"Full List of Locations\" text index (structured address, no coordinates). Each entry's source field says which section it came from -- \"map\" or \"list\" -- not a business classification; both round-trip through GET /shakeshack/store by path, which always returns full structured address and coordinates regardless of source.", - "operationId": "shakeshack-locations", + "description": "Lists URL entries from a Shopify storefront's sitemaps, for the required `url`. `type` filters (`all` by default, `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, `other`) and `limit` caps entries (default 50, max 250). Each has `loc`, `type`, `handle`, `lastmod`, `changefreq` and optional `images`.", + "operationId": "shopify-sitemap-urls", "parameters": [ { - "description": "1-based page (default 1)", + "description": "Shopify storefront URL", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.allbirds.com" }, { - "description": "Entries per page, 1-500 (default 100)", + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], "in": "query", - "name": "page_size", + "name": "type", + "type": "string", + "x-example": "products" + }, + { + "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", "type": "integer", - "x-example": 100 + "x-example": 50 } ], "produces": [ @@ -461126,7 +476455,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shakeshack.locationsResponseDoc" + "$ref": "#/definitions/shopify.sitemapURLsResponseDoc" } }, "400": { @@ -461135,12 +476464,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -461159,27 +476482,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Shake Shack's store index", + "summary": "List Shopify sitemap URLs", "tags": [ - "Shake Shack" + "Shopify" ] } }, - "/shakeshack/menu": { + "/shopify/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Shake Shack location's full menu as a category tree: every category and its products, with name, description, base calories, allergens, a promotional/dietary badge when published (e.g. \"LIMITED TIME ONLY\", \"VEGETARIAN\"), image, and a full customization tree (size, additions, removals, allergen flags), each choice carrying its own price and calorie delta. location_id comes from GET /shakeshack/nearby. Many items, most notably burgers, price entirely through a required size selection rather than a base price, so price is commonly 0 for those items -- the real price lives on the size modifier's own choices.", - "operationId": "shakeshack-menu", + "description": "Lists the child sitemaps in a Shopify storefront's sitemap index, for the required `url`. Each has a `loc` and a `type` (`products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`) inferred from its URL. Localhost, private-network and credentialed URLs are rejected.", + "operationId": "shopify-sitemaps", "parameters": [ { - "description": "Location id from /shakeshack/nearby", + "description": "Shopify storefront URL", "in": "query", - "name": "location_id", + "name": "url", "required": true, - "type": "integer", - "x-example": 14992 + "type": "string", + "x-example": "https://www.allbirds.com" } ], "produces": [ @@ -461189,7 +476512,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shakeshack.menuResponseDoc" + "$ref": "#/definitions/shopify.sitemapIndexResponseDoc" } }, "400": { @@ -461198,12 +476521,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -461222,49 +476539,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Shake Shack location's full menu", + "summary": "List Shopify sitemaps", "tags": [ - "Shake Shack" + "Shopify" ] } }, - "/shakeshack/nearby": { + "/shopify/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns Shake Shack locations within a radius of a coordinate, nearest first, using Shake Shack's own Olo-backed ordering API (a separate source from GET /shakeshack/locations, which reads the main site's store directory instead). Each result carries location_id, real-time weekly hours, which fulfillment modes are currently enabled (dine-in, pickup, delivery, curbside, drive-thru, walk-up, drive-up), and Shake Shack's own delivery fee schedule. Pass location_id to GET /shakeshack/menu for that location's full menu.", - "operationId": "shakeshack-nearby", + "description": "Resolves a public Shopify storefront and returns its metadata.", + "operationId": "shopify-store", "parameters": [ { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 40.758 - }, - { - "description": "Search center longitude", + "description": "Shopify storefront URL", "in": "query", - "name": "longitude", + "name": "url", "required": true, - "type": "number", - "x-example": -73.9855 - }, - { - "description": "Search radius in miles, 1-50 (default 15)", - "in": "query", - "name": "radius", - "type": "integer", - "x-example": 15 - }, - { - "description": "Maximum locations to return, 1-50 (default 10)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "type": "string", + "x-example": "https://www.allbirds.com" } ], "produces": [ @@ -461274,7 +476569,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shakeshack.nearbyResponseDoc" + "$ref": "#/definitions/shopify.storeResponseDoc" } }, "400": { @@ -461301,27 +476596,27 @@ "ApiKeyAuth": [] } ], - "summary": "Find Shake Shack locations near a coordinate", + "summary": "Get Shopify store metadata", "tags": [ - "Shake Shack" + "Shopify" ] } }, - "/shakeshack/store": { + "/similarweb/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Shake Shack store: postal address, coordinates, phone (when published), a Monday-first week of opening hours (omitted for a location that publishes no schedule, seen on venue/kiosk-shaped locations such as inside a stadium), and the order types Shake Shack publishes for it, e.g. \"Dine In\", \"Delivery\". Store paths come from GET /shakeshack/locations, either the aliased \"location/\" form or the legacy \"node/\" form -- both resolve to the same record, and the response's own path field always reports the canonical alias. A path with neither shape, or one that does not resolve to a real store page, returns a 404.", - "operationId": "shakeshack-store", + "description": "Looks up a domain or keyword on SimilarWeb and returns the matching websites, companies (name, domain and logo) and apps on the App Store and Google Play.", + "operationId": "similarweb-search", "parameters": [ { - "description": "Store path from a /shakeshack/locations entry", + "description": "Domain or keyword to search", "in": "query", - "name": "path", + "name": "q", "required": true, "type": "string", - "x-example": "location/meyerland-tx" + "x-example": "google.com" } ], "produces": [ @@ -461331,29 +476626,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shakeshack.storeResponseDoc" + "$ref": "#/definitions/similarweb.searchResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid query parameter", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -461364,19 +476653,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Shake Shack store's detail", + "summary": "Search SimilarWeb Info", "tags": [ - "Shake Shack" + "SimilarWeb" ] } }, - "/shein/brands": { + "/similarweb/web/{domain}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the brand channel's category tabs with ids usable with `/shein/category/goods` and `/shein/products/search`.", - "operationId": "shein-brands", + "description": "Returns SimilarWeb's traffic profile for one domain: global, country and category rank, estimated monthly visits, engagement (bounce rate, pages per visit, time on site), top countries, traffic sources, top keywords and similar sites. `DataSource` shows whether the full source or the narrower public-page fallback answered; the fallback omits several fields.", + "operationId": "similarweb-web", + "parameters": [ + { + "description": "Domain to fetch SimilarWeb data for", + "in": "path", + "name": "domain", + "required": true, + "type": "string", + "x-example": "google.com" + } + ], "produces": [ "application/json" ], @@ -461384,17 +476683,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.brandsResponseDoc" + "$ref": "#/definitions/similarweb.webResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Invalid domain parameter", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -461405,19 +476710,35 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN brand channel categories", + "summary": "Get SimilarWeb Web Info", "tags": [ - "SHEIN" + "SimilarWeb" ] } }, - "/shein/categories": { + "/skims/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns SHEIN's root category tree (11 top-level categories, nested to leaf ids) plus the global attribute filter taxonomy (sizes, colors, materials, …). Use the returned `cat_id` values with `/shein/category/nav`, `/shein/category/filters` and `/shein/category/goods`.", - "operationId": "shein-categories", + "description": "Returns collections from SKIMS (https://skims.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", + "operationId": "skims-collections", + "parameters": [ + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum collections, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + } + ], "produces": [ "application/json" ], @@ -461425,11 +476746,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.categoriesResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461446,27 +476773,41 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN category tree and global filters", + "summary": "List SKIMS collections", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/category/filters": { + "/skims/collections/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns the filter facets for a SHEIN category by the required numeric `cat_id`, such as sizes, colours and composition. Each group has a `node_id`, `node_name` and a list of options with their own ids and names. Also returns `min_price`, `max_price` and the `currency`.", - "operationId": "shein-category-filters", + "description": "Returns products from one SKIMS (https://skims.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", + "operationId": "skims-collection-products", "parameters": [ { - "description": "Numeric SHEIN category id", - "in": "query", - "name": "cat_id", + "description": "Collection handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "1766" + "x-example": "collection-handle" + }, + { + "description": "1-based page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -461476,7 +476817,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.categoryFiltersResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { @@ -461485,8 +476826,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461503,48 +476850,33 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN category filter facets", + "summary": "List SKIMS collection products", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/category/goods": { + "/skims/pages": { "get": { "consumes": [ "application/json" ], - "description": "Lists products in a SHEIN category, by the required numeric `cat_id`. `page` starts at 1 and `page_size` defaults to 20; `sort` is a non-negative integer, `0` by default. Each product has its id, name, images, sale, retail and USD prices, rating, review count, and `on_sale` and `sold_out` flags. `total` is the category's listing count.", - "operationId": "shein-category-goods", + "description": "Lists SKIMS static pages, 50 per request by default (`limit` up to 250), with `page` starting at 1. Each page has its handle, title, URL, plain-text content and timestamps. An empty result is a normal 200. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", + "operationId": "skims-pages", "parameters": [ { - "description": "Numeric SHEIN category id", - "in": "query", - "name": "cat_id", - "required": true, - "type": "string", - "x-example": "1727" - }, - { - "description": "1-based page number", + "description": "1-based page, defaults to 1", "in": "query", "name": "page", "type": "integer", "x-example": 1 }, { - "description": "Results per page", + "description": "Maximum static pages, defaults to 50 and supports up to 250", "in": "query", - "name": "page_size", + "name": "limit", "type": "integer", - "x-example": 20 - }, - { - "description": "SHEIN sort code: a non-negative integer. `0` is the default (recommended). Other codes are accepted and forwarded as-is; the full code-to-meaning mapping has not been live-verified yet (see the endpoint markdown), so callers relying on a specific ordering should confirm behavior empirically.", - "in": "query", - "name": "sort", - "type": "string", - "x-example": "0" + "x-example": 50 } ], "produces": [ @@ -461554,7 +476886,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.categoryGoodsResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { @@ -461563,8 +476895,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461581,27 +476913,27 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN category product listing", + "summary": "List SKIMS static pages", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/category/nav": { + "/skims/pages/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the subcategory navigation tabs for a SHEIN category, by the required numeric `cat_id`. Each tab has its `nav_id`, `nav_name`, `nav_type`, `nav_img` and the `goods_id` of a representative product.", - "operationId": "shein-category-nav", + "description": "Returns one SKIMS static page by its `handle`: id, title, URL, plain-text `content` and the created, published and updated timestamps. Page text is cleaned, not raw HTML. An unknown handle returns 404. When the reduced form is served, `transport_mode` is `ssr_embedded` and `id` is omitted.", + "operationId": "skims-page", "parameters": [ { - "description": "Numeric SHEIN category id", - "in": "query", - "name": "cat_id", + "description": "Page handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "1766" + "x-example": "page-handle" } ], "produces": [ @@ -461611,7 +476943,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.categoryNavResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, "400": { @@ -461620,8 +476952,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461638,33 +476976,33 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN category nav tabs", + "summary": "Get a SKIMS static page", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/deals/products": { + "/skims/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of SHEIN's coupon/deal product pool (≈3,000 items at the time of writing), with the same normalized product-card fields as product search plus an `is_new_coupon` flag. Paging is 1-based; `page_size` is capped at 20 by the upstream.", - "operationId": "shein-deals-products", + "description": "Returns products from SKIMS's (https://skims.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "skims-products", "parameters": [ { - "description": "1-based page number (default 1)", + "description": "1-based page, defaults to 1", "in": "query", "name": "page", "type": "integer", "x-example": 1 }, { - "description": "Products per page, 1-20 (default 10)", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "page_size", + "name": "limit", "type": "integer", - "x-example": 10 + "x-example": 50 } ], "produces": [ @@ -461674,7 +477012,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.dealsProductsResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" } }, "400": { @@ -461683,8 +477021,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461701,19 +477039,29 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN coupon and deal products", + "summary": "List SKIMS products", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/deals/tabs": { + "/skims/products/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the deal-landing tabs and categories (ids usable with `/shein/category/goods` and `/shein/deals/products`).", - "operationId": "shein-deals-tabs", + "description": "Returns product detail for one SKIMS (https://skims.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "skims-product", + "parameters": [ + { + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "product-handle" + } + ], "produces": [ "application/json" ], @@ -461721,11 +477069,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.dealTabsResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461742,34 +477102,45 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN deal category tabs", + "summary": "Get a SKIMS product", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/products/aggregation-filters": { - "post": { + "/skims/products/{handle}/recommendations": { + "get": { "consumes": [ "application/json" ], - "description": "Returns the filter facets for a SHEIN search, given the required `keyword` and an optional `cat_id` that narrows them. The response has filter groups (id, name, options), a recursive `category` drill-down with `children`, and the `min_price` and `max_price` for the query.", - "operationId": "shein-products-aggregation-filters", + "description": "Returns recommended products for one SKIMS (https://skims.com) product handle. The storefront URL is fixed server-side.", + "operationId": "skims-product-recommendations", "parameters": [ { - "description": "Free-text search query", - "in": "query", - "name": "keyword", + "description": "Product handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "dress" + "x-example": "product-handle" }, { - "description": "Numeric SHEIN category id, narrows the facets", + "description": "Maximum products, defaults to 10 and supports up to 20", "in": "query", - "name": "cat_id", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", + "enum": [ + "related", + "complementary" + ], + "in": "query", + "name": "intent", "type": "string", - "x-example": "12476" + "x-example": "related" } ], "produces": [ @@ -461779,7 +477150,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.aggregationFiltersResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -461788,8 +477159,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461806,34 +477183,41 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN search aggregation filters", + "summary": "List SKIMS product recommendations", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/products/detail": { + "/skims/search/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns a SHEIN product by the required numeric `goods_id`; `goods_sn` is optional and narrows the lookup. The response has the name, description, category, brand code, sale, retail and USD prices, images, video URL, size options, per-SKU stock and prices, and colour variants.", - "operationId": "shein-products-detail", + "description": "Returns products, collections, and query suggestions from SKIMS's (https://skims.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "skims-search-suggest", "parameters": [ { - "description": "Numeric SHEIN goods id (from a search result's goods_id)", + "description": "Search query", "in": "query", - "name": "goods_id", + "name": "q", "required": true, "type": "string", - "x-example": "163003837" + "x-example": "wool" }, { - "description": "SHEIN goods serial number, narrows the lookup", + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", "in": "query", - "name": "goods_sn", + "name": "types", "type": "string", - "x-example": "sz25081193234595996" + "x-example": "product,collection,query" + }, + { + "description": "Maximum results per type, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -461843,7 +477227,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.productDetailResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { @@ -461852,8 +477236,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461870,48 +477254,42 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN product detail", + "summary": "Get SKIMS search suggestions", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/products/search": { - "post": { + "/skims/sitemap/urls": { + "get": { "consumes": [ "application/json" ], - "description": "Searches SHEIN products for the required `keyword`. `page` starts at 1, `page_size` defaults to 20 and `sort` is a non-negative integer, `0` by default. Each product card has its id, name, images, prices, rating, review count and stock flags. Also returns `total` and spelling suggestions in `suggest_words`.", - "operationId": "shein-products-search", + "description": "Lists URL entries from SKIMS sitemaps, filtered by `type` (`all` by default, or `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, `other`). Stops at `limit` entries (default 50, max 250). Each entry has `loc`, its type, handle, `lastmod`, `changefreq` and, where present, images with caption and title.", + "operationId": "skims-sitemap-urls", "parameters": [ { - "description": "Free-text search query", + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], "in": "query", - "name": "keyword", - "required": true, + "name": "type", "type": "string", - "x-example": "dress" - }, - { - "description": "1-based page number", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "products" }, { - "description": "Results per page", + "description": "Maximum URL entries, defaults to 50 and supports up to 250", "in": "query", - "name": "page_size", + "name": "limit", "type": "integer", - "x-example": 20 - }, - { - "description": "SHEIN sort code: a non-negative integer. `0` is the default (recommended). Other codes are accepted and forwarded as-is; the full code-to-meaning mapping has not been live-verified yet (see the endpoint markdown), so callers relying on a specific ordering should confirm behavior empirically.", - "in": "query", - "name": "sort", - "type": "string", - "x-example": "0" + "x-example": 50 } ], "produces": [ @@ -461921,7 +477299,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.productsSearchResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" } }, "400": { @@ -461930,8 +477308,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -461948,29 +477326,19 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN product search", + "summary": "List SKIMS sitemap URLs", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/search/autocomplete": { - "post": { + "/skims/sitemaps": { + "get": { "consumes": [ "application/json" ], - "description": "Returns SHEIN search suggestions for a partial query in the required `word`. Each suggestion has its `word`, `word_id` and `type`. A word with no matching phrase returns an empty list, not an error.", - "operationId": "shein-search-autocomplete", - "parameters": [ - { - "description": "Partial search query", - "in": "query", - "name": "word", - "required": true, - "type": "string", - "x-example": "dres" - } - ], + "description": "Lists the child sitemaps in the SKIMS sitemap index, each with its `loc` URL and a `type` of `products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`. Takes no parameters. Use it to see which sitemap files exist before listing their URLs.", + "operationId": "skims-sitemaps", "produces": [ "application/json" ], @@ -461978,7 +477346,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.autocompleteResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" } }, "400": { @@ -461987,8 +477355,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -462005,35 +477373,19 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN search autocomplete", + "summary": "List SKIMS sitemaps", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/search/keywords": { - "post": { + "/skims/store": { + "get": { "consumes": [ "application/json" ], - "description": "Returns the trending search keywords SHEIN shows in its search box. `scene` defaults to `trendStoreChannel` and `word_type` to `1`. Each keyword has its `word`, `word_id`, `type` and `from`.", - "operationId": "shein-search-keywords", - "parameters": [ - { - "description": "Keyword scene (trendStoreChannel)", - "in": "query", - "name": "scene", - "type": "string", - "x-example": "trendStoreChannel" - }, - { - "description": "Keyword type (1)", - "in": "query", - "name": "word_type", - "type": "string", - "x-example": "1" - } - ], + "description": "Returns storefront metadata for SKIMS (https://skims.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "skims-store", "produces": [ "application/json" ], @@ -462041,7 +477393,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.searchKeywordsResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, "400": { @@ -462050,8 +477402,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -462068,27 +477420,24 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN trending search keywords", + "summary": "Get SKIMS store metadata", "tags": [ - "SHEIN" + "SKIMS" ] } }, - "/shein/store": { + "/skynews/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a SHEIN store/seller profile — name, logo, follower count, seller label, store-type flags — plus the categories the store sells into, by the numeric `store_code` that product search/category/detail results already return. Use the returned `category_id` with `/shein/store/products` to list that category's products.", - "operationId": "shein-store", + "description": "Returns a Sky News article by canonical `url` of the form `https://news.sky.com/story/...-`: title, description, section, authors, publication and update times, image, body `paragraphs` and a `paywalled` flag.", + "operationId": "skynews-article", "parameters": [ { - "description": "Numeric SHEIN store code, as returned in product cards", + "description": "Canonical Sky News article URL", "in": "query", - "name": "store_code", + "name": "url", "required": true, "type": "string", - "x-example": "1813776918" + "x-example": "https://news.sky.com/story/example-story-12345678" } ], "produces": [ @@ -462098,7 +477447,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.storeResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -462107,8 +477456,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -462125,49 +477474,24 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN store profile and categories", + "summary": "Get Sky News article content", "tags": [ - "SHEIN" + "Sky News" ] } }, - "/shein/store/products": { + "/skynews/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the product listing for one category of a SHEIN store. `store_code` comes from a product card or `/shein/store`; `category_id` from `/shein/store`. `page_size` is capped at 20 (the upstream limit). Product cards use the same normalized fields as product search.", - "operationId": "shein-store-products", + "description": "Returns a Sky News author's profile by canonical `url` (`https://news.sky.com/author/-`): name, `job_title`, biography paragraphs and recent articles. An `info` list carries whatever else the page shows, as label and value entries with an optional link, such as expertise, location, social handles or email.", + "operationId": "skynews-author", "parameters": [ { - "description": "Numeric SHEIN store code", - "in": "query", - "name": "store_code", - "required": true, - "type": "string", - "x-example": "1813776918" - }, - { - "description": "Numeric store category id from /shein/store", + "description": "Canonical Sky News author URL", "in": "query", - "name": "category_id", + "name": "url", "required": true, "type": "string", - "x-example": "1766" - }, - { - "description": "1-based page number (default 1)", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Products per page, 1-20 (default 20)", - "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 20 + "x-example": "https://news.sky.com/author/sam-coates-763" } ], "produces": [ @@ -462177,7 +477501,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.storeProductsResponseDoc" + "$ref": "#/definitions/publicnews.skyNewsAuthorResponseDoc" } }, "400": { @@ -462186,8 +477510,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -462204,19 +477528,42 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN store category products", + "summary": "Get a Sky News author profile", "tags": [ - "SHEIN" + "Sky News" ] } }, - "/shein/trending/categories": { + "/skynews/headlines": { "get": { - "consumes": [ - "application/json" + "description": "Returns fresh headlines from one Sky News section, either its official RSS feed or (for the 5 sections with no feed) its public hub page.", + "operationId": "skynews-headlines", + "parameters": [ + { + "description": "Sky News section slug", + "enum": [ + "home", + "uk", + "world", + "us", + "business", + "politics", + "technology", + "entertainment", + "strange", + "money", + "science-climate-tech", + "offbeat", + "analysis", + "data-and-forensics" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "home" + } ], - "description": "Returns SHEIN's trending-category cards: the category id/name list with a representative `store_code` and `goods_id` per category. Pair with `/shein/category/goods` (by `cat_id`) or `/shein/store` (by `store_code`).", - "operationId": "shein-trending-categories", "produces": [ "application/json" ], @@ -462224,11 +477571,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.trendingCategoriesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -462245,19 +477592,16 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN trending categories", + "summary": "Get Sky News section headlines", "tags": [ - "SHEIN" + "Sky News" ] } }, - "/shein/trending/filters": { + "/skynews/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the trending channel's collection tabs (e.g. \"#Dot Charm\") and the category filters available on the trending surface. Pair with `/shein/trending/categories` and `/shein/category/goods`.", - "operationId": "shein-trending-filters", + "description": "Returns Sky News's latest top stories across the site. Takes no parameters. Each item has its title, URL, summary, publication time and image. Pass an item's URL to `skynews-article` for its body paragraphs.", + "operationId": "skynews-news", "produces": [ "application/json" ], @@ -462265,11 +477609,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shein.trendingFiltersResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -462286,58 +477630,50 @@ "ApiKeyAuth": [] } ], - "summary": "SHEIN trending filters", + "summary": "Get Sky News top stories", "tags": [ - "SHEIN" + "Sky News" ] } }, - "/shop-app/analysis": { + "/skynews/sections": { "get": { - "consumes": [ + "description": "Returns the Sky News section inventory: 9 official RSS feeds plus 5 additional site sections with no RSS feed, listed from their public hub page instead.", + "operationId": "skynews-sections", + "produces": [ "application/json" ], - "description": "Returns a market snapshot derived from Shop.app search results, including price ranges, currencies, sale counts, discounts, and top shops. Limit defaults to 20 and accepts values up to 50.", - "operationId": "shop-app-analysis", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Sky News sections", + "tags": [ + "Sky News" + ] + } + }, + "/skynews/video": { + "get": { + "description": "Returns one Sky News video's public metadata (title, description, thumbnails, duration, embed URL) from a canonical video URL. There is no transcript or article body for a video.", + "operationId": "skynews-video", "parameters": [ { - "description": "Search query", + "description": "Canonical Sky News video URL", "in": "query", - "name": "query", + "name": "url", "required": true, "type": "string", - "x-example": "sneakers" - }, - { - "description": "Maximum products to analyze, defaults to 20 and supports up to 50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "default": true, - "description": "Request in-stock products", - "in": "query", - "name": "in_stock", - "type": "boolean", - "x-example": true - }, - { - "default": false, - "description": "Request sale products", - "in": "query", - "name": "on_sale", - "type": "boolean", - "x-example": false - }, - { - "default": false, - "description": "Accepted for compatibility; Shop.app no longer offers a separate deep search mode, so results are unchanged", - "in": "query", - "name": "deep_search", - "type": "boolean", - "x-example": false + "x-example": "https://news.sky.com/video/example-video-12345678" } ], "produces": [ @@ -462347,7 +477683,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.analysisResponseDoc" + "$ref": "#/definitions/publicnews.skyNewsVideoResponseDoc" } }, "400": { @@ -462356,8 +477692,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -462374,19 +477710,16 @@ "ApiKeyAuth": [] } ], - "summary": "Analyze Shop.app query results", + "summary": "Get Sky News video metadata", "tags": [ - "Shop.app" + "Sky News" ] } }, - "/shop-app/categories": { + "/skynews/videos": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the Shop.app product category tree, with no parameters. Each category has its `id`, `gid`, `name`, `slug`, `image`, `has_children`, nested `children` and a `path` of ancestors. Ids are taken from Shopify product category GIDs where present.", - "operationId": "shop-app-categories", + "description": "Lists recent videos from the Sky News videos hub. Takes no parameters. Each item has its title, URL, summary, author, lead image, publication time and type. An item's `url` can be passed to `skynews-video` to get that video's own metadata.", + "operationId": "skynews-videos", "produces": [ "application/json" ], @@ -462394,13 +477727,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.categoriesResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.skyNewsVideosResponseDoc" } }, "503": { @@ -462415,34 +477742,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app categories", + "summary": "Get the Sky News videos hub", "tags": [ - "Shop.app" + "Sky News" ] } }, - "/shop-app/products/{id}": { + "/skysports/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Shop.app product by `id`: title, description, price and original price, currency, availability, images, option groups, rating, review count with reviews, related products and the selling shop. Pass `variant_id` to mark a variant as selected. Missing products return an error.", - "operationId": "shop-app-product", + "description": "Returns a Sky Sports article by `url`, an HTTPS `skysports.com` address with a sport news path such as `/football/news//`: title, description, section, authors, publication and update times, image and body `paragraphs`. The returned URL uses `www.skysports.com`, and query strings and fragments are discarded.", + "operationId": "skysports-article", "parameters": [ { - "description": "Product id", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "4596217053229" - }, - { - "description": "Variant id", + "description": "Canonical Sky Sports article URL", "in": "query", - "name": "variant_id", + "name": "url", + "required": true, "type": "string", - "x-example": "34761278160941" + "x-example": "https://www.skysports.com/football/news/13592544/example-story" } ], "produces": [ @@ -462452,7 +477769,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.productResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -462467,12 +477784,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -462485,34 +477796,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Shop.app product", + "summary": "Get a Sky Sports article", "tags": [ - "Shop.app" + "Sky Sports" ] } }, - "/shop-app/products/{id}/related": { + "/skysports/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists products related to a Shop.app product, by `id`. `limit` defaults to 20 and is capped at 50. Each card has the product's id, title, price, original price, currency, `on_sale` flag, image, shop name and URL. A product page with no related items returns an error.", - "operationId": "shop-app-product-related", + "description": "Returns a Sky Sports author's name, current `job_title`, biography paragraphs and the article links on their profile page, from an author `url` such as `https://www.skysports.com/author/kaveh-solhekol-773`. Each article has a title and URL, with summary, author, publication time and image where present.", + "operationId": "skysports-author", "parameters": [ { - "description": "Product id", - "in": "path", - "name": "id", + "description": "Canonical Sky Sports author URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "4596217053229" - }, - { - "description": "Maximum products, defaults to 20 and supports up to 50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "https://www.skysports.com/author/kaveh-solhekol-773" } ], "produces": [ @@ -462522,7 +477823,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.relatedResponseDoc" + "$ref": "#/definitions/publicnews.skySportsAuthorResponseDoc" } }, "400": { @@ -462531,8 +477832,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -462549,34 +477850,48 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app related products", + "summary": "Get a Sky Sports author profile", "tags": [ - "Shop.app" + "Sky Sports" ] } }, - "/shop-app/products/{id}/reviews": { + "/skysports/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists customer reviews for a Shop.app product, by `id`, up to `limit` (default 20, max 50). Each review has its rating, title, body, author, date, helpful count and variant label, where present. A product with no reviews returns an error.", - "operationId": "shop-app-product-reviews", + "description": "Returns the article cards from one Sky Sports section listing page. `section` is required and takes one of 22 slugs such as `football`, `f1`, `cricket`, `rugby-union`, `golf`, `boxing`, `nfl` or `darts`. The site's Show More pagination is not exposed, so only the first listing comes back.", + "operationId": "skysports-headlines", "parameters": [ { - "description": "Product id", - "in": "path", - "name": "id", + "description": "Sky Sports section slug", + "enum": [ + "football", + "f1", + "cricket", + "rugby-union", + "rugby-league", + "golf", + "boxing", + "nfl", + "tennis", + "nba", + "racing", + "darts", + "netball", + "mma", + "more-sports", + "athletics", + "basketball", + "cycling", + "snooker", + "motor-sport", + "wwe", + "olympics" + ], + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "4596217053229" - }, - { - "description": "Maximum reviews, defaults to 20 and supports up to 50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "football" } ], "produces": [ @@ -462586,7 +477901,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.reviewsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -462595,11 +477910,37 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Sky Sports section headlines", + "tags": [ + "Sky Sports" + ] + } + }, + "/skysports/news": { + "get": { + "description": "Returns the 20 latest Sky Sports top stories. Takes no parameters. Each item has its title, canonical `www.skysports.com` article URL, summary, publication time and image.", + "operationId": "skysports-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "503": { "description": "Service Unavailable", @@ -462613,27 +477954,50 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app product reviews", + "summary": "Get Sky Sports top stories", "tags": [ - "Shop.app" + "Sky Sports" ] } }, - "/shop-app/products/{id}/shop": { + "/skysports/sections": { "get": { - "consumes": [ + "description": "Lists the 22 Sky Sports sections that `skysports-headlines` accepts, from `football` and `f1` to `wwe` and `olympics`. Each entry has a `slug`, a display `name` and the section `url`. Winter Sports and Commonwealth Games pages returned 404 in the 2026-09-28 check and are not accepted.", + "operationId": "skysports-sections", + "produces": [ "application/json" ], - "description": "Finds the Shop.app merchant that sells a product, by the product `id`. Returns the shop's handle, name, description, logo, banner, rating, review count, storefront URL, and its collections. Unknown products, or ones with no public shop, return not found.", - "operationId": "shop-app-product-shop", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Sky Sports sections", + "tags": [ + "Sky Sports" + ] + } + }, + "/slate/article": { + "get": { + "description": "Returns public Slate article metadata and server-delivered body paragraphs from a canonical dated Slate URL. It does not log in, use account cookies, or bypass a challenge; is_paywalled reports when Slate marks the delivered page as subscription-gated.", + "operationId": "slate-article", "parameters": [ { - "description": "Product id", - "in": "path", - "name": "id", + "description": "Canonical HTTPS Slate article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "4596217053229" + "x-example": "https://slate.com/news-and-politics/2026/09/example.html" } ], "produces": [ @@ -462643,7 +478007,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.productShopResponseDoc" + "$ref": "#/definitions/slate.articleResponseDoc" } }, "400": { @@ -462664,6 +478028,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -462676,34 +478046,76 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Shop.app shop for a product", + "summary": "Slate article content", "tags": [ - "Shop.app" + "Slate" ] } }, - "/shop-app/products/{id}/variant": { + "/slate/categories": { "get": { - "consumes": [ + "description": "Lists the exact Slate section values accepted by slate-headlines. The set includes all, news-and-politics, culture, technology, business, life, and advice; subsection navigation pages are not RSS feeds and are intentionally not accepted by slate-headlines.", + "operationId": "slate-categories", + "produces": [ "application/json" ], - "description": "Returns the exact public product variant matching selected options. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.", - "operationId": "shop-app-product-variant", - "parameters": [ - { - "description": "Product id", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "4596217053229" + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/slate.categoriesResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Selected options JSON object", + "ApiKeyAuth": [] + } + ], + "summary": "Slate public feed sections", + "tags": [ + "Slate" + ] + } + }, + "/slate/headlines": { + "get": { + "description": "Returns current Slate article-card metadata from one public RSS feed. section must be one of the values returned by slate-categories.", + "operationId": "slate-headlines", + "parameters": [ + { + "default": "all", + "description": "Slate feed section", + "enum": [ + "all", + "news-and-politics", + "culture", + "technology", + "business", + "life", + "advice" + ], "in": "query", - "name": "selected_options", - "type": "string", - "x-example": "{\"Colour\":\"Black\",\"Size\":\"7\",\"Width\":\"6E\"}" + "name": "section", + "type": "string" } ], "produces": [ @@ -462713,7 +478125,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.productVariantResponseDoc" + "$ref": "#/definitions/slate.headlinesResponseDoc" } }, "400": { @@ -462734,6 +478146,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -462746,41 +478164,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Shop.app product variant by selected options", + "summary": "Slate section headlines", "tags": [ - "Shop.app" + "Slate" ] } }, - "/shop-app/products/{id}/variants": { + "/slickdeals/categories": { "get": { "consumes": [ "application/json" - ], - "description": "Returns adjacent variants for a Shop.app product. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.", - "operationId": "shop-app-product-variants", - "parameters": [ - { - "description": "Product id", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "4596217053229" - }, - { - "description": "Selected options JSON object", - "in": "query", - "name": "selected_options", - "type": "string", - "x-example": "{\"Size\":\"7\"}" - }, + ], + "description": "Returns Slickdeals' own full category/tag list -- the discovery endpoint for GET /slickdeals/category's slug parameter. This is a separate taxonomy from the category/sub_category fields GET /slickdeals/deal returns for an individual deal (Slickdeals maintains multiple parallel category/tag id spaces, not one) -- these slugs are the ones GET /slickdeals/category's own browse pages accept. The list is refreshed from Slickdeals' own site periodically; an optional q parameter narrows it to a substring match.", + "operationId": "slickdeals-categories", + "parameters": [ { - "description": "Maximum variants, defaults to 50 and supports up to 100", + "description": "Case-insensitive substring filter on slug or name", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "q", + "type": "string", + "x-example": "laptop" } ], "produces": [ @@ -462790,13 +478193,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.variantsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/slickdeals.categoriesResponseDoc" } }, "429": { @@ -462817,58 +478214,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app product variants", + "summary": "List every Slickdeals deal category/tag", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/search": { + "/slickdeals/category": { "get": { "consumes": [ "application/json" ], - "description": "Searches Shop.app product results. Limit defaults to 20 and accepts values up to 50.", - "operationId": "shop-app-search", + "description": "Returns the current deal listing for one Slickdeals category/tag (e.g. \"laptop-bag\", \"apparel\"): for each deal, title, price, list price, store, community vote score, comment count, the public username who posted it, and status flags (is_popular, is_expired, is_new, is_frontpage). slug must be one of the values from GET /slickdeals/categories -- an unrecognized slug returns a typed invalid-parameter error rather than being sent upstream. Pair a result's thread_id or url with GET /slickdeals/deal for the full detail record (description, full taxonomy).", + "operationId": "slickdeals-category", "parameters": [ { - "description": "Search query", + "description": "Category/tag slug from GET /slickdeals/categories", "in": "query", - "name": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "sneakers" - }, - { - "description": "Maximum products, defaults to 20 and supports up to 50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "default": true, - "description": "Request in-stock products", - "in": "query", - "name": "in_stock", - "type": "boolean", - "x-example": true - }, - { - "default": false, - "description": "Request sale products", - "in": "query", - "name": "on_sale", - "type": "boolean", - "x-example": false - }, - { - "default": false, - "description": "Accepted for compatibility; Shop.app no longer offers a separate deep search mode, so results are unchanged", - "in": "query", - "name": "deep_search", - "type": "boolean", - "x-example": false + "x-example": "laptop-bag" } ], "produces": [ @@ -462878,7 +478244,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.searchResponseDoc" + "$ref": "#/definitions/slickdeals.categoryResponseDoc" } }, "400": { @@ -462905,27 +478271,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search Shop.app products", + "summary": "Browse current deals in one Slickdeals category/tag", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/shops/{handle}": { + "/slickdeals/comments": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Shop.app merchant profile by shop `handle`: name, description, logo, banner, rating, review count, storefront and Shop.app URLs, and collection summaries when the shop page lists them. Unknown handles return an error.", - "operationId": "shop-app-shop", + "description": "Returns one Slickdeals deal thread's full comment thread: for each comment, the public username who posted it (with their forum rank/title and total post count), the comment content (as HTML and as cleaned plain text), when it was posted, a permalink, and reaction counts (like, funny, helpful, not helpful). Give either url (the exact value returned by GET /slickdeals/search or GET /slickdeals/deal) or thread_id; at least one is required. has_more indicates whether Slickdeals' own page truncated the reply list (no further pagination is currently exposed by this endpoint).", + "operationId": "slickdeals-comments", "parameters": [ { - "description": "Shop handle", - "in": "path", - "name": "handle", - "required": true, + "description": "Full Slickdeals deal URL, as returned by GET /slickdeals/search or GET /slickdeals/deal (https://slickdeals.net/f/...)", + "in": "query", + "name": "url", "type": "string", - "x-example": "marcnolan" + "x-example": "https://slickdeals.net/f/20015817-microsoft-surface-laptop-5-13-5-2-5ghz-16gb-256gb-refurb-w-warranty-358-53" + }, + { + "description": "Slickdeals numeric thread id", + "in": "query", + "name": "thread_id", + "type": "integer", + "x-example": 20015817 } ], "produces": [ @@ -462935,7 +478307,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.shopResponseDoc" + "$ref": "#/definitions/slickdeals.commentsResponseDoc" } }, "400": { @@ -462968,64 +478340,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Shop.app shop", + "summary": "Get one Slickdeals deal thread's comments", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/shops/{handle}/collections/{collection_id}/products": { + "/slickdeals/deal": { "get": { "consumes": [ "application/json" ], - "description": "Lists products in one collection of a Shop.app merchant, by shop `handle` and `collection_id`. `limit` defaults to 30 (max 60), `sort_by` is `MOST_SALES` (default), `PRICE_LOW_TO_HIGH`, `PRICE_HIGH_TO_LOW` or `RELEVANCE`, and `in_stock` defaults to true. Each card has its title, price, original price, image and URL.", - "operationId": "shop-app-collection-products", + "description": "Returns one Slickdeals deal thread's full detail: title, store, final/list price, community vote score, comment count, whether the deal is marked expired, the deal's product category and taxonomy (category/sub_category/category_paths, and separately the legacy forum/forum_id the thread was posted under), the public Slickdeals username who posted it (\"found by\" attribution) with a public community-standing summary (reputation, join date, deals posted, total votes/comments), a related_deals sidebar (Slickdeals' own Popular/Trending picks), the outbound merchant link, and the deal's own description. Give either url (the exact value returned by GET /slickdeals/search) or thread_id (Slickdeals' own numeric thread id, e.g. from a deal's URL path /f/{thread_id}-...); at least one is required. An unknown or removed deal returns 404.", + "operationId": "slickdeals-deal", "parameters": [ { - "description": "Shop handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "marcnolan" - }, - { - "description": "Collection id", - "in": "path", - "name": "collection_id", - "required": true, - "type": "string", - "x-example": "292518002767" - }, - { - "description": "Maximum products, defaults to 30 and supports up to 60", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 30 - }, - { - "default": "MOST_SALES", - "description": "Sort mode", - "enum": [ - "MOST_SALES", - "PRICE_LOW_TO_HIGH", - "PRICE_HIGH_TO_LOW", - "RELEVANCE" - ], + "description": "Full Slickdeals deal URL, as returned by GET /slickdeals/search (https://slickdeals.net/f/...)", "in": "query", - "name": "sort_by", + "name": "url", "type": "string", - "x-example": "MOST_SALES" + "x-example": "https://slickdeals.net/f/20015817-microsoft-surface-laptop-5-13-5-2-5ghz-16gb-256gb-refurb-w-warranty-358-53" }, { - "default": true, - "description": "Request in-stock products", + "description": "Slickdeals numeric thread id", "in": "query", - "name": "in_stock", - "type": "boolean", - "x-example": true + "name": "thread_id", + "type": "integer", + "x-example": 20015817 } ], "produces": [ @@ -463035,7 +478376,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.shopProductsResponseDoc" + "$ref": "#/definitions/slickdeals.dealResponseDoc" } }, "400": { @@ -463044,6 +478385,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -463062,34 +478409,26 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app collection products", + "summary": "Get one Slickdeals deal thread's full detail", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/shops/{handle}/locations": { + "/slickdeals/deal-types": { "get": { "consumes": [ "application/json" ], - "description": "Returns the public retail locations of a Shop.app merchant by shop handle, up to `limit` (default 10, max 50). Each location has its id, name, latitude and longitude, and street address; the response also carries the total count and a cursor for the next page. A shop with no public retail locations returns an error.", - "operationId": "shop-app-shop-locations", + "description": "Returns Slickdeals' own deal-type tag list (Coupon, Free / Freebie, Giveaway, Gift Card, Mail In Rebate, Online Only, YMMV, ...) -- the discovery endpoint for GET /slickdeals/search's deal_type_id parameter. Confirmed identical across multiple Slickdeals sub-forums, unlike the broader interest-tag space it is drawn from, which was not found to be reliably enumerable. An optional q parameter narrows it to a substring match on name.", + "operationId": "slickdeals-deal-types", "parameters": [ { - "description": "Shop handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "marcnolan" - }, - { - "description": "Maximum locations, defaults to 10 and supports up to 50", + "description": "Case-insensitive substring filter on name", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "q", + "type": "string", + "x-example": "free" } ], "produces": [ @@ -463099,19 +478438,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.shopLocationsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/slickdeals.dealTypesResponseDoc" } }, "429": { @@ -463132,56 +478459,26 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app shop locations", + "summary": "List every Slickdeals deal-type tag", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/shops/{handle}/products": { + "/slickdeals/forums": { "get": { "consumes": [ "application/json" ], - "description": "Lists products from a Shop.app merchant, by shop `handle`. `limit` defaults to 30 (max 60), `sort_by` is `MOST_SALES` (default), `PRICE_LOW_TO_HIGH`, `PRICE_HIGH_TO_LOW` or `RELEVANCE`, and `in_stock` defaults to true. Each card has its id, title, price, original price, image and URL. An invalid `sort_by` is rejected.", - "operationId": "shop-app-shop-products", + "description": "Returns Slickdeals' own full legacy sub-forum list (e.g. Hot Deals, Coupons, Freebies) -- the discovery endpoint for GET /slickdeals/search's forum_id parameter. A separate, coarser-grained taxonomy from GET /slickdeals/categories' 421-entry tag list: this is the classification GET /slickdeals/deal, /slickdeals/search/advanced, and /slickdeals/frontpage already surface as forum_id, with this endpoint as the way to resolve an id to a name or filter search results by it. The list is refreshed from Slickdeals' own site periodically; an optional q parameter narrows it to a substring match on name.", + "operationId": "slickdeals-forums", "parameters": [ { - "description": "Shop handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "marcnolan" - }, - { - "description": "Maximum products, defaults to 30 and supports up to 60", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 30 - }, - { - "default": "MOST_SALES", - "description": "Sort mode", - "enum": [ - "MOST_SALES", - "PRICE_LOW_TO_HIGH", - "PRICE_HIGH_TO_LOW", - "RELEVANCE" - ], + "description": "Case-insensitive substring filter on name", "in": "query", - "name": "sort_by", + "name": "q", "type": "string", - "x-example": "MOST_SALES" - }, - { - "default": true, - "description": "Request in-stock products", - "in": "query", - "name": "in_stock", - "type": "boolean", - "x-example": true + "x-example": "deal" } ], "produces": [ @@ -463191,13 +478488,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.shopProductsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/slickdeals.forumsResponseDoc" } }, "429": { @@ -463218,34 +478509,26 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app shop products", + "summary": "List every Slickdeals legacy sub-forum", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/shops/{handle}/reviews": { + "/slickdeals/frontpage": { "get": { "consumes": [ "application/json" ], - "description": "Lists customer reviews for a Shop.app merchant, by shop `handle`, up to `limit` (default 20, max 50). Each review has its rating, body, author, date, helpful count and the product reviewed. Also returns `total_count` and `next_cursor`. Unknown shops return not found.", - "operationId": "shop-app-shop-reviews", + "description": "Returns one page of Slickdeals' own homepage deal listing -- the deals Slickdeals itself is currently featuring, distinct from a keyword search or a single category/tag's own listing. Each deal carries the same fields as GET /slickdeals/search/advanced's results (real integer vote/comment/view counts, store id, discount, status flags), plus is_fire_deal and has_rebate flags this feed's cards carry. Pagination is next-page-only (has_next_page), since the page itself exposes no total page count.", + "operationId": "slickdeals-frontpage", "parameters": [ { - "description": "Shop handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "marcnolan" - }, - { - "description": "Maximum reviews, defaults to 20 and supports up to 50", + "description": "1-based frontpage listing page, default 1", "in": "query", - "name": "limit", + "name": "page", "type": "integer", - "x-example": 20 + "x-example": 1 } ], "produces": [ @@ -463255,7 +478538,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.shopReviewsResponseDoc" + "$ref": "#/definitions/slickdeals.frontpageResponseDoc" } }, "400": { @@ -463264,12 +478547,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -463288,42 +478565,26 @@ "ApiKeyAuth": [] } ], - "summary": "List Shop.app shop reviews", + "summary": "Browse Slickdeals' own homepage deal feed", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/shops/{handle}/typeahead": { + "/slickdeals/primary-categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns search suggestions inside one Shop.app shop, for the shop `handle` and required `query`. `limit` defaults to 20, which is also the maximum. Suggestions are `type` term, product or collection, with text, position and a product or collection object where relevant. Unknown shops return not found.", - "operationId": "shop-app-shop-typeahead", + "description": "Returns Slickdeals' small, curated set of \"featured\" primary-category landing pages (e.g. laptop-deals, tv-deals) -- the discovery endpoint for GET /slickdeals/primary-category's slug parameter. This is a separate taxonomy from GET /slickdeals/categories' 421-entry tag list and from GET /slickdeals/deal's own category/sub_category fields -- Slickdeals maintains multiple parallel category/tag id spaces, not one. Unlike /slickdeals/categories, no single live page enumerates this set; it is maintained as periodically-refreshed reference data.", + "operationId": "slickdeals-primary-categories", "parameters": [ { - "description": "Shop handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "marcnolan" - }, - { - "description": "Typeahead query", + "description": "Case-insensitive substring filter on slug or name", "in": "query", - "name": "query", - "required": true, + "name": "q", "type": "string", - "x-example": "loafer" - }, - { - "description": "Maximum suggestions, defaults to 20 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "laptop" } ], "produces": [ @@ -463333,19 +478594,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.shopTypeaheadResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/slickdeals.primaryCategoriesResponseDoc" } }, "429": { @@ -463366,34 +478615,27 @@ "ApiKeyAuth": [] } ], - "summary": "Suggest products and collections inside a Shop.app shop", + "summary": "List Slickdeals' featured primary-category landing pages", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shop-app/suggestions": { + "/slickdeals/primary-category": { "get": { "consumes": [ "application/json" ], - "description": "Returns Shop.app autocomplete suggestions for the required `query`. `limit` defaults to 10 and is capped at 20. Each suggestion is either a search query or a shop, with its `text`, `type`, URL and, for shops, the shop handle, name, rating and image.", - "operationId": "shop-app-suggestions", + "description": "Returns the current deal listing for one Slickdeals featured primary-category landing page (e.g. laptop-deals, tv-deals): for each deal, title, price, list price, store, community vote score, comment count, found-by username, and status flags. slug must be one of the values from GET /slickdeals/primary-categories -- an unrecognized slug (including a valid GET /slickdeals/categories tag slug, which is a different taxonomy) returns a typed invalid-parameter error rather than being sent upstream.", + "operationId": "slickdeals-primary-category", "parameters": [ { - "description": "Search query", + "description": "Featured-category slug from GET /slickdeals/primary-categories", "in": "query", - "name": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "sneakers" - }, - { - "description": "Maximum suggestions, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "x-example": "laptop-deals" } ], "produces": [ @@ -463403,7 +478645,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopapp.suggestionsResponseDoc" + "$ref": "#/definitions/slickdeals.primaryCategoryResponseDoc" } }, "400": { @@ -463430,41 +478672,41 @@ "ApiKeyAuth": [] } ], - "summary": "Suggest Shop.app searches", + "summary": "Browse current deals in one Slickdeals featured primary category", "tags": [ - "Shop.app" + "Slickdeals" ] } }, - "/shopify/collections": { + "/slickdeals/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from a public Shopify storefront. Valid empty result pages return `200` with an empty collections array.", - "operationId": "shopify-collections", + "description": "Searches Slickdeals (slickdeals.net), a community deal/coupon aggregator, for deal threads matching a free-text keyword query. Each result is one community-submitted deal thread with its title (which conventionally embeds the deal price), a best-effort price extracted from that title, the merchant domain, the community vote (\"thumb\") score, the public Slickdeals username who posted it, and when it was posted. Pair a result's thread_id or url with GET /slickdeals/deal for the full detail record, including comment count and category. An optional forum_id restricts results to one Slickdeals legacy sub-forum (e.g. Hot Deals, Coupons) -- obtain a value from GET /slickdeals/forums, a closed enum validated before the request is made. An optional deal_type_id restricts results to one Slickdeals deal-type tag (e.g. Coupon, Free / Freebie, YMMV) -- obtain a value from GET /slickdeals/deal-types, also a closed enum validated before the request is made; composes with forum_id.", + "operationId": "slickdeals-search", "parameters": [ { - "description": "Shopify storefront URL", + "description": "Free-text keyword query", "in": "query", - "name": "url", + "name": "q", "required": true, "type": "string", - "x-example": "https://www.allbirds.com" + "x-example": "laptop" }, { - "description": "1-based page, defaults to 1", + "description": "Restrict results to one Slickdeals legacy sub-forum, from GET /slickdeals/forums", "in": "query", - "name": "page", + "name": "forum_id", "type": "integer", - "x-example": 1 + "x-example": 9 }, { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Restrict results to one Slickdeals deal-type tag, from GET /slickdeals/deal-types", "in": "query", - "name": "limit", + "name": "deal_type_id", "type": "integer", - "x-example": 50 + "x-example": 1774 } ], "produces": [ @@ -463474,7 +478716,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.collectionsResponseDoc" + "$ref": "#/definitions/slickdeals.searchResponseDoc" } }, "400": { @@ -463501,113 +478743,61 @@ "ApiKeyAuth": [] } ], - "summary": "List Shopify collections", + "summary": "Search Slickdeals community-submitted deals by keyword", "tags": [ - "Shopify" + "Slickdeals" ] } }, - "/shopify/collections/{handle}/products": { + "/slickdeals/search/advanced": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from a Shopify collection. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic store, since classic Shopify storefronts have no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic and headless stores; supplying any of these takes precedence over sortBy/dynamic facet filters.", - "operationId": "shopify-collection-products", + "description": "Searches Slickdeals' modern search surface -- a richer alternative to GET /slickdeals/search's keyword-only search. Returns real pagination (page/total_pages/per_page/result_count), integer vote/comment/view counts (not parsed from free text), a fuller per-deal record (store id, discount percent, status flags), and facets -- Categories, Stores, and Brands available for the current query, each option carrying a value usable as category_id/brand_id/store_id. Facet values and counts are scoped to the current query, not a site-wide enumeration -- category_id/brand_id/store_id are passthrough filters (obtain a value from a prior response's own facets), not validated against a closed enum. sort defaults to relevance; other values are passed through unvalidated.", + "operationId": "slickdeals-search-advanced", "parameters": [ { - "description": "Collection handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "mens" - }, - { - "description": "Shopify storefront URL", + "description": "Free-text keyword query", "in": "query", - "name": "url", + "name": "q", "required": true, "type": "string", - "x-example": "https://www.allbirds.com" + "x-example": "laptop" }, { - "description": "1-based page, defaults to 1", + "description": "1-based result page, default 1", "in": "query", "name": "page", "type": "integer", "x-example": 1 }, { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - }, - { - "description": "SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.", - "enum": [ - "sortLTH", - "sortHTL", - "newest" - ], - "in": "query", - "name": "sortBy", - "type": "string", - "x-example": "sortLTH" - }, - { - "description": "Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.", - "enum": [ - "manual", - "best-selling", - "title-ascending", - "title-descending", - "price-ascending", - "price-descending", - "created-ascending", - "created-descending" - ], + "description": "Sort order, default relevance", "in": "query", - "name": "sort_by", + "name": "sort", "type": "string", - "x-example": "price-ascending" - }, - { - "description": "Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.", - "in": "query", - "name": "min_price", - "type": "number", - "x-example": 10 - }, - { - "description": "Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.", - "in": "query", - "name": "max_price", - "type": "number", - "x-example": 100 + "x-example": "relevance" }, { - "description": "Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.", + "description": "Category facet id, from a prior response's own facets", "in": "query", - "name": "product_type", - "type": "string", - "x-example": "Hats,T-Shirts" + "name": "category_id", + "type": "integer", + "x-example": 9 }, { - "description": "Storefront-filtering transport. true restricts to currently in-stock items only.", + "description": "Brand facet id, from a prior response's own facets", "in": "query", - "name": "in_stock_only", - "type": "boolean", - "x-example": true + "name": "brand_id", + "type": "integer" }, { - "description": "Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.", + "description": "Store facet id, from a prior response's own facets", "in": "query", - "name": "option_size", - "type": "string", - "x-example": "Small,Medium" + "name": "store_id", + "type": "integer", + "x-example": 482 } ], "produces": [ @@ -463617,7 +478807,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.collectionProductsResponseDoc" + "$ref": "#/definitions/slickdeals.searchAdvancedResponseDoc" } }, "400": { @@ -463626,12 +478816,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -463650,41 +478834,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Shopify collection products", + "summary": "Search Slickdeals with real pagination, counts, and facets", "tags": [ - "Shopify" + "Slickdeals" ] } }, - "/shopify/pages": { + "/sloanreview/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists static pages from a Shopify storefront given by the required `url`, paged with `page` (from 1) and `limit` (default 50, max 250). Each has `handle`, `title`, `url`, plain-text `content` and dates. If `transport_mode` is `ssr_embedded`, items hold only `handle`, `url` and `updated_at`.", - "operationId": "shopify-pages", + "description": "Returns an MIT Sloan Management Review article's metadata and full body paragraphs from an existing public archive.today snapshot. Sloan Review's origin HTML is paywalled/partial; no login, cookies, or subscription credentials are used. Coverage is partial and an article without a verified full snapshot returns 404.", + "operationId": "sloanreview-article", "parameters": [ { - "description": "Shopify storefront URL", + "description": "Canonical Sloan Review article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.allbirds.com" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum pages, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "https://sloanreview.mit.edu/article/how-ai-creates-a-capability-mirage/" } ], "produces": [ @@ -463694,7 +478861,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.pagesResponseDoc" + "$ref": "#/definitions/sloanreview.articleResponseDoc" } }, "400": { @@ -463703,6 +478870,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -463721,35 +478894,30 @@ "ApiKeyAuth": [] } ], - "summary": "List Shopify pages", + "summary": "Get MIT Sloan Management Review article content", "tags": [ - "Shopify" + "MIT Sloan Management Review" ] } }, - "/shopify/pages/{handle}": { + "/sloanreview/articles": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one static page from any public Shopify storefront, by path `handle` and the required `url` of the store. The response has the page's title, URL, times and its `content` as plain text. Unknown handles return 404. Localhost, private-network and credentialed URLs are rejected.", - "operationId": "shopify-page", + "description": "Returns a paginated, sitemap-backed index of all article URLs currently published by MIT Sloan Management Review. Use an item's URL with sloanreview-article to request archive-backed body content; archive availability remains dependent on a public snapshot existing for that article.", + "operationId": "sloanreview-articles", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "accessibility" + "description": "1-based page number (default 1)", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Shopify storefront URL", + "description": "Items per page, 1-500 (default 100)", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.allbirds.com" + "name": "page_size", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -463759,7 +478927,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.pageResponseDoc" + "$ref": "#/definitions/sloanreview.articlesResponseDoc" } }, "400": { @@ -463768,12 +478936,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -463792,107 +478954,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get Shopify page", + "summary": "List MIT Sloan Management Review article URLs", "tags": [ - "Shopify" + "MIT Sloan Management Review" ] } }, - "/shopify/products": { + "/sloanreview/categories": { "get": { - "consumes": [ + "description": "Returns the complete public MIT Sloan Management Review topic taxonomy discovered from the site's All Topics page. The returned slugs are the accepted values for sloanreview-topic.", + "operationId": "sloanreview-categories", + "produces": [ "application/json" ], - "description": "Returns products from a public Shopify storefront. Valid empty result pages return `200` with an empty products array. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic store, since classic Shopify storefronts have no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic and headless stores; supplying any of these takes precedence over sortBy/dynamic facet filters.", - "operationId": "shopify-products", - "parameters": [ - { - "description": "Shopify storefront URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.allbirds.com" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - }, - { - "description": "SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.", - "enum": [ - "sortLTH", - "sortHTL", - "newest" - ], - "in": "query", - "name": "sortBy", - "type": "string", - "x-example": "sortLTH" - }, - { - "description": "Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.", - "enum": [ - "manual", - "best-selling", - "title-ascending", - "title-descending", - "price-ascending", - "price-descending", - "created-ascending", - "created-descending" - ], - "in": "query", - "name": "sort_by", - "type": "string", - "x-example": "price-ascending" - }, - { - "description": "Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.", - "in": "query", - "name": "min_price", - "type": "number", - "x-example": 10 - }, - { - "description": "Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.", - "in": "query", - "name": "max_price", - "type": "number", - "x-example": 100 - }, - { - "description": "Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.", - "in": "query", - "name": "product_type", - "type": "string", - "x-example": "Hats,T-Shirts" + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/sloanreview.categoriesResponseDoc" + } }, - { - "description": "Storefront-filtering transport. true restricts to currently in-stock items only.", - "in": "query", - "name": "in_stock_only", - "type": "boolean", - "x-example": true + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.", - "in": "query", - "name": "option_size", - "type": "string", - "x-example": "Small,Medium" + "ApiKeyAuth": [] } ], + "summary": "Get MIT Sloan Management Review topic taxonomy", + "tags": [ + "MIT Sloan Management Review" + ] + } + }, + "/sloanreview/headlines": { + "get": { + "description": "Returns the article cards on the MIT Sloan Management Review homepage, including editor picks and tiled feeds, with no parameters. Each item has a `title` and `url` and, when present, `topic`, `authors` and `published_at`. It covers the homepage only; the articles endpoint finds URLs beyond it.", + "operationId": "sloanreview-headlines", "produces": [ "application/json" ], @@ -463900,13 +479009,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.productsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sloanreview.headlinesResponseDoc" } }, "429": { @@ -463927,35 +479030,80 @@ "ApiKeyAuth": [] } ], - "summary": "List Shopify products", + "summary": "Get MIT Sloan Management Review headlines", "tags": [ - "Shopify" + "MIT Sloan Management Review" ] } }, - "/shopify/products/{handle}": { + "/sloanreview/topic": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one product from any Shopify storefront, given the store URL and the product handle: title, description, product type, tags, price and compare-at price, availability, options, images, and each variant with its own price, availability and barcode. Prices are in decimal currency units; an unknown handle returns `404`.", - "operationId": "shopify-product", + "description": "Returns article cards from one public Sloan Review topic page. Use sloanreview-categories for the complete accepted slug set; this includes the primary navigation topics and the site's child topic pages.", + "operationId": "sloanreview-topic", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "mens-wool-runners" - }, - { - "description": "Shopify storefront URL", + "description": "Sloan Review topic slug returned by sloanreview-categories", + "enum": [ + "ai-machine-learning", + "analytics-business-intelligence", + "automation", + "boards-corporate-governance", + "business-models-strategy", + "climate-change", + "collaboration", + "corporate-social-responsibility-sustainability", + "crisis-management", + "culture", + "customers", + "data-ai-machine-learning", + "data-culture", + "developing-strategy", + "digital-marketing", + "disruption", + "diversity-inclusion", + "equality", + "ethics", + "executing-strategy", + "financial-management-risk", + "global-strategy", + "innovation-3", + "innovation-strategy", + "it-governance-leadership", + "leadership", + "leadership-skills", + "leading-change", + "managing-technology", + "managing-your-career", + "marketing", + "marketing-strategy", + "new-product-development", + "operations", + "organizational-behavior", + "organizational-structure", + "organizational-transformation", + "performance-management", + "platforms-ecosystems", + "project-management", + "quality-service", + "remote-work", + "security-privacy", + "skills-learning", + "social-media", + "social-responsibility", + "strategy", + "supply-chains-logistics", + "sustainability-social-responsibility", + "talent-management", + "technology-implementation", + "technology-innovation-strategy", + "work-life-balance", + "workplace-teams-culture" + ], "in": "query", - "name": "url", + "name": "topic", "required": true, "type": "string", - "x-example": "https://www.allbirds.com" + "x-example": "strategy" } ], "produces": [ @@ -463965,7 +479113,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.productResponseDoc" + "$ref": "#/definitions/sloanreview.topicResponseDoc" } }, "400": { @@ -463998,53 +479146,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Shopify product", + "summary": "Get an MIT Sloan Management Review topic archive", "tags": [ - "Shopify" + "MIT Sloan Management Review" ] } }, - "/shopify/products/{handle}/recommendations": { + "/smh/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns recommended products from Shopify's product recommendations.", - "operationId": "shopify-product-recommendations", + "description": "Returns one Sydney Morning Herald article's public metadata and the body paragraphs an anonymous visitor's page request is served, from a canonical article URL. The Sydney Morning Herald runs a metered subscription paywall; the response reports it with is_accessible_for_free (the page's own declaration), paywalled (the page marks the story as subscriber content), and is_truncated (the page served a shortened preview, or no body at all, instead of the full story). Paywalls are never bypassed and body text is never fabricated. Video-only pages are rejected with a 400.", + "operationId": "smh-article", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "mens-wool-runners" - }, - { - "description": "Shopify storefront URL", + "description": "Canonical The Sydney Morning Herald article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.allbirds.com" - }, - { - "description": "Maximum products, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], - "in": "query", - "name": "intent", - "type": "string", - "x-example": "related" + "x-example": "https://www.smh.com.au/politics/nsw/identity-rabbit-hole-one-nation-cops-spray-over-criticism-of-aboriginal-flag-pin-20260924-p6107h.html" } ], "produces": [ @@ -464054,7 +479173,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.productRecommendationsResponseDoc" + "$ref": "#/definitions/publicnews.smhArticleResponseDoc" } }, "400": { @@ -464069,12 +479188,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -464087,49 +479200,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Shopify product recommendations", + "summary": "Get The Sydney Morning Herald article content", "tags": [ - "Shopify" + "The Sydney Morning Herald" ] } }, - "/shopify/search/suggest": { + "/smh/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns predictive search suggestions from any Shopify storefront for a query: matching products, collections and suggested queries. Choose which with `types` (default all three) and cap results per type with `limit` (default 10, max 20). Products carry price, availability, images and options; collections carry title, handle, description and product count.", - "operationId": "shopify-search-suggest", + "description": "Returns a Sydney Morning Herald journalist's public profile -- name, short biography, headshot, contact email and social links where published -- plus their recent stories, from a canonical https://www.smh.com.au/by/- URL.", + "operationId": "smh-author", "parameters": [ { - "description": "Shopify storefront URL", + "description": "Canonical The Sydney Morning Herald journalist URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.allbirds.com" - }, - { - "description": "Search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "wool" - }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" - }, - { - "description": "Maximum results per type, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "x-example": "https://www.smh.com.au/by/michael-mcgowan-p536tc" } ], "produces": [ @@ -464139,7 +479227,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.searchSuggestResponseDoc" + "$ref": "#/definitions/publicnews.smhAuthorResponseDoc" } }, "400": { @@ -464148,8 +479236,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -464166,50 +479254,122 @@ "ApiKeyAuth": [] } ], - "summary": "Get Shopify search suggestions", + "summary": "Get a Sydney Morning Herald journalist profile", "tags": [ - "Shopify" + "The Sydney Morning Herald" ] } }, - "/shopify/sitemap/urls": { + "/smh/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists URL entries from a Shopify storefront's sitemaps, for the required `url`. `type` filters (`all` by default, `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, `other`) and `limit` caps entries (default 50, max 250). Each has `loc`, `type`, `handle`, `lastmod`, `changefreq` and optional `images`.", - "operationId": "shopify-sitemap-urls", + "description": "Returns the current stories for one Sydney Morning Herald section: title, canonical URL, summary, author, publication time, and image where the section lists them. section must be one of the slugs returned by /smh/sections; any other value is rejected with a 400 before The Sydney Morning Herald is contacted.", + "operationId": "smh-headlines", "parameters": [ { - "description": "Shopify storefront URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.allbirds.com" - }, - { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "description": "Section slug from /smh/sections", "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" + "sydney-news", + "national/nsw", + "politics", + "politics/federal", + "politics/nsw", + "politics/victoria", + "politics/queensland", + "politics/western-australia", + "business", + "business/companies", + "business/markets", + "business/bullsnbears", + "business/the-economy", + "business/banking-and-finance", + "business/small-business", + "business/workplace", + "world", + "world/north-america", + "world/europe", + "world/asia", + "world/middle-east", + "world/south-america", + "world/africa", + "national", + "national/victoria", + "national/queensland", + "national/western-australia", + "opinion", + "property", + "property/news", + "property/living", + "sport", + "sport/nrl", + "sport/rugby-union", + "sport/cricket", + "sport/soccer", + "sport/afl", + "sport/racing", + "sport/tennis", + "sport/netball", + "sport/basketball", + "sport/motorsport", + "sport/cycling", + "sport/golf", + "sport/nfl", + "sport/athletics", + "sport/swimming", + "sport/boxing", + "goodfood", + "goodfood/sydney-eating-out", + "goodfood/recipes", + "goodfood/tips-and-advice", + "goodfood/drinks", + "culture", + "culture/movies", + "culture/tv-and-radio", + "culture/music", + "culture/celebrity", + "culture/books", + "culture/comedy", + "culture/dance", + "culture/musicals", + "culture/opera", + "culture/theatre", + "culture/art-and-design", + "culture/live-reviews", + "lifestyle", + "lifestyle/health-and-wellness", + "lifestyle/fashion", + "lifestyle/life-and-relationships", + "lifestyle/beauty", + "traveller", + "traveller/inspiration/destination-guides", + "traveller/inspiration", + "traveller/reviews-and-advice", + "traveller/travel-news", + "good-weekend", + "sunday-life", + "money", + "money/super-and-retirement", + "money/investing", + "money/banking", + "money/borrowing", + "money/saving", + "money/tax", + "money/planning-and-budgeting", + "education", + "healthcare", + "environment", + "environment/conservation", + "environment/climate-change", + "environment/sustainability", + "environment/weather", + "technology", + "technology/video-games", + "australia-higher-education" ], "in": "query", - "name": "type", - "type": "string", - "x-example": "products" - }, - { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "section", + "required": true, + "type": "string", + "x-example": "politics/federal" } ], "produces": [ @@ -464219,7 +479379,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.sitemapURLsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -464228,12 +479388,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -464246,29 +479400,16 @@ "ApiKeyAuth": [] } ], - "summary": "List Shopify sitemap URLs", + "summary": "Get The Sydney Morning Herald section headlines", "tags": [ - "Shopify" + "The Sydney Morning Herald" ] } }, - "/shopify/sitemaps": { + "/smh/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the child sitemaps in a Shopify storefront's sitemap index, for the required `url`. Each has a `loc` and a `type` (`products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`) inferred from its URL. Localhost, private-network and credentialed URLs are rejected.", - "operationId": "shopify-sitemaps", - "parameters": [ - { - "description": "Shopify storefront URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.allbirds.com" - } - ], + "description": "Returns The Sydney Morning Herald's current \"Latest News\" public RSS feed: each story's title, canonical URL, summary, author, publication time, and lead image.", + "operationId": "smh-news", "produces": [ "application/json" ], @@ -464276,13 +479417,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.sitemapIndexResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -464303,29 +479438,16 @@ "ApiKeyAuth": [] } ], - "summary": "List Shopify sitemaps", + "summary": "Get The Sydney Morning Herald top stories", "tags": [ - "Shopify" + "The Sydney Morning Herald" ] } }, - "/shopify/store": { + "/smh/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Resolves a public Shopify storefront and returns its metadata.", - "operationId": "shopify-store", - "parameters": [ - { - "description": "Shopify storefront URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.allbirds.com" - } - ], + "description": "Lists every Sydney Morning Herald section accepted by /smh/headlines (96 sections from the site's own section menu), each with its slug, display name, and public section-front URL.", + "operationId": "smh-sections", "produces": [ "application/json" ], @@ -464333,25 +479455,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopify.storeResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -464360,27 +479464,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get Shopify store metadata", + "summary": "Get The Sydney Morning Herald sections", "tags": [ - "Shopify" + "The Sydney Morning Herald" ] } }, - "/similarweb/search": { + "/sofascore/categories": { "get": { "consumes": [ "application/json" ], - "description": "Looks up a domain or keyword on SimilarWeb and returns the matching websites, companies (name, domain and logo) and apps on the App Store and Google Play.", - "operationId": "similarweb-search", + "description": "Returns every category (country or region, such as England or International) SofaScore lists for a sport, with id, name, slug, flag, optional two-letter code, and priority, highest priority first. Use a category `id` with category-tournaments (its competitions) and with scheduled-events (its fixtures on a date). The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, and `waterpolo`. Slugs are not unique across categories, so identify a category by `id`.", + "operationId": "sofascore-categories", "parameters": [ { - "description": "Domain or keyword to search", + "description": "Sport key", + "enum": [ + "american-football", + "aussie-rules", + "badminton", + "bandy", + "baseball", + "basketball", + "beach-volley", + "cricket", + "darts", + "esports", + "floorball", + "football", + "futsal", + "handball", + "ice-hockey", + "mma", + "minifootball", + "padel", + "rugby", + "snooker", + "table-tennis", + "tennis", + "volleyball", + "waterpolo" + ], "in": "query", - "name": "q", + "name": "sport", "required": true, "type": "string", - "x-example": "google.com" + "x-example": "football" } ], "produces": [ @@ -464390,23 +479520,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/similarweb.searchResponseDoc" + "$ref": "#/definitions/sofascore.categoriesResponseDoc" } }, "400": { - "description": "Invalid query parameter", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -464417,27 +479547,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search SimilarWeb Info", + "summary": "SofaScore categories for a sport", "tags": [ - "SimilarWeb" + "SofaScore" ] } }, - "/similarweb/web/{domain}": { + "/sofascore/category-tournaments": { "get": { "consumes": [ "application/json" ], - "description": "Returns SimilarWeb's traffic profile for one domain: global, country and category rank, estimated monthly visits, engagement (bounce rate, pages per visit, time on site), top countries, traffic sources, top keywords and similar sites. `DataSource` shows whether the full source or the narrower public-page fallback answered; the fallback omits several fields.", - "operationId": "similarweb-web", + "description": "Returns the competitions (unique tournaments) inside one category, most followed first. Each `id` is the competition id the tournament-seasons, standings, tournament-rounds, and round-events endpoints take. Get the category `id` from the categories endpoint. An empty `tournaments` list is a valid response: some categories exist without any competitions. Returns 404 for an unknown category id.", + "operationId": "sofascore-category-tournaments", "parameters": [ { - "description": "Domain to fetch SimilarWeb data for", - "in": "path", - "name": "domain", + "description": "Numeric SofaScore category id from the categories endpoint", + "in": "query", + "name": "id", "required": true, "type": "string", - "x-example": "google.com" + "x-example": "1" } ], "produces": [ @@ -464447,23 +479577,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/similarweb.webResponseDoc" + "$ref": "#/definitions/sofascore.categoryTournamentsResponseDoc" } }, "400": { - "description": "Invalid domain parameter", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -464474,33 +479610,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get SimilarWeb Web Info", + "summary": "SofaScore competitions in a category", "tags": [ - "SimilarWeb" + "SofaScore" ] } }, - "/skims/collections": { + "/sofascore/draft": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from SKIMS (https://skims.com). The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty collections array.", - "operationId": "skims-collections", + "description": "Returns the draft attached to a league season: the upcoming or just-held `draft` and the `previous_draft`, each with its year, start and end time, status, the draft `rounds` (the valid `round` values for draft-picks) and whether the lottery is complete. The `league` enum accepts `nba` and `nfl`. Get `season` from tournament-seasons (NBA competition id 132, NFL 9464). A season without a draft, or a season id that does not belong to the league, returns 404. A season whose draft is not scheduled yet returns only `previous_draft`.", + "operationId": "sofascore-draft", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "League whose draft to return", + "enum": [ + "nba", + "nfl" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "league", + "required": true, + "type": "string", + "x-example": "nba" }, { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Numeric SofaScore season id of the league", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "season", + "required": true, + "type": "string", + "x-example": "80229" } ], "produces": [ @@ -464510,7 +479652,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/sofascore.draftResponseDoc" } }, "400": { @@ -464519,6 +479661,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -464537,41 +479685,49 @@ "ApiKeyAuth": [] } ], - "summary": "List SKIMS collections", + "summary": "SofaScore league draft", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/collections/{handle}/products": { + "/sofascore/draft-picks": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one SKIMS (https://skims.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.", - "operationId": "skims-collection-products", + "description": "Returns one round of a league draft: each pick with the overall and in-round number, the drafting team, and the drafted prospect (name, position, college or club, top-prospect flag and the player id when SofaScore has one), plus the teams that hold no pick in that round. The `league` enum accepts `nba` (rounds 1 and 2) and `nfl` (rounds 1 to 7); other rounds return 400. Get `year` from the draft endpoint's `draft.year` and `previous_draft.year`; SofaScore keeps only recent drafts, so an older year returns 404. Returns 404 when SofaScore has no picks for that year and round.", + "operationId": "sofascore-draft-picks", "parameters": [ { - "description": "Collection handle", - "in": "path", - "name": "handle", + "description": "League whose draft to return", + "enum": [ + "nba", + "nfl" + ], + "in": "query", + "name": "league", "required": true, "type": "string", - "x-example": "collection-handle" + "x-example": "nba" }, { - "description": "1-based page, defaults to 1", + "description": "Four-digit draft year", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "year", + "required": true, + "type": "string", + "x-example": "2025" }, { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Draft round: 1 to 2 for nba, 1 to 7 for nfl", "in": "query", - "name": "limit", + "maximum": 7, + "minimum": 1, + "name": "round", + "required": true, "type": "integer", - "x-example": 50 + "x-example": 1 } ], "produces": [ @@ -464581,7 +479737,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/sofascore.draftPicksResponseDoc" } }, "400": { @@ -464614,33 +479770,41 @@ "ApiKeyAuth": [] } ], - "summary": "List SKIMS collection products", + "summary": "SofaScore league draft picks", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/pages": { + "/sofascore/esports-game": { "get": { "consumes": [ "application/json" ], - "description": "Lists SKIMS static pages, 50 per request by default (`limit` up to 250), with `page` starting at 1. Each page has its handle, title, URL, plain-text content and timestamps. An empty result is a normal 200. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", - "operationId": "skims-pages", + "description": "Returns one resource of one esports game from SofaScore, chosen with `part`: `statistics` (team totals such as kills, towers and barracks for Dota 2, gold and drakes for League of Legends), `lineups` (every player with hero or champion and per-player statistics such as net worth, gold or ADR), `bans` (banned heroes or champions per side) and `rounds` (Counter-Strike round history with outcome, winner and side per round, including overtime). Only the requested block is returned. Get the game id from sofascore-event-esports-games. Statistics and bans exist for Dota 2 and League of Legends only (404 for Counter-Strike), rounds fill for Counter-Strike only (an empty list otherwise) and lineups work for all three. Returns 404 when SofaScore has no such data for the game.", + "operationId": "sofascore-esports-game", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Numeric SofaScore esports game id from sofascore-event-esports-games", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "id", + "required": true, + "type": "string", + "x-example": "588883" }, { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Which resource of the game to return", + "enum": [ + "statistics", + "lineups", + "bans", + "rounds" + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "part", + "required": true, + "type": "string", + "x-example": "lineups" } ], "produces": [ @@ -464650,7 +479814,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/sofascore.esportsGameResponseDoc" } }, "400": { @@ -464659,6 +479823,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -464677,27 +479847,27 @@ "ApiKeyAuth": [] } ], - "summary": "List SKIMS static pages", + "summary": "SofaScore esports game detail", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/pages/{handle}": { + "/sofascore/event": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SKIMS static page by its `handle`: id, title, URL, plain-text `content` and the created, published and updated timestamps. Page text is cleaned, not raw HTML. An unknown handle returns 404. When the reduced form is served, `transport_mode` is `ssr_embedded` and `id` is omitted.", - "operationId": "skims-page", + "description": "Returns one SofaScore match by event id: home and away teams and scores, status, start time, tournament, attendance and winner code, plus venue and referee when SofaScore has them. An unknown or malformed id surfaces as an upstream error.", + "operationId": "sofascore-event", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", + "description": "Numeric SofaScore event (match) id", + "in": "query", + "name": "id", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "14025013" } ], "produces": [ @@ -464707,7 +479877,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/sofascore.eventResponseDoc" } }, "400": { @@ -464740,33 +479910,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SKIMS static page", + "summary": "SofaScore event detail", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/products": { + "/sofascore/event-at-bat-pitches": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from SKIMS's (https://skims.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "skims-products", + "description": "Returns every pitch of one baseball at-bat from SofaScore, in pitch order: the ball-strike-out count, outcome code, pitch type and name, speed in kilometres per hour, zone, plate location, strike-zone bounds, batter and pitcher hand, the score, and for balls put in play the hit type, trajectory, hardness and location plus runner movements and fielder credits. Get the at-bat id (`at_bat_id`) from sofascore-event-at-bats for the same event. Returns 404 when SofaScore has no pitches for that at-bat, which includes an at-bat id that does not belong to the event.", + "operationId": "sofascore-event-at-bat-pitches", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Numeric SofaScore baseball event (match) id", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "id", + "required": true, + "type": "string", + "x-example": "17199139" }, { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Numeric at-bat id from sofascore-event-at-bats for the same event", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "at_bat_id", + "required": true, + "type": "string", + "x-example": "2595879" } ], "produces": [ @@ -464776,7 +479948,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" + "$ref": "#/definitions/sofascore.eventAtBatPitchesResponseDoc" } }, "400": { @@ -464785,6 +479957,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -464803,27 +479981,27 @@ "ApiKeyAuth": [] } ], - "summary": "List SKIMS products", + "summary": "SofaScore event at-bat pitches", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/products/{handle}": { + "/sofascore/event-at-bats": { "get": { "consumes": [ "application/json" ], - "description": "Returns product detail for one SKIMS (https://skims.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "skims-product", + "description": "Returns a baseball match's at-bat timeline from SofaScore, in play order: for each plate appearance the inning and half (`top` or `bottom`), pitcher, hitter, their teams, when it ended and the home and away win probabilities before and after it. Use an at-bat `id` with sofascore-event-at-bat-pitches to read its pitches. Returns 404 when SofaScore has no at-bat data for the match, which includes matches that have not started and sports other than baseball.", + "operationId": "sofascore-event-at-bats", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Numeric SofaScore baseball event (match) id", + "in": "query", + "name": "id", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "17199139" } ], "produces": [ @@ -464833,7 +480011,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" + "$ref": "#/definitions/sofascore.eventAtBatsResponseDoc" } }, "400": { @@ -464866,45 +480044,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SKIMS product", + "summary": "SofaScore event at-bats", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/products/{handle}/recommendations": { + "/sofascore/event-average-positions": { "get": { "consumes": [ "application/json" ], - "description": "Returns recommended products for one SKIMS (https://skims.com) product handle. The storefront URL is fixed server-side.", - "operationId": "skims-product-recommendations", + "description": "Returns every player's average position on the pitch during a football match (`average_x` and `average_y` on SofaScore's 0-100 pitch scale, plus the number of touches behind it) for the home and away sides, and the substitutions with their minute. Returns 404 when SofaScore has no positional data for the match, which includes unstarted matches and sports other than football.", + "operationId": "sofascore-event-average-positions", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" - }, - { - "description": "Maximum products, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "intent", + "name": "id", + "required": true, "type": "string", - "x-example": "related" + "x-example": "16363867" } ], "produces": [ @@ -464914,7 +480074,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/sofascore.eventAveragePositionsResponseDoc" } }, "400": { @@ -464947,41 +480107,27 @@ "ApiKeyAuth": [] } ], - "summary": "List SKIMS product recommendations", + "summary": "SofaScore event average positions", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/search/suggest": { + "/sofascore/event-baseball-top-performers": { "get": { "consumes": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from SKIMS's (https://skims.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "skims-search-suggest", + "description": "Returns a baseball match's top performers from SofaScore: each pitcher or batter (`role`) with a rating, their team and a snake_case map of the statistics that earned the mention (for example pitching strike outs, batting home runs and runs batted in). Returns 404 when SofaScore has no top performers for the match, which includes matches that have not started and sports other than baseball.", + "operationId": "sofascore-event-baseball-top-performers", "parameters": [ { - "description": "Search query", + "description": "Numeric SofaScore baseball event (match) id", "in": "query", - "name": "q", + "name": "id", "required": true, "type": "string", - "x-example": "wool" - }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" - }, - { - "description": "Maximum results per type, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "x-example": "17199139" } ], "produces": [ @@ -464991,7 +480137,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + "$ref": "#/definitions/sofascore.eventBaseballTopPerformersResponseDoc" } }, "400": { @@ -465000,6 +480146,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -465018,42 +480170,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get SKIMS search suggestions", + "summary": "SofaScore event baseball top performers", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/sitemap/urls": { + "/sofascore/event-best-players": { "get": { "consumes": [ "application/json" ], - "description": "Lists URL entries from SKIMS sitemaps, filtered by `type` (`all` by default, or `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, `other`). Stops at `limit` entries (default 50, max 250). Each entry has `loc`, its type, handle, `lastmod`, `changefreq` and, where present, images with caption and title.", - "operationId": "skims-sitemap-urls", + "description": "Returns a match's best-rated players per side, the overall top-rated list, and the player of the match (each with team and value) from SofaScore. Covers football (value is the match rating, label `rating`) and ice hockey (label `pts`, value the points scored; a goalkeeper with no points has no numeric `value` and carries SofaScore's dash in `value_text`). The basketball, baseball and tennis matches checked returned no summary. Returns 404 when SofaScore has no best-players summary for the match, which includes matches that have not started, sports without one and fixtures without rated players.", + "operationId": "sofascore-event-best-players", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", - "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" - ], + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "type", + "name": "id", + "required": true, "type": "string", - "x-example": "products" - }, - { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "16363867" } ], "produces": [ @@ -465063,7 +480200,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/sofascore.eventBestPlayersResponseDoc" } }, "400": { @@ -465072,6 +480209,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -465090,19 +480233,29 @@ "ApiKeyAuth": [] } ], - "summary": "List SKIMS sitemap URLs", + "summary": "SofaScore event best players", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/sitemaps": { + "/sofascore/event-comments": { "get": { "consumes": [ "application/json" ], - "description": "Lists the child sitemaps in the SKIMS sitemap index, each with its `loc` URL and a `type` of `products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`. Takes no parameters. Use it to see which sitemap files exist before listing their URLs.", - "operationId": "skims-sitemaps", + "description": "Returns a match's text commentary (minute, type, text, and the players involved, plus the running score on scoring lines) from SofaScore, newest first. Works for football and basketball matches that have commentary. An empty `comments` list is a valid response (a live match with no lines yet). Returns 404 when SofaScore has no commentary for the match, which includes matches that have not started.", + "operationId": "sofascore-event-comments", + "parameters": [ + { + "description": "Numeric SofaScore event (match) id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "16363867" + } + ], "produces": [ "application/json" ], @@ -465110,7 +480263,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/sofascore.eventCommentsResponseDoc" } }, "400": { @@ -465119,6 +480272,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -465137,19 +480296,29 @@ "ApiKeyAuth": [] } ], - "summary": "List SKIMS sitemaps", + "summary": "SofaScore event commentary", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skims/store": { + "/sofascore/event-esports-games": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for SKIMS (https://skims.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "skims-store", + "description": "Returns the games (maps) of an esports match from SofaScore: each game's id, status, start time, length in seconds, winner, score per side (kills for Dota 2 and League of Legends, rounds with half and overtime split for Counter-Strike), the map for Counter-Strike, and whether complete statistics exist. Use a game `id` with sofascore-esports-game to read its statistics, lineups, bans or rounds. Returns 404 when SofaScore has no games for the event, which includes sports other than esports.", + "operationId": "sofascore-event-esports-games", + "parameters": [ + { + "description": "Numeric SofaScore esports event (match) id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "17260338" + } + ], "produces": [ "application/json" ], @@ -465157,7 +480326,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/sofascore.eventEsportsGamesResponseDoc" } }, "400": { @@ -465166,6 +480335,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -465184,24 +480359,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get SKIMS store metadata", + "summary": "SofaScore event esports games", "tags": [ - "SKIMS" + "SofaScore" ] } }, - "/skynews/article": { + "/sofascore/event-graph": { "get": { - "description": "Returns a Sky News article by canonical `url` of the form `https://news.sky.com/story/...-`: title, description, section, authors, publication and update times, image, body `paragraphs` and a `paywalled` flag.", - "operationId": "skynews-article", + "consumes": [ + "application/json" + ], + "description": "Returns a match's momentum graph as minute and value points (positive values favour the home side) plus period length information, from SofaScore. Covers football, ice hockey and basketball. An empty `points` list is a valid response (a live match that has just started). Returns 404 when SofaScore has no momentum graph for the match, which includes matches that have not started and sports without one such as tennis and baseball.", + "operationId": "sofascore-event-graph", "parameters": [ { - "description": "Canonical Sky News article URL", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://news.sky.com/story/example-story-12345678" + "x-example": "16363867" } ], "produces": [ @@ -465211,7 +480389,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/sofascore.eventGraphResponseDoc" } }, "400": { @@ -465226,6 +480404,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -465238,24 +480422,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sky News article content", + "summary": "SofaScore event momentum graph", "tags": [ - "Sky News" + "SofaScore" ] } }, - "/skynews/author": { + "/sofascore/event-h2h": { "get": { - "description": "Returns a Sky News author's profile by canonical `url` (`https://news.sky.com/author/-`): name, `job_title`, biography paragraphs and recent articles. An `info` list carries whatever else the page shows, as label and value entries with an optional link, such as expertise, location, social handles or email.", - "operationId": "skynews-author", + "consumes": [ + "application/json" + ], + "description": "Returns the historical head-to-head win/draw record between a match's two teams (and managers, when available) from SofaScore.", + "operationId": "sofascore-event-h2h", "parameters": [ { - "description": "Canonical Sky News author URL", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://news.sky.com/author/sam-coates-763" + "x-example": "14025013" } ], "produces": [ @@ -465265,7 +480452,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.skyNewsAuthorResponseDoc" + "$ref": "#/definitions/sofascore.eventH2HResponseDoc" } }, "400": { @@ -465280,6 +480467,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -465292,40 +480485,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sky News author profile", + "summary": "SofaScore event head-to-head", "tags": [ - "Sky News" + "SofaScore" ] } }, - "/skynews/headlines": { + "/sofascore/event-highlights": { "get": { - "description": "Returns fresh headlines from one Sky News section, either its official RSS feed or (for the 5 sections with no feed) its public hub page.", - "operationId": "skynews-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns the highlight videos attached to a match: title, subtitle (for example `Full Highlights`), video `url`, thumbnail, the publish time, whether it is the key highlight, and the countries it is restricted to when SofaScore limits it. `media_type_code` is SofaScore's own numeric code and is returned untranslated. Returns 404 when the match has no highlight videos, which includes matches that have not finished.", + "operationId": "sofascore-event-highlights", "parameters": [ { - "description": "Sky News section slug", - "enum": [ - "home", - "uk", - "world", - "us", - "business", - "politics", - "technology", - "entertainment", - "strange", - "money", - "science-climate-tech", - "offbeat", - "analysis", - "data-and-forensics" - ], + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "section", + "name": "id", "required": true, "type": "string", - "x-example": "home" + "x-example": "16363867" } ], "produces": [ @@ -465335,7 +480515,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/sofascore.eventHighlightsResponseDoc" } }, "400": { @@ -465344,37 +480524,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Sky News section headlines", - "tags": [ - "Sky News" - ] - } - }, - "/skynews/news": { - "get": { - "description": "Returns Sky News's latest top stories across the site. Takes no parameters. Each item has its title, URL, summary, publication time and image. Pass an item's URL to `skynews-article` for its body paragraphs.", - "operationId": "skynews-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -465394,50 +480548,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sky News top stories", + "summary": "SofaScore event highlights", "tags": [ - "Sky News" + "SofaScore" ] } }, - "/skynews/sections": { + "/sofascore/event-incidents": { "get": { - "description": "Returns the Sky News section inventory: 9 official RSS feeds plus 5 additional site sections with no RSS feed, listed from their public hub page instead.", - "operationId": "skynews-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Sky News sections", - "tags": [ - "Sky News" - ] - } - }, - "/skynews/video": { - "get": { - "description": "Returns one Sky News video's public metadata (title, description, thumbnails, duration, embed URL) from a canonical video URL. There is no transcript or article body for a video.", - "operationId": "skynews-video", + "description": "Returns one match's goal, card, substitution, and period timeline from SofaScore. An empty `incidents` list is a valid response before kickoff.", + "operationId": "sofascore-event-incidents", "parameters": [ { - "description": "Canonical Sky News video URL", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://news.sky.com/video/example-video-12345678" + "x-example": "14025013" } ], "produces": [ @@ -465447,7 +480578,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.skyNewsVideoResponseDoc" + "$ref": "#/definitions/sofascore.eventIncidentsResponseDoc" } }, "400": { @@ -465462,6 +480593,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -465474,16 +480611,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sky News video metadata", + "summary": "SofaScore event incidents", "tags": [ - "Sky News" + "SofaScore" ] } }, - "/skynews/videos": { + "/sofascore/event-innings": { "get": { - "description": "Lists recent videos from the Sky News videos hub. Takes no parameters. Each item has its title, URL, summary, author, lead image, publication time and type. An item's `url` can be passed to `skynews-video` to get that video's own metadata.", - "operationId": "skynews-videos", + "consumes": [ + "application/json" + ], + "description": "Returns a cricket match's innings scorecards from SofaScore. Each innings has the batting and bowling teams, runs, wickets, overs in cricket notation (18.4 is 18 overs and 4 balls), extras (wides, no balls, byes, leg byes, penalty), every batter's line (runs, balls, fours, sixes, dismissal with the bowler and fielder, fall-of-wicket score and over), every bowler's figures (overs, maidens, runs, wickets, wides, no balls), the partnerships and a derived fall-of-wickets list. Works for T20, one-day and Test matches (a Test lists up to four innings). Returns 404 when SofaScore has no innings data for the match, which includes matches that have not started and sports other than cricket.", + "operationId": "sofascore-event-innings", + "parameters": [ + { + "description": "Numeric SofaScore cricket event (match) id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "16253632" + } + ], "produces": [ "application/json" ], @@ -465491,7 +480641,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.skyNewsVideosResponseDoc" + "$ref": "#/definitions/sofascore.eventInningsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -465506,24 +480674,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Sky News videos hub", + "summary": "SofaScore event innings", "tags": [ - "Sky News" + "SofaScore" ] } }, - "/skysports/article": { + "/sofascore/event-lineups": { "get": { - "description": "Returns a Sky Sports article by `url`, an HTTPS `skysports.com` address with a sport news path such as `/football/news//`: title, description, section, authors, publication and update times, image and body `paragraphs`. The returned URL uses `www.skysports.com`, and query strings and fragments are discarded.", - "operationId": "skysports-article", + "consumes": [ + "application/json" + ], + "description": "Returns one match's starting XI and substitutes per side, with formation. Returns 404 when SofaScore has no lineups for the match. A missing-lineup result may be reused for up to two minutes before checking again.", + "operationId": "sofascore-event-lineups", "parameters": [ { - "description": "Canonical Sky Sports article URL", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.skysports.com/football/news/13592544/example-story" + "x-example": "14025013" } ], "produces": [ @@ -465533,7 +480704,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/sofascore.eventLineupsResponseDoc" } }, "400": { @@ -465548,6 +480719,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -465560,24 +480737,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sky Sports article", + "summary": "SofaScore event lineups", "tags": [ - "Sky Sports" + "SofaScore" ] } }, - "/skysports/author": { + "/sofascore/event-managers": { "get": { - "description": "Returns a Sky Sports author's name, current `job_title`, biography paragraphs and the article links on their profile page, from an author `url` such as `https://www.skysports.com/author/kaveh-solhekol-773`. Each article has a title and URL, with summary, author, publication time and image where present.", - "operationId": "skysports-author", + "consumes": [ + "application/json" + ], + "description": "Returns the two managers (coaches) of a match with their SofaScore ids, names and slugs. The manager `id` works with the manager and manager-events endpoints. Returns 404 when SofaScore lists no managers for the match, which includes tennis matches.", + "operationId": "sofascore-event-managers", "parameters": [ { - "description": "Canonical Sky Sports author URL", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.skysports.com/author/kaveh-solhekol-773" + "x-example": "16363867" } ], "produces": [ @@ -465587,7 +480767,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.skySportsAuthorResponseDoc" + "$ref": "#/definitions/sofascore.eventManagersResponseDoc" } }, "400": { @@ -465602,6 +480782,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -465614,48 +480800,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sky Sports author profile", + "summary": "SofaScore event managers", "tags": [ - "Sky Sports" + "SofaScore" ] } }, - "/skysports/headlines": { + "/sofascore/event-odds": { "get": { - "description": "Returns the article cards from one Sky Sports section listing page. `section` is required and takes one of 22 slugs such as `football`, `f1`, `cricket`, `rugby-union`, `golf`, `boxing`, `nfl` or `darts`. The site's Show More pagination is not exposed, so only the first listing comes back.", - "operationId": "skysports-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one match's betting markets and choices. Returns 404 when SofaScore has no odds for the match.", + "operationId": "sofascore-event-odds", "parameters": [ { - "description": "Sky Sports section slug", - "enum": [ - "football", - "f1", - "cricket", - "rugby-union", - "rugby-league", - "golf", - "boxing", - "nfl", - "tennis", - "nba", - "racing", - "darts", - "netball", - "mma", - "more-sports", - "athletics", - "basketball", - "cycling", - "snooker", - "motor-sport", - "wwe", - "olympics" - ], + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "section", + "name": "id", "required": true, "type": "string", - "x-example": "football" + "x-example": "14025013" } ], "produces": [ @@ -465665,7 +480830,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/sofascore.eventOddsResponseDoc" } }, "400": { @@ -465674,36 +480839,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Sky Sports section headlines", - "tags": [ - "Sky Sports" - ] - } - }, - "/skysports/news": { - "get": { - "description": "Returns the 20 latest Sky Sports top stories. Takes no parameters. Each item has its title, canonical `www.skysports.com` article URL, summary, publication time and image.", - "operationId": "skysports-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "429": { + "description": "Too Many Requests", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/app.Response" } }, "503": { @@ -465718,50 +480863,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sky Sports top stories", + "summary": "SofaScore event odds", "tags": [ - "Sky Sports" + "SofaScore" ] } }, - "/skysports/sections": { + "/sofascore/event-player-heatmap": { "get": { - "description": "Lists the 22 Sky Sports sections that `skysports-headlines` accepts, from `football` and `f1` to `wwe` and `olympics`. Each entry has a `slug`, a display `name` and the section `url`. Winter Sports and Commonwealth Games pages returned 404 in the 2026-09-28 check and are not accepted.", - "operationId": "skysports-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Sky Sports sections", - "tags": [ - "Sky Sports" - ] - } - }, - "/slate/article": { - "get": { - "description": "Returns public Slate article metadata and server-delivered body paragraphs from a canonical dated Slate URL. It does not log in, use account cookies, or bypass a challenge; is_paywalled reports when Slate marks the delivered page as subscription-gated.", - "operationId": "slate-article", + "description": "Returns one player's touch locations in a football match as `points`, each an `x` and `y` on SofaScore's 0-100 pitch scale. Get `player_id` from event-lineups. Returns 404 when SofaScore has no heatmap for that player in that match, which includes players who did not play, unstarted matches and sports other than football.", + "operationId": "sofascore-event-player-heatmap", "parameters": [ { - "description": "Canonical HTTPS Slate article URL", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://slate.com/news-and-politics/2026/09/example.html" + "x-example": "16363867" + }, + { + "description": "Numeric SofaScore player id that played in the match", + "in": "query", + "name": "player_id", + "required": true, + "type": "string", + "x-example": "839956" } ], "produces": [ @@ -465771,7 +480901,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slate.articleResponseDoc" + "$ref": "#/definitions/sofascore.eventPlayerHeatmapResponseDoc" } }, "400": { @@ -465792,12 +480922,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -465810,16 +480934,37 @@ "ApiKeyAuth": [] } ], - "summary": "Slate article content", + "summary": "SofaScore event player heatmap", "tags": [ - "Slate" + "SofaScore" ] } }, - "/slate/categories": { + "/sofascore/event-player-statistics": { "get": { - "description": "Lists the exact Slate section values accepted by slate-headlines. The set includes all, news-and-politics, culture, technology, business, life, and advice; subsection navigation pages are not RSS feeds and are intentionally not accepted by slate-headlines.", - "operationId": "slate-categories", + "consumes": [ + "application/json" + ], + "description": "Returns one player's statistics inside one football match (minutes, rating, passes, duels, shots, expected goals, and more) as a snake_case metric map. The set of metrics depends on the player's position, so absent metrics are omitted rather than zero. Get `player_id` from event-lineups. Returns 404 when SofaScore has no statistics for that player in that match.", + "operationId": "sofascore-event-player-statistics", + "parameters": [ + { + "description": "Numeric SofaScore event (match) id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "16363867" + }, + { + "description": "Numeric SofaScore player id that took part in the match", + "in": "query", + "name": "player_id", + "required": true, + "type": "string", + "x-example": "839956" + } + ], "produces": [ "application/json" ], @@ -465827,17 +480972,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slate.categoriesResponseDoc" + "$ref": "#/definitions/sofascore.eventPlayerStatisticsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -465854,32 +481005,27 @@ "ApiKeyAuth": [] } ], - "summary": "Slate public feed sections", + "summary": "SofaScore event player statistics", "tags": [ - "Slate" + "SofaScore" ] } }, - "/slate/headlines": { + "/sofascore/event-point-by-point": { "get": { - "description": "Returns current Slate article-card metadata from one public RSS feed. section must be one of the values returned by slate-categories.", - "operationId": "slate-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a racket-sport match's point-by-point timeline, with sets and games in play order. Tennis sets list games and each game lists every point with the running score (`0`, `15`, `30`, `40`, `A`, or a plain count in a tie-break), the server, the game winner, a `description` of `ace` or `double_fault` where SofaScore flags it, and break point (`break_point`) or set or match point (`set_or_match_point`) markers per player. Table tennis and badminton sets list their points directly. The ace flag is a lower bound of the match's real ace count. Darts matches are not covered. Returns 404 when SofaScore has no point-by-point data for the match, which includes matches that have not started and sports without it.", + "operationId": "sofascore-event-point-by-point", "parameters": [ { - "default": "all", - "description": "Slate feed section", - "enum": [ - "all", - "news-and-politics", - "culture", - "technology", - "business", - "life", - "advice" - ], + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "section", - "type": "string" + "name": "id", + "required": true, + "type": "string", + "x-example": "17257382" } ], "produces": [ @@ -465889,7 +481035,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slate.headlinesResponseDoc" + "$ref": "#/definitions/sofascore.eventPointByPointResponseDoc" } }, "400": { @@ -465910,12 +481056,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -465928,26 +481068,27 @@ "ApiKeyAuth": [] } ], - "summary": "Slate section headlines", + "summary": "SofaScore event point-by-point", "tags": [ - "Slate" + "SofaScore" ] } }, - "/slickdeals/categories": { + "/sofascore/event-pregame-form": { "get": { "consumes": [ "application/json" ], - "description": "Returns Slickdeals' own full category/tag list -- the discovery endpoint for GET /slickdeals/category's slug parameter. This is a separate taxonomy from the category/sub_category fields GET /slickdeals/deal returns for an individual deal (Slickdeals maintains multiple parallel category/tag id spaces, not one) -- these slugs are the ones GET /slickdeals/category's own browse pages accept. The list is refreshed from Slickdeals' own site periodically; an optional q parameter narrows it to a substring match.", - "operationId": "slickdeals-categories", + "description": "Returns each side's form going into a match: league position, points (football) or win-loss record (basketball) in `value` with the `label` that names it, the average player rating where SofaScore has one, and the recent results (`W`, `D`, `L`) in the order SofaScore returns them. Covers football and basketball; returns 404 when SofaScore has no pre-game form for the match, which includes tennis matches.", + "operationId": "sofascore-event-pregame-form", "parameters": [ { - "description": "Case-insensitive substring filter on slug or name", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "q", + "name": "id", + "required": true, "type": "string", - "x-example": "laptop" + "x-example": "16363867" } ], "produces": [ @@ -465957,7 +481098,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.categoriesResponseDoc" + "$ref": "#/definitions/sofascore.eventPregameFormResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -465978,27 +481131,27 @@ "ApiKeyAuth": [] } ], - "summary": "List every Slickdeals deal category/tag", + "summary": "SofaScore event pre-game form", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/category": { + "/sofascore/event-shotmap": { "get": { "consumes": [ "application/json" ], - "description": "Returns the current deal listing for one Slickdeals category/tag (e.g. \"laptop-bag\", \"apparel\"): for each deal, title, price, list price, store, community vote score, comment count, the public username who posted it, and status flags (is_popular, is_expired, is_new, is_frontpage). slug must be one of the values from GET /slickdeals/categories -- an unrecognized slug returns a typed invalid-parameter error rather than being sent upstream. Pair a result's thread_id or url with GET /slickdeals/deal for the full detail record (description, full taxonomy).", - "operationId": "slickdeals-category", + "description": "Returns every shot in a football or ice hockey match. Football shots carry the shooter, side, outcome (`shot_type`), situation, body part, expected goals (xG and xGOT), minute, and pitch and goal-mouth coordinates. Ice hockey shots carry the shooter, team, side, shot technique (`shot_type`, for example `wrist`), `outcome` (`made`, `saved`, `missed` or `blocked`), `strength` (`even`, `powerplay` or `shorthanded`), period and period clock, rink `coordinates` and, for most shots, `xg`. An empty `shots` list is a valid response (a live match with no shots yet). Returns 404 when SofaScore has no shot map for the match, which includes matches that have not started, basketball and other sports without one, and fixtures without expected-goals coverage.", + "operationId": "sofascore-event-shotmap", "parameters": [ { - "description": "Category/tag slug from GET /slickdeals/categories", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "laptop-bag" + "x-example": "16363867" } ], "produces": [ @@ -466008,7 +481161,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.categoryResponseDoc" + "$ref": "#/definitions/sofascore.eventShotmapResponseDoc" } }, "400": { @@ -466017,6 +481170,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -466035,33 +481194,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse current deals in one Slickdeals category/tag", + "summary": "SofaScore event shot map", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/comments": { + "/sofascore/event-statistics": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Slickdeals deal thread's full comment thread: for each comment, the public username who posted it (with their forum rank/title and total post count), the comment content (as HTML and as cleaned plain text), when it was posted, a permalink, and reaction counts (like, funny, helpful, not helpful). Give either url (the exact value returned by GET /slickdeals/search or GET /slickdeals/deal) or thread_id; at least one is required. has_more indicates whether Slickdeals' own page truncated the reply list (no further pagination is currently exposed by this endpoint).", - "operationId": "slickdeals-comments", + "description": "Returns one match's statistics (possession, shots, passes, and more, grouped and split by period). Returns 404 when SofaScore has no tracked statistics for the match.", + "operationId": "sofascore-event-statistics", "parameters": [ { - "description": "Full Slickdeals deal URL, as returned by GET /slickdeals/search or GET /slickdeals/deal (https://slickdeals.net/f/...)", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", + "required": true, "type": "string", - "x-example": "https://slickdeals.net/f/20015817-microsoft-surface-laptop-5-13-5-2-5ghz-16gb-256gb-refurb-w-warranty-358-53" - }, - { - "description": "Slickdeals numeric thread id", - "in": "query", - "name": "thread_id", - "type": "integer", - "x-example": 20015817 + "x-example": "14025013" } ], "produces": [ @@ -466071,7 +481224,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.commentsResponseDoc" + "$ref": "#/definitions/sofascore.eventStatisticsResponseDoc" } }, "400": { @@ -466104,33 +481257,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Slickdeals deal thread's comments", + "summary": "SofaScore event statistics", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/deal": { + "/sofascore/event-team-heatmap": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Slickdeals deal thread's full detail: title, store, final/list price, community vote score, comment count, whether the deal is marked expired, the deal's product category and taxonomy (category/sub_category/category_paths, and separately the legacy forum/forum_id the thread was posted under), the public Slickdeals username who posted it (\"found by\" attribution) with a public community-standing summary (reputation, join date, deals posted, total votes/comments), a related_deals sidebar (Slickdeals' own Popular/Trending picks), the outbound merchant link, and the deal's own description. Give either url (the exact value returned by GET /slickdeals/search) or thread_id (Slickdeals' own numeric thread id, e.g. from a deal's URL path /f/{thread_id}-...); at least one is required. An unknown or removed deal returns 404.", - "operationId": "slickdeals-deal", + "description": "Returns one team's touch locations in a football match as `player_points` (outfield players) and `goalkeeper_points`, each point an `x` and `y` on SofaScore's 0-100 pitch scale. `team_id` must be the home or away team of the event; get both ids from the event endpoint. Returns 404 when SofaScore has no heatmap for that team in that match, which includes teams that did not play it, unstarted matches and sports other than football.", + "operationId": "sofascore-event-team-heatmap", "parameters": [ { - "description": "Full Slickdeals deal URL, as returned by GET /slickdeals/search (https://slickdeals.net/f/...)", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "url", + "name": "id", + "required": true, "type": "string", - "x-example": "https://slickdeals.net/f/20015817-microsoft-surface-laptop-5-13-5-2-5ghz-16gb-256gb-refurb-w-warranty-358-53" + "x-example": "16363867" }, { - "description": "Slickdeals numeric thread id", + "description": "Numeric SofaScore team id of the home or away side", "in": "query", - "name": "thread_id", - "type": "integer", - "x-example": 20015817 + "name": "team_id", + "required": true, + "type": "string", + "x-example": "17" } ], "produces": [ @@ -466140,7 +481295,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.dealResponseDoc" + "$ref": "#/definitions/sofascore.eventTeamHeatmapResponseDoc" } }, "400": { @@ -466173,26 +481328,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Slickdeals deal thread's full detail", + "summary": "SofaScore event team heatmap", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/deal-types": { + "/sofascore/event-team-streaks": { "get": { "consumes": [ "application/json" ], - "description": "Returns Slickdeals' own deal-type tag list (Coupon, Free / Freebie, Giveaway, Gift Card, Mail In Rebate, Online Only, YMMV, ...) -- the discovery endpoint for GET /slickdeals/search's deal_type_id parameter. Confirmed identical across multiple Slickdeals sub-forums, unlike the broader interest-tag space it is drawn from, which was not found to be reliably enumerable. An optional q parameter narrows it to a substring match on name.", - "operationId": "slickdeals-deal-types", + "description": "Returns a match's team streaks and trends: `general` statements about each side's recent matches (for example `Wins` 6 or `No goals conceded` 4) and `head2head` statements about their meetings. Each item names the streak, a `value` that is either a run length (`6`) or a ratio (`5/5`), the `team` it refers to (`home`, `away` or `both`) and, where SofaScore reports it, whether the streak `continued` into this match. Returns 404 when SofaScore lists no streaks for the match, which includes tennis matches.", + "operationId": "sofascore-event-team-streaks", "parameters": [ { - "description": "Case-insensitive substring filter on name", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "q", + "name": "id", + "required": true, "type": "string", - "x-example": "free" + "x-example": "16363867" } ], "produces": [ @@ -466202,7 +481358,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.dealTypesResponseDoc" + "$ref": "#/definitions/sofascore.eventTeamStreaksResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -466223,26 +481391,27 @@ "ApiKeyAuth": [] } ], - "summary": "List every Slickdeals deal-type tag", + "summary": "SofaScore event team streaks", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/forums": { + "/sofascore/event-tennis-power": { "get": { "consumes": [ "application/json" ], - "description": "Returns Slickdeals' own full legacy sub-forum list (e.g. Hot Deals, Coupons, Freebies) -- the discovery endpoint for GET /slickdeals/search's forum_id parameter. A separate, coarser-grained taxonomy from GET /slickdeals/categories' 421-entry tag list: this is the classification GET /slickdeals/deal, /slickdeals/search/advanced, and /slickdeals/frontpage already surface as forum_id, with this endpoint as the way to resolve an id to a name or filter search results by it. The list is refreshed from Slickdeals' own site periodically; an optional q parameter narrows it to a substring match on name.", - "operationId": "slickdeals-forums", + "description": "Returns a tennis match's per-game momentum series: for each game of each set a `value` (positive favours the home player or team, negative the away side) and whether a break of serve `break_occurred`. An empty `games` list is a valid response (a live match with no completed game yet). Returns 404 when SofaScore has no tennis power data for the match, which includes matches that have not started and sports other than tennis.", + "operationId": "sofascore-event-tennis-power", "parameters": [ { - "description": "Case-insensitive substring filter on name", + "description": "Numeric SofaScore tennis event (match) id", "in": "query", - "name": "q", + "name": "id", + "required": true, "type": "string", - "x-example": "deal" + "x-example": "17257382" } ], "produces": [ @@ -466252,7 +481421,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.forumsResponseDoc" + "$ref": "#/definitions/sofascore.eventTennisPowerResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -466273,26 +481454,34 @@ "ApiKeyAuth": [] } ], - "summary": "List every Slickdeals legacy sub-forum", + "summary": "SofaScore event tennis power", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/frontpage": { + "/sofascore/event-tv-channels": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of Slickdeals' own homepage deal listing -- the deals Slickdeals itself is currently featuring, distinct from a keyword search or a single category/tag's own listing. Each deal carries the same fields as GET /slickdeals/search/advanced's results (real integer vote/comment/view counts, store id, discount, status flags), plus is_fire_deal and has_rebate flags this feed's cards carry. Pagination is next-page-only (has_next_page), since the page itself exposes no total page count.", - "operationId": "slickdeals-frontpage", + "description": "Returns where a match is broadcast. `available_countries` lists every country that has a broadcast with its channel ids; those country codes are the valid values for `country`. With `country` set (a two-letter ISO 3166-1 alpha-2 code such as `GB`, any case) the response also resolves that country's `channels` to names, using one extra upstream call. A well-formed country code the match is not broadcast in returns 404, and so does a match with no broadcast information.", + "operationId": "sofascore-event-tv-channels", "parameters": [ { - "description": "1-based frontpage listing page, default 1", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "id", + "required": true, + "type": "string", + "x-example": "16363867" + }, + { + "description": "Two-letter ISO 3166-1 alpha-2 country code. Omit to list the broadcasting countries only", + "in": "query", + "name": "country", + "type": "string", + "x-example": "GB" } ], "produces": [ @@ -466302,7 +481491,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.frontpageResponseDoc" + "$ref": "#/definitions/sofascore.eventTVChannelsResponseDoc" } }, "400": { @@ -466311,6 +481500,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -466329,26 +481524,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Slickdeals' own homepage deal feed", + "summary": "SofaScore event TV channels", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/primary-categories": { + "/sofascore/event-votes": { "get": { "consumes": [ "application/json" ], - "description": "Returns Slickdeals' small, curated set of \"featured\" primary-category landing pages (e.g. laptop-deals, tv-deals) -- the discovery endpoint for GET /slickdeals/primary-category's slug parameter. This is a separate taxonomy from GET /slickdeals/categories' 421-entry tag list and from GET /slickdeals/deal's own category/sub_category fields -- Slickdeals maintains multiple parallel category/tag id spaces, not one. Unlike /slickdeals/categories, no single live page enumerates this set; it is maintained as periodically-refreshed reference data.", - "operationId": "slickdeals-primary-categories", + "description": "Returns a match's community vote tallies: the match result vote (`match_result` with `home`, `away`, `total` and `draw`, where `draw` is absent for two-way sports such as basketball and tennis), both teams to score, which team scores first and who should have won (when SofaScore has opened that vote). A block that holds no votes is omitted. Returns 404 when SofaScore has no votes for the match.", + "operationId": "sofascore-event-votes", "parameters": [ { - "description": "Case-insensitive substring filter on slug or name", + "description": "Numeric SofaScore event (match) id", "in": "query", - "name": "q", + "name": "id", + "required": true, "type": "string", - "x-example": "laptop" + "x-example": "16363867" } ], "produces": [ @@ -466358,7 +481554,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.primaryCategoriesResponseDoc" + "$ref": "#/definitions/sofascore.eventVotesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -466379,27 +481587,53 @@ "ApiKeyAuth": [] } ], - "summary": "List Slickdeals' featured primary-category landing pages", + "summary": "SofaScore event votes", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/primary-category": { + "/sofascore/live-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns the current deal listing for one Slickdeals featured primary-category landing page (e.g. laptop-deals, tv-deals): for each deal, title, price, list price, store, community vote score, comment count, found-by username, and status flags. slug must be one of the values from GET /slickdeals/primary-categories -- an unrecognized slug (including a valid GET /slickdeals/categories tag slug, which is a different taxonomy) returns a typed invalid-parameter error rather than being sent upstream.", - "operationId": "slickdeals-primary-category", + "description": "Returns currently live events for a sport. The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, and `waterpolo`; the sports endpoint lists them. An empty `events` list is a valid response when nothing is live right now.", + "operationId": "sofascore-live-events", "parameters": [ { - "description": "Featured-category slug from GET /slickdeals/primary-categories", + "description": "Sport key", + "enum": [ + "american-football", + "aussie-rules", + "badminton", + "bandy", + "baseball", + "basketball", + "beach-volley", + "cricket", + "darts", + "esports", + "floorball", + "football", + "futsal", + "handball", + "ice-hockey", + "mma", + "minifootball", + "padel", + "rugby", + "snooker", + "table-tennis", + "tennis", + "volleyball", + "waterpolo" + ], "in": "query", - "name": "slug", + "name": "sport", "required": true, "type": "string", - "x-example": "laptop-deals" + "x-example": "football" } ], "produces": [ @@ -466409,7 +481643,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.primaryCategoryResponseDoc" + "$ref": "#/definitions/sofascore.liveEventsResponseDoc" } }, "400": { @@ -466436,41 +481670,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse current deals in one Slickdeals featured primary category", + "summary": "SofaScore live events", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/search": { + "/sofascore/manager": { "get": { "consumes": [ "application/json" ], - "description": "Searches Slickdeals (slickdeals.net), a community deal/coupon aggregator, for deal threads matching a free-text keyword query. Each result is one community-submitted deal thread with its title (which conventionally embeds the deal price), a best-effort price extracted from that title, the merchant domain, the community vote (\"thumb\") score, the public Slickdeals username who posted it, and when it was posted. Pair a result's thread_id or url with GET /slickdeals/deal for the full detail record, including comment count and category. An optional forum_id restricts results to one Slickdeals legacy sub-forum (e.g. Hot Deals, Coupons) -- obtain a value from GET /slickdeals/forums, a closed enum validated before the request is made. An optional deal_type_id restricts results to one Slickdeals deal-type tag (e.g. Coupon, Free / Freebie, YMMV) -- obtain a value from GET /slickdeals/deal-types, also a closed enum validated before the request is made; composes with forum_id.", - "operationId": "slickdeals-search", + "description": "Returns a manager's (coach's) profile (nationality, birth date, preferred formation, current team and teams, and the career win/draw/loss and goals record). Get a manager id from sofascore-search results of type `manager`.", + "operationId": "sofascore-manager", "parameters": [ { - "description": "Free-text keyword query", + "description": "Numeric SofaScore manager id", "in": "query", - "name": "q", + "name": "id", "required": true, "type": "string", - "x-example": "laptop" - }, - { - "description": "Restrict results to one Slickdeals legacy sub-forum, from GET /slickdeals/forums", - "in": "query", - "name": "forum_id", - "type": "integer", - "x-example": 9 - }, - { - "description": "Restrict results to one Slickdeals deal-type tag, from GET /slickdeals/deal-types", - "in": "query", - "name": "deal_type_id", - "type": "integer", - "x-example": 1774 + "x-example": "794873" } ], "produces": [ @@ -466480,7 +481700,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.searchResponseDoc" + "$ref": "#/definitions/sofascore.managerResponseDoc" } }, "400": { @@ -466489,6 +481709,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -466507,61 +481733,34 @@ "ApiKeyAuth": [] } ], - "summary": "Search Slickdeals community-submitted deals by keyword", + "summary": "SofaScore manager detail", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/slickdeals/search/advanced": { + "/sofascore/manager-events": { "get": { "consumes": [ "application/json" ], - "description": "Searches Slickdeals' modern search surface -- a richer alternative to GET /slickdeals/search's keyword-only search. Returns real pagination (page/total_pages/per_page/result_count), integer vote/comment/view counts (not parsed from free text), a fuller per-deal record (store id, discount percent, status flags), and facets -- Categories, Stores, and Brands available for the current query, each option carrying a value usable as category_id/brand_id/store_id. Facet values and counts are scoped to the current query, not a site-wide enumeration -- category_id/brand_id/store_id are passthrough filters (obtain a value from a prior response's own facets), not validated against a closed enum. sort defaults to relevance; other values are passed through unvalidated.", - "operationId": "slickdeals-search-advanced", + "description": "Returns a page of the matches a manager (coach) has recently taken charge of, newest first, across all clubs they managed. Only past matches are available; SofaScore publishes no upcoming list for managers. Returns 404 for a page past the end of the manager's history.", + "operationId": "sofascore-manager-events", "parameters": [ { - "description": "Free-text keyword query", + "description": "Numeric SofaScore manager id", "in": "query", - "name": "q", + "name": "id", "required": true, "type": "string", - "x-example": "laptop" + "x-example": "794873" }, { - "description": "1-based result page, default 1", + "description": "Zero-based page number", "in": "query", "name": "page", "type": "integer", - "x-example": 1 - }, - { - "description": "Sort order, default relevance", - "in": "query", - "name": "sort", - "type": "string", - "x-example": "relevance" - }, - { - "description": "Category facet id, from a prior response's own facets", - "in": "query", - "name": "category_id", - "type": "integer", - "x-example": 9 - }, - { - "description": "Brand facet id, from a prior response's own facets", - "in": "query", - "name": "brand_id", - "type": "integer" - }, - { - "description": "Store facet id, from a prior response's own facets", - "in": "query", - "name": "store_id", - "type": "integer", - "x-example": 482 + "x-example": 0 } ], "produces": [ @@ -466571,7 +481770,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/slickdeals.searchAdvancedResponseDoc" + "$ref": "#/definitions/sofascore.managerEventsResponseDoc" } }, "400": { @@ -466580,6 +481779,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -466598,24 +481803,49 @@ "ApiKeyAuth": [] } ], - "summary": "Search Slickdeals with real pagination, counts, and facets", + "summary": "SofaScore manager recent matches", "tags": [ - "Slickdeals" + "SofaScore" ] } }, - "/sloanreview/article": { + "/sofascore/mma-card": { "get": { - "description": "Returns an MIT Sloan Management Review article's metadata and full body paragraphs from an existing public archive.today snapshot. Sloan Review's origin HTML is paywalled/partial; no login, cookies, or subscription credentials are used. Coverage is partial and an article without a verified full snapshot returns 404.", - "operationId": "sloanreview-article", + "consumes": [ + "application/json" + ], + "description": "Returns the bouts of one MMA fight card, main event first, narrowed with `part` to `all` bouts, the `maincard`, the `prelims` or the `earlyprelims`. Each bout has the fighters (country, nickname, ranking where 0 is the champion, record), weight class, scheduled rounds, status, and for finished bouts the winner, win type, final round and fight time. Get `org_id` and `card_id` from sofascore-mma-schedule. Returns 404 when the card is unknown or has no bouts in that segment (for example a card without early prelims).", + "operationId": "sofascore-mma-card", "parameters": [ { - "description": "Canonical Sloan Review article URL", + "description": "Numeric SofaScore MMA organisation id", "in": "query", - "name": "url", + "name": "org_id", "required": true, "type": "string", - "x-example": "https://sloanreview.mit.edu/article/how-ai-creates-a-capability-mirage/" + "x-example": "19906" + }, + { + "description": "Numeric card id (card_id) from sofascore-mma-schedule", + "in": "query", + "name": "card_id", + "required": true, + "type": "string", + "x-example": "197311" + }, + { + "description": "Which segment of the card to return", + "enum": [ + "all", + "maincard", + "prelims", + "earlyprelims" + ], + "in": "query", + "name": "part", + "required": true, + "type": "string", + "x-example": "all" } ], "produces": [ @@ -466625,7 +481855,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sloanreview.articleResponseDoc" + "$ref": "#/definitions/sofascore.mmaCardResponseDoc" } }, "400": { @@ -466658,30 +481888,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get MIT Sloan Management Review article content", + "summary": "SofaScore MMA card", "tags": [ - "MIT Sloan Management Review" + "SofaScore" ] } }, - "/sloanreview/articles": { + "/sofascore/mma-schedule": { "get": { - "description": "Returns a paginated, sitemap-backed index of all article URLs currently published by MIT Sloan Management Review. Use an item's URL with sloanreview-article to request archive-backed body content; archive availability remains dependent on a public snapshot existing for that article.", - "operationId": "sloanreview-articles", + "consumes": [ + "application/json" + ], + "description": "Returns the main event of every fight card an MMA organisation holds in one calendar month, with the card id and name, fighters (country, nickname, ranking where 0 is the champion, record), weight class, scheduled rounds, status, and for finished fights the winner, win type and final round. Find organisation ids (UFC 19906, PFL 19910, ONE 20269, Rizin 19905, Fight Nation Championship 20463, KSW 19946, OKTAGON 20258, Absolute Championship Akhmat 20254, Cage Warriors 19909, Dana White's Contender Series 20264, Brave CF 20267, Jungle Fight 20253) with sofascore-categories (sport `mma`) and sofascore-category-tournaments (category 1708). Use the `card_id` with sofascore-mma-card to read every bout. Returns 404 when the organisation has no card in that month or the id is not an MMA organisation.", + "operationId": "sofascore-mma-schedule", "parameters": [ { - "description": "1-based page number (default 1)", + "description": "Numeric SofaScore MMA organisation id", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "org_id", + "required": true, + "type": "string", + "x-example": "19906" }, { - "description": "Items per page, 1-500 (default 100)", + "description": "Calendar month as YYYY-MM", "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 100 + "name": "month", + "required": true, + "type": "string", + "x-example": "2026-10" } ], "produces": [ @@ -466691,7 +481926,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sloanreview.articlesResponseDoc" + "$ref": "#/definitions/sofascore.mmaScheduleResponseDoc" } }, "400": { @@ -466700,6 +481935,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -466718,16 +481959,55 @@ "ApiKeyAuth": [] } ], - "summary": "List MIT Sloan Management Review article URLs", + "summary": "SofaScore MMA schedule", "tags": [ - "MIT Sloan Management Review" + "SofaScore" ] } }, - "/sloanreview/categories": { + "/sofascore/odds-dropping": { "get": { - "description": "Returns the complete public MIT Sloan Management Review topic taxonomy discovered from the site's All Topics page. The returned slugs are the accepted values for sloanreview-topic.", - "operationId": "sloanreview-categories", + "consumes": [ + "application/json" + ], + "description": "Returns SofaScore's dropping odds list for a sport: about twenty upcoming events whose odds moved most, each as the usual event summary plus the `choice_name` and `percentage` SofaScore reports for the move (returned as supplied) and the market with opening and current prices (`change` is 1 above the opening price, -1 below it, 0 unchanged). The `sport` enum accepts `all` and the SofaScore sport keys; it defaults to `all`. A sport with no qualifying events at the moment (for example esports when probed) returns 404.", + "operationId": "sofascore-odds-dropping", + "parameters": [ + { + "description": "Sport key, or all for every sport. Defaults to all", + "enum": [ + "all", + "american-football", + "aussie-rules", + "badminton", + "bandy", + "baseball", + "basketball", + "beach-volley", + "cricket", + "darts", + "esports", + "floorball", + "football", + "futsal", + "handball", + "ice-hockey", + "mma", + "minifootball", + "padel", + "rugby", + "snooker", + "table-tennis", + "tennis", + "volleyball", + "waterpolo" + ], + "in": "query", + "name": "sport", + "type": "string", + "x-example": "football" + } + ], "produces": [ "application/json" ], @@ -466735,7 +482015,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sloanreview.categoriesResponseDoc" + "$ref": "#/definitions/sofascore.oddsDroppingResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -466756,16 +482048,55 @@ "ApiKeyAuth": [] } ], - "summary": "Get MIT Sloan Management Review topic taxonomy", + "summary": "SofaScore dropping odds", "tags": [ - "MIT Sloan Management Review" + "SofaScore" ] } }, - "/sloanreview/headlines": { + "/sofascore/odds-winning": { "get": { - "description": "Returns the article cards on the MIT Sloan Management Review homepage, including editor picks and tiled feeds, with no parameters. Each item has a `title` and `url` and, when present, `topic`, `authors` and `published_at`. It covers the homepage only; the articles endpoint finds URLs beyond it.", - "operationId": "sloanreview-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns SofaScore's winning odds list for a sport: about twenty upcoming events whose favourite SofaScore highlights, each as the usual event summary plus `winning_odds` (fractional), the `expected` and `actual` percentages SofaScore reports for it (returned as supplied) and the full-time market with opening and current prices (`change` is 1 above the opening price, -1 below it, 0 unchanged). The `sport` enum accepts `all` and the SofaScore sport keys; it defaults to `all`. A sport with no qualifying events at the moment (for example baseball, cricket and esports when probed) returns 404.", + "operationId": "sofascore-odds-winning", + "parameters": [ + { + "description": "Sport key, or all for every sport. Defaults to all", + "enum": [ + "all", + "american-football", + "aussie-rules", + "badminton", + "bandy", + "baseball", + "basketball", + "beach-volley", + "cricket", + "darts", + "esports", + "floorball", + "football", + "futsal", + "handball", + "ice-hockey", + "mma", + "minifootball", + "padel", + "rugby", + "snooker", + "table-tennis", + "tennis", + "volleyball", + "waterpolo" + ], + "in": "query", + "name": "sport", + "type": "string", + "x-example": "football" + } + ], "produces": [ "application/json" ], @@ -466773,7 +482104,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sloanreview.headlinesResponseDoc" + "$ref": "#/definitions/sofascore.oddsWinningResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -466794,80 +482137,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get MIT Sloan Management Review headlines", + "summary": "SofaScore winning odds", "tags": [ - "MIT Sloan Management Review" + "SofaScore" ] } }, - "/sloanreview/topic": { + "/sofascore/player": { "get": { - "description": "Returns article cards from one public Sloan Review topic page. Use sloanreview-categories for the complete accepted slug set; this includes the primary navigation topics and the site's child topic pages.", - "operationId": "sloanreview-topic", + "consumes": [ + "application/json" + ], + "description": "Returns one SofaScore player by numeric `id`: name, short name, position, jersey number, date of birth, height, preferred foot, country, market value and currency, and the current team. `deceased` is `true` for historical players. An unknown or malformed id returns an upstream error.", + "operationId": "sofascore-player", "parameters": [ { - "description": "Sloan Review topic slug returned by sloanreview-categories", - "enum": [ - "ai-machine-learning", - "analytics-business-intelligence", - "automation", - "boards-corporate-governance", - "business-models-strategy", - "climate-change", - "collaboration", - "corporate-social-responsibility-sustainability", - "crisis-management", - "culture", - "customers", - "data-ai-machine-learning", - "data-culture", - "developing-strategy", - "digital-marketing", - "disruption", - "diversity-inclusion", - "equality", - "ethics", - "executing-strategy", - "financial-management-risk", - "global-strategy", - "innovation-3", - "innovation-strategy", - "it-governance-leadership", - "leadership", - "leadership-skills", - "leading-change", - "managing-technology", - "managing-your-career", - "marketing", - "marketing-strategy", - "new-product-development", - "operations", - "organizational-behavior", - "organizational-structure", - "organizational-transformation", - "performance-management", - "platforms-ecosystems", - "project-management", - "quality-service", - "remote-work", - "security-privacy", - "skills-learning", - "social-media", - "social-responsibility", - "strategy", - "supply-chains-logistics", - "sustainability-social-responsibility", - "talent-management", - "technology-implementation", - "technology-innovation-strategy", - "work-life-balance", - "workplace-teams-culture" - ], + "description": "Numeric SofaScore player id", "in": "query", - "name": "topic", + "name": "id", "required": true, "type": "string", - "x-example": "strategy" + "x-example": "855833" } ], "produces": [ @@ -466877,7 +482167,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sloanreview.topicResponseDoc" + "$ref": "#/definitions/sofascore.playerResponseDoc" } }, "400": { @@ -466910,24 +482200,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get an MIT Sloan Management Review topic archive", + "summary": "SofaScore player detail", "tags": [ - "MIT Sloan Management Review" + "SofaScore" ] } }, - "/smh/article": { + "/sofascore/player-attributes": { "get": { - "description": "Returns one Sydney Morning Herald article's public metadata and the body paragraphs an anonymous visitor's page request is served, from a canonical article URL. The Sydney Morning Herald runs a metered subscription paywall; the response reports it with is_accessible_for_free (the page's own declaration), paywalled (the page marks the story as subscriber content), and is_truncated (the page served a shortened preview, or no body at all, instead of the full story). Paywalls are never bypassed and body text is never fabricated. Video-only pages are rejected with a 400.", - "operationId": "smh-article", + "consumes": [ + "application/json" + ], + "description": "Returns a football player's attribute scores (0 to 100) for the current year and up to three earlier years (`year_shift` 0 to 3), the average scores for the player's position, and the player's characteristics: playing positions plus strengths and weaknesses, each with SofaScore's numeric `code`, a `key` and `name` such as finishing or aerial duels, and a `rank`. Outfield players carry attacking, technical, tactical, defending and creativity scores; goalkeepers carry saves, anticipation, ball_distribution, aerial and tactical. Combines two SofaScore requests. Returns 404 for players without attribute overviews, which includes non-football players.", + "operationId": "sofascore-player-attributes", "parameters": [ { - "description": "Canonical The Sydney Morning Herald article URL", + "description": "Numeric SofaScore player id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.smh.com.au/politics/nsw/identity-rabbit-hole-one-nation-cops-spray-over-criticism-of-aboriginal-flag-pin-20260924-p6107h.html" + "x-example": "839956" } ], "produces": [ @@ -466937,7 +482230,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.smhArticleResponseDoc" + "$ref": "#/definitions/sofascore.playerAttributesResponseDoc" } }, "400": { @@ -466952,6 +482245,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -466964,24 +482263,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sydney Morning Herald article content", + "summary": "SofaScore player attributes and characteristics", "tags": [ - "The Sydney Morning Herald" + "SofaScore" ] } }, - "/smh/author": { + "/sofascore/player-events": { "get": { - "description": "Returns a Sydney Morning Herald journalist's public profile -- name, short biography, headshot, contact email and social links where published -- plus their recent stories, from a canonical https://www.smh.com.au/by/- URL.", - "operationId": "smh-author", + "consumes": [ + "application/json" + ], + "description": "Returns one page (30 matches) of a player's matches, each with the player's own numbers merged in: `statistics` (football: rating and minutes_played; basketball: points, rebounds, assists and more), `incident_counts` (goals, assists, yellow and red cards, penalty goals), `on_bench` for an unused substitute and `played_for_team_id` (club or national team). Page 0 is the most recent window and can include upcoming fixtures (status type `notstarted`); matches inside a page run oldest first. Follow `has_next_page` for older pages; a page past the end returns 404.", + "operationId": "sofascore-player-events", "parameters": [ { - "description": "Canonical The Sydney Morning Herald journalist URL", + "description": "Numeric SofaScore player id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.smh.com.au/by/michael-mcgowan-p536tc" + "x-example": "839956" + }, + { + "description": "Zero-based page number. Defaults to 0", + "in": "query", + "minimum": 0, + "name": "page", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -466991,7 +482301,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.smhAuthorResponseDoc" + "$ref": "#/definitions/sofascore.playerEventsResponseDoc" } }, "400": { @@ -467006,6 +482316,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -467018,122 +482334,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sydney Morning Herald journalist profile", + "summary": "SofaScore player matches with per-match numbers", "tags": [ - "The Sydney Morning Herald" + "SofaScore" ] } }, - "/smh/headlines": { + "/sofascore/player-last-year-summary": { "get": { - "description": "Returns the current stories for one Sydney Morning Herald section: title, canonical URL, summary, author, publication time, and image where the section lists them. section must be one of the slugs returned by /smh/sections; any other value is rejected with a 400 before The Sydney Morning Herald is contacted.", - "operationId": "smh-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a player's form timeline over roughly the last year: `summary` entries, each with a `type`, a date and (where it applies) a competition. `event` is a rated match (the rating is in `value` as published and as a number in `rating`, the competition in `tournament_id`); `injury` is an injury period whose `value` is an opaque number; `missing` is a match the player missed; `transfer` is a transfer date. `tournaments` describes the competitions referenced. An empty `summary` is a valid response for a player with no rated appearance in the period.", + "operationId": "sofascore-player-last-year-summary", "parameters": [ { - "description": "Section slug from /smh/sections", - "enum": [ - "sydney-news", - "national/nsw", - "politics", - "politics/federal", - "politics/nsw", - "politics/victoria", - "politics/queensland", - "politics/western-australia", - "business", - "business/companies", - "business/markets", - "business/bullsnbears", - "business/the-economy", - "business/banking-and-finance", - "business/small-business", - "business/workplace", - "world", - "world/north-america", - "world/europe", - "world/asia", - "world/middle-east", - "world/south-america", - "world/africa", - "national", - "national/victoria", - "national/queensland", - "national/western-australia", - "opinion", - "property", - "property/news", - "property/living", - "sport", - "sport/nrl", - "sport/rugby-union", - "sport/cricket", - "sport/soccer", - "sport/afl", - "sport/racing", - "sport/tennis", - "sport/netball", - "sport/basketball", - "sport/motorsport", - "sport/cycling", - "sport/golf", - "sport/nfl", - "sport/athletics", - "sport/swimming", - "sport/boxing", - "goodfood", - "goodfood/sydney-eating-out", - "goodfood/recipes", - "goodfood/tips-and-advice", - "goodfood/drinks", - "culture", - "culture/movies", - "culture/tv-and-radio", - "culture/music", - "culture/celebrity", - "culture/books", - "culture/comedy", - "culture/dance", - "culture/musicals", - "culture/opera", - "culture/theatre", - "culture/art-and-design", - "culture/live-reviews", - "lifestyle", - "lifestyle/health-and-wellness", - "lifestyle/fashion", - "lifestyle/life-and-relationships", - "lifestyle/beauty", - "traveller", - "traveller/inspiration/destination-guides", - "traveller/inspiration", - "traveller/reviews-and-advice", - "traveller/travel-news", - "good-weekend", - "sunday-life", - "money", - "money/super-and-retirement", - "money/investing", - "money/banking", - "money/borrowing", - "money/saving", - "money/tax", - "money/planning-and-budgeting", - "education", - "healthcare", - "environment", - "environment/conservation", - "environment/climate-change", - "environment/sustainability", - "environment/weather", - "technology", - "technology/video-games", - "australia-higher-education" - ], + "description": "Numeric SofaScore player id", "in": "query", - "name": "section", + "name": "id", "required": true, "type": "string", - "x-example": "politics/federal" + "x-example": "839956" } ], "produces": [ @@ -467143,7 +482364,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/sofascore.playerLastYearSummaryResponseDoc" } }, "400": { @@ -467152,6 +482373,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -467164,16 +482397,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sydney Morning Herald section headlines", + "summary": "SofaScore player form over the last year", "tags": [ - "The Sydney Morning Herald" + "SofaScore" ] } }, - "/smh/news": { + "/sofascore/player-national-team-statistics": { "get": { - "description": "Returns The Sydney Morning Herald's current \"Latest News\" public RSS feed: each story's title, canonical URL, summary, author, publication time, and lead image.", - "operationId": "smh-news", + "consumes": [ + "application/json" + ], + "description": "Returns a player's national team record: for each national team the appearances, goals and debut date. An empty `teams` list is a valid response for a player who never played internationally.", + "operationId": "sofascore-player-national-team-statistics", + "parameters": [ + { + "description": "Numeric SofaScore player id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "839956" + } + ], "produces": [ "application/json" ], @@ -467181,7 +482427,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/sofascore.playerNationalTeamStatisticsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -467202,16 +482460,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sydney Morning Herald top stories", + "summary": "SofaScore player national team record", "tags": [ - "The Sydney Morning Herald" + "SofaScore" ] } }, - "/smh/sections": { + "/sofascore/player-penalty-history": { "get": { - "description": "Lists every Sydney Morning Herald section accepted by /smh/headlines (96 sections from the site's own section menu), each with its slug, display name, and public section-front URL.", - "operationId": "smh-sections", + "consumes": [ + "application/json" + ], + "description": "Returns the penalties a player has taken, newest first: the totals (`attempts`, `scored`) and, per penalty, the outcome (`goal`, `miss`, `post` or `save`), the zone of the goal (for example `low-right`, `high-left`, `close-high`), the x and y position in the goal mouth on SofaScore's 0 to 100 scale, the expected-goals value when available and the match. Returns 404 for players with no recorded penalties, such as most goalkeepers and defenders.", + "operationId": "sofascore-player-penalty-history", + "parameters": [ + { + "description": "Numeric SofaScore player id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "839956" + } + ], "produces": [ "application/json" ], @@ -467219,7 +482490,31 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/sofascore.playerPenaltyHistoryResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -467228,53 +482523,57 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sydney Morning Herald sections", + "summary": "SofaScore player penalty history", "tags": [ - "The Sydney Morning Herald" + "SofaScore" ] } }, - "/sofascore/categories": { + "/sofascore/player-ratings": { "get": { "consumes": [ "application/json" ], - "description": "Returns every category (country or region, such as England or International) SofaScore lists for a sport, with id, name, slug, flag, optional two-letter code, and priority, highest priority first. Use a category `id` with category-tournaments (its competitions) and with scheduled-events (its fixtures on a date). The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, and `waterpolo`. Slugs are not unique across categories, so identify a category by `id`.", - "operationId": "sofascore-categories", + "description": "Returns a player's rating in every match of one competition season, newest first, with the opponent, home or away and the match. The `type` enum accepts `overall`, `home`, `away`, `regular_season` and `playoffs` and defaults to `overall`; football seasons answer `overall` and NBA seasons answer `regular_season` and `playoffs` (the types a season offers are listed by player-statistics-seasons). Returns 404 when SofaScore has no ratings of that type for the combination.", + "operationId": "sofascore-player-ratings", "parameters": [ { - "description": "Sport key", - "enum": [ - "american-football", - "aussie-rules", - "badminton", - "bandy", - "baseball", - "basketball", - "beach-volley", - "cricket", - "darts", - "esports", - "floorball", - "football", - "futsal", - "handball", - "ice-hockey", - "mma", - "minifootball", - "padel", - "rugby", - "snooker", - "table-tennis", - "tennis", - "volleyball", - "waterpolo" - ], + "description": "Numeric SofaScore player id", "in": "query", - "name": "sport", + "name": "id", "required": true, "type": "string", - "x-example": "football" + "x-example": "839956" + }, + { + "description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", + "in": "query", + "name": "tournament_id", + "required": true, + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id from player-statistics-seasons", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "76986" + }, + { + "default": "overall", + "description": "Statistics view", + "enum": [ + "overall", + "home", + "away", + "regular_season", + "playoffs" + ], + "in": "query", + "name": "type", + "type": "string" } ], "produces": [ @@ -467284,7 +482583,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.categoriesResponseDoc" + "$ref": "#/definitions/sofascore.playerRatingsResponseDoc" } }, "400": { @@ -467293,6 +482592,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -467311,27 +482616,43 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore categories for a sport", + "summary": "SofaScore player match ratings for a season", "tags": [ "SofaScore" ] } }, - "/sofascore/category-tournaments": { + "/sofascore/player-season-heatmap": { "get": { "consumes": [ "application/json" ], - "description": "Returns the competitions (unique tournaments) inside one category, most followed first. Each `id` is the competition id the tournament-seasons, standings, tournament-rounds, and round-events endpoints take. Get the category `id` from the categories endpoint. An empty `tournaments` list is a valid response: some categories exist without any competitions. Returns 404 for an unknown category id.", - "operationId": "sofascore-category-tournaments", + "description": "Returns a football player's aggregated touch locations over one competition season: `points` with an `x`, `y` and touch `count` on SofaScore's 0-100 pitch scale, the number of `matches` behind it and the matched `events`. Get `tournament_id` and `season` from player-statistics-seasons. The response is large for a full league season. Returns 404 when SofaScore has no heatmap for that player, competition and season, which includes sports other than football and seasons the player did not play.", + "operationId": "sofascore-player-season-heatmap", "parameters": [ { - "description": "Numeric SofaScore category id from the categories endpoint", + "description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "1" + "x-example": "839956" + }, + { + "description": "Numeric SofaScore unique-tournament (competition) id", + "in": "query", + "name": "tournament_id", + "required": true, + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "76986" } ], "produces": [ @@ -467341,7 +482662,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.categoryTournamentsResponseDoc" + "$ref": "#/definitions/sofascore.playerSeasonHeatmapResponseDoc" } }, "400": { @@ -467374,39 +482695,57 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore competitions in a category", + "summary": "SofaScore player season heatmap", "tags": [ "SofaScore" ] } }, - "/sofascore/draft": { + "/sofascore/player-season-statistics": { "get": { "consumes": [ "application/json" ], - "description": "Returns the draft attached to a league season: the upcoming or just-held `draft` and the `previous_draft`, each with its year, start and end time, status, the draft `rounds` (the valid `round` values for draft-picks) and whether the lottery is complete. The `league` enum accepts `nba` and `nfl`. Get `season` from tournament-seasons (NBA competition id 132, NFL 9464). A season without a draft, or a season id that does not belong to the league, returns 404. A season whose draft is not scheduled yet returns only `previous_draft`.", - "operationId": "sofascore-draft", + "description": "Returns a player's statistics for one competition season (appearances, rating, goals, assists, passing, duels, and more) as a snake_case metric map, plus the team and a rating breakdown when available. The `type` enum accepts `overall`, `home`, `away`, `regular_season`, and `playoffs` and defaults to `overall`; only the types listed for that season by player-statistics-seasons exist (football players have `overall`, `home`, `away`; basketball, ice hockey and baseball players have `regular_season` and `playoffs`). Returns 404 when SofaScore has no statistics of that type for the combination.", + "operationId": "sofascore-player-season-statistics", "parameters": [ { - "description": "League whose draft to return", - "enum": [ - "nba", - "nfl" - ], + "description": "Numeric SofaScore player id", "in": "query", - "name": "league", + "name": "id", "required": true, "type": "string", - "x-example": "nba" + "x-example": "839956" }, { - "description": "Numeric SofaScore season id of the league", + "description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", + "in": "query", + "name": "tournament_id", + "required": true, + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", "name": "season", "required": true, "type": "string", - "x-example": "80229" + "x-example": "96668" + }, + { + "default": "overall", + "description": "Statistics view", + "enum": [ + "overall", + "home", + "away", + "regular_season", + "playoffs" + ], + "in": "query", + "name": "type", + "type": "string" } ], "produces": [ @@ -467416,7 +482755,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.draftResponseDoc" + "$ref": "#/definitions/sofascore.playerSeasonStatisticsResponseDoc" } }, "400": { @@ -467449,49 +482788,45 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore league draft", + "summary": "SofaScore player season statistics", "tags": [ "SofaScore" ] } }, - "/sofascore/draft-picks": { + "/sofascore/player-statistical-rankings": { "get": { "consumes": [ "application/json" ], - "description": "Returns one round of a league draft: each pick with the overall and in-round number, the drafting team, and the drafted prospect (name, position, college or club, top-prospect flag and the player id when SofaScore has one), plus the teams that hold no pick in that round. The `league` enum accepts `nba` (rounds 1 and 2) and `nfl` (rounds 1 to 7); other rounds return 400. Get `year` from the draft endpoint's `draft.year` and `previous_draft.year`; SofaScore keeps only recent drafts, so an older year returns 404. Returns 404 when SofaScore has no picks for that year and round.", - "operationId": "sofascore-draft-picks", + "description": "Returns where a football player ranks against every other player of the competition season for about 78 statistics (goals, assists, rating, expected goals, passes, duels, distance covered and more): the `value`, the `rank` (tied values share a rank), the number of ranked players (`count`) and the tie-broken `order`. Statistics are snake_case and sorted alphabetically. The `type` enum accepts only `overall`, which is also the default; the other statistics views answer 404. Returns 404 for players without a ranking in that season, which includes basketball players.", + "operationId": "sofascore-player-statistical-rankings", "parameters": [ { - "description": "League whose draft to return", - "enum": [ - "nba", - "nfl" - ], + "description": "Numeric SofaScore player id", "in": "query", - "name": "league", + "name": "id", "required": true, "type": "string", - "x-example": "nba" + "x-example": "839956" }, { - "description": "Four-digit draft year", + "description": "Numeric SofaScore season id from player-statistics-seasons", "in": "query", - "name": "year", + "name": "season", "required": true, "type": "string", - "x-example": "2025" + "x-example": "96668" }, { - "description": "Draft round: 1 to 2 for nba, 1 to 7 for nfl", + "default": "overall", + "description": "Statistics view", + "enum": [ + "overall" + ], "in": "query", - "maximum": 7, - "minimum": 1, - "name": "round", - "required": true, - "type": "integer", - "x-example": 1 + "name": "type", + "type": "string" } ], "produces": [ @@ -467501,7 +482836,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.draftPicksResponseDoc" + "$ref": "#/definitions/sofascore.playerStatisticalRankingsResponseDoc" } }, "400": { @@ -467534,41 +482869,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore league draft picks", + "summary": "SofaScore player ranking among all players in a season", "tags": [ "SofaScore" ] } }, - "/sofascore/esports-game": { + "/sofascore/player-statistics-seasons": { "get": { "consumes": [ "application/json" ], - "description": "Returns one resource of one esports game from SofaScore, chosen with `part`: `statistics` (team totals such as kills, towers and barracks for Dota 2, gold and drakes for League of Legends), `lineups` (every player with hero or champion and per-player statistics such as net worth, gold or ADR), `bans` (banned heroes or champions per side) and `rounds` (Counter-Strike round history with outcome, winner and side per round, including overtime). Only the requested block is returned. Get the game id from sofascore-event-esports-games. Statistics and bans exist for Dota 2 and League of Legends only (404 for Counter-Strike), rounds fill for Counter-Strike only (an empty list otherwise) and lineups work for all three. Returns 404 when SofaScore has no such data for the game.", - "operationId": "sofascore-esports-game", + "description": "Lists the competitions and seasons a player has statistics for, with the statistics `types` available for each season. Use a returned competition id (`unique_tournament_id`), season `id` and one of its `types` with player-season-statistics. The `types` values are `overall`, `home`, `away`, `regular_season`, and `playoffs`. Returns 404 for players with no tracked statistics (for example tennis players).", + "operationId": "sofascore-player-statistics-seasons", "parameters": [ { - "description": "Numeric SofaScore esports game id from sofascore-event-esports-games", + "description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "588883" - }, - { - "description": "Which resource of the game to return", - "enum": [ - "statistics", - "lineups", - "bans", - "rounds" - ], - "in": "query", - "name": "part", - "required": true, - "type": "string", - "x-example": "lineups" + "x-example": "839956" } ], "produces": [ @@ -467578,7 +482899,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.esportsGameResponseDoc" + "$ref": "#/definitions/sofascore.playerStatisticsSeasonsResponseDoc" } }, "400": { @@ -467611,27 +482932,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore esports game detail", + "summary": "SofaScore player statistics seasons", "tags": [ "SofaScore" ] } }, - "/sofascore/event": { + "/sofascore/player-tournaments": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SofaScore match by event id: home and away teams and scores, status, start time, tournament, attendance and winner code, plus venue and referee when SofaScore has them. An unknown or malformed id surfaces as an upstream error.", - "operationId": "sofascore-event", + "description": "Lists every competition a player has played in, with id, name, slug, category, sport and gender. It includes competitions without season statistics (cups, friendlies, all-star games) that player-statistics-seasons leaves out. Returns 404 when SofaScore has no competitions for the player.", + "operationId": "sofascore-player-tournaments", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "14025013" + "x-example": "839956" } ], "produces": [ @@ -467641,7 +482962,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventResponseDoc" + "$ref": "#/definitions/sofascore.playerTournamentsResponseDoc" } }, "400": { @@ -467674,35 +482995,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event detail", + "summary": "SofaScore player competitions", "tags": [ "SofaScore" ] } }, - "/sofascore/event-at-bat-pitches": { + "/sofascore/player-transfers": { "get": { "consumes": [ "application/json" ], - "description": "Returns every pitch of one baseball at-bat from SofaScore, in pitch order: the ball-strike-out count, outcome code, pitch type and name, speed in kilometres per hour, zone, plate location, strike-zone bounds, batter and pitcher hand, the score, and for balls put in play the hit type, trajectory, hardness and location plus runner movements and fielder credits. Get the at-bat id (`at_bat_id`) from sofascore-event-at-bats for the same event. Returns 404 when SofaScore has no pitches for that at-bat, which includes an at-bat id that does not belong to the event.", - "operationId": "sofascore-event-at-bat-pitches", + "description": "Returns a player's transfer history (clubs moved from and to, date, fee, and SofaScore's numeric transfer type code), newest first. An empty `transfers` list is a valid response for a player who has never moved clubs. Returns 404 when SofaScore has no transfer record for the player (seen for ice hockey and baseball players). The `type_code` values are SofaScore's own opaque codes and are not translated.", + "operationId": "sofascore-player-transfers", "parameters": [ { - "description": "Numeric SofaScore baseball event (match) id", + "description": "Numeric SofaScore player id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "17199139" - }, - { - "description": "Numeric at-bat id from sofascore-event-at-bats for the same event", - "in": "query", - "name": "at_bat_id", - "required": true, - "type": "string", - "x-example": "2595879" + "x-example": "839956" } ], "produces": [ @@ -467712,7 +483025,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventAtBatPitchesResponseDoc" + "$ref": "#/definitions/sofascore.playerTransfersResponseDoc" } }, "400": { @@ -467745,29 +483058,19 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event at-bat pitches", + "summary": "SofaScore player transfer history", "tags": [ "SofaScore" ] } }, - "/sofascore/event-at-bats": { + "/sofascore/ranking-types": { "get": { "consumes": [ "application/json" ], - "description": "Returns a baseball match's at-bat timeline from SofaScore, in play order: for each plate appearance the inning and half (`top` or `bottom`), pitcher, hitter, their teams, when it ended and the home and away win probabilities before and after it. Use an at-bat `id` with sofascore-event-at-bat-pitches to read its pitches. Returns 404 when SofaScore has no at-bat data for the match, which includes matches that have not started and sports other than baseball.", - "operationId": "sofascore-event-at-bats", - "parameters": [ - { - "description": "Numeric SofaScore baseball event (match) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17199139" - } - ], + "description": "Lists every ranking available from the sofascore rankings endpoint: the numeric `type` id, a descriptive name, the sport, the gender and the kind of entity that is ranked (`team`, `player` or `unique_tournament`). Covers 32 rankings across football (league coefficients, FIFA national teams, club coefficients), rugby, tennis (ATP and WTA official and live rankings, UTR), padel and MMA (UFC and Fight Nation Championship divisions). The catalogue is a fixed list and costs no upstream request.", + "operationId": "sofascore-ranking-types", "produces": [ "application/json" ], @@ -467775,19 +483078,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventAtBatsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sofascore.rankingTypesResponseDoc" } }, "429": { @@ -467808,27 +483099,70 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event at-bats", + "summary": "SofaScore ranking catalogue", "tags": [ "SofaScore" ] } }, - "/sofascore/event-average-positions": { + "/sofascore/rankings": { "get": { "consumes": [ "application/json" ], - "description": "Returns every player's average position on the pitch during a football match (`average_x` and `average_y` on SofaScore's 0-100 pitch scale, plus the number of touches behind it) for the home and away sides, and the substitutions with their minute. Returns 404 when SofaScore has no positional data for the match, which includes unstarted matches and sports other than football.", - "operationId": "sofascore-event-average-positions", + "description": "Returns one SofaScore ranking list: the rank, previous rank, points and the ranked team, player or competition, plus when the list was last updated. Choose the `type` id from sofascore-ranking-types, for example 5 for the ATP men's singles ranking or 2 for the FIFA men's national team ranking. Optional `limit` returns only the first rows of long lists (tennis lists hold 500 rows). MMA division rankings use rank 0 for the reigning champion.", + "operationId": "sofascore-rankings", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Ranking id from sofascore-ranking-types", + "enum": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 34, + 35, + 36, + 37, + 40, + 41, + 42, + 43, + 44, + 45, + 46 + ], "in": "query", - "name": "id", + "name": "type", "required": true, - "type": "string", - "x-example": "16363867" + "type": "integer", + "x-example": 5 + }, + { + "description": "Return only the first N rows, 1 to 500. Omit to return every row", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -467838,7 +483172,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventAveragePositionsResponseDoc" + "$ref": "#/definitions/sofascore.rankingsResponseDoc" } }, "400": { @@ -467847,12 +483181,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -467871,27 +483199,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event average positions", + "summary": "SofaScore rankings", "tags": [ "SofaScore" ] } }, - "/sofascore/event-baseball-top-performers": { + "/sofascore/referee": { "get": { "consumes": [ "application/json" ], - "description": "Returns a baseball match's top performers from SofaScore: each pitcher or batter (`role`) with a rating, their team and a snake_case map of the statistics that earned the mention (for example pitching strike outs, batting home runs and runs batted in). Returns 404 when SofaScore has no top performers for the match, which includes matches that have not started and sports other than baseball.", - "operationId": "sofascore-event-baseball-top-performers", + "description": "Returns a referee's profile: name, country, sport, career matches officiated and career yellow, red and yellow-red card totals, plus date of birth and first league debut when SofaScore records them. Get the referee id from the `referee.id` of the sofascore-event endpoint or from a sofascore-search result of type referee. Returns 404 for an unknown id.", + "operationId": "sofascore-referee", "parameters": [ { - "description": "Numeric SofaScore baseball event (match) id", + "description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "17199139" + "x-example": "74264" } ], "produces": [ @@ -467901,7 +483229,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventBaseballTopPerformersResponseDoc" + "$ref": "#/definitions/sofascore.refereeResponseDoc" } }, "400": { @@ -467934,27 +483262,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event baseball top performers", + "summary": "SofaScore referee profile", "tags": [ "SofaScore" ] } }, - "/sofascore/event-best-players": { + "/sofascore/referee-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns a match's best-rated players per side, the overall top-rated list, and the player of the match (each with team and value) from SofaScore. Covers football (value is the match rating, label `rating`) and ice hockey (label `pts`, value the points scored; a goalkeeper with no points has no numeric `value` and carries SofaScore's dash in `value_text`). The basketball, baseball and tennis matches checked returned no summary. Returns 404 when SofaScore has no best-players summary for the match, which includes matches that have not started, sports without one and fixtures without rated players.", - "operationId": "sofascore-event-best-players", + "description": "Returns one page (30 matches) of the matches a referee officiated, most recent first, across every competition. Follow `has_next_page` for older pages; a page past the end returns 404. Only past matches exist (no upcoming list), and the list includes canceled and postponed fixtures (their `status.type` says so), which the career match total of sofascore-referee does not count.", + "operationId": "sofascore-referee-events", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "74264" + }, + { + "description": "Zero-based page number. Defaults to 0", + "in": "query", + "minimum": 0, + "name": "page", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -467964,7 +483300,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventBestPlayersResponseDoc" + "$ref": "#/definitions/sofascore.refereeEventsResponseDoc" } }, "400": { @@ -467997,27 +483333,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event best players", + "summary": "SofaScore referee officiated matches", "tags": [ "SofaScore" ] } }, - "/sofascore/event-comments": { + "/sofascore/referee-statistics": { "get": { "consumes": [ "application/json" ], - "description": "Returns a match's text commentary (minute, type, text, and the players involved, plus the running score on scoring lines) from SofaScore, newest first. Works for football and basketball matches that have commentary. An empty `comments` list is a valid response (a live match with no lines yet). Returns 404 when SofaScore has no commentary for the match, which includes matches that have not started.", - "operationId": "sofascore-event-comments", + "description": "Returns a referee's record per competition: matches officiated, yellow cards, red cards, yellow-red cards and penalties awarded. The per-competition appearances add up to the career matches in sofascore-referee. An empty `competitions` list is valid for a referee with no recorded competitions.", + "operationId": "sofascore-referee-statistics", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore referee id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "74264" } ], "produces": [ @@ -468027,7 +483363,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventCommentsResponseDoc" + "$ref": "#/definitions/sofascore.refereeStatisticsResponseDoc" } }, "400": { @@ -468060,27 +483396,57 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event commentary", + "summary": "SofaScore referee card statistics", "tags": [ "SofaScore" ] } }, - "/sofascore/event-esports-games": { + "/sofascore/round-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns the games (maps) of an esports match from SofaScore: each game's id, status, start time, length in seconds, winner, score per side (kills for Dota 2 and League of Legends, rounds with half and overtime split for Counter-Strike), the map for Counter-Strike, and whether complete statistics exist. Use a game `id` with sofascore-esports-game to read its statistics, lineups, bans or rounds. Returns 404 when SofaScore has no games for the event, which includes sports other than esports.", - "operationId": "sofascore-event-esports-games", + "description": "Returns fixtures for one round of a competition season. Get `id` from search or category-tournaments, `season` from tournament-seasons, and the round values from tournament-rounds. Round numbers are not unique in cups, and knockout or named rounds return 404 unless the round's `slug` is passed (plus its `prefix` when tournament-rounds lists one): the UEFA Champions League has a qualifying and a league-phase round 1, and a playoff round 636 both with the `Qualification` prefix and without. Plain numbered league rounds need only `round`. `slug` is lowercase letters, digits, and hyphens (up to 64 characters); `prefix` is letters, digits, spaces, and hyphens (up to 64 characters) and is only valid together with `slug`.", + "operationId": "sofascore-round-events", "parameters": [ { - "description": "Numeric SofaScore esports event (match) id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "17260338" + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "76986" + }, + { + "description": "Round number", + "in": "query", + "name": "round", + "required": true, + "type": "integer", + "x-example": 1 + }, + { + "description": "Round slug from tournament-rounds, for example round-of-16; required for knockout and named cup rounds", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "round-of-16" + }, + { + "description": "Round prefix from tournament-rounds, for example Qualification; only valid together with slug", + "in": "query", + "name": "prefix", + "type": "string", + "x-example": "Qualification" } ], "produces": [ @@ -468090,7 +483456,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventEsportsGamesResponseDoc" + "$ref": "#/definitions/sofascore.roundEventsResponseDoc" } }, "400": { @@ -468123,27 +483489,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event esports games", + "summary": "SofaScore round fixtures", "tags": [ "SofaScore" ] } }, - "/sofascore/event-graph": { + "/sofascore/scheduled-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns a match's momentum graph as minute and value points (positive values favour the home side) plus period length information, from SofaScore. Covers football, ice hockey and basketball. An empty `points` list is a valid response (a live match that has just started). Returns 404 when SofaScore has no momentum graph for the match, which includes matches that have not started and sports without one such as tennis and baseball.", - "operationId": "sofascore-event-graph", + "description": "Returns the events (matches) in one category, such as a country, that start on a UTC date, ordered by start time. Get the category `id` from the categories endpoint (or `category_id` from scheduled-tournaments). `date` must be a real calendar date written `YYYY-MM-DD` and is a UTC day; to cover a local day in another timezone, request the neighbouring dates and filter on `start_timestamp`. An empty `events` list is a valid response when the category has no fixtures that day. Returns 404 for an unknown category id.", + "operationId": "sofascore-scheduled-events", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore category id from the categories endpoint", "in": "query", - "name": "id", + "name": "category_id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "13" + }, + { + "description": "UTC calendar date, YYYY-MM-DD", + "in": "query", + "name": "date", + "required": true, + "type": "string", + "x-example": "2026-10-08" } ], "produces": [ @@ -468153,7 +483527,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventGraphResponseDoc" + "$ref": "#/definitions/sofascore.scheduledEventsResponseDoc" } }, "400": { @@ -468186,27 +483560,70 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event momentum graph", + "summary": "SofaScore events scheduled in a category on a date", "tags": [ "SofaScore" ] } }, - "/sofascore/event-h2h": { + "/sofascore/scheduled-tournaments": { "get": { "consumes": [ "application/json" ], - "description": "Returns the historical head-to-head win/draw record between a match's two teams (and managers, when available) from SofaScore.", - "operationId": "sofascore-event-h2h", + "description": "Returns one page of the tournaments that have fixtures on a UTC date for a sport, each with the number of events starting that UTC day. This lists competitions, not matches: use scheduled-events with a tournament's `category_id` for the matches, or its `unique_tournament_id` with the tournament-seasons and round endpoints. `date` must be a real calendar date written `YYYY-MM-DD`. Pages are one-based; follow `has_next_page`. The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, and `waterpolo`. An empty `tournaments` list is a valid response for a date with no fixtures or a page past the last one.", + "operationId": "sofascore-scheduled-tournaments", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Sport key", + "enum": [ + "american-football", + "aussie-rules", + "badminton", + "bandy", + "baseball", + "basketball", + "beach-volley", + "cricket", + "darts", + "esports", + "floorball", + "football", + "futsal", + "handball", + "ice-hockey", + "mma", + "minifootball", + "padel", + "rugby", + "snooker", + "table-tennis", + "tennis", + "volleyball", + "waterpolo" + ], "in": "query", - "name": "id", + "name": "sport", "required": true, "type": "string", - "x-example": "14025013" + "x-example": "football" + }, + { + "description": "UTC calendar date, YYYY-MM-DD", + "in": "query", + "name": "date", + "required": true, + "type": "string", + "x-example": "2026-10-08" + }, + { + "description": "One-based page number; defaults to 1", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -468216,7 +483633,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventH2HResponseDoc" + "$ref": "#/definitions/sofascore.scheduledTournamentsResponseDoc" } }, "400": { @@ -468225,12 +483642,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -468249,27 +483660,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event head-to-head", + "summary": "SofaScore tournaments scheduled on a date", "tags": [ "SofaScore" ] } }, - "/sofascore/event-highlights": { + "/sofascore/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the highlight videos attached to a match: title, subtitle (for example `Full Highlights`), video `url`, thumbnail, the publish time, whether it is the key highlight, and the countries it is restricted to when SofaScore limits it. `media_type_code` is SofaScore's own numeric code and is returned untranslated. Returns 404 when the match has no highlight videos, which includes matches that have not finished.", - "operationId": "sofascore-event-highlights", + "description": "Searches SofaScore for teams, players, and competitions matching a free-text query. An empty `results` list is a valid response when nothing matches.", + "operationId": "sofascore-search", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Free-text search query", "in": "query", - "name": "id", + "name": "q", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "barcelona" } ], "produces": [ @@ -468279,7 +483690,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventHighlightsResponseDoc" + "$ref": "#/definitions/sofascore.searchResponseDoc" } }, "400": { @@ -468288,12 +483699,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -468312,27 +483717,85 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event highlights", + "summary": "SofaScore universal search", "tags": [ "SofaScore" ] } }, - "/sofascore/event-incidents": { + "/sofascore/search-typed": { "get": { "consumes": [ "application/json" ], - "description": "Returns one match's goal, card, substitution, and period timeline from SofaScore. An empty `incidents` list is a valid response before kickoff.", - "operationId": "sofascore-event-incidents", + "description": "Searches SofaScore for one entity type and returns up to 20 ranked results per page: `events` (matches), `teams`, `players` (with team and position), `managers`, `referees`, `venues` (with city and capacity) and `unique_tournaments` (competitions with category). Page with the zero-based `page`; an empty page means there are no further results. The optional `sport` filter (any key listed by sofascore/sports, such as `football`, `basketball`, `tennis` or `mma`) narrows `teams`, `players`, `managers` and `unique_tournaments`, and is rejected for `events`, `referees` and `venues`, which ignore it. Use the returned ids with the matching endpoints (team, player, manager, venue, tournament-seasons, event).", + "operationId": "sofascore-search-typed", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Entity type to search", + "enum": [ + "events", + "teams", + "players", + "managers", + "referees", + "venues", + "unique_tournaments" + ], "in": "query", - "name": "id", + "name": "type", "required": true, "type": "string", - "x-example": "14025013" + "x-example": "teams" + }, + { + "description": "Search text, up to 128 characters", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "arsenal" + }, + { + "description": "Zero-based page number. Defaults to 0", + "in": "query", + "minimum": 0, + "name": "page", + "type": "integer", + "x-example": 0 + }, + { + "description": "Restrict teams, players, managers or unique_tournaments to one sport", + "enum": [ + "american-football", + "aussie-rules", + "badminton", + "bandy", + "baseball", + "basketball", + "beach-volley", + "cricket", + "darts", + "esports", + "floorball", + "football", + "futsal", + "handball", + "ice-hockey", + "mma", + "minifootball", + "padel", + "rugby", + "snooker", + "table-tennis", + "tennis", + "volleyball", + "waterpolo" + ], + "in": "query", + "name": "sport", + "type": "string", + "x-example": "football" } ], "produces": [ @@ -468342,7 +483805,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventIncidentsResponseDoc" + "$ref": "#/definitions/sofascore.searchTypedResponseDoc" } }, "400": { @@ -468351,12 +483814,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -468375,27 +483832,55 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event incidents", + "summary": "SofaScore search by entity type", "tags": [ "SofaScore" ] } }, - "/sofascore/event-innings": { + "/sofascore/season-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns a cricket match's innings scorecards from SofaScore. Each innings has the batting and bowling teams, runs, wickets, overs in cricket notation (18.4 is 18 overs and 4 balls), extras (wides, no balls, byes, leg byes, penalty), every batter's line (runs, balls, fours, sixes, dismissal with the bowler and fielder, fall-of-wicket score and over), every bowler's figures (overs, maidens, runs, wickets, wides, no balls), the partnerships and a derived fall-of-wickets list. Works for T20, one-day and Test matches (a Test lists up to four innings). Returns 404 when SofaScore has no innings data for the match, which includes matches that have not started and sports other than cricket.", - "operationId": "sofascore-event-innings", + "description": "Returns one page (about 30 events) of every fixture or result of a competition season, with the round of each event. The `direction` enum accepts `next` (upcoming fixtures) and `last` (finished results). Follow `has_next_page` to read further pages: a page past the end, a direction with no events (for example `next` in a finished season) and a season id that does not belong to the competition all answer 404. Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-season-events", "parameters": [ { - "description": "Numeric SofaScore cricket event (match) id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16253632" + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" + }, + { + "description": "Upcoming fixtures or finished results", + "enum": [ + "next", + "last" + ], + "in": "query", + "name": "direction", + "required": true, + "type": "string", + "x-example": "last" + }, + { + "description": "Zero-based page number. Defaults to 0", + "in": "query", + "minimum": 0, + "name": "page", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -468405,7 +483890,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventInningsResponseDoc" + "$ref": "#/definitions/sofascore.seasonEventsResponseDoc" } }, "400": { @@ -468438,29 +483923,19 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event innings", + "summary": "SofaScore season fixtures and results", "tags": [ "SofaScore" ] } }, - "/sofascore/event-lineups": { + "/sofascore/sports": { "get": { "consumes": [ "application/json" ], - "description": "Returns one match's starting XI and substitutes per side, with formation. Returns 404 when SofaScore has no lineups for the match. A missing-lineup result may be reused for up to two minutes before checking again.", - "operationId": "sofascore-event-lineups", - "parameters": [ - { - "description": "Numeric SofaScore event (match) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "14025013" - } - ], + "description": "Lists every sport key the SofaScore endpoints accept (the `sport` enum of live-events, categories, and scheduled-tournaments), with live and total event counts when available. The list is fixed and always complete; if the live counts cannot be read, `counts_available` is `false` and the per-sport counts are omitted instead of failing the call. Counts are also omitted for a sport the count feed does not cover (for example `mma`). Accepted sport keys: `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, `waterpolo`.", + "operationId": "sofascore-sports", "produces": [ "application/json" ], @@ -468468,19 +483943,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventLineupsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sofascore.sportsResponseDoc" } }, "429": { @@ -468501,27 +483964,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event lineups", + "summary": "SofaScore supported sports", "tags": [ "SofaScore" ] } }, - "/sofascore/event-managers": { + "/sofascore/stage": { "get": { "consumes": [ "application/json" ], - "description": "Returns the two managers (coaches) of a match with their SofaScore ids, names and slugs. The manager `id` works with the manager and manager-events endpoints. Returns 404 when SofaScore lists no managers for the match, which includes tennis matches.", - "operationId": "sofascore-event-managers", + "description": "Returns one stage from SofaScore's stage hierarchy: a season (Formula 1 2026), an event (a Grand Prix weekend, a NASCAR race, a rally, a cycling race), a session (practice, qualifying, sprint, race) or a cycling stage. The response has its type (`Season`, `Event`, `Practice`, `Qualifying`, `Qualifying part`, `Race`, `Sprint race`, `Sprint qualifying`, `Practice part`, `Stage`), status (`finished`, `notstarted`, `canceled`), start time, country, competition, parent stage (the season of an event, the event of a session), the winner once decided, and circuit, weather and race facts where published (laps, race distance, lap record, safety car, NASCAR cautions, rally special stages, cycling route). `info` fields are omitted when not published, never zero. A season has no status. Stage ids and competition ids are different id spaces. Returns 404 for an unknown stage id.", + "operationId": "sofascore-stage", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "214258" } ], "produces": [ @@ -468531,7 +483994,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventManagersResponseDoc" + "$ref": "#/definitions/sofascore.stageDetailResponseDoc" } }, "400": { @@ -468564,27 +484027,31 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event managers", + "summary": "SofaScore motorsport and cycling stage", "tags": [ "SofaScore" ] } }, - "/sofascore/event-odds": { + "/sofascore/stage-categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns one match's betting markets and choices. Returns 404 when SofaScore has no odds for the match.", - "operationId": "sofascore-event-odds", + "description": "Lists the categories SofaScore keeps for a stage sport, each with its competitions. For `motorsport` that is the racing series (Formula 1, MotoGP, Moto2, Moto3, Superbike, NASCAR with its Cup, Truck and Xfinity competitions, WRC, Formula E, Indycar, DTM); for `cycling` it is Cycling Men and Cycling Women. Use a competition `id` with stage-seasons to list its seasons. Some categories exist without any competition (for example Motocross, Speedway, WEC) and return an empty `competitions` list. Motorsport and cycling are not available on the match-based endpoints (live-events, categories, scheduled-events); they use the stage endpoints. The `sport` enum accepts `motorsport` and `cycling`.", + "operationId": "sofascore-stage-categories", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Stage sport key", + "enum": [ + "motorsport", + "cycling" + ], "in": "query", - "name": "id", + "name": "sport", "required": true, "type": "string", - "x-example": "14025013" + "x-example": "motorsport" } ], "produces": [ @@ -468594,7 +484061,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventOddsResponseDoc" + "$ref": "#/definitions/sofascore.stageCategoriesResponseDoc" } }, "400": { @@ -468603,12 +484070,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -468627,35 +484088,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event odds", + "summary": "SofaScore motorsport and cycling categories and competitions", "tags": [ "SofaScore" ] } }, - "/sofascore/event-player-heatmap": { + "/sofascore/stage-driver-performance": { "get": { "consumes": [ "application/json" ], - "description": "Returns one player's touch locations in a football match as `points`, each an `x` and `y` on SofaScore's 0-100 pitch scale. Get `player_id` from event-lineups. Returns 404 when SofaScore has no heatmap for that player in that match, which includes players who did not play, unstarted matches and sports other than football.", - "operationId": "sofascore-event-player-heatmap", + "description": "Returns every competitor's progress through a finished race or rally. For circuit races (Formula 1, MotoGP and similar) `laps` lists the position at the end of each lap, starting with lap 0 for the grid, plus the tyre compound and a `pit_stop` flag where published; the lap a driver retired has `retired` set and no position. For rallies `stage_positions` lists the overall position after each special stage. The response also repeats the stage itself. It is published for races and sprints of some series (verified for Formula 1, MotoGP and WRC) and not for practice, qualifying, NASCAR, cycling, events or seasons, which return 404. Returns 404 for an unknown id.", + "operationId": "sofascore-stage-driver-performance", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore stage id of a finished race, sprint or rally", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" - }, - { - "description": "Numeric SofaScore player id that played in the match", - "in": "query", - "name": "player_id", - "required": true, - "type": "string", - "x-example": "839956" + "x-example": "214258" } ], "produces": [ @@ -468665,7 +484118,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventPlayerHeatmapResponseDoc" + "$ref": "#/definitions/sofascore.stageDriverPerformanceResponseDoc" } }, "400": { @@ -468698,35 +484151,31 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event player heatmap", + "summary": "SofaScore motorsport race progress per driver", "tags": [ "SofaScore" ] } }, - "/sofascore/event-player-statistics": { + "/sofascore/stage-featured": { "get": { "consumes": [ "application/json" ], - "description": "Returns one player's statistics inside one football match (minutes, rating, passes, duels, shots, expected goals, and more) as a snake_case metric map. The set of metrics depends on the player's position, so absent metrics are omitted rather than zero. Get `player_id` from event-lineups. Returns 404 when SofaScore has no statistics for that player in that match.", - "operationId": "sofascore-event-player-statistics", + "description": "Returns the events SofaScore features for a stage sport right now: a mix of the latest finished events (with `winner` and result facts such as laps and circuit) and the next upcoming ones, across series such as Formula 1, MotoGP, Moto2, Moto3, Superbike, NASCAR and cycling races. Each event carries its competition, season name, parent season stage and country. Use an event `id` with stage-substages for its sessions or stages and stage-standings for results. The `sport` enum accepts `motorsport` and `cycling`.", + "operationId": "sofascore-stage-featured", "parameters": [ { - "description": "Numeric SofaScore event (match) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "16363867" - }, - { - "description": "Numeric SofaScore player id that took part in the match", + "description": "Stage sport key", + "enum": [ + "motorsport", + "cycling" + ], "in": "query", - "name": "player_id", + "name": "sport", "required": true, "type": "string", - "x-example": "839956" + "x-example": "motorsport" } ], "produces": [ @@ -468736,7 +484185,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventPlayerStatisticsResponseDoc" + "$ref": "#/definitions/sofascore.stageFeaturedResponseDoc" } }, "400": { @@ -468745,12 +484194,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -468769,27 +484212,39 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event player statistics", + "summary": "SofaScore featured motorsport and cycling events", "tags": [ "SofaScore" ] } }, - "/sofascore/event-point-by-point": { + "/sofascore/stage-schedule": { "get": { "consumes": [ "application/json" ], - "description": "Returns a racket-sport match's point-by-point timeline, with sets and games in play order. Tennis sets list games and each game lists every point with the running score (`0`, `15`, `30`, `40`, `A`, or a plain count in a tie-break), the server, the game winner, a `description` of `ace` or `double_fault` where SofaScore flags it, and break point (`break_point`) or set or match point (`set_or_match_point`) markers per player. Table tennis and badminton sets list their points directly. The ace flag is a lower bound of the match's real ace count. Darts matches are not covered. Returns 404 when SofaScore has no point-by-point data for the match, which includes matches that have not started and sports without it.", - "operationId": "sofascore-event-point-by-point", + "description": "Returns the events SofaScore lists for a stage sport around a UTC date: Grand Prix weekends, NASCAR race weekends, rallies and cycling races, each with its country, competition, every session start time (`session_start_timestamps`) and the session SofaScore highlights (`session`: the live, next or latest one). The list is not a strict one-day filter. It holds the events in progress on the date plus the next upcoming ones, and a quiet date still returns the next events; use `on_date`, which is true when a session of the event starts inside the requested UTC day, to separate them. Schedule rows carry no event status or winner: use `session.status`, or pass the event `id` to stage for the event detail and to stage-substages for its sessions. `date` must be a real calendar date written `YYYY-MM-DD`. An empty `stages` list is valid when nothing is in progress or scheduled nearby. The `sport` enum accepts `motorsport` and `cycling`.", + "operationId": "sofascore-stage-schedule", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Stage sport key", + "enum": [ + "motorsport", + "cycling" + ], "in": "query", - "name": "id", + "name": "sport", "required": true, "type": "string", - "x-example": "17257382" + "x-example": "motorsport" + }, + { + "description": "UTC calendar date, YYYY-MM-DD", + "in": "query", + "name": "date", + "required": true, + "type": "string", + "x-example": "2026-10-04" } ], "produces": [ @@ -468799,7 +484254,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventPointByPointResponseDoc" + "$ref": "#/definitions/sofascore.stageScheduleResponseDoc" } }, "400": { @@ -468808,12 +484263,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -468832,27 +484281,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event point-by-point", + "summary": "SofaScore motorsport and cycling events around a date", "tags": [ "SofaScore" ] } }, - "/sofascore/event-pregame-form": { + "/sofascore/stage-seasons": { "get": { "consumes": [ "application/json" ], - "description": "Returns each side's form going into a match: league position, points (football) or win-loss record (basketball) in `value` with the `label` that names it, the average player rating where SofaScore has one, and the recent results (`W`, `D`, `L`) in the order SofaScore returns them. Covers football and basketball; returns 404 when SofaScore has no pre-game form for the match, which includes tennis matches.", - "operationId": "sofascore-event-pregame-form", + "description": "Returns the seasons of one stage competition, newest first, for example Formula 1 2026 (id 214140) back to 1950. A season `id` is a stage id: pass it to stage-substages for the race calendar and to stage-standings for the championship table. The season still in progress has no `end_timestamp`. Get the competition `id` from stage-categories (for example 40 for Formula 1, 17 for MotoGP, 18 for the NASCAR Cup Series, 9 for Cycling Men). Competition ids and stage ids are different id spaces, so a competition id passed to stage returns an unrelated stage. Returns 404 for an unknown competition id.", + "operationId": "sofascore-stage-seasons", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore competition id from stage-categories", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "40" } ], "produces": [ @@ -468862,7 +484311,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventPregameFormResponseDoc" + "$ref": "#/definitions/sofascore.stageSeasonsResponseDoc" } }, "400": { @@ -468895,27 +484344,39 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event pre-game form", + "summary": "SofaScore seasons of a motorsport or cycling competition", "tags": [ "SofaScore" ] } }, - "/sofascore/event-shotmap": { + "/sofascore/stage-standings": { "get": { "consumes": [ "application/json" ], - "description": "Returns every shot in a football or ice hockey match. Football shots carry the shooter, side, outcome (`shot_type`), situation, body part, expected goals (xG and xGOT), minute, and pitch and goal-mouth coordinates. Ice hockey shots carry the shooter, team, side, shot technique (`shot_type`, for example `wrist`), `outcome` (`made`, `saved`, `missed` or `blocked`), `strength` (`even`, `powerplay` or `shorthanded`), period and period clock, rink `coordinates` and, for most shots, `xg`. An empty `shots` list is a valid response (a live match with no shots yet). Returns 404 when SofaScore has no shot map for the match, which includes matches that have not started, basketball and other sports without one, and fixtures without expected-goals coverage.", - "operationId": "sofascore-event-shotmap", + "description": "Returns one classification of a stage. For a race or sprint it is the result (position, grid, race time, gap, interval, laps, laps led, pit stops, tyre stints, fastest lap, points, retirement status); for practice and qualifying the timing order (`time` is the best lap); for a cycling stage the stage result with time gaps; for an event the event aggregate; for a season the championship table (points, victories, races started, pole positions, podiums, fastest laps; NASCAR adds top 5, top 10 and races not finished). `competitor` returns drivers and riders, `team` returns constructors and teams, which only some seasons and events publish (verified for the Formula 1 and MotoGP seasons and the Formula 1 event; races, NASCAR, WRC and cycling return 404 for `team`). Rows are in upstream order. `position` is omitted for competitors who did not finish or set no time, and `gap` is `DNF` for a retirement. The parent session of a split qualifying has no standings; use the ids of its parts from stage-substages. Fields a classification does not publish are omitted. Returns 404 for an unknown id, a stage that has no results yet, or a kind of stage without that classification. The `type` enum accepts `competitor` and `team`.", + "operationId": "sofascore-stage-standings", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore stage id of a season, event, session or cycling stage", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "214258" + }, + { + "description": "Classification kind", + "enum": [ + "competitor", + "team" + ], + "in": "query", + "name": "type", + "required": true, + "type": "string", + "x-example": "competitor" } ], "produces": [ @@ -468925,7 +484386,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventShotmapResponseDoc" + "$ref": "#/definitions/sofascore.stageStandingsResponseDoc" } }, "400": { @@ -468958,27 +484419,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event shot map", + "summary": "SofaScore motorsport and cycling stage standings", "tags": [ "SofaScore" ] } }, - "/sofascore/event-statistics": { + "/sofascore/stage-substages": { "get": { "consumes": [ "application/json" ], - "description": "Returns one match's statistics (possession, shots, passes, and more, grouped and split by period). Returns 404 when SofaScore has no tracked statistics for the match.", - "operationId": "sofascore-event-statistics", + "description": "Returns the children of a stage in upstream order. For a season it is the race calendar: every event with status (`finished`, `notstarted`, `canceled`), dates, round, circuit and winner. For an event it is the sessions: practices, qualifying, sprint qualifying, sprint and race for a Grand Prix, the numbered stages of a cycling race or rally. Qualifying and practice sessions list their `parts`, and the part ids carry the timing results (the parent session of a split qualifying has no standings of its own). Use a child `id` with stage for detail, stage-standings for its results and stage-driver-performance for race progress. A race, session or cycling stage has no children and returns 404, as does an unknown id.", + "operationId": "sofascore-stage-substages", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore stage id of a season or an event", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "14025013" + "x-example": "214253" } ], "produces": [ @@ -468988,7 +484449,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventStatisticsResponseDoc" + "$ref": "#/definitions/sofascore.stageSubstagesResponseDoc" } }, "400": { @@ -469021,35 +484482,48 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event statistics", + "summary": "SofaScore children of a motorsport or cycling stage", "tags": [ "SofaScore" ] } }, - "/sofascore/event-team-heatmap": { + "/sofascore/standings": { "get": { "consumes": [ "application/json" ], - "description": "Returns one team's touch locations in a football match as `player_points` (outfield players) and `goalkeeper_points`, each point an `x` and `y` on SofaScore's 0-100 pitch scale. `team_id` must be the home or away team of the event; get both ids from the event endpoint. Returns 404 when SofaScore has no heatmap for that team in that match, which includes teams that did not play it, unstarted matches and sports other than football.", - "operationId": "sofascore-event-team-heatmap", + "description": "Returns a league table for a competition season. The `type` enum accepts `total`, `home`, and `away`. Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-standings", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "17" }, { - "description": "Numeric SofaScore team id of the home or away side", + "description": "Numeric SofaScore season id", "in": "query", - "name": "team_id", + "name": "season", "required": true, "type": "string", - "x-example": "17" + "x-example": "76986" + }, + { + "description": "Standings variant", + "enum": [ + "total", + "home", + "away" + ], + "in": "query", + "name": "type", + "required": true, + "type": "string", + "x-example": "total" } ], "produces": [ @@ -469059,7 +484533,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventTeamHeatmapResponseDoc" + "$ref": "#/definitions/sofascore.standingsResponseDoc" } }, "400": { @@ -469092,27 +484566,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event team heatmap", + "summary": "SofaScore standings", "tags": [ "SofaScore" ] } }, - "/sofascore/event-team-streaks": { + "/sofascore/team": { "get": { "consumes": [ "application/json" ], - "description": "Returns a match's team streaks and trends: `general` statements about each side's recent matches (for example `Wins` 6 or `No goals conceded` 4) and `head2head` statements about their meetings. Each item names the streak, a `value` that is either a run length (`6`) or a ratio (`5/5`), the `team` it refers to (`home`, `away` or `both`) and, where SofaScore reports it, whether the streak `continued` into this match. Returns 404 when SofaScore lists no streaks for the match, which includes tennis matches.", - "operationId": "sofascore-event-team-streaks", + "description": "Returns one SofaScore team by numeric `id`: name, short name, country, sport, manager, venue with its city and capacity, primary colour, and national-team flag. `tournament_id` and `tournament_name` give the team's primary competition, such as its domestic league. An unknown id returns an upstream error.", + "operationId": "sofascore-team", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "2817" } ], "produces": [ @@ -469122,7 +484596,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventTeamStreaksResponseDoc" + "$ref": "#/definitions/sofascore.teamResponseDoc" } }, "400": { @@ -469155,27 +484629,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event team streaks", + "summary": "SofaScore team detail", "tags": [ "SofaScore" ] } }, - "/sofascore/event-tennis-power": { + "/sofascore/team-achievements": { "get": { "consumes": [ "application/json" ], - "description": "Returns a tennis match's per-game momentum series: for each game of each set a `value` (positive favours the home player or team, negative the away side) and whether a break of serve `break_occurred`. An empty `games` list is a valid response (a live match with no completed game yet). Returns 404 when SofaScore has no tennis power data for the match, which includes matches that have not started and sports other than tennis.", - "operationId": "sofascore-event-tennis-power", + "description": "Returns the trophies a team has won: the total and, per competition, the number won and the winning seasons (newest first, with the season id where SofaScore tracks it). Some competitions, such as US leagues, report a count with an empty or shorter `seasons` list. Returns 404 when SofaScore records no achievements for the team.", + "operationId": "sofascore-team-achievements", "parameters": [ { - "description": "Numeric SofaScore tennis event (match) id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "17257382" + "x-example": "17" } ], "produces": [ @@ -469185,7 +484659,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventTennisPowerResponseDoc" + "$ref": "#/definitions/sofascore.teamAchievementsResponseDoc" } }, "400": { @@ -469218,34 +484692,46 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event tennis power", + "summary": "SofaScore team trophies", "tags": [ "SofaScore" ] } }, - "/sofascore/event-tv-channels": { + "/sofascore/team-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns where a match is broadcast. `available_countries` lists every country that has a broadcast with its channel ids; those country codes are the valid values for `country`. With `country` set (a two-letter ISO 3166-1 alpha-2 code such as `GB`, any case) the response also resolves that country's `channels` to names, using one extra upstream call. A well-formed country code the match is not broadcast in returns 404, and so does a match with no broadcast information.", - "operationId": "sofascore-event-tv-channels", + "description": "Returns a page of a team's upcoming or recent fixtures. The `direction` enum accepts `next` and `last`. An empty `events` list is a valid response when there is no fixture on that page.", + "operationId": "sofascore-team-events", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" + "x-example": "2817" }, { - "description": "Two-letter ISO 3166-1 alpha-2 country code. Omit to list the broadcasting countries only", + "description": "Fixture direction", + "enum": [ + "next", + "last" + ], "in": "query", - "name": "country", + "name": "direction", + "required": true, "type": "string", - "x-example": "GB" + "x-example": "next" + }, + { + "description": "Zero-based page number", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -469255,7 +484741,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.eventTVChannelsResponseDoc" + "$ref": "#/definitions/sofascore.teamEventsResponseDoc" } }, "400": { @@ -469288,116 +484774,43 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore event TV channels", + "summary": "SofaScore team fixtures", "tags": [ "SofaScore" ] } }, - "/sofascore/event-votes": { + "/sofascore/team-goal-distributions": { "get": { "consumes": [ "application/json" ], - "description": "Returns a match's community vote tallies: the match result vote (`match_result` with `home`, `away`, `total` and `draw`, where `draw` is absent for two-way sports such as basketball and tennis), both teams to score, which team scores first and who should have won (when SofaScore has opened that vote). A block that holds no votes is omitted. Returns 404 when SofaScore has no votes for the match.", - "operationId": "sofascore-event-votes", + "description": "Returns a football team's goals scored and conceded per block of match minutes (1-15, 16-30, 31-45, 46-60, 61-75, 76-90) for one competition season, in three views: `overall`, `home` and `away`, each with the matches played and the goal totals. A block with no goals is returned as 0. Returns 404 for non-football teams and for a team and season that do not belong together.", + "operationId": "sofascore-team-goal-distributions", "parameters": [ { - "description": "Numeric SofaScore event (match) id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "16363867" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/sofascore.eventVotesResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + "x-example": "17" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "SofaScore event votes", - "tags": [ - "SofaScore" - ] - } - }, - "/sofascore/live-events": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns currently live events for a sport. The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, and `waterpolo`; the sports endpoint lists them. An empty `events` list is a valid response when nothing is live right now.", - "operationId": "sofascore-live-events", - "parameters": [ + "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", + "in": "query", + "name": "tournament_id", + "required": true, + "type": "string", + "x-example": "17" + }, { - "description": "Sport key", - "enum": [ - "american-football", - "aussie-rules", - "badminton", - "bandy", - "baseball", - "basketball", - "beach-volley", - "cricket", - "darts", - "esports", - "floorball", - "football", - "futsal", - "handball", - "ice-hockey", - "mma", - "minifootball", - "padel", - "rugby", - "snooker", - "table-tennis", - "tennis", - "volleyball", - "waterpolo" - ], + "description": "Numeric SofaScore season id", "in": "query", - "name": "sport", + "name": "season", "required": true, "type": "string", - "x-example": "football" + "x-example": "96668" } ], "produces": [ @@ -469407,7 +484820,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.liveEventsResponseDoc" + "$ref": "#/definitions/sofascore.teamGoalDistributionsResponseDoc" } }, "400": { @@ -469416,6 +484829,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -469434,27 +484853,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore live events", + "summary": "SofaScore team goals by match minute", "tags": [ "SofaScore" ] } }, - "/sofascore/manager": { + "/sofascore/team-near-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns a manager's (coach's) profile (nationality, birth date, preferred formation, current team and teams, and the career win/draw/loss and goals record). Get a manager id from sofascore-search results of type `manager`.", - "operationId": "sofascore-manager", + "description": "Returns a team's last played match and its next scheduled match with teams, competition, status, score and start time. Either side can be missing (a team with no upcoming fixture returns only `previous_event`). Returns 404 when SofaScore has neither. For full fixture lists use team-events.", + "operationId": "sofascore-team-near-events", "parameters": [ { - "description": "Numeric SofaScore manager id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "794873" + "x-example": "17" } ], "produces": [ @@ -469464,7 +484883,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.managerResponseDoc" + "$ref": "#/definitions/sofascore.teamNearEventsResponseDoc" } }, "400": { @@ -469497,34 +484916,43 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore manager detail", + "summary": "SofaScore team previous and next match", "tags": [ "SofaScore" ] } }, - "/sofascore/manager-events": { + "/sofascore/team-of-the-week": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of the matches a manager (coach) has recently taken charge of, newest first, across all clubs they managed. Only past matches are available; SofaScore publishes no upcoming list for managers. Returns 404 for a page past the end of the manager's history.", - "operationId": "sofascore-manager-events", + "description": "Returns one team of the week: the formation and the selected players with their SofaScore rating, team and, for round and weekly selections, the match the rating was earned in. Get the `period` id from sofascore-team-of-the-week-periods; a period that does not belong to the given competition season is rejected with 400.", + "operationId": "sofascore-team-of-the-week", "parameters": [ { - "description": "Numeric SofaScore manager id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "794873" + "x-example": "17" }, { - "description": "Zero-based page number", + "description": "Numeric SofaScore season id", "in": "query", - "name": "page", - "type": "integer", - "x-example": 0 + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" + }, + { + "description": "Numeric period id from sofascore-team-of-the-week-periods", + "in": "query", + "name": "period", + "required": true, + "type": "string", + "x-example": "29321" } ], "produces": [ @@ -469534,7 +484962,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.managerEventsResponseDoc" + "$ref": "#/definitions/sofascore.teamOfTheWeekResponseDoc" } }, "400": { @@ -469567,49 +484995,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore manager recent matches", + "summary": "SofaScore team of the week", "tags": [ "SofaScore" ] } }, - "/sofascore/mma-card": { + "/sofascore/team-of-the-week-periods": { "get": { "consumes": [ "application/json" ], - "description": "Returns the bouts of one MMA fight card, main event first, narrowed with `part` to `all` bouts, the `maincard`, the `prelims` or the `earlyprelims`. Each bout has the fighters (country, nickname, ranking where 0 is the champion, record), weight class, scheduled rounds, status, and for finished bouts the winner, win type, final round and fight time. Get `org_id` and `card_id` from sofascore-mma-schedule. Returns 404 when the card is unknown or has no bouts in that segment (for example a card without early prelims).", - "operationId": "sofascore-mma-card", + "description": "Lists the periods of a competition season for which SofaScore published a team of the week, newest first: league rounds (`round`), weekly time spans (`timespan`) and season-level selections (`season`, such as an NBA regular season or playoff team). Use a returned period `id` with sofascore-team-of-the-week. An empty list is valid when no team of the week has been published yet. Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-team-of-the-week-periods", "parameters": [ { - "description": "Numeric SofaScore MMA organisation id", - "in": "query", - "name": "org_id", - "required": true, - "type": "string", - "x-example": "19906" - }, - { - "description": "Numeric card id (card_id) from sofascore-mma-schedule", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", - "name": "card_id", + "name": "id", "required": true, "type": "string", - "x-example": "197311" + "x-example": "17" }, { - "description": "Which segment of the card to return", - "enum": [ - "all", - "maincard", - "prelims", - "earlyprelims" - ], + "description": "Numeric SofaScore season id", "in": "query", - "name": "part", + "name": "season", "required": true, "type": "string", - "x-example": "all" + "x-example": "96668" } ], "produces": [ @@ -469619,7 +485033,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.mmaCardResponseDoc" + "$ref": "#/definitions/sofascore.teamOfTheWeekPeriodsResponseDoc" } }, "400": { @@ -469652,35 +485066,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore MMA card", + "summary": "SofaScore team of the week periods", "tags": [ "SofaScore" ] } }, - "/sofascore/mma-schedule": { + "/sofascore/team-performance": { "get": { "consumes": [ "application/json" ], - "description": "Returns the main event of every fight card an MMA organisation holds in one calendar month, with the card id and name, fighters (country, nickname, ranking where 0 is the champion, record), weight class, scheduled rounds, status, and for finished fights the winner, win type and final round. Find organisation ids (UFC 19906, PFL 19910, ONE 20269, Rizin 19905, Fight Nation Championship 20463, KSW 19946, OKTAGON 20258, Absolute Championship Akhmat 20254, Cage Warriors 19909, Dana White's Contender Series 20264, Brave CF 20267, Jungle Fight 20253) with sofascore-categories (sport `mma`) and sofascore-category-tournaments (category 1708). Use the `card_id` with sofascore-mma-card to read every bout. Returns 404 when the organisation has no card in that month or the id is not an MMA organisation.", - "operationId": "sofascore-mma-schedule", + "description": "Returns a team's most recent matches (about ten, oldest first) with SofaScore's per-match performance value in `points`: higher is better and a heavy defeat is negative. An event SofaScore gave no value for has no `points`. An empty `events` list is a valid response for a team with no recent matches.", + "operationId": "sofascore-team-performance", "parameters": [ { - "description": "Numeric SofaScore MMA organisation id", - "in": "query", - "name": "org_id", - "required": true, - "type": "string", - "x-example": "19906" - }, - { - "description": "Calendar month as YYYY-MM", + "description": "Numeric SofaScore team id", "in": "query", - "name": "month", + "name": "id", "required": true, "type": "string", - "x-example": "2026-10" + "x-example": "17" } ], "produces": [ @@ -469690,7 +485096,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.mmaScheduleResponseDoc" + "$ref": "#/definitions/sofascore.teamPerformanceResponseDoc" } }, "400": { @@ -469723,53 +485129,57 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore MMA schedule", + "summary": "SofaScore team recent performance", "tags": [ "SofaScore" ] } }, - "/sofascore/odds-dropping": { + "/sofascore/team-player-statistics": { "get": { "consumes": [ "application/json" ], - "description": "Returns SofaScore's dropping odds list for a sport: about twenty upcoming events whose odds moved most, each as the usual event summary plus the `choice_name` and `percentage` SofaScore reports for the move (returned as supplied) and the market with opening and current prices (`change` is 1 above the opening price, -1 below it, 0 unchanged). The `sport` enum accepts `all` and the SofaScore sport keys; it defaults to `all`. A sport with no qualifying events at the moment (for example esports when probed) returns 404.", - "operationId": "sofascore-odds-dropping", + "description": "Returns the statistics of every player in a team's squad for one competition season, each as a snake_case metric map (appearances, minutes, rating, goals, assists, passing and duel metrics for football; points, rebounds and assists for basketball), in SofaScore's order. The `type` enum accepts `overall`, `home`, `away`, `regular_season` and `playoffs` and defaults to `overall`; only the types listed for that season by team-player-statistics-seasons exist (football `overall`, `home`, `away`; NBA `regular_season`, `playoffs`). A metric SofaScore did not record is omitted rather than returned as 0. Returns 404 when SofaScore has no statistics of that type for the combination.", + "operationId": "sofascore-team-player-statistics", "parameters": [ { - "description": "Sport key, or all for every sport. Defaults to all", + "description": "Numeric SofaScore team id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", + "in": "query", + "name": "tournament_id", + "required": true, + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id from team-player-statistics-seasons", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" + }, + { + "default": "overall", + "description": "Statistics view", "enum": [ - "all", - "american-football", - "aussie-rules", - "badminton", - "bandy", - "baseball", - "basketball", - "beach-volley", - "cricket", - "darts", - "esports", - "floorball", - "football", - "futsal", - "handball", - "ice-hockey", - "mma", - "minifootball", - "padel", - "rugby", - "snooker", - "table-tennis", - "tennis", - "volleyball", - "waterpolo" + "overall", + "home", + "away", + "regular_season", + "playoffs" ], "in": "query", - "name": "sport", - "type": "string", - "x-example": "football" + "name": "type", + "type": "string" } ], "produces": [ @@ -469779,7 +485189,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.oddsDroppingResponseDoc" + "$ref": "#/definitions/sofascore.teamPlayerStatisticsResponseDoc" } }, "400": { @@ -469812,53 +485222,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore dropping odds", + "summary": "SofaScore team player statistics", "tags": [ "SofaScore" ] } }, - "/sofascore/odds-winning": { + "/sofascore/team-player-statistics-seasons": { "get": { "consumes": [ "application/json" ], - "description": "Returns SofaScore's winning odds list for a sport: about twenty upcoming events whose favourite SofaScore highlights, each as the usual event summary plus `winning_odds` (fractional), the `expected` and `actual` percentages SofaScore reports for it (returned as supplied) and the full-time market with opening and current prices (`change` is 1 above the opening price, -1 below it, 0 unchanged). The `sport` enum accepts `all` and the SofaScore sport keys; it defaults to `all`. A sport with no qualifying events at the moment (for example baseball, cricket and esports when probed) returns 404.", - "operationId": "sofascore-odds-winning", + "description": "Lists the competitions and seasons for which SofaScore has per-player statistics for a team, with the statistics `types` available in each season (`overall`, `home`, `away`, `regular_season`, `playoffs`). Use it to find the `tournament_id`, `season` and `type` accepted by team-player-statistics and team-top-players. Football teams offer `overall`, `home` and `away`; NBA teams offer `regular_season` and `playoffs`. Returns 404 when SofaScore has no player statistics for the team.", + "operationId": "sofascore-team-player-statistics-seasons", "parameters": [ { - "description": "Sport key, or all for every sport. Defaults to all", - "enum": [ - "all", - "american-football", - "aussie-rules", - "badminton", - "bandy", - "baseball", - "basketball", - "beach-volley", - "cricket", - "darts", - "esports", - "floorball", - "football", - "futsal", - "handball", - "ice-hockey", - "mma", - "minifootball", - "padel", - "rugby", - "snooker", - "table-tennis", - "tennis", - "volleyball", - "waterpolo" - ], + "description": "Numeric SofaScore team id", "in": "query", - "name": "sport", + "name": "id", + "required": true, "type": "string", - "x-example": "football" + "x-example": "17" } ], "produces": [ @@ -469868,7 +485252,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.oddsWinningResponseDoc" + "$ref": "#/definitions/sofascore.teamPlayerStatisticsSeasonsResponseDoc" } }, "400": { @@ -469901,27 +485285,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore winning odds", + "summary": "SofaScore team player statistics seasons", "tags": [ "SofaScore" ] } }, - "/sofascore/player": { + "/sofascore/team-players": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SofaScore player by numeric `id`: name, short name, position, jersey number, date of birth, height, preferred foot, country, market value and currency, and the current team. `deceased` is `true` for historical players. An unknown or malformed id returns an upstream error.", - "operationId": "sofascore-player", + "description": "Returns a team's full squad from SofaScore by team id: each player's name, position, jersey number, date of birth, height, country and preferred foot, plus SofaScore's market value estimate and its currency when available.", + "operationId": "sofascore-team-players", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "855833" + "x-example": "2817" } ], "produces": [ @@ -469931,7 +485315,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerResponseDoc" + "$ref": "#/definitions/sofascore.teamPlayersResponseDoc" } }, "400": { @@ -469964,27 +485348,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player detail", + "summary": "SofaScore team players", "tags": [ "SofaScore" ] } }, - "/sofascore/player-attributes": { + "/sofascore/team-rankings": { "get": { "consumes": [ "application/json" ], - "description": "Returns a football player's attribute scores (0 to 100) for the current year and up to three earlier years (`year_shift` 0 to 3), the average scores for the player's position, and the player's characteristics: playing positions plus strengths and weaknesses, each with SofaScore's numeric `code`, a `key` and `name` such as finishing or aerial duels, and a `rank`. Outfield players carry attacking, technical, tactical, defending and creativity scores; goalkeepers carry saves, anticipation, ball_distribution, aerial and tactical. Combines two SofaScore requests. Returns 404 for players without attribute overviews, which includes non-football players.", - "operationId": "sofascore-player-attributes", + "description": "Returns every ranking a team or tennis player appears in: for a tennis player the ATP or WTA ranking, its live version and the UTR rating, for a football club the UEFA club coefficient by year. Each ranking carries its `type_id` (the same ids the rankings endpoint takes), name, sport, category and last update, and `rows` with the `position`, `points`, previous and best position where SofaScore reports them. Returns 404 when the id appears in no ranking.", + "operationId": "sofascore-team-rankings", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id (a tennis player id for tennis)", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "112783" } ], "produces": [ @@ -469994,7 +485378,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerAttributesResponseDoc" + "$ref": "#/definitions/sofascore.teamRankingsResponseDoc" } }, "400": { @@ -470027,35 +485411,57 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player attributes and characteristics", + "summary": "SofaScore team rankings", "tags": [ "SofaScore" ] } }, - "/sofascore/player-events": { + "/sofascore/team-season-statistics": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page (30 matches) of a player's matches, each with the player's own numbers merged in: `statistics` (football: rating and minutes_played; basketball: points, rebounds, assists and more), `incident_counts` (goals, assists, yellow and red cards, penalty goals), `on_bench` for an unused substitute and `played_for_team_id` (club or national team). Page 0 is the most recent window and can include upcoming fixtures (status type `notstarted`); matches inside a page run oldest first. Follow `has_next_page` for older pages; a page past the end returns 404.", - "operationId": "sofascore-player-events", + "description": "Returns a team's statistics for one competition season (goals, shots, passing, duels, discipline, and the matching conceded-side metrics) as a snake_case metric map. The `type` enum accepts `overall`, `home`, `away`, `regular_season`, and `playoffs` and defaults to `overall`; only the types listed for that season by team-statistics-seasons exist (football teams have `overall` only; basketball, ice hockey and baseball teams have `regular_season` and `playoffs`). Returns 404 when SofaScore has no statistics of that type for the combination.", + "operationId": "sofascore-team-season-statistics", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "17" }, { - "description": "Zero-based page number. Defaults to 0", + "description": "Numeric SofaScore unique-tournament (competition) id from team-statistics-seasons", + "in": "query", + "name": "tournament_id", + "required": true, + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id from team-statistics-seasons", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" + }, + { + "default": "overall", + "description": "Statistics view", + "enum": [ + "overall", + "home", + "away", + "regular_season", + "playoffs" + ], "in": "query", - "minimum": 0, - "name": "page", - "type": "integer", - "x-example": 0 + "name": "type", + "type": "string" } ], "produces": [ @@ -470065,7 +485471,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerEventsResponseDoc" + "$ref": "#/definitions/sofascore.teamSeasonStatisticsResponseDoc" } }, "400": { @@ -470098,27 +485504,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player matches with per-match numbers", + "summary": "SofaScore team season statistics", "tags": [ "SofaScore" ] } }, - "/sofascore/player-last-year-summary": { + "/sofascore/team-statistics-seasons": { "get": { "consumes": [ "application/json" ], - "description": "Returns a player's form timeline over roughly the last year: `summary` entries, each with a `type`, a date and (where it applies) a competition. `event` is a rated match (the rating is in `value` as published and as a number in `rating`, the competition in `tournament_id`); `injury` is an injury period whose `value` is an opaque number; `missing` is a match the player missed; `transfer` is a transfer date. `tournaments` describes the competitions referenced. An empty `summary` is a valid response for a player with no rated appearance in the period.", - "operationId": "sofascore-player-last-year-summary", + "description": "Lists the competitions and seasons a team has statistics for, with the statistics `types` available for each season. Use a returned competition id (`unique_tournament_id`), season `id` and one of its `types` with team-season-statistics. The `types` values are `overall`, `home`, `away`, `regular_season`, and `playoffs`. Returns 404 for teams with no tracked statistics.", + "operationId": "sofascore-team-statistics-seasons", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "17" } ], "produces": [ @@ -470128,7 +485534,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerLastYearSummaryResponseDoc" + "$ref": "#/definitions/sofascore.teamStatisticsSeasonsResponseDoc" } }, "400": { @@ -470161,27 +485567,64 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player form over the last year", + "summary": "SofaScore team statistics seasons", "tags": [ "SofaScore" ] } }, - "/sofascore/player-national-team-statistics": { + "/sofascore/team-top-players": { "get": { "consumes": [ "application/json" ], - "description": "Returns a player's national team record: for each national team the appearances, goals and debut date. An empty `teams` list is a valid response for a player who never played internationally.", - "operationId": "sofascore-player-national-team-statistics", + "description": "Returns a team's best players for every statistic category SofaScore ranks within the team and season (rating, goals, assists, expected goals, tackles, saves and more for football; points, rebounds and assists for basketball), each as a ranked list with player, team and value. The category set depends on the sport, so the response lists every category it holds. The `type` enum accepts `overall`, `regular_season` and `playoffs`: football competitions publish `overall`, the NBA publishes `regular_season` and `playoffs`, and a type the competition does not publish answers 404. Optional `limit` caps the rows per category (up to 50); the payload is large without it.", + "operationId": "sofascore-team-top-players", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "17" + }, + { + "description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", + "in": "query", + "name": "tournament_id", + "required": true, + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id from team-player-statistics-seasons", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" + }, + { + "default": "overall", + "description": "Statistics scope", + "enum": [ + "overall", + "regular_season", + "playoffs" + ], + "in": "query", + "name": "type", + "type": "string" + }, + { + "description": "Rows per category, 1 to 50. Omit to return every row", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "limit", + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -470191,7 +485634,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerNationalTeamStatisticsResponseDoc" + "$ref": "#/definitions/sofascore.teamTopPlayersResponseDoc" } }, "400": { @@ -470224,27 +485667,34 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player national team record", + "summary": "SofaScore team top players", "tags": [ "SofaScore" ] } }, - "/sofascore/player-penalty-history": { + "/sofascore/team-tournaments": { "get": { "consumes": [ "application/json" ], - "description": "Returns the penalties a player has taken, newest first: the totals (`attempts`, `scored`) and, per penalty, the outcome (`goal`, `miss`, `post` or `save`), the zone of the goal (for example `low-right`, `high-left`, `close-high`), the x and y position in the goal mouth on SofaScore's 0 to 100 scale, the expected-goals value when available and the match. Returns 404 for players with no recorded penalties, such as most goalkeepers and defenders.", - "operationId": "sofascore-player-penalty-history", + "description": "Lists the competitions a team plays in, each with id, name, slug, category and sport. By default (`all=false`) it returns the competitions the team currently takes part in; with `all=true` it returns every competition the team has been recorded in, including friendlies and older tournaments. Competition ids can be used as `tournament_id` elsewhere in the SofaScore endpoints; use team-player-statistics-seasons for the seasons that have statistics. Returns 404 when SofaScore has no competitions for the team.", + "operationId": "sofascore-team-tournaments", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "17" + }, + { + "default": false, + "description": "false returns current competitions, true returns every recorded competition", + "in": "query", + "name": "all", + "type": "boolean" } ], "produces": [ @@ -470254,7 +485704,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerPenaltyHistoryResponseDoc" + "$ref": "#/definitions/sofascore.teamTournamentsResponseDoc" } }, "400": { @@ -470287,57 +485737,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player penalty history", + "summary": "SofaScore team competitions", "tags": [ "SofaScore" ] } }, - "/sofascore/player-ratings": { + "/sofascore/team-transfers": { "get": { "consumes": [ "application/json" ], - "description": "Returns a player's rating in every match of one competition season, newest first, with the opponent, home or away and the match. The `type` enum accepts `overall`, `home`, `away`, `regular_season` and `playoffs` and defaults to `overall`; football seasons answer `overall` and NBA seasons answer `regular_season` and `playoffs` (the types a season offers are listed by player-statistics-seasons). Returns 404 when SofaScore has no ratings of that type for the combination.", - "operationId": "sofascore-player-ratings", + "description": "Returns a team's recent incoming (`transfers_in`) and outgoing (`transfers_out`) transfers with player, clubs, date, fee, and SofaScore's numeric transfer type code. Empty lists are valid for a quiet transfer window. Returns 404 when SofaScore has no transfer record for the team (seen for ice hockey and baseball teams). The `type_code` values are SofaScore's own opaque codes and are not translated.", + "operationId": "sofascore-team-transfers", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" - }, - { - "description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", - "in": "query", - "name": "tournament_id", - "required": true, - "type": "string", "x-example": "17" - }, - { - "description": "Numeric SofaScore season id from player-statistics-seasons", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "76986" - }, - { - "default": "overall", - "description": "Statistics view", - "enum": [ - "overall", - "home", - "away", - "regular_season", - "playoffs" - ], - "in": "query", - "name": "type", - "type": "string" } ], "produces": [ @@ -470347,7 +485767,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerRatingsResponseDoc" + "$ref": "#/definitions/sofascore.teamTransfersResponseDoc" } }, "400": { @@ -470380,43 +485800,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player match ratings for a season", + "summary": "SofaScore team transfers", "tags": [ "SofaScore" ] } }, - "/sofascore/player-season-heatmap": { + "/sofascore/tennis-player-grand-slam-results": { "get": { "consumes": [ "application/json" ], - "description": "Returns a football player's aggregated touch locations over one competition season: `points` with an `x`, `y` and touch `count` on SofaScore's 0-100 pitch scale, the number of `matches` behind it and the matched `events`. Get `tournament_id` and `season` from player-statistics-seasons. The response is large for a full league season. Returns 404 when SofaScore has no heatmap for that player, competition and season, which includes sports other than football and seasons the player did not play.", - "operationId": "sofascore-player-season-heatmap", + "description": "Returns a tennis player's best round at each grand slam (Australian Open, Roland Garros, Wimbledon and US Open) for the last five editions: per edition the `year`, the `season_id`, the best `round` reached and whether the player won it (`winner`). A year without a `round` means no result is recorded for that edition. `id` is the SofaScore team id of a tennis player (tennis players are teams in SofaScore); get it from search or rankings. Returns 404 for ids that are not tennis players.", + "operationId": "sofascore-tennis-player-grand-slam-results", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore team id of a tennis player", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" - }, - { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "tournament_id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "76986" + "x-example": "14882" } ], "produces": [ @@ -470426,7 +485830,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerSeasonHeatmapResponseDoc" + "$ref": "#/definitions/sofascore.tennisGrandSlamResultsResponseDoc" } }, "400": { @@ -470459,57 +485863,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player season heatmap", + "summary": "SofaScore tennis player grand slam results", "tags": [ "SofaScore" ] } }, - "/sofascore/player-season-statistics": { + "/sofascore/tournament-cuptree": { "get": { "consumes": [ "application/json" ], - "description": "Returns a player's statistics for one competition season (appearances, rating, goals, assists, passing, duels, and more) as a snake_case metric map, plus the team and a rating breakdown when available. The `type` enum accepts `overall`, `home`, `away`, `regular_season`, and `playoffs` and defaults to `overall`; only the types listed for that season by player-statistics-seasons exist (football players have `overall`, `home`, `away`; basketball, ice hockey and baseball players have `regular_season` and `playoffs`). Returns 404 when SofaScore has no statistics of that type for the combination.", - "operationId": "sofascore-player-season-statistics", + "description": "Returns the knockout tree(s) of a cup or playoff competition season: every round with its ties, each tie's participants (team or player, seed, winner flag, the earlier tie it advanced from), result and score strings (a shoot-out is appended, such as `1 (4)`), match ids and start time, plus the final and third-place tie. Tennis competitions return two trees (main draw and qualifying). League seasons have no tree and answer 404, as does a season id that does not belong to the competition. Get `id` from search or tournaments-with-feature and `season` from tournament-seasons; pass the returned `event_ids` to the event endpoints.", + "operationId": "sofascore-tournament-cuptree", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" - }, - { - "description": "Numeric SofaScore unique-tournament (competition) id from player-statistics-seasons", - "in": "query", - "name": "tournament_id", - "required": true, - "type": "string", - "x-example": "17" + "x-example": "7" }, { - "description": "Numeric SofaScore season id from player-statistics-seasons", + "description": "Numeric SofaScore season id", "in": "query", "name": "season", "required": true, "type": "string", - "x-example": "96668" - }, - { - "default": "overall", - "description": "Statistics view", - "enum": [ - "overall", - "home", - "away", - "regular_season", - "playoffs" - ], - "in": "query", - "name": "type", - "type": "string" + "x-example": "76953" } ], "produces": [ @@ -470519,7 +485901,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerSeasonStatisticsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentCupTreeResponseDoc" } }, "400": { @@ -470552,45 +485934,34 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player season statistics", + "summary": "SofaScore competition knockout tree", "tags": [ "SofaScore" ] } }, - "/sofascore/player-statistical-rankings": { + "/sofascore/tournament-info": { "get": { "consumes": [ "application/json" ], - "description": "Returns where a football player ranks against every other player of the competition season for about 78 statistics (goals, assists, rating, expected goals, passes, duels, distance covered and more): the `value`, the `rank` (tied values share a rank), the number of ranked players (`count`) and the tie-broken `order`. Statistics are snake_case and sorted alphabetically. The `type` enum accepts only `overall`, which is also the default; the other statistics views answer 404. Returns 404 for players without a ranking in that season, which includes basketball players.", - "operationId": "sofascore-player-statistical-rankings", + "description": "Returns a competition's metadata (name, sport, category, tier, title holder, most titles, current season dates, divisions above and below, linked competitions). When `season` is given it also returns that season's aggregates: number of competitors and, for football competitions, goals, home wins, away wins, draws, yellow and red cards and the promoted teams. Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-tournament-info", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "17" }, { - "description": "Numeric SofaScore season id from player-statistics-seasons", + "description": "Numeric SofaScore season id. Omit for competition metadata only", "in": "query", "name": "season", - "required": true, "type": "string", "x-example": "96668" - }, - { - "default": "overall", - "description": "Statistics view", - "enum": [ - "overall" - ], - "in": "query", - "name": "type", - "type": "string" } ], "produces": [ @@ -470600,7 +485971,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerStatisticalRankingsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentInfoResponseDoc" } }, "400": { @@ -470633,27 +486004,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player ranking among all players in a season", + "summary": "SofaScore competition info", "tags": [ "SofaScore" ] } }, - "/sofascore/player-statistics-seasons": { + "/sofascore/tournament-player-of-the-season": { "get": { "consumes": [ "application/json" ], - "description": "Lists the competitions and seasons a player has statistics for, with the statistics `types` available for each season. Use a returned competition id (`unique_tournament_id`), season `id` and one of its `types` with player-season-statistics. The `types` values are `overall`, `home`, `away`, `regular_season`, and `playoffs`. Returns 404 for players with no tracked statistics (for example tennis players).", - "operationId": "sofascore-player-statistics-seasons", + "description": "Returns the player SofaScore names player of the season for a finished competition season: the player, their team, shirt number, average rating, appearances and the statistics scope (`overall`, or `regular_season` for the NBA). A season that is still running, has not been awarded, or does not belong to the competition answers 404. Get `id` from search and `season` from tournament-seasons or tournament-winners.", + "operationId": "sofascore-tournament-player-of-the-season", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id of a finished season", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "76986" } ], "produces": [ @@ -470663,7 +486042,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerStatisticsSeasonsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentPlayerOfTheSeasonResponseDoc" } }, "400": { @@ -470696,27 +486075,177 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player statistics seasons", + "summary": "SofaScore player of the season", "tags": [ "SofaScore" ] } }, - "/sofascore/player-tournaments": { + "/sofascore/tournament-player-statistics": { "get": { "consumes": [ "application/json" ], - "description": "Lists every competition a player has played in, with id, name, slug, category, sport and gender. It includes competitions without season statistics (cups, friendlies, all-star games) that player-statistics-seasons leaves out. Returns 404 when SofaScore has no competitions for the player.", - "operationId": "sofascore-player-tournaments", + "description": "Returns one page of a football competition season's player statistics table, sortable by a statistic. `order` chooses the statistic to sort by, `direction` the sort direction (`desc` or `asc`), `accumulation` whether values are season totals, per-game averages or per-90-minute averages (`total`, `perGame`, `per90`), and `group` which statistic columns each row carries (`summary`, `attack`, `defence`, `passing`, `goalkeeper`). Page with `limit` (up to 100) and `offset`; `has_next_page` shows whether more rows follow. Optional filters narrow the table: `team` (team ids), `nationality` (SofaScore nationality codes), `position` (`G`, `D`, `M`, `F`), `min_appearances` and `min_minutes`; several filters combine (AND) and several values of one filter are alternatives (OR). The team ids and nationality codes of a season come from tournament-statistics-info. A filter that matches nobody returns an empty `players` list. Other sports return no rows (404). Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-tournament-player-statistics", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" + }, + { + "description": "Statistic to sort by. Defaults to rating", + "enum": [ + "rating", + "goals", + "expectedGoals", + "assists", + "successfulDribbles", + "tackles", + "accuratePassesPercentage", + "bigChancesMissed", + "totalShots", + "goalConversionPercentage", + "interceptions", + "clearances", + "errorLeadToGoal", + "outfielderBlocks", + "bigChancesCreated", + "accuratePasses", + "keyPasses", + "saves", + "cleanSheet", + "penaltySave", + "savedShotsFromInsideTheBox", + "runsOut" + ], + "in": "query", + "name": "order", + "type": "string", + "x-example": "goals" + }, + { + "description": "Sort direction. Defaults to desc", + "enum": [ + "desc", + "asc" + ], + "in": "query", + "name": "direction", + "type": "string", + "x-example": "desc" + }, + { + "description": "How statistics are accumulated. Defaults to total", + "enum": [ + "total", + "perGame", + "per90" + ], + "in": "query", + "name": "accumulation", + "type": "string", + "x-example": "total" + }, + { + "description": "Statistic columns returned. Defaults to summary", + "enum": [ + "summary", + "attack", + "defence", + "passing", + "goalkeeper" + ], + "in": "query", + "name": "group", + "type": "string", + "x-example": "summary" + }, + { + "description": "Rows per page, 1 to 100. Defaults to 20", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Rows to skip. Defaults to 0", + "in": "query", + "minimum": 0, + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "collectionFormat": "csv", + "description": "Team ids to keep, comma separated, up to 20 (ids from tournament-statistics-info or tournament-teams)", + "in": "query", + "items": { + "type": "string" + }, + "name": "team", + "type": "array", + "x-example": "42" + }, + { + "collectionFormat": "csv", + "description": "Nationality codes to keep, comma separated, up to 20 (codes from tournament-statistics-info)", + "in": "query", + "items": { + "type": "string" + }, + "name": "nationality", + "type": "array", + "x-example": "EN" + }, + { + "collectionFormat": "csv", + "description": "Position codes to keep, comma separated", + "in": "query", + "items": { + "enum": [ + "G", + "D", + "M", + "F" + ], + "type": "string" + }, + "name": "position", + "type": "array", + "x-example": "F" + }, + { + "description": "Keep players with at least this many appearances, 0 to 1000. Omit for no minimum", + "in": "query", + "maximum": 1000, + "minimum": 0, + "name": "min_appearances", + "type": "integer", + "x-example": 10 + }, + { + "description": "Keep players with at least this many minutes played, 0 to 100000. Omit for no minimum", + "in": "query", + "maximum": 100000, + "minimum": 0, + "name": "min_minutes", + "type": "integer", + "x-example": 900 } ], "produces": [ @@ -470726,7 +486255,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerTournamentsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentPlayerStatisticsResponseDoc" } }, "400": { @@ -470759,27 +486288,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player competitions", + "summary": "SofaScore season player statistics table", "tags": [ "SofaScore" ] } }, - "/sofascore/player-transfers": { + "/sofascore/tournament-rounds": { "get": { "consumes": [ "application/json" ], - "description": "Returns a player's transfer history (clubs moved from and to, date, fee, and SofaScore's numeric transfer type code), newest first. An empty `transfers` list is a valid response for a player who has never moved clubs. Returns 404 when SofaScore has no transfer record for the player (seen for ice hockey and baseball players). The `type_code` values are SofaScore's own opaque codes and are not translated.", - "operationId": "sofascore-player-transfers", + "description": "Returns the rounds of a competition season and the current round. Round numbers are not unique in cups: the UEFA Champions League has both a qualifying and a league-phase round 1, and the same playoff round number with and without a `prefix`. To fetch a round's fixtures, pass its `round` to round-events together with its `slug` and, when present, its `prefix`; knockout and named rounds return 404 from round-events without the slug. Plain numbered rounds (a league's round 1 to 38) have no slug. Get `id` from category-tournaments or search and `season` from tournament-seasons. Returns 404 when SofaScore has no rounds for the season (for example a season that has not started).", + "operationId": "sofascore-tournament-rounds", "parameters": [ { - "description": "Numeric SofaScore player id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "839956" + "x-example": "7" + }, + { + "description": "Numeric SofaScore season id from tournament-seasons", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "76953" } ], "produces": [ @@ -470789,7 +486326,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.playerTransfersResponseDoc" + "$ref": "#/definitions/sofascore.tournamentRoundsResponseDoc" } }, "400": { @@ -470822,111 +486359,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player transfer history", - "tags": [ - "SofaScore" - ] - } - }, - "/sofascore/ranking-types": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Lists every ranking available from the sofascore rankings endpoint: the numeric `type` id, a descriptive name, the sport, the gender and the kind of entity that is ranked (`team`, `player` or `unique_tournament`). Covers 32 rankings across football (league coefficients, FIFA national teams, club coefficients), rugby, tennis (ATP and WTA official and live rankings, UTR), padel and MMA (UFC and Fight Nation Championship divisions). The catalogue is a fixed list and costs no upstream request.", - "operationId": "sofascore-ranking-types", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/sofascore.rankingTypesResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "SofaScore ranking catalogue", + "summary": "SofaScore competition season rounds", "tags": [ "SofaScore" ] } }, - "/sofascore/rankings": { + "/sofascore/tournament-seasons": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SofaScore ranking list: the rank, previous rank, points and the ranked team, player or competition, plus when the list was last updated. Choose the `type` id from sofascore-ranking-types, for example 5 for the ATP men's singles ranking or 2 for the FIFA men's national team ranking. Optional `limit` returns only the first rows of long lists (tennis lists hold 500 rows). MMA division rankings use rank 0 for the reigning champion.", - "operationId": "sofascore-rankings", + "description": "Returns the season list for a competition. Use a returned season id with the standings and round-events endpoints.", + "operationId": "sofascore-tournament-seasons", "parameters": [ { - "description": "Ranking id from sofascore-ranking-types", - "enum": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 34, - 35, - 36, - 37, - 40, - 41, - 42, - 43, - 44, - 45, - 46 - ], + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", - "name": "type", + "name": "id", "required": true, - "type": "integer", - "x-example": 5 - }, - { - "description": "Return only the first N rows, 1 to 500. Omit to return every row", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "limit", - "type": "integer", - "x-example": 10 + "type": "string", + "x-example": "17" } ], "produces": [ @@ -470936,7 +486389,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.rankingsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentSeasonsResponseDoc" } }, "400": { @@ -470945,6 +486398,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -470963,27 +486422,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore rankings", + "summary": "SofaScore competition seasons", "tags": [ "SofaScore" ] } }, - "/sofascore/referee": { + "/sofascore/tournament-statistics-info": { "get": { "consumes": [ "application/json" ], - "description": "Returns a referee's profile: name, country, sport, career matches officiated and career yellow, red and yellow-red card totals, plus date of birth and first league debut when SofaScore records them. Get the referee id from the `referee.id` of the sofascore-event endpoint or from a sofascore-search result of type referee. Returns 404 for an unknown id.", - "operationId": "sofascore-referee", + "description": "Returns what the tournament-player-statistics table of a football competition season can be filtered by: the season's teams (ids for the `team` filter), the nationality codes (for the `nationality` filter; SofaScore uses `EN`, `SX`, `WA` and `NX` for the home nations), the position codes `G`, `D`, `M` and `F` (for the `position` filter), and the statistic columns of each `group` value (`summary`, `attack`, `defence`, `passing`, `goalkeeper`). Other sports answer 404. Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-tournament-statistics-info", "parameters": [ { - "description": "Numeric SofaScore referee id", + "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "74264" + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" } ], "produces": [ @@ -470993,7 +486460,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.refereeResponseDoc" + "$ref": "#/definitions/sofascore.tournamentStatisticsInfoResponseDoc" } }, "400": { @@ -471026,35 +486493,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore referee profile", + "summary": "SofaScore player statistics table filters", "tags": [ "SofaScore" ] } }, - "/sofascore/referee-events": { + "/sofascore/tournament-team-of-the-season": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page (30 matches) of the matches a referee officiated, most recent first, across every competition. Follow `has_next_page` for older pages; a page past the end returns 404. Only past matches exist (no upcoming list), and the list includes canceled and postponed fixtures (their `status.type` says so), which the career match total of sofascore-referee does not count.", - "operationId": "sofascore-referee-events", + "description": "Returns the team of the season SofaScore selected for a finished competition season: the formation, when it was created and the selected players (11 in football, 5 in basketball) with position, shirt number, team and average rating. A season that is still running, has no selection, or does not belong to the competition answers 404. Get `id` from search and `season` from tournament-seasons or tournament-winners.", + "operationId": "sofascore-tournament-team-of-the-season", "parameters": [ { - "description": "Numeric SofaScore referee id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "74264" + "x-example": "17" }, { - "description": "Zero-based page number. Defaults to 0", + "description": "Numeric SofaScore season id of a finished season", "in": "query", - "minimum": 0, - "name": "page", - "type": "integer", - "x-example": 0 + "name": "season", + "required": true, + "type": "string", + "x-example": "76986" } ], "produces": [ @@ -471064,7 +486531,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.refereeEventsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentTeamOfTheSeasonResponseDoc" } }, "400": { @@ -471097,27 +486564,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore referee officiated matches", + "summary": "SofaScore team of the season", "tags": [ "SofaScore" ] } }, - "/sofascore/referee-statistics": { + "/sofascore/tournament-teams": { "get": { "consumes": [ "application/json" ], - "description": "Returns a referee's record per competition: matches officiated, yellow cards, red cards, yellow-red cards and penalties awarded. The per-competition appearances add up to the career matches in sofascore-referee. An empty `competitions` list is valid for a referee with no recorded competitions.", - "operationId": "sofascore-referee-statistics", + "description": "Returns every team (or, for tennis and other individual sports, every player) entered in a competition season, with id, name, short name, name code, country, gender, type (`0` team, `1` individual player) and, for individual players, the current ranking. Use the team ids with team, team-players and the `team` filter of tournament-player-statistics. A season id that does not belong to the competition, or a field not yet decided, answers 404. Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-tournament-teams", "parameters": [ { - "description": "Numeric SofaScore referee id", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "74264" + "x-example": "17" + }, + { + "description": "Numeric SofaScore season id", + "in": "query", + "name": "season", + "required": true, + "type": "string", + "x-example": "96668" } ], "produces": [ @@ -471127,7 +486602,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.refereeStatisticsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentTeamsResponseDoc" } }, "400": { @@ -471160,19 +486635,19 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore referee card statistics", + "summary": "SofaScore teams of a competition season", "tags": [ "SofaScore" ] } }, - "/sofascore/round-events": { + "/sofascore/tournament-top-players": { "get": { "consumes": [ "application/json" ], - "description": "Returns fixtures for one round of a competition season. Get `id` from search or category-tournaments, `season` from tournament-seasons, and the round values from tournament-rounds. Round numbers are not unique in cups, and knockout or named rounds return 404 unless the round's `slug` is passed (plus its `prefix` when tournament-rounds lists one): the UEFA Champions League has a qualifying and a league-phase round 1, and a playoff round 636 both with the `Qualification` prefix and without. Plain numbered league rounds need only `round`. `slug` is lowercase letters, digits, and hyphens (up to 64 characters); `prefix` is letters, digits, spaces, and hyphens (up to 64 characters) and is only valid together with `slug`.", - "operationId": "sofascore-round-events", + "description": "Returns a competition season's top players for every statistic category SofaScore ranks (for football about 30 categories such as rating, goals, assists, expected goals, tackles and saves; for basketball points, rebounds, assists and more), each with the ranked players, their team and the value. The category set depends on the sport and competition, so the response lists every category it holds. The `type` enum accepts `overall`, `regular_season` and `playoffs`: football competitions publish `overall`, the NBA publishes `regular_season` and `playoffs`, and a type the competition does not publish answers 404. Optional `limit` caps the rows per category (up to 50). Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-tournament-top-players", "parameters": [ { "description": "Numeric SofaScore unique-tournament (competition) id", @@ -471188,29 +486663,28 @@ "name": "season", "required": true, "type": "string", - "x-example": "76986" - }, - { - "description": "Round number", - "in": "query", - "name": "round", - "required": true, - "type": "integer", - "x-example": 1 + "x-example": "96668" }, { - "description": "Round slug from tournament-rounds, for example round-of-16; required for knockout and named cup rounds", + "description": "Statistics scope. Defaults to overall", + "enum": [ + "overall", + "regular_season", + "playoffs" + ], "in": "query", - "name": "slug", + "name": "type", "type": "string", - "x-example": "round-of-16" + "x-example": "overall" }, { - "description": "Round prefix from tournament-rounds, for example Qualification; only valid together with slug", + "description": "Rows per category, 1 to 50. Omit to return every row", "in": "query", - "name": "prefix", - "type": "string", - "x-example": "Qualification" + "maximum": 50, + "minimum": 1, + "name": "limit", + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -471220,7 +486694,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.roundEventsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentTopPlayersResponseDoc" } }, "400": { @@ -471253,35 +486727,56 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore round fixtures", + "summary": "SofaScore season top players", "tags": [ "SofaScore" ] } }, - "/sofascore/scheduled-events": { + "/sofascore/tournament-top-teams": { "get": { "consumes": [ "application/json" ], - "description": "Returns the events (matches) in one category, such as a country, that start on a UTC date, ordered by start time. Get the category `id` from the categories endpoint (or `category_id` from scheduled-tournaments). `date` must be a real calendar date written `YYYY-MM-DD` and is a UTC day; to cover a local day in another timezone, request the neighbouring dates and filter on `start_timestamp`. An empty `events` list is a valid response when the category has no fixtures that day. Returns 404 for an unknown category id.", - "operationId": "sofascore-scheduled-events", + "description": "Returns a competition season's top teams for every team statistic category SofaScore ranks (for football about 30 categories such as average rating, goals scored, possession, shots and clean sheets; for basketball points, pace, ratings and more), each with the ranked teams and the value. The category set depends on the sport and competition, so the response lists every category it holds. The `type` enum accepts `overall`, `regular_season` and `playoffs`: football competitions publish `overall`, the NBA publishes `regular_season`, and a type the competition does not publish answers 404. Optional `limit` caps the rows per category (up to 50). Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-tournament-top-teams", "parameters": [ { - "description": "Numeric SofaScore category id from the categories endpoint", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", - "name": "category_id", + "name": "id", "required": true, "type": "string", - "x-example": "13" + "x-example": "17" }, { - "description": "UTC calendar date, YYYY-MM-DD", + "description": "Numeric SofaScore season id", "in": "query", - "name": "date", + "name": "season", "required": true, "type": "string", - "x-example": "2026-10-08" + "x-example": "96668" + }, + { + "description": "Statistics scope. Defaults to overall", + "enum": [ + "overall", + "regular_season", + "playoffs" + ], + "in": "query", + "name": "type", + "type": "string", + "x-example": "overall" + }, + { + "description": "Rows per category, 1 to 50. Omit to return every row", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "limit", + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -471291,7 +486786,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.scheduledEventsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentTopTeamsResponseDoc" } }, "400": { @@ -471324,70 +486819,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore events scheduled in a category on a date", + "summary": "SofaScore season top teams", "tags": [ "SofaScore" ] } }, - "/sofascore/scheduled-tournaments": { + "/sofascore/tournament-venues": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of the tournaments that have fixtures on a UTC date for a sport, each with the number of events starting that UTC day. This lists competitions, not matches: use scheduled-events with a tournament's `category_id` for the matches, or its `unique_tournament_id` with the tournament-seasons and round endpoints. `date` must be a real calendar date written `YYYY-MM-DD`. Pages are one-based; follow `has_next_page`. The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, and `waterpolo`. An empty `tournaments` list is a valid response for a date with no fixtures or a page past the last one.", - "operationId": "sofascore-scheduled-tournaments", + "description": "Returns every venue used by a competition season with id, name, capacity, city, state (US), coordinates and the `hidden` flag. Use the venue ids with venue and venue-events. A season id that does not belong to the competition answers 404. Get `id` from search and `season` from tournament-seasons.", + "operationId": "sofascore-tournament-venues", "parameters": [ { - "description": "Sport key", - "enum": [ - "american-football", - "aussie-rules", - "badminton", - "bandy", - "baseball", - "basketball", - "beach-volley", - "cricket", - "darts", - "esports", - "floorball", - "football", - "futsal", - "handball", - "ice-hockey", - "mma", - "minifootball", - "padel", - "rugby", - "snooker", - "table-tennis", - "tennis", - "volleyball", - "waterpolo" - ], + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", - "name": "sport", + "name": "id", "required": true, "type": "string", - "x-example": "football" + "x-example": "17" }, { - "description": "UTC calendar date, YYYY-MM-DD", + "description": "Numeric SofaScore season id", "in": "query", - "name": "date", + "name": "season", "required": true, "type": "string", - "x-example": "2026-10-08" - }, - { - "description": "One-based page number; defaults to 1", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "96668" } ], "produces": [ @@ -471397,7 +486857,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.scheduledTournamentsResponseDoc" + "$ref": "#/definitions/sofascore.tournamentVenuesResponseDoc" } }, "400": { @@ -471406,6 +486866,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -471424,27 +486890,35 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore tournaments scheduled on a date", + "summary": "SofaScore venues of a competition season", "tags": [ "SofaScore" ] } }, - "/sofascore/search": { + "/sofascore/tournament-winners": { "get": { "consumes": [ "application/json" ], - "description": "Searches SofaScore for teams, players, and competitions matching a free-text query. An empty `results` list is a valid response when nothing matches.", - "operationId": "sofascore-search", + "description": "Returns one page (10 seasons, newest first) of a competition's past winners: the year, the season id and the winning team or player. Follow `has_next_page` and pass `page` (zero-based) for older seasons; a page past the last one and an unknown competition both answer 404. Get `id` from search; the returned `season_id` works with every season-scoped endpoint.", + "operationId": "sofascore-tournament-winners", "parameters": [ { - "description": "Free-text search query", + "description": "Numeric SofaScore unique-tournament (competition) id", "in": "query", - "name": "q", + "name": "id", "required": true, "type": "string", - "x-example": "barcelona" + "x-example": "17" + }, + { + "description": "Zero-based page number. Defaults to 0", + "in": "query", + "minimum": 0, + "name": "page", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -471454,7 +486928,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.searchResponseDoc" + "$ref": "#/definitions/sofascore.tournamentWinnersResponseDoc" } }, "400": { @@ -471463,6 +486937,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -471481,55 +486961,36 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore universal search", + "summary": "SofaScore past winners of a competition", "tags": [ "SofaScore" ] } }, - "/sofascore/search-typed": { + "/sofascore/tournaments-with-feature": { "get": { "consumes": [ "application/json" ], - "description": "Searches SofaScore for one entity type and returns up to 20 ranked results per page: `events` (matches), `teams`, `players` (with team and position), `managers`, `referees`, `venues` (with city and capacity) and `unique_tournaments` (competitions with category). Page with the zero-based `page`; an empty page means there are no further results. The optional `sport` filter (any key listed by sofascore/sports, such as `football`, `basketball`, `tennis` or `mma`) narrows `teams`, `players`, `managers` and `unique_tournaments`, and is rejected for `events`, `referees` and `venues`, which ignore it. Use the returned ids with the matching endpoints (team, player, manager, venue, tournament-seasons, event).", - "operationId": "sofascore-search-typed", + "description": "Returns SofaScore's short list (up to 10) of the most followed competitions of a sport that carry one feature. The `feature` enum accepts `cuptree` (knockout tree, for tournament-cuptree), `standings` (league table), `totw` (team of the week) and `power_rankings`. The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `minifootball`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball` and `waterpolo` (`mma` and `padel` are not supported). The list is fixed by SofaScore and cannot be paged or searched; a sport with no such competition returns an empty list. Use search-typed with `type` `unique_tournaments` to find other competitions.", + "operationId": "sofascore-tournaments-with-feature", "parameters": [ { - "description": "Entity type to search", + "description": "Competition feature", "enum": [ - "events", - "teams", - "players", - "managers", - "referees", - "venues", - "unique_tournaments" + "cuptree", + "standings", + "totw", + "power_rankings" ], "in": "query", - "name": "type", - "required": true, - "type": "string", - "x-example": "teams" - }, - { - "description": "Search text, up to 128 characters", - "in": "query", - "name": "q", + "name": "feature", "required": true, "type": "string", - "x-example": "arsenal" - }, - { - "description": "Zero-based page number. Defaults to 0", - "in": "query", - "minimum": 0, - "name": "page", - "type": "integer", - "x-example": 0 + "x-example": "cuptree" }, { - "description": "Restrict teams, players, managers or unique_tournaments to one sport", + "description": "Sport key", "enum": [ "american-football", "aussie-rules", @@ -471546,9 +487007,7 @@ "futsal", "handball", "ice-hockey", - "mma", "minifootball", - "padel", "rugby", "snooker", "table-tennis", @@ -471558,6 +487017,7 @@ ], "in": "query", "name": "sport", + "required": true, "type": "string", "x-example": "football" } @@ -471569,7 +487029,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.searchTypedResponseDoc" + "$ref": "#/definitions/sofascore.tournamentsWithFeatureResponseDoc" } }, "400": { @@ -471596,55 +487056,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore search by entity type", + "summary": "SofaScore competitions that carry a feature", "tags": [ "SofaScore" ] } }, - "/sofascore/season-events": { + "/sofascore/trending-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page (about 30 events) of every fixture or result of a competition season, with the round of each event. The `direction` enum accepts `next` (upcoming fixtures) and `last` (finished results). Follow `has_next_page` to read further pages: a page past the end, a direction with no events (for example `next` in a finished season) and a season id that does not belong to the competition all answer 404. Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-season-events", + "description": "Returns the events trending in one country across every sport (live, recent and upcoming), each as the usual event summary plus its `sport` key. `country` is a two-letter ISO 3166-1 alpha-2 code such as `GB` or `US` (any case); SofaScore serves a trending list per country, and a code it does not serve returns 404. The list is about twenty events and changes through the day.", + "operationId": "sofascore-trending-events", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "96668" - }, - { - "description": "Upcoming fixtures or finished results", - "enum": [ - "next", - "last" - ], + "description": "Two-letter ISO 3166-1 alpha-2 country code", "in": "query", - "name": "direction", + "name": "country", "required": true, "type": "string", - "x-example": "last" - }, - { - "description": "Zero-based page number. Defaults to 0", - "in": "query", - "minimum": 0, - "name": "page", - "type": "integer", - "x-example": 0 + "x-example": "GB" } ], "produces": [ @@ -471654,7 +487086,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.seasonEventsResponseDoc" + "$ref": "#/definitions/sofascore.trendingEventsResponseDoc" } }, "400": { @@ -471687,19 +487119,33 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore season fixtures and results", + "summary": "SofaScore trending events", "tags": [ "SofaScore" ] } }, - "/sofascore/sports": { + "/sofascore/trending-players": { "get": { "consumes": [ "application/json" ], - "description": "Lists every sport key the SofaScore endpoints accept (the `sport` enum of live-events, categories, and scheduled-tournaments), with live and total event counts when available. The list is fixed and always complete; if the live counts cannot be read, `counts_available` is `false` and the per-sport counts are omitted instead of failing the call. Counts are also omitted for a sport the count feed does not cover (for example `mma`). Accepted sport keys: `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `mma`, `minifootball`, `padel`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball`, `waterpolo`.", - "operationId": "sofascore-sports", + "description": "Returns a sport's trending top players: standout performers from recent matches with the player, team, the match and that match's numbers as a snake_case metric map (`rating`, `minutes_played`, `goals` and more; the metric set depends on the sport and position). The `sport` enum accepts `football` and `basketball`, the sports for which SofaScore publishes this list. Returns 404 when SofaScore has no trending players for the sport right now.", + "operationId": "sofascore-trending-players", + "parameters": [ + { + "description": "Sport key", + "enum": [ + "football", + "basketball" + ], + "in": "query", + "name": "sport", + "required": true, + "type": "string", + "x-example": "football" + } + ], "produces": [ "application/json" ], @@ -471707,7 +487153,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.sportsResponseDoc" + "$ref": "#/definitions/sofascore.trendingPlayersResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -471728,27 +487186,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore supported sports", + "summary": "SofaScore trending players", "tags": [ "SofaScore" ] } }, - "/sofascore/stage": { + "/sofascore/venue": { "get": { "consumes": [ "application/json" ], - "description": "Returns one stage from SofaScore's stage hierarchy: a season (Formula 1 2026), an event (a Grand Prix weekend, a NASCAR race, a rally, a cycling race), a session (practice, qualifying, sprint, race) or a cycling stage. The response has its type (`Season`, `Event`, `Practice`, `Qualifying`, `Qualifying part`, `Race`, `Sprint race`, `Sprint qualifying`, `Practice part`, `Stage`), status (`finished`, `notstarted`, `canceled`), start time, country, competition, parent stage (the season of an event, the event of a session), the winner once decided, and circuit, weather and race facts where published (laps, race distance, lap record, safety car, NASCAR cautions, rally special stages, cycling route). `info` fields are omitted when not published, never zero. A season has no status. Stage ids and competition ids are different id spaces. Returns 404 for an unknown stage id.", - "operationId": "sofascore-stage", + "description": "Returns one venue (stadium or arena): name, capacity, city, country, coordinates, its home teams, the venue-wide match totals (matches, goals, home and away win shares, and for football cards and corners per game) and a per-sport record in `sports`, most matches first. `hidden` venues, such as NBA arenas, have no venue-wide match list in venue-events and are listed per competition season instead. An unknown venue id answers 404. Get `id` from search-typed with `type` `venues`, from tournament-venues or from an event's venue.", + "operationId": "sofascore-venue", "parameters": [ { - "description": "Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages", + "description": "Numeric SofaScore venue id", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "214258" + "x-example": "624" } ], "produces": [ @@ -471758,7 +487216,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageDetailResponseDoc" + "$ref": "#/definitions/sofascore.venueResponseDoc" } }, "400": { @@ -471791,31 +487249,95 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore motorsport and cycling stage", + "summary": "SofaScore venue", "tags": [ "SofaScore" ] } }, - "/sofascore/stage-categories": { + "/sofascore/venue-events": { "get": { "consumes": [ "application/json" ], - "description": "Lists the categories SofaScore keeps for a stage sport, each with its competitions. For `motorsport` that is the racing series (Formula 1, MotoGP, Moto2, Moto3, Superbike, NASCAR with its Cup, Truck and Xfinity competitions, WRC, Formula E, Indycar, DTM); for `cycling` it is Cycling Men and Cycling Women. Use a competition `id` with stage-seasons to list its seasons. Some categories exist without any competition (for example Motocross, Speedway, WEC) and return an empty `competitions` list. Motorsport and cycling are not available on the match-based endpoints (live-events, categories, scheduled-events); they use the stage endpoints. The `sport` enum accepts `motorsport` and `cycling`.", - "operationId": "sofascore-stage-categories", + "description": "Returns one page (up to 30) of the matches played (`direction` `last`, newest page first) or scheduled (`next`) at a venue, as match summaries. Without `tournament` and `season` it lists every match at the venue, optionally narrowed by `sport` (`all`, or any key listed in the venue's `sports`, such as `football`, `rugby`, `basketball`, `mma`); with both it lists that competition season's matches at the venue and `sport` must be omitted. Hidden venues (see venue) have no venue-wide list and answer 404 without `tournament` and `season`. A direction with no matches, a sport the venue never hosted and a page past the last one also answer 404; follow `has_next_page`.", + "operationId": "sofascore-venue-events", "parameters": [ { - "description": "Stage sport key", + "description": "Numeric SofaScore venue id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "624" + }, + { + "description": "Upcoming matches or finished matches", "enum": [ - "motorsport", - "cycling" + "next", + "last" ], "in": "query", - "name": "sport", + "name": "direction", "required": true, "type": "string", - "x-example": "motorsport" + "x-example": "last" + }, + { + "description": "Sport filter for the venue-wide list. Defaults to all", + "enum": [ + "all", + "american-football", + "aussie-rules", + "badminton", + "bandy", + "baseball", + "basketball", + "beach-volley", + "cricket", + "darts", + "esports", + "floorball", + "football", + "futsal", + "handball", + "ice-hockey", + "mma", + "minifootball", + "padel", + "rugby", + "snooker", + "table-tennis", + "tennis", + "volleyball", + "waterpolo" + ], + "in": "query", + "name": "sport", + "type": "string", + "x-example": "football" + }, + { + "description": "Zero-based page number. Defaults to 0", + "in": "query", + "minimum": 0, + "name": "page", + "type": "integer", + "x-example": 0 + }, + { + "description": "Numeric unique-tournament id; with season, lists that competition season's matches at the venue", + "in": "query", + "name": "tournament", + "type": "string", + "x-example": "17" + }, + { + "description": "Numeric season id; with tournament, lists that competition season's matches at the venue", + "in": "query", + "name": "season", + "type": "string", + "x-example": "96668" } ], "produces": [ @@ -471825,7 +487347,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageCategoriesResponseDoc" + "$ref": "#/definitions/sofascore.venueEventsResponseDoc" } }, "400": { @@ -471834,6 +487356,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -471852,27 +487380,37 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore motorsport and cycling categories and competitions", + "summary": "SofaScore matches at a venue", "tags": [ "SofaScore" ] } }, - "/sofascore/stage-driver-performance": { + "/sonic/availability": { "get": { "consumes": [ "application/json" ], - "description": "Returns every competitor's progress through a finished race or rally. For circuit races (Formula 1, MotoGP and similar) `laps` lists the position at the end of each lap, starting with lap 0 for the grid, plus the tyre compound and a `pit_stop` flag where published; the lap a driver retired has `retired` set and no position. For rallies `stage_positions` lists the overall position after each special stage. The response also repeats the stage itself. It is published for races and sprints of some series (verified for Formula 1, MotoGP and WRC) and not for practice, qualifying, NASCAR, cycling, events or seasons, which return 404. Returns 404 for an unknown id.", - "operationId": "sofascore-stage-driver-performance", + "description": "Returns the bookable order-ahead windows for one Sonic Drive-In restaurant, grouped by service channel and local date. Each window has a UTC start_time and end_time. Also returns the store's timezone, how long each window lasts (slot_duration_minutes), the prep/handoff buffer before the first bookable window (lead_time_minutes), and service_types -- every channel the store supports, which is a superset of the channels that currently have windows. fulfillment selects the request method and accepts exactly `PICKUP` or `DELIVERY`; note the per-window service_type is a separate, finer vocabulary and can be `ORDER_AHEAD`, `CURBSIDE_PICKUP`, `DRIVE_THROUGH`, `STORE`, `PICKUP` or `DELIVERY`. A closed or fully-booked restaurant returns an empty channels array with total_slots 0, not an error. An unknown store_id returns 404.", + "operationId": "sonic-availability", "parameters": [ { - "description": "Numeric SofaScore stage id of a finished race, sprint or rally", + "description": "Sonic store number, e.g. from /sonic/nearby", "in": "query", - "name": "id", + "name": "store_id", "required": true, "type": "string", - "x-example": "214258" + "x-example": "4521" + }, + { + "description": "Fulfillment method: PICKUP or DELIVERY. Defaults to PICKUP.", + "enum": [ + "PICKUP", + "DELIVERY" + ], + "in": "query", + "name": "fulfillment", + "type": "string" } ], "produces": [ @@ -471882,7 +487420,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageDriverPerformanceResponseDoc" + "$ref": "#/definitions/sonic.availabilityResponseDoc" } }, "400": { @@ -471915,33 +487453,19 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore motorsport race progress per driver", + "summary": "List a Sonic Drive-In restaurant's order-ahead time slots", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/stage-featured": { + "/sonic/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the events SofaScore features for a stage sport right now: a mix of the latest finished events (with `winner` and result facts such as laps and circuit) and the next upcoming ones, across series such as Formula 1, MotoGP, Moto2, Moto3, Superbike, NASCAR and cycling races. Each event carries its competition, season name, parent season stage and country. Use an event `id` with stage-substages for its sessions or stages and stage-standings for results. The `sport` enum accepts `motorsport` and `cycling`.", - "operationId": "sofascore-stage-featured", - "parameters": [ - { - "description": "Stage sport key", - "enum": [ - "motorsport", - "cycling" - ], - "in": "query", - "name": "sport", - "required": true, - "type": "string", - "x-example": "motorsport" - } - ], + "description": "Returns Sonic Drive-In's national menu's top-level categories -- Breakfast, Value, Limited Time, Combos, Burgers, Chicken, Hot Dogs, Sandwiches, Snacks & Sides, Sweets, Tea & Coffee, Lemonades & Limeades, Sodas, Slushes, Refreshers, Wacky Pack Kids Meals and others -- each with its slug (the value GET /sonic/menu takes) and a page_count of subcategory/item pages nested under it.", + "operationId": "sonic-categories", "produces": [ "application/json" ], @@ -471949,13 +487473,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageFeaturedResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sonic.categoriesResponseDoc" } }, "429": { @@ -471976,41 +487494,19 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore featured motorsport and cycling events", + "summary": "List Sonic Drive-In menu categories", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/stage-schedule": { + "/sonic/deals": { "get": { "consumes": [ "application/json" ], - "description": "Returns the events SofaScore lists for a stage sport around a UTC date: Grand Prix weekends, NASCAR race weekends, rallies and cycling races, each with its country, competition, every session start time (`session_start_timestamps`) and the session SofaScore highlights (`session`: the live, next or latest one). The list is not a strict one-day filter. It holds the events in progress on the date plus the next upcoming ones, and a quiet date still returns the next events; use `on_date`, which is true when a session of the event starts inside the requested UTC day, to separate them. Schedule rows carry no event status or winner: use `session.status`, or pass the event `id` to stage for the event detail and to stage-substages for its sessions. `date` must be a real calendar date written `YYYY-MM-DD`. An empty `stages` list is valid when nothing is in progress or scheduled nearby. The `sport` enum accepts `motorsport` and `cycling`.", - "operationId": "sofascore-stage-schedule", - "parameters": [ - { - "description": "Stage sport key", - "enum": [ - "motorsport", - "cycling" - ], - "in": "query", - "name": "sport", - "required": true, - "type": "string", - "x-example": "motorsport" - }, - { - "description": "UTC calendar date, YYYY-MM-DD", - "in": "query", - "name": "date", - "required": true, - "type": "string", - "x-example": "2026-10-04" - } - ], + "description": "Returns the promotions currently published on Sonic Drive-In's national deals page -- each with its marketing headline, public name, description, legal terms, call-to-action label and link, and creative image. This page is not listed in Sonic's own sitemap, so GET /sonic/sitemap will never surface it. Deals are national marketing offers, not per-store pricing; there is no price field in this source. Between campaigns Sonic can publish the page with no promotions at all, which returns an empty deals array with count 0 rather than an error.", + "operationId": "sonic-deals", "produces": [ "application/json" ], @@ -472018,13 +487514,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageScheduleResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sonic.dealsResponseDoc" } }, "429": { @@ -472045,29 +487535,19 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore motorsport and cycling events around a date", + "summary": "List Sonic Drive-In's current promotions", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/stage-seasons": { + "/sonic/directory": { "get": { "consumes": [ "application/json" ], - "description": "Returns the seasons of one stage competition, newest first, for example Formula 1 2026 (id 214140) back to 1950. A season `id` is a stage id: pass it to stage-substages for the race calendar and to stage-standings for the championship table. The season still in progress has no `end_timestamp`. Get the competition `id` from stage-categories (for example 40 for Formula 1, 17 for MotoGP, 18 for the NASCAR Cup Series, 9 for Cycling Men). Competition ids and stage ids are different id spaces, so a competition id passed to stage returns an unrelated stage. Returns 404 for an unknown competition id.", - "operationId": "sofascore-stage-seasons", - "parameters": [ - { - "description": "Numeric SofaScore competition id from stage-categories", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "40" - } - ], + "description": "Returns Sonic Drive-In's restaurant directory as a country to state to city tree, with a restaurant count at every level. Use it to discover which states and cities have restaurants before calling GET /sonic/locations or GET /sonic/nearby. Each city carries both its display name and the slug that composes into a store path. Counts here describe listed restaurants and are internally consistent (the city counts sum to total_count); GET /sonic/locations enumerates a larger set of store pages, so the two totals intentionally differ.", + "operationId": "sonic-directory", "produces": [ "application/json" ], @@ -472075,19 +487555,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageSeasonsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sonic.directoryResponseDoc" } }, "429": { @@ -472108,39 +487576,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore seasons of a motorsport or cycling competition", + "summary": "Browse Sonic Drive-In's restaurant directory by country, state and city", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/stage-standings": { + "/sonic/item": { "get": { "consumes": [ "application/json" ], - "description": "Returns one classification of a stage. For a race or sprint it is the result (position, grid, race time, gap, interval, laps, laps led, pit stops, tyre stints, fastest lap, points, retirement status); for practice and qualifying the timing order (`time` is the best lap); for a cycling stage the stage result with time gaps; for an event the event aggregate; for a season the championship table (points, victories, races started, pole positions, podiums, fastest laps; NASCAR adds top 5, top 10 and races not finished). `competitor` returns drivers and riders, `team` returns constructors and teams, which only some seasons and events publish (verified for the Formula 1 and MotoGP seasons and the Formula 1 event; races, NASCAR, WRC and cycling return 404 for `team`). Rows are in upstream order. `position` is omitted for competitors who did not finish or set no time, and `gap` is `DNF` for a retirement. The parent session of a split qualifying has no standings; use the ids of its parts from stage-substages. Fields a classification does not publish are omitted. Returns 404 for an unknown id, a stage that has no results yet, or a kind of stage without that classification. The `type` enum accepts `competitor` and `team`.", - "operationId": "sofascore-stage-standings", + "description": "Returns one menu page's detail: name, description, image, and a link to Sonic's site-wide nutrition/allergen guide PDF. path must be a \"menu\" section path with kind category, subcategory, or item from GET /sonic/sitemap (or a path copied from a GET /sonic/menu-adjacent page you already know).", + "operationId": "sonic-item", "parameters": [ { - "description": "Numeric SofaScore stage id of a season, event, session or cycling stage", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "214258" - }, - { - "description": "Classification kind", - "enum": [ - "competitor", - "team" - ], + "description": "A menu page path from /sonic/sitemap (section=menu)", "in": "query", - "name": "type", + "name": "path", "required": true, "type": "string", - "x-example": "competitor" + "x-example": "menu/categories/breakfast/local-breakfast-favorites/bacon-egg-and-cheese-bagel" } ], "produces": [ @@ -472150,7 +487606,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageStandingsResponseDoc" + "$ref": "#/definitions/sonic.itemResponseDoc" } }, "400": { @@ -472183,27 +487639,41 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore motorsport and cycling stage standings", + "summary": "Look up one Sonic Drive-In menu item's detail", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/stage-substages": { + "/sonic/location-suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns the children of a stage in upstream order. For a season it is the race calendar: every event with status (`finished`, `notstarted`, `canceled`), dates, round, circuit and winner. For an event it is the sessions: practices, qualifying, sprint qualifying, sprint and race for a Grand Prix, the numbered stages of a cycling race or rally. Qualifying and practice sessions list their `parts`, and the part ids carry the timing results (the parent session of a split qualifying has no standings of its own). Use a child `id` with stage for detail, stage-standings for its results and stage-driver-performance for race progress. A race, session or cycling stage has no children and returns 404, as does an unknown id.", - "operationId": "sofascore-stage-substages", + "description": "Completes a partial address, place, city, state or ZIP into ranked matches, each already carrying the latitude and longitude that GET /sonic/nearby takes -- so a caller can run a Sonic restaurant search from free text instead of coordinates. Each suggestion's layer describes its granularity and is one of `address`, `locality`, `state`, `postalCode` or `place`, and confidence is one of `exact`, `interpolated` or `fallback`. Results are restricted to one country (default US). A query that matches nothing returns an empty suggestions array with count 0, not an error.", + "operationId": "sonic-location-suggest", "parameters": [ { - "description": "Numeric SofaScore stage id of a season or an event", + "description": "Partial address, place, city, state or ZIP to complete", "in": "query", - "name": "id", + "name": "query", "required": true, "type": "string", - "x-example": "214253" + "x-example": "cheyenne wy" + }, + { + "description": "Maximum suggestions, 1-25. Defaults to 5. Upstream may return fewer.", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 5 + }, + { + "description": "ISO 3166-1 alpha-2 country code to restrict results to. Defaults to US.", + "in": "query", + "name": "country", + "type": "string", + "x-example": "US" } ], "produces": [ @@ -472213,7 +487683,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.stageSubstagesResponseDoc" + "$ref": "#/definitions/sonic.locationSuggestResponseDoc" } }, "400": { @@ -472222,12 +487692,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -472246,48 +487710,47 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore children of a motorsport or cycling stage", + "summary": "Complete an address into coordinates for Sonic Drive-In store search", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/standings": { + "/sonic/locations": { "get": { "consumes": [ "application/json" ], - "description": "Returns a league table for a competition season. The `type` enum accepts `total`, `home`, and `away`. Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-standings", + "description": "Returns Sonic Drive-In's restaurant listing one page at a time, each entry already split into its country, state, city and address parts plus a ready-made path value that GET /sonic/store takes -- so enumerating restaurants needs no path parsing. Filter by state and/or city to narrow the list; city slugs come from GET /sonic/directory. Results are sorted by path so paging is reproducible. This listing covers more store pages than GET /sonic/directory counts, since the directory counts listed restaurants while this enumerates every published store page; a filter that matches nothing returns an empty locations array with total 0, not an error. If Sonic's live store-locator service refuses the request, the list is built from Sonic's public store sitemap instead (same entry shape; it can omit stores without a published page, and source_url shows which source answered).", + "operationId": "sonic-locations", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", + "description": "Two-letter state or province code to filter by", "in": "query", - "name": "id", - "required": true, + "name": "state", "type": "string", - "x-example": "17" + "x-example": "WY" }, { - "description": "Numeric SofaScore season id", + "description": "City slug to filter by, from /sonic/directory", "in": "query", - "name": "season", - "required": true, + "name": "city", "type": "string", - "x-example": "76986" + "x-example": "cheyenne" }, { - "description": "Standings variant", - "enum": [ - "total", - "home", - "away" - ], + "description": "1-based page number. Defaults to 1.", "in": "query", - "name": "type", - "required": true, - "type": "string", - "x-example": "total" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Entries per page, 1-500. Defaults to 100.", + "in": "query", + "name": "page_size", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -472297,7 +487760,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.standingsResponseDoc" + "$ref": "#/definitions/sonic.locationsResponseDoc" } }, "400": { @@ -472306,12 +487769,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -472330,27 +487787,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore standings", + "summary": "List Sonic Drive-In restaurants with ready-made store paths", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/team": { + "/sonic/menu": { "get": { "consumes": [ "application/json" ], - "description": "Returns one SofaScore team by numeric `id`: name, short name, country, sport, manager, venue with its city and capacity, primary colour, and national-team flag. `tournament_id` and `tournament_name` give the team's primary competition, such as its domestic league. An unknown id returns an upstream error.", - "operationId": "sofascore-team", + "description": "Returns the items in one Sonic Drive-In menu category, each with its name and published calorie count. Category slugs come from GET /sonic/categories. Some entries are themselves a nested size/variant group (e.g. \"Coffee\" expands to Small/Medium/Large/Rt.44 orderable sizes) rather than a single orderable product -- there is no price or full nutrition panel in this source, only calories; see GET /sonic/item for description, image, and a link to Sonic's nutrition guide.", + "operationId": "sonic-menu", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "Category slug from /sonic/categories", "in": "query", - "name": "id", + "name": "category", "required": true, "type": "string", - "x-example": "2817" + "x-example": "breakfast" } ], "produces": [ @@ -472360,7 +487817,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamResponseDoc" + "$ref": "#/definitions/sonic.menuResponseDoc" } }, "400": { @@ -472393,27 +487850,56 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team detail", + "summary": "List one Sonic Drive-In menu category's items", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/team-achievements": { + "/sonic/nearby": { "get": { "consumes": [ "application/json" ], - "description": "Returns the trophies a team has won: the total and, per competition, the number won and the winning seasons (newest first, with the season id where SofaScore tracks it). Some competitions, such as US leagues, report a count with an empty or shorter `seasons` list. Returns 404 when SofaScore records no achievements for the team.", - "operationId": "sofascore-team-achievements", + "description": "Returns Sonic Drive-In restaurants within a radius of a latitude/longitude, nearest first, one page at a time. Each result carries the same detail as GET /sonic/store -- address, phone, coordinates, open/closed status, amenities, weekly hours per fulfillment channel, and delivery-provider deep links -- plus distance_miles from the search centre, so ranking or mapping results needs no follow-up call per store. Use this instead of paging GET /sonic/sitemap when you know roughly where you are looking. An area with no restaurants returns an empty stores array with total_stores 0, not an error.", + "operationId": "sonic-nearby", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "Latitude of the search centre, -90 to 90", "in": "query", - "name": "id", + "name": "latitude", "required": true, - "type": "string", - "x-example": "17" + "type": "number", + "x-example": 35.4676 + }, + { + "description": "Longitude of the search centre, -180 to 180", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": -97.5164 + }, + { + "description": "Search radius in miles, 1-100. Defaults to 25.", + "in": "query", + "name": "radius", + "type": "integer", + "x-example": 25 + }, + { + "description": "Stores per page, 1-50. Defaults to 10.", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Zero-based page number. Defaults to 0.", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -472423,7 +487909,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamAchievementsResponseDoc" + "$ref": "#/definitions/sonic.nearbyResponseDoc" } }, "400": { @@ -472432,12 +487918,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -472456,48 +487936,19 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team trophies", + "summary": "Find Sonic Drive-In restaurants near a coordinate", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/team-events": { + "/sonic/nutrition-documents": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of a team's upcoming or recent fixtures. The `direction` enum accepts `next` and `last`. An empty `events` list is a valid response when there is no fixture on that page.", - "operationId": "sofascore-team-events", - "parameters": [ - { - "description": "Numeric SofaScore team id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "2817" - }, - { - "description": "Fixture direction", - "enum": [ - "next", - "last" - ], - "in": "query", - "name": "direction", - "required": true, - "type": "string", - "x-example": "next" - }, - { - "description": "Zero-based page number", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 0 - } - ], + "description": "Returns the nutrition, allergen and ingredient documents Sonic Drive-In publishes nationally -- the printable menu, the Spanish-language menu, the nutrition guide, allergen information, and the ingredient statement -- each with a directly fetchable URL, file name, MIME type, size in bytes, and the date it was last republished. These are the only structured nutrition source Sonic publishes; per-item macro and micronutrient values are not available anywhere on the public site, and GET /sonic/menu carries calories only. Files are large print-ready PDFs (several megabytes each), so check size_bytes before downloading.", + "operationId": "sonic-nutrition-documents", "produces": [ "application/json" ], @@ -472505,13 +487956,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamEventsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sonic.nutritionDocumentsResponseDoc" } }, "404": { @@ -472538,43 +487983,60 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team fixtures", + "summary": "List Sonic Drive-In's official nutrition and allergen documents", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/team-goal-distributions": { + "/sonic/sitemap": { "get": { "consumes": [ "application/json" ], - "description": "Returns a football team's goals scored and conceded per block of match minutes (1-15, 16-30, 31-45, 46-60, 61-75, 76-90) for one competition season, in three views: `overall`, `home` and `away`, each with the matches played and the goal totals. A block with no goals is returned as 0. Returns 404 for non-football teams and for a team and season that do not belong together.", - "operationId": "sofascore-team-goal-distributions", + "description": "Returns one page of Sonic Drive-In's own sitemap: section=menu lists every menu category/subcategory/item page (298 pages), section=locations lists every store-directory page (state/city/store, ~3,365 stores). Each entry's path is what GET /sonic/item (menu section) or GET /sonic/store (locations section, kind=store) takes.", + "operationId": "sonic-sitemap", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "Which sitemap to read", + "enum": [ + "menu", + "locations" + ], "in": "query", - "name": "id", + "name": "section", "required": true, "type": "string", - "x-example": "17" + "x-example": "menu" }, { - "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", + "description": "Optional. Filter by page kind. menu: index, category, subcategory, item. locations: index, state, city, store.", + "enum": [ + "index", + "category", + "subcategory", + "item", + "state", + "city", + "store" + ], "in": "query", - "name": "tournament_id", - "required": true, - "type": "string", - "x-example": "17" + "name": "kind", + "type": "string" }, { - "description": "Numeric SofaScore season id", + "description": "Optional. 1-based page, default 1.", "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "96668" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Optional. Entries per page, 1-500, default 100.", + "in": "query", + "name": "page_size", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -472584,7 +488046,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamGoalDistributionsResponseDoc" + "$ref": "#/definitions/sonic.sitemapResponseDoc" } }, "400": { @@ -472593,12 +488055,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -472617,27 +488073,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team goals by match minute", + "summary": "Browse Sonic Drive-In's menu-page or store-locator sitemap", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/team-near-events": { + "/sonic/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns a team's last played match and its next scheduled match with teams, competition, status, score and start time. Either side can be missing (a team with no upcoming fixture returns only `previous_event`). Returns 404 when SofaScore has neither. For full fixture lists use team-events.", - "operationId": "sofascore-team-near-events", + "description": "Returns one Sonic Drive-In restaurant's address, phone, coordinates, open/closed status, amenities, weekly hours broken down per fulfillment channel (order-ahead, pickup, curbside, in-store, delivery, drive-through), and delivery-provider deep links (DoorDash, GrubHub, Uber Eats, Postmates). path must be a \"locations\" section, kind=store path from GET /sonic/sitemap.", + "operationId": "sonic-store", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "A store path from /sonic/sitemap (section=locations, kind=store)", "in": "query", - "name": "id", + "name": "path", "required": true, "type": "string", - "x-example": "17" + "x-example": "locations/us/wy/cheyenne/2540-dell-range-blvd/store-4521" } ], "produces": [ @@ -472647,7 +488103,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamNearEventsResponseDoc" + "$ref": "#/definitions/sonic.storeResponseDoc" } }, "400": { @@ -472680,43 +488136,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team previous and next match", + "summary": "Look up one Sonic Drive-In restaurant by its locator path", "tags": [ - "SofaScore" + "Sonic" ] } }, - "/sofascore/team-of-the-week": { + "/soundcloud/playlist": { "get": { "consumes": [ "application/json" ], - "description": "Returns one team of the week: the formation and the selected players with their SofaScore rating, team and, for round and weekly selections, the match the rating was earned in. Get the `period` id from sofascore-team-of-the-week-periods; a period that does not belong to the given competition season is rejected with 400.", - "operationId": "sofascore-team-of-the-week", + "description": "Returns one playlist or album's metadata plus its full track list: owner, likes/reposts counts, and every track's title, artwork, and playback/likes counts. Public data sourced from SoundCloud's own JSON API.", + "operationId": "soundcloud-playlist", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "96668" - }, - { - "description": "Numeric period id from sofascore-team-of-the-week-periods", + "description": "Full soundcloud.com playlist/album URL (a playlist's permalink_url)", "in": "query", - "name": "period", + "name": "url", "required": true, "type": "string", - "x-example": "29321" + "x-example": "https://soundcloud.com/lofi_chill/sets/lofi-chill" } ], "produces": [ @@ -472726,7 +488166,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamOfTheWeekResponseDoc" + "$ref": "#/definitions/soundcloud.playlistResponseDoc" } }, "400": { @@ -472759,35 +488199,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team of the week", + "summary": "Get a SoundCloud playlist or album's detail", "tags": [ - "SofaScore" + "SoundCloud" ] } }, - "/sofascore/team-of-the-week-periods": { + "/soundcloud/profile": { "get": { "consumes": [ "application/json" ], - "description": "Lists the periods of a competition season for which SofaScore published a team of the week, newest first: league rounds (`round`), weekly time spans (`timespan`) and season-level selections (`season`, such as an NBA regular season or playoff team). Use a returned period `id` with sofascore-team-of-the-week. An empty list is valid when no team of the week has been published yet. Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-team-of-the-week-periods", + "description": "Returns a SoundCloud user or artist profile for a full profile `url` such as `https://soundcloud.com/artist`. Fields are username, full name, bio, avatar, city, country, verified status, and counts of followers, followings, tracks, playlists and likes. A URL for a track or other entity returns 400; an unresolvable URL returns 404.", + "operationId": "soundcloud-profile", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", + "description": "Full soundcloud.com user/artist profile URL", "in": "query", - "name": "season", + "name": "url", "required": true, "type": "string", - "x-example": "96668" + "x-example": "https://soundcloud.com/lofi_girl" } ], "produces": [ @@ -472797,7 +488229,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamOfTheWeekPeriodsResponseDoc" + "$ref": "#/definitions/soundcloud.profileResponseDoc" } }, "400": { @@ -472830,27 +488262,34 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team of the week periods", + "summary": "Get a SoundCloud user/artist profile", "tags": [ - "SofaScore" + "SoundCloud" ] } }, - "/sofascore/team-performance": { + "/soundcloud/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns a team's most recent matches (about ten, oldest first) with SofaScore's per-match performance value in `points`: higher is better and a heavy defeat is negative. An event SofaScore gave no value for has no `points`. An empty `events` list is a valid response for a team with no recent matches.", - "operationId": "sofascore-team-performance", + "description": "Searches SoundCloud tracks for `query`, in SoundCloud's default relevance order. `limit` defaults to 20 and is capped at 50. Each track has its title, artwork, genre, tags, `duration_ms`, play, like, comment and repost counts, and uploader details including follower count and verified status.", + "operationId": "soundcloud-search", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "Search text", "in": "query", - "name": "id", + "name": "query", "required": true, "type": "string", - "x-example": "17" + "x-example": "lofi hip hop" + }, + { + "description": "Number of tracks to return (default 20, max 50)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -472860,7 +488299,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamPerformanceResponseDoc" + "$ref": "#/definitions/soundcloud.searchResponseDoc" } }, "400": { @@ -472869,12 +488308,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -472893,57 +488326,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team recent performance", + "summary": "Search SoundCloud tracks", "tags": [ - "SofaScore" + "SoundCloud" ] } }, - "/sofascore/team-player-statistics": { + "/soundcloud/track": { "get": { "consumes": [ "application/json" ], - "description": "Returns the statistics of every player in a team's squad for one competition season, each as a snake_case metric map (appearances, minutes, rating, goals, assists, passing and duel metrics for football; points, rebounds and assists for basketball), in SofaScore's order. The `type` enum accepts `overall`, `home`, `away`, `regular_season` and `playoffs` and defaults to `overall`; only the types listed for that season by team-player-statistics-seasons exist (football `overall`, `home`, `away`; NBA `regular_season`, `playoffs`). A metric SofaScore did not record is omitted rather than returned as 0. Returns 404 when SofaScore has no statistics of that type for the combination.", - "operationId": "sofascore-team-player-statistics", + "description": "Returns one track's full metadata: title, artwork, description, genre, tags, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.", + "operationId": "soundcloud-track", "parameters": [ { - "description": "Numeric SofaScore team id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", - "in": "query", - "name": "tournament_id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id from team-player-statistics-seasons", + "description": "Full soundcloud.com track URL (a track's permalink_url)", "in": "query", - "name": "season", + "name": "url", "required": true, "type": "string", - "x-example": "96668" - }, - { - "default": "overall", - "description": "Statistics view", - "enum": [ - "overall", - "home", - "away", - "regular_season", - "playoffs" - ], - "in": "query", - "name": "type", - "type": "string" + "x-example": "https://soundcloud.com/lofi_girl/4-am-studysession" } ], "produces": [ @@ -472953,7 +488356,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamPlayerStatisticsResponseDoc" + "$ref": "#/definitions/soundcloud.trackResponseDoc" } }, "400": { @@ -472986,27 +488389,34 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team player statistics", + "summary": "Get a SoundCloud track's detail", "tags": [ - "SofaScore" + "SoundCloud" ] } }, - "/sofascore/team-player-statistics-seasons": { + "/soundcloud/user-tracks": { "get": { "consumes": [ "application/json" ], - "description": "Lists the competitions and seasons for which SofaScore has per-player statistics for a team, with the statistics `types` available in each season (`overall`, `home`, `away`, `regular_season`, `playoffs`). Use it to find the `tournament_id`, `season` and `type` accepted by team-player-statistics and team-top-players. Football teams offer `overall`, `home` and `away`; NBA teams offer `regular_season` and `playoffs`. Returns 404 when SofaScore has no player statistics for the team.", - "operationId": "sofascore-team-player-statistics-seasons", + "description": "Returns a user/artist's own uploaded tracks, most recent first: title, artwork, playback/likes/comment/repost counts. Public data sourced from SoundCloud's own JSON API.", + "operationId": "soundcloud-user-tracks", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "Full soundcloud.com user/artist profile URL", "in": "query", - "name": "id", + "name": "url", "required": true, "type": "string", - "x-example": "17" + "x-example": "https://soundcloud.com/lofi_girl" + }, + { + "description": "Number of tracks to return (default 20, max 50)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -473016,7 +488426,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamPlayerStatisticsSeasonsResponseDoc" + "$ref": "#/definitions/soundcloud.userTracksResponseDoc" } }, "400": { @@ -473049,27 +488459,24 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team player statistics seasons", + "summary": "Get a SoundCloud user's own uploaded tracks", "tags": [ - "SofaScore" + "SoundCloud" ] } }, - "/sofascore/team-players": { + "/space/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a team's full squad from SofaScore by team id: each player's name, position, jersey number, date of birth, height, country and preferred foot, plus SofaScore's market value estimate and its currency when available.", - "operationId": "sofascore-team-players", + "description": "Returns a Space.com article by canonical `url` in any of the site's URL shapes, including older `.html` reference pages: title, description, section, authors, publication and update times, image and body `paragraphs`. `/news/live/` pages return only their introductory paragraphs, and membership-gated content returns only its public preview.", + "operationId": "space-article", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "Canonical Space.com article URL", "in": "query", - "name": "id", + "name": "url", "required": true, "type": "string", - "x-example": "2817" + "x-example": "https://www.space.com/astronomy/solar-system/asteroids/astronomers-just-named-an-asteroid-after-weird-al-yankovic" } ], "produces": [ @@ -473079,7 +488486,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamPlayersResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -473094,12 +488501,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -473112,27 +488513,30 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team players", + "summary": "Get Space.com article content", "tags": [ - "SofaScore" + "Space" ] } }, - "/sofascore/team-rankings": { + "/space/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns every ranking a team or tennis player appears in: for a tennis player the ATP or WTA ranking, its live version and the UTR rating, for a football club the UEFA club coefficient by year. Each ranking carries its `type_id` (the same ids the rankings endpoint takes), name, sport, category and last update, and `rows` with the `position`, `points`, previous and best position where SofaScore reports them. Returns 404 when the id appears in no ranking.", - "operationId": "sofascore-team-rankings", + "description": "Returns a Space.com author's profile, looked up by `slug` (for example `elizabeth-howell`) or canonical `url`; exactly one is required. The response has the name, `job_title`, biography, image and the first batch of recent articles on the author page. That page has no URL-based pagination, so no further articles are available.", + "operationId": "space-author", "parameters": [ { - "description": "Numeric SofaScore team id (a tennis player id for tennis)", + "description": "Author slug, e.g. elizabeth-howell", "in": "query", - "name": "id", - "required": true, + "name": "slug", "type": "string", - "x-example": "112783" + "x-example": "elizabeth-howell" + }, + { + "description": "Canonical space.com/author/ URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.space.com/author/elizabeth-howell" } ], "produces": [ @@ -473142,7 +488546,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamRankingsResponseDoc" + "$ref": "#/definitions/publicnews.spaceAuthorResponseDoc" } }, "400": { @@ -473157,12 +488561,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -473175,57 +488573,87 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team rankings", + "summary": "Get a Space.com author profile", "tags": [ - "SofaScore" + "Space" ] } }, - "/sofascore/team-season-statistics": { + "/space/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a team's statistics for one competition season (goals, shots, passing, duels, discipline, and the matching conceded-side metrics) as a snake_case metric map. The `type` enum accepts `overall`, `home`, `away`, `regular_season`, and `playoffs` and defaults to `overall`; only the types listed for that season by team-statistics-seasons exist (football teams have `overall` only; basketball, ice hockey and baseball teams have `regular_season` and `playoffs`). Returns 404 when SofaScore has no statistics of that type for the combination.", - "operationId": "sofascore-team-season-statistics", + "description": "Returns the latest Space.com stories for one category. `section` is required and takes a slug from `space-sections`, which joins nested category paths with hyphens, such as `astronomy`, `astronomy-solar-system-mars` or `stargazing-meteor-showers`. Each item has its title, URL, summary, author, publication time and image. Other values return a 400.", + "operationId": "space-headlines", "parameters": [ { - "description": "Numeric SofaScore team id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore unique-tournament (competition) id from team-statistics-seasons", - "in": "query", - "name": "tournament_id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id from team-statistics-seasons", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "96668" - }, - { - "default": "overall", - "description": "Statistics view", + "description": "Space.com category slug", "enum": [ - "overall", - "home", - "away", - "regular_season", - "playoffs" + "astronomy", + "astronomy-black-holes", + "astronomy-dark-universe", + "astronomy-exoplanets", + "astronomy-galaxies", + "astronomy-hubble-space-telescope", + "astronomy-james-webb-space-telescope", + "astronomy-solar-system", + "astronomy-solar-system-asteroids", + "astronomy-solar-system-comets", + "astronomy-solar-system-dwarf-planets", + "astronomy-solar-system-earth", + "astronomy-solar-system-jupiter", + "astronomy-solar-system-mars", + "astronomy-solar-system-mercury", + "astronomy-solar-system-moon", + "astronomy-solar-system-neptune", + "astronomy-solar-system-pluto", + "astronomy-solar-system-saturn", + "astronomy-solar-system-sun", + "astronomy-solar-system-uranus", + "astronomy-solar-system-venus", + "astronomy-stars", + "entertainment", + "entertainment-space-books", + "entertainment-space-games", + "entertainment-space-movies-shows", + "entertainment-space-toys-lego", + "science", + "science-astrophysics", + "science-climate-change", + "science-particle-physics", + "science-weather", + "space-exploration", + "space-exploration-human-spaceflight", + "space-exploration-launches-spacecraft", + "space-exploration-missions", + "space-exploration-missions-apollo", + "space-exploration-missions-artemis", + "space-exploration-missions-asteroid-comet-missions", + "space-exploration-missions-international-space-station", + "space-exploration-missions-mars-rovers", + "space-exploration-missions-new-horizons", + "space-exploration-missions-parker-solar-probe", + "space-exploration-missions-space-shuttle", + "space-exploration-missions-voyager", + "space-exploration-private-spaceflight", + "space-exploration-satellites", + "space-exploration-search-for-life", + "stargazing", + "stargazing-astrophotography", + "stargazing-auroras", + "stargazing-constellations", + "stargazing-eclipses", + "stargazing-eclipses-lunar-eclipses", + "stargazing-eclipses-solar-eclipses", + "stargazing-meteor-showers", + "stargazing-skywatching-kit", + "technology", + "technology-aerospace", + "technology-drones" ], "in": "query", - "name": "type", - "type": "string" + "name": "section", + "required": true, + "type": "string", + "x-example": "astronomy" } ], "produces": [ @@ -473235,7 +488663,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamSeasonStatisticsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -473244,11 +488672,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Space.com section headlines", + "tags": [ + "Space" + ] + } + }, + "/space/news": { + "get": { + "description": "Returns the latest Space.com top stories (space, astronomy and skywatching news) from the site's latest-news hub. Takes no parameters. Each item has its title, URL, summary, author, publication time and image.", + "operationId": "space-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -473268,29 +488722,42 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team season statistics", + "summary": "Get Space.com top stories", "tags": [ - "SofaScore" + "Space" ] } }, - "/sofascore/team-statistics-seasons": { + "/space/sections": { "get": { - "consumes": [ + "description": "Lists the Space.com categories that `space-headlines` accepts, from `astronomy`, `entertainment`, `science`, `space-exploration`, `stargazing` and `technology` down to their subcategories. Each entry has a `slug`, a display `name` and the category `url`. Slugs join the nested path with hyphens, so `astronomy-solar-system-mars` maps to `/astronomy/solar-system/mars`.", + "operationId": "space-sections", + "produces": [ "application/json" ], - "description": "Lists the competitions and seasons a team has statistics for, with the statistics `types` available for each season. Use a returned competition id (`unique_tournament_id`), season `id` and one of its `types` with team-season-statistics. The `types` values are `overall`, `home`, `away`, `regular_season`, and `playoffs`. Returns 404 for teams with no tracked statistics.", - "operationId": "sofascore-team-statistics-seasons", - "parameters": [ + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ { - "description": "Numeric SofaScore team id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" + "ApiKeyAuth": [] } ], + "summary": "Get Space.com sections", + "tags": [ + "Space" + ] + } + }, + "/sparkfun/categories": { + "get": { + "description": "Lists SparkFun's top-level browse categories. Each has an id, name, `url_key` and `url_path`. Pass a category's `url_key` to `sparkfun-category` to browse it. Takes no parameters, and the set follows the live storefront catalogue.", + "operationId": "sparkfun-categories", "produces": [ "application/json" ], @@ -473298,19 +488765,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamStatisticsSeasonsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/sparkfun.categoriesResponseDoc" } }, "429": { @@ -473331,64 +488786,53 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team statistics seasons", + "summary": "List SparkFun categories", "tags": [ - "SofaScore" + "SparkFun" ] } }, - "/sofascore/team-top-players": { + "/sparkfun/category": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a team's best players for every statistic category SofaScore ranks within the team and season (rating, goals, assists, expected goals, tackles, saves and more for football; points, rebounds and assists for basketball), each as a ranked list with player, team and value. The category set depends on the sport, so the response lists every category it holds. The `type` enum accepts `overall`, `regular_season` and `playoffs`: football competitions publish `overall`, the NBA publishes `regular_season` and `playoffs`, and a type the competition does not publish answers 404. Optional `limit` caps the rows per category (up to 50); the payload is large without it.", - "operationId": "sofascore-team-top-players", + "description": "Returns paginated public products and dynamic facet filters for a SparkFun category URL key. Each filter must be `attribute:value`; use values from the response's filters array.", + "operationId": "sparkfun-category", "parameters": [ { - "description": "Numeric SofaScore team id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore unique-tournament (competition) id from team-player-statistics-seasons", + "description": "SparkFun category URL key", "in": "query", - "name": "tournament_id", + "name": "url_key", "required": true, "type": "string", - "x-example": "17" + "x-example": "development-boards" }, { - "description": "Numeric SofaScore season id from team-player-statistics-seasons", + "default": 1, + "description": "One-based result page (1-100)", "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "96668" + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" }, { - "default": "overall", - "description": "Statistics scope", - "enum": [ - "overall", - "regular_season", - "playoffs" - ], + "default": 24, + "description": "Products per page (1-24)", "in": "query", - "name": "type", - "type": "string" + "maximum": 24, + "minimum": 1, + "name": "per_page", + "type": "integer" }, { - "description": "Rows per category, 1 to 50. Omit to return every row", + "collectionFormat": "multi", + "description": "Repeatable dynamic facet in attribute:value form", "in": "query", - "maximum": 50, - "minimum": 1, - "name": "limit", - "type": "integer", - "x-example": 5 + "items": { + "type": "string" + }, + "name": "filter", + "type": "array", + "x-example": "sf_qwiic_dev_board_type:8417" } ], "produces": [ @@ -473398,7 +488842,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamTopPlayersResponseDoc" + "$ref": "#/definitions/sparkfun.categoryResponseDoc" } }, "400": { @@ -473431,34 +488875,24 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team top players", + "summary": "Browse a SparkFun category", "tags": [ - "SofaScore" + "SparkFun" ] } }, - "/sofascore/team-tournaments": { + "/sparkfun/product": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the competitions a team plays in, each with id, name, slug, category and sport. By default (`all=false`) it returns the competitions the team currently takes part in; with `all=true` it returns every competition the team has been recorded in, including friendlies and older tournaments. Competition ids can be used as `tournament_id` elsewhere in the SofaScore endpoints; use team-player-statistics-seasons for the seasons that have statistics. Returns 404 when SofaScore has no competitions for the team.", - "operationId": "sofascore-team-tournaments", + "description": "Returns one SparkFun product by `sku`, for example `DEV-18158`: name, URL, stock status, current minimum price and currency, main image and media gallery, categories, and a cleaned short description. `recommendations` lists related, upsell or crosssell products when available. An unknown SKU returns 404.", + "operationId": "sparkfun-product", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "SparkFun product SKU", "in": "query", - "name": "id", + "name": "sku", "required": true, "type": "string", - "x-example": "17" - }, - { - "default": false, - "description": "false returns current competitions, true returns every recorded competition", - "in": "query", - "name": "all", - "type": "boolean" + "x-example": "DEV-18158" } ], "produces": [ @@ -473468,7 +488902,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamTournamentsResponseDoc" + "$ref": "#/definitions/sparkfun.productResponseDoc" } }, "400": { @@ -473501,27 +488935,53 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team competitions", + "summary": "Get a SparkFun product", "tags": [ - "SofaScore" + "SparkFun" ] } }, - "/sofascore/team-transfers": { + "/sparkfun/search": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a team's recent incoming (`transfers_in`) and outgoing (`transfers_out`) transfers with player, clubs, date, fee, and SofaScore's numeric transfer type code. Empty lists are valid for a quiet transfer window. Returns 404 when SofaScore has no transfer record for the team (seen for ice hockey and baseball teams). The `type_code` values are SofaScore's own opaque codes and are not translated.", - "operationId": "sofascore-team-transfers", + "description": "Searches public SparkFun product data with pagination and dynamic facet filters. Each filter must be `attribute:value`; use values from the response's filters array.", + "operationId": "sparkfun-search", "parameters": [ { - "description": "Numeric SofaScore team id", + "description": "Product search query", "in": "query", - "name": "id", + "name": "q", "required": true, "type": "string", - "x-example": "17" + "x-example": "arduino" + }, + { + "default": 1, + "description": "One-based result page (1-100)", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 24, + "description": "Products per page (1-24)", + "in": "query", + "maximum": 24, + "minimum": 1, + "name": "per_page", + "type": "integer" + }, + { + "collectionFormat": "multi", + "description": "Repeatable dynamic facet in attribute:value form", + "in": "query", + "items": { + "type": "string" + }, + "name": "filter", + "type": "array", + "x-example": "sf_qwiic_dev_board_type:8417" } ], "produces": [ @@ -473531,7 +488991,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.teamTransfersResponseDoc" + "$ref": "#/definitions/sparkfun.searchResponseDoc" } }, "400": { @@ -473540,12 +489000,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -473564,27 +489018,24 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team transfers", + "summary": "Search SparkFun products", "tags": [ - "SofaScore" + "SparkFun" ] } }, - "/sofascore/tennis-player-grand-slam-results": { + "/sportingnews/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a tennis player's best round at each grand slam (Australian Open, Roland Garros, Wimbledon and US Open) for the last five editions: per edition the `year`, the `season_id`, the best `round` reached and whether the player won it (`winner`). A year without a `round` means no result is recorded for that edition. `id` is the SofaScore team id of a tennis player (tennis players are teams in SofaScore); get it from search or rankings. Returns 404 for ids that are not tennis players.", - "operationId": "sofascore-tennis-player-grand-slam-results", + "description": "Returns a Sporting News US article by canonical `url`, such as `https://www.sportingnews.com/us/nfl/dallas-cowboys/news//`: title, description, section (the sport or topic in the URL, for example `NFL`), authors, publication and update times, image and body `paragraphs`. Tables, embeds, ad slots and related-story lists are excluded. Non-US editions and hub pages are rejected.", + "operationId": "sportingnews-article", "parameters": [ { - "description": "Numeric SofaScore team id of a tennis player", + "description": "Canonical Sporting News US article URL", "in": "query", - "name": "id", + "name": "url", "required": true, "type": "string", - "x-example": "14882" + "x-example": "https://www.sportingnews.com/us/nfl/dallas-cowboys/news/cowboys-george-pickens-production-way-down/30f07d65f36691600b3f97ba" } ], "produces": [ @@ -473594,7 +489045,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tennisGrandSlamResultsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -473609,12 +489060,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -473627,35 +489072,30 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore tennis player grand slam results", + "summary": "Get Sporting News article content", "tags": [ - "SofaScore" + "Sporting News" ] } }, - "/sofascore/tournament-cuptree": { + "/sportingnews/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the knockout tree(s) of a cup or playoff competition season: every round with its ties, each tie's participants (team or player, seed, winner flag, the earlier tie it advanced from), result and score strings (a shoot-out is appended, such as `1 (4)`), match ids and start time, plus the final and third-place tie. Tennis competitions return two trees (main draw and qualifying). League seasons have no tree and answer 404, as does a season id that does not belong to the competition. Get `id` from search or tournaments-with-feature and `season` from tournament-seasons; pass the returned `event_ids` to the event endpoints.", - "operationId": "sofascore-tournament-cuptree", + "description": "Returns a Sporting News US author's profile, looked up by `slug` (for example `anne-erickson`) or canonical `url`; exactly one is required. The response has the name, `bio`, photo, social links and about 20 recent articles, each with title, URL, section, author, publication time and image. There is no pagination, and an unknown author returns not-found.", + "operationId": "sportingnews-author", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id of a cup or playoff competition", + "description": "Author slug, e.g. anne-erickson", "in": "query", - "name": "id", - "required": true, + "name": "slug", "type": "string", - "x-example": "7" + "x-example": "anne-erickson" }, { - "description": "Numeric SofaScore season id", + "description": "Canonical sportingnews.com/us/author/ URL; alternative to slug", "in": "query", - "name": "season", - "required": true, + "name": "url", "type": "string", - "x-example": "76953" + "x-example": "https://www.sportingnews.com/us/author/anne-erickson" } ], "produces": [ @@ -473665,7 +489105,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentCupTreeResponseDoc" + "$ref": "#/definitions/publicnews.sportingNewsAuthorResponseDoc" } }, "400": { @@ -473680,12 +489120,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -473698,34 +489132,70 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore competition knockout tree", + "summary": "Get a Sporting News author profile", "tags": [ - "SofaScore" + "Sporting News" ] } }, - "/sofascore/tournament-info": { + "/sportingnews/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a competition's metadata (name, sport, category, tier, title holder, most titles, current season dates, divisions above and below, linked competitions). When `season` is given it also returns that season's aggregates: number of competitors and, for football competitions, goals, home wins, away wins, draws, yellow and red cards and the promoted teams. Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-tournament-info", + "description": "Returns up to 20 of the newest Sporting News US stories for one sport, league or topic. `section` is required and takes one of 44 slugs such as `nfl`, `nba`, `mlb`, `premier-league`, `formula-1`, `ufc` or `college`. Each item has its title, URL, summary, publication time, author and image. Off-season leagues may return older stories.", + "operationId": "sportingnews-headlines", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", + "description": "Sporting News section slug", + "enum": [ + "baseball", + "basketball", + "boxing", + "bundesliga", + "champions-league", + "club-world-cup", + "college", + "cricket", + "culture", + "darts", + "fantasy", + "football", + "formula-1", + "golf", + "high-school", + "horse-racing", + "la-liga", + "liga-mx", + "mlb", + "mls", + "mma", + "nascar", + "nba", + "nba-draft", + "ncaa", + "ncaa-basketball", + "ncaa-football", + "nfl", + "nfl-draft", + "nhl", + "olympics", + "premier-league", + "sec", + "serie-a", + "soccer", + "softball", + "tennis", + "tickets", + "tsn", + "ufc", + "watch", + "wnba", + "womens-college-basketball", + "wwe" + ], "in": "query", - "name": "id", + "name": "section", "required": true, "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id. Omit for competition metadata only", - "in": "query", - "name": "season", - "type": "string", - "x-example": "96668" + "x-example": "baseball" } ], "produces": [ @@ -473735,7 +489205,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentInfoResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -473744,11 +489214,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Sporting News section headlines", + "tags": [ + "Sporting News" + ] + } + }, + "/sportingnews/news": { + "get": { + "description": "Returns fresh top stories from the Sporting News US edition public RSS feed. Only the US edition (sportingnews.com/us) is covered.", + "operationId": "sportingnews-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -473768,37 +489264,16 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore competition info", + "summary": "Get Sporting News top stories", "tags": [ - "SofaScore" + "Sporting News" ] } }, - "/sofascore/tournament-player-of-the-season": { + "/sportingnews/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the player SofaScore names player of the season for a finished competition season: the player, their team, shirt number, average rating, appearances and the statistics scope (`overall`, or `regular_season` for the NBA). A season that is still running, has not been awarded, or does not belong to the competition answers 404. Get `id` from search and `season` from tournament-seasons or tournament-winners.", - "operationId": "sofascore-tournament-player-of-the-season", - "parameters": [ - { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id of a finished season", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "76986" - } - ], + "description": "Lists the 44 Sporting News US sport, league and topic feeds that `sportingnews-headlines` accepts. Each entry has a `slug`, a display `name` and the feed `url`. Off-season leagues such as `club-world-cup` and `softball` are listed and may return older items. Team feeds and non-US editions are not covered.", + "operationId": "sportingnews-sections", "produces": [ "application/json" ], @@ -473806,19 +489281,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentPlayerOfTheSeasonResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } }, "429": { @@ -473839,177 +489302,30 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player of the season", + "summary": "Get Sporting News sections", "tags": [ - "SofaScore" + "Sporting News" ] } }, - "/sofascore/tournament-player-statistics": { + "/sportskeeda/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of a football competition season's player statistics table, sortable by a statistic. `order` chooses the statistic to sort by, `direction` the sort direction (`desc` or `asc`), `accumulation` whether values are season totals, per-game averages or per-90-minute averages (`total`, `perGame`, `per90`), and `group` which statistic columns each row carries (`summary`, `attack`, `defence`, `passing`, `goalkeeper`). Page with `limit` (up to 100) and `offset`; `has_next_page` shows whether more rows follow. Optional filters narrow the table: `team` (team ids), `nationality` (SofaScore nationality codes), `position` (`G`, `D`, `M`, `F`), `min_appearances` and `min_minutes`; several filters combine (AND) and several values of one filter are alternatives (OR). The team ids and nationality codes of a season come from tournament-statistics-info. A filter that matches nobody returns an empty `players` list. Other sports return no rows (404). Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-tournament-player-statistics", + "description": "Returns public article metadata and body paragraphs for a Sportskeeda article slug. Discovered slugs may contain case-preserving percent-encoded characters. A canonical Sportskeeda URL remains accepted for existing clients. Provide exactly one of slug or url; use /sportskeeda/sections and /sportskeeda/sitemaps for topic discovery.", + "operationId": "sportskeeda-article", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "96668" - }, - { - "description": "Statistic to sort by. Defaults to rating", - "enum": [ - "rating", - "goals", - "expectedGoals", - "assists", - "successfulDribbles", - "tackles", - "accuratePassesPercentage", - "bigChancesMissed", - "totalShots", - "goalConversionPercentage", - "interceptions", - "clearances", - "errorLeadToGoal", - "outfielderBlocks", - "bigChancesCreated", - "accuratePasses", - "keyPasses", - "saves", - "cleanSheet", - "penaltySave", - "savedShotsFromInsideTheBox", - "runsOut" - ], - "in": "query", - "name": "order", - "type": "string", - "x-example": "goals" - }, - { - "description": "Sort direction. Defaults to desc", - "enum": [ - "desc", - "asc" - ], - "in": "query", - "name": "direction", - "type": "string", - "x-example": "desc" - }, - { - "description": "How statistics are accumulated. Defaults to total", - "enum": [ - "total", - "perGame", - "per90" - ], + "description": "Sportskeeda article path without host; preferred over url", "in": "query", - "name": "accumulation", + "name": "slug", "type": "string", - "x-example": "total" + "x-example": "football/rumor-psg-handed-major-lionel-messi-injury-scare-ahead-bayern-munich-clash-latest-fitness-update-reports" }, { - "description": "Statistic columns returned. Defaults to summary", - "enum": [ - "summary", - "attack", - "defence", - "passing", - "goalkeeper" - ], + "description": "Canonical Sportskeeda article URL; alternative to slug", "in": "query", - "name": "group", + "name": "url", "type": "string", - "x-example": "summary" - }, - { - "description": "Rows per page, 1 to 100. Defaults to 20", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "limit", - "type": "integer", - "x-example": 20 - }, - { - "description": "Rows to skip. Defaults to 0", - "in": "query", - "minimum": 0, - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "collectionFormat": "csv", - "description": "Team ids to keep, comma separated, up to 20 (ids from tournament-statistics-info or tournament-teams)", - "in": "query", - "items": { - "type": "string" - }, - "name": "team", - "type": "array", - "x-example": "42" - }, - { - "collectionFormat": "csv", - "description": "Nationality codes to keep, comma separated, up to 20 (codes from tournament-statistics-info)", - "in": "query", - "items": { - "type": "string" - }, - "name": "nationality", - "type": "array", - "x-example": "EN" - }, - { - "collectionFormat": "csv", - "description": "Position codes to keep, comma separated", - "in": "query", - "items": { - "enum": [ - "G", - "D", - "M", - "F" - ], - "type": "string" - }, - "name": "position", - "type": "array", - "x-example": "F" - }, - { - "description": "Keep players with at least this many appearances, 0 to 1000. Omit for no minimum", - "in": "query", - "maximum": 1000, - "minimum": 0, - "name": "min_appearances", - "type": "integer", - "x-example": 10 - }, - { - "description": "Keep players with at least this many minutes played, 0 to 100000. Omit for no minimum", - "in": "query", - "maximum": 100000, - "minimum": 0, - "name": "min_minutes", - "type": "integer", - "x-example": 900 + "x-example": "https://www.sportskeeda.com/football/rumor-psg-handed-major-lionel-messi-injury-scare-ahead-bayern-munich-clash-latest-fitness-update-reports" } ], "produces": [ @@ -474019,7 +489335,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentPlayerStatisticsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -474034,12 +489350,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474052,35 +489362,30 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore season player statistics table", + "summary": "Get a Sportskeeda article", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-rounds": { + "/sportskeeda/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the rounds of a competition season and the current round. Round numbers are not unique in cups: the UEFA Champions League has both a qualifying and a league-phase round 1, and the same playoff round number with and without a `prefix`. To fetch a round's fixtures, pass its `round` to round-events together with its `slug` and, when present, its `prefix`; knockout and named rounds return 404 from round-events without the slug. Plain numbered rounds (a league's round 1 to 38) have no slug. Get `id` from category-tournaments or search and `season` from tournament-seasons. Returns 404 when SofaScore has no rounds for the season (for example a season that has not started).", - "operationId": "sofascore-tournament-rounds", + "description": "Returns a Sportskeeda author's profile, looked up by `slug` (for example `sripad`) or canonical `url`; at least one is required. The response has the name and the articles listed on the profile, each with title and URL, and can also carry `biography`, `role` and `image_url`.", + "operationId": "sportskeeda-author", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", + "description": "Sportskeeda author slug, e.g. sripad", "in": "query", - "name": "id", - "required": true, + "name": "slug", "type": "string", - "x-example": "7" + "x-example": "sripad" }, { - "description": "Numeric SofaScore season id from tournament-seasons", + "description": "Canonical Sportskeeda /author/ URL; alternative to slug", "in": "query", - "name": "season", - "required": true, + "name": "url", "type": "string", - "x-example": "76953" + "x-example": "https://www.sportskeeda.com/author/sripad" } ], "produces": [ @@ -474090,7 +489395,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentRoundsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaAuthorResponseDoc" } }, "400": { @@ -474105,12 +489410,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474123,27 +489422,32 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore competition season rounds", + "summary": "Get a Sportskeeda author profile", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-seasons": { + "/sportskeeda/college-basketball-schedule": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the season list for a competition. Use a returned season id with the standings and round-events endpoints.", - "operationId": "sofascore-tournament-seasons", + "description": "Returns all games and published scores for the requested date and season from Sportskeeda's first-party JSON feed. Discover valid season values with college-basketball-schedule-options. The upstream conference filter is currently unreliable and this endpoint does not accept it.", + "operationId": "sportskeeda-college-basketball-schedule", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", + "description": "Game date in YYYY-MM-DD format", "in": "query", - "name": "id", + "name": "date", "required": true, "type": "string", - "x-example": "17" + "x-example": "2026-11-02" + }, + { + "description": "Season starting year returned by college-basketball-schedule-options", + "in": "query", + "name": "season", + "required": true, + "type": "integer", + "x-example": 2026 } ], "produces": [ @@ -474153,7 +489457,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentSeasonsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaCollegeBasketballScheduleResponseDoc" } }, "400": { @@ -474168,12 +489472,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474186,35 +489484,23 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore competition seasons", + "summary": "Get Sportskeeda college basketball games for a date", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-statistics-info": { + "/sportskeeda/college-basketball-schedule-options": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns what the tournament-player-statistics table of a football competition season can be filtered by: the season's teams (ids for the `team` filter), the nationality codes (for the `nationality` filter; SofaScore uses `EN`, `SX`, `WA` and `NX` for the home nations), the position codes `G`, `D`, `M` and `F` (for the `position` filter), and the statistic columns of each `group` value (`summary`, `attack`, `defence`, `passing`, `goalkeeper`). Other sports answer 404. Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-tournament-statistics-info", + "description": "Reads Sportskeeda's current college basketball schedule configuration. It returns every season from the published minimum through the current schedule season and the date-picker window. The conference selector is shown by the site, but its current-season feed metadata is incomplete.", + "operationId": "sportskeeda-college-basketball-schedule-options", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id of a football competition", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", + "description": "A season starting year from the live seasons list; defaults to the current schedule season", "in": "query", "name": "season", - "required": true, - "type": "string", - "x-example": "96668" + "type": "integer", + "x-example": 2026 } ], "produces": [ @@ -474224,7 +489510,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentStatisticsInfoResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaCollegeBasketballScheduleOptionsResponseDoc" } }, "400": { @@ -474233,18 +489519,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474257,35 +489531,45 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore player statistics table filters", + "summary": "Discover college basketball schedule seasons and date window", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-team-of-the-season": { + "/sportskeeda/cricket-commentary": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the team of the season SofaScore selected for a finished competition season: the formation, when it was created and the selected players (11 in football, 5 in basketball) with position, shirt number, team and average rating. A season that is still running, has no selection, or does not belong to the competition answers 404. Get `id` from search and `season` from tournament-seasons or tournament-winners.", - "operationId": "sofascore-tournament-team-of-the-season", + "description": "Returns the current commentary feed. To page to older events, pass a 24-character lowercase hexadecimal cursor from an event in /sportskeeda/cricket-match's commentary field (the full feed may contain zero-filled IDs); language then selects an upstream language. The match page's commentary selector offers en, hi, ta, te, and bho. Language without cursor is rejected because the upstream feed ignores it.", + "operationId": "sportskeeda-cricket-commentary", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", + "description": "Host-free match path returned by /sportskeeda/schedule", "in": "query", - "name": "id", + "name": "slug", "required": true, "type": "string", - "x-example": "17" + "x-example": "live-cricket-score/india-vs-west-indies-2nd-odi-30-september-2026" }, { - "description": "Numeric SofaScore season id of a finished season", + "description": "Nonzero 24-character lowercase hexadecimal commentary ID from /sportskeeda/cricket-match commentary", "in": "query", - "name": "season", - "required": true, + "name": "cursor", "type": "string", - "x-example": "76986" + "x-example": "6abba0970c04cda719d37b18" + }, + { + "description": "Older-comment language; valid only with cursor", + "enum": [ + "en", + "hi", + "ta", + "te", + "bho" + ], + "in": "query", + "name": "language", + "type": "string", + "x-example": "en" } ], "produces": [ @@ -474295,7 +489579,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentTeamOfTheSeasonResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaCricketCommentaryResponseDoc" } }, "400": { @@ -474310,12 +489594,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474328,35 +489606,24 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore team of the season", + "summary": "Get Sportskeeda cricket ball-by-ball commentary", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-teams": { + "/sportskeeda/cricket-match": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns every team (or, for tennis and other individual sports, every player) entered in a competition season, with id, name, short name, name code, country, gender, type (`0` team, `1` individual player) and, for individual players, the current ranking. Use the team ids with team, team-players and the `team` filter of tournament-player-statistics. A season id that does not belong to the competition, or a field not yet decided, answers 404. Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-tournament-teams", + "description": "Returns the public scorecard, innings, teams, squads, player data, and latest commentary for a cricket match slug discovered from /sportskeeda/schedule. Betting fields are excluded.", + "operationId": "sportskeeda-cricket-match", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", + "description": "Host-free match path returned by /sportskeeda/schedule", "in": "query", - "name": "season", + "name": "slug", "required": true, "type": "string", - "x-example": "96668" + "x-example": "live-cricket-score/india-vs-west-indies-2nd-odi-30-september-2026" } ], "produces": [ @@ -474366,7 +489633,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentTeamsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaCricketMatchResponseDoc" } }, "400": { @@ -474381,12 +489648,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474399,56 +489660,27 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore teams of a competition season", + "summary": "Get a Sportskeeda cricket match center", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-top-players": { + "/sportskeeda/depth-chart": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a competition season's top players for every statistic category SofaScore ranks (for football about 30 categories such as rating, goals, assists, expected goals, tackles and saves; for basketball points, rebounds, assists and more), each with the ranked players, their team and the value. The category set depends on the sport and competition, so the response lists every category it holds. The `type` enum accepts `overall`, `regular_season` and `playoffs`: football competitions publish `overall`, the NBA publishes `regular_season` and `playoffs`, and a type the competition does not publish answers 404. Optional `limit` caps the rows per category (up to 50). Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-tournament-top-players", + "description": "Returns every team and listed position/player from the live NFL depth chart. Players and team detail pages include slugs when Sportskeeda links them.", + "operationId": "sportskeeda-depth-chart", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", - "in": "query", - "name": "season", - "required": true, - "type": "string", - "x-example": "96668" - }, - { - "description": "Statistics scope. Defaults to overall", + "description": "Must be nfl/depth-chart", "enum": [ - "overall", - "regular_season", - "playoffs" + "nfl/depth-chart" ], "in": "query", - "name": "type", + "name": "slug", + "required": true, "type": "string", - "x-example": "overall" - }, - { - "description": "Rows per category, 1 to 50. Omit to return every row", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "limit", - "type": "integer", - "x-example": 5 + "x-example": "nfl/depth-chart" } ], "produces": [ @@ -474458,7 +489690,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentTopPlayersResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaDepthChartResponseDoc" } }, "400": { @@ -474473,12 +489705,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474491,56 +489717,66 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore season top players", + "summary": "Get the NFL depth chart for all teams", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-top-teams": { + "/sportskeeda/draft-picks": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a competition season's top teams for every team statistic category SofaScore ranks (for football about 30 categories such as average rating, goals scored, possession, shots and clean sheets; for basketball points, pace, ratings and more), each with the ranked teams and the value. The category set depends on the sport and competition, so the response lists every category it holds. The `type` enum accepts `overall`, `regular_season` and `playoffs`: football competitions publish `overall`, the NBA publishes `regular_season`, and a type the competition does not publish answers 404. Optional `limit` caps the rows per category (up to 50). Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-tournament-top-teams", + "description": "Reads the complete public draft JSON asset, not only the rows initially visible on the page. Filter by year, round, position or player name. Discover each team's exact filter values with draft-picks-options. Source history and latest available year are published by Sportskeeda and may lag the current season.", + "operationId": "sportskeeda-draft-picks", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", + "description": "NFL team draft-picks page path without host", "in": "query", - "name": "id", + "name": "slug", "required": true, "type": "string", - "x-example": "17" + "x-example": "nfl/san-francisco-49ers/draft-picks" }, { - "description": "Numeric SofaScore season id", + "description": "Year from draft-picks-options; omit for all years", "in": "query", - "name": "season", - "required": true, + "name": "year", + "type": "integer", + "x-example": 2025 + }, + { + "description": "Exact round from draft-picks-options; historical special labels are accepted", + "in": "query", + "name": "round", "type": "string", - "x-example": "96668" + "x-example": "1" }, { - "description": "Statistics scope. Defaults to overall", - "enum": [ - "overall", - "regular_season", - "playoffs" - ], + "description": "Exact position from draft-picks-options", "in": "query", - "name": "type", + "name": "position", "type": "string", - "x-example": "overall" + "x-example": "QB" }, { - "description": "Rows per category, 1 to 50. Omit to return every row", + "description": "Case-insensitive player-name substring, at most 100 characters", "in": "query", - "maximum": 50, - "minimum": 1, - "name": "limit", + "name": "q", + "type": "string", + "x-example": "Purdy" + }, + { + "description": "Page number, 1-1000; default 1", + "in": "query", + "name": "page", "type": "integer", - "x-example": 5 + "x-example": 1 + }, + { + "description": "Records per page, 1-500; default 100", + "in": "query", + "name": "per_page", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -474550,7 +489786,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentTopTeamsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaDraftPicksResponseDoc" } }, "400": { @@ -474565,12 +489801,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474583,35 +489813,24 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore season top teams", + "summary": "Get all historical NFL team draft picks from Sportskeeda", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-venues": { + "/sportskeeda/draft-picks-options": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns every venue used by a competition season with id, name, capacity, city, state (US), coordinates and the `hidden` flag. Use the venue ids with venue and venue-events. A season id that does not belong to the competition answers 404. Get `id` from search and `season` from tournament-seasons.", - "operationId": "sofascore-tournament-venues", + "description": "Reads the public draft JSON asset named by the team page and returns every available year, round and position, including historical special rounds. Team page slugs are discoverable from page-options on an NFL team overview.", + "operationId": "sportskeeda-draft-picks-options", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "17" - }, - { - "description": "Numeric SofaScore season id", + "description": "NFL team draft-picks page path without host", "in": "query", - "name": "season", + "name": "slug", "required": true, "type": "string", - "x-example": "96668" + "x-example": "nfl/san-francisco-49ers/draft-picks" } ], "produces": [ @@ -474621,7 +489840,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentVenuesResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaDraftPicksOptionsResponseDoc" } }, "400": { @@ -474636,12 +489855,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474654,35 +489867,93 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore venues of a competition season", + "summary": "Discover an NFL team's complete Sportskeeda draft filters", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournament-winners": { + "/sportskeeda/event-calendar": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page (10 seasons, newest first) of a competition's past winners: the year, the season id and the winning team or player. Follow `has_next_page` and pass `page` (zero-based) for older seasons; a page past the last one and an unknown competition both answer 404. Get `id` from search; the returned `season_id` works with every season-scoped endpoint.", - "operationId": "sofascore-tournament-winners", + "description": "Returns all events from the embedded Sports Calendar, optionally filtered by an offered region-specific sport, one or more offered months, or an inclusive date range. Discover the current region, sport, and month values through /sportskeeda/event-calendar-options.", + "operationId": "sportskeeda-event-calendar", "parameters": [ { - "description": "Numeric SofaScore unique-tournament (competition) id", + "default": "us", + "description": "Calendar region", + "enum": [ + "us", + "india" + ], "in": "query", - "name": "id", - "required": true, + "name": "region", + "type": "string" + }, + { + "description": "Exact sport label offered for the selected region; see event-calendar-options", + "enum": [ + "NFL", + "Football", + "MLB", + "College Football", + "NBA", + "College Basketball", + "NHL", + "WNBA", + "Golf", + "Tennis", + "NASCAR", + "WWE", + "Boxing", + "UFC", + "MMA", + "Formula 1", + "College Baseball", + "IndyCar", + "AEW", + "MotoGP", + "Wrestling", + "Cricket", + "Table Tennis", + "Chess", + "Kabaddi", + "Hockey", + "Badminton", + "Athletics" + ], + "in": "query", + "name": "sport", + "type": "string" + }, + { + "collectionFormat": "multi", + "description": "One or more offered calendar months in YYYY-MM format; repeat this parameter for multiple months", + "in": "query", + "items": { + "enum": [ + "2026-09", + "2026-10", + "2026-11", + "2026-12" + ], + "type": "string" + }, + "name": "month", + "type": "array" + }, + { + "description": "Inclusive range start in YYYY-MM-DD; provide together with end_date", + "in": "query", + "name": "start_date", "type": "string", - "x-example": "17" + "x-example": "2026-09-01" }, { - "description": "Zero-based page number. Defaults to 0", + "description": "Inclusive range end in YYYY-MM-DD; provide together with start_date", "in": "query", - "minimum": 0, - "name": "page", - "type": "integer", - "x-example": 0 + "name": "end_date", + "type": "string", + "x-example": "2026-09-30" } ], "produces": [ @@ -474692,7 +489963,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentWinnersResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaEventCalendarResponseDoc" } }, "400": { @@ -474701,18 +489972,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474725,67 +489984,16 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore past winners of a competition", + "summary": "Get Sportskeeda regional sports calendar events", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/tournaments-with-feature": { + "/sportskeeda/event-calendar-options": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns SofaScore's short list (up to 10) of the most followed competitions of a sport that carry one feature. The `feature` enum accepts `cuptree` (knockout tree, for tournament-cuptree), `standings` (league table), `totw` (team of the week) and `power_rankings`. The `sport` enum accepts `american-football`, `aussie-rules`, `badminton`, `bandy`, `baseball`, `basketball`, `beach-volley`, `cricket`, `darts`, `esports`, `floorball`, `football`, `futsal`, `handball`, `ice-hockey`, `minifootball`, `rugby`, `snooker`, `table-tennis`, `tennis`, `volleyball` and `waterpolo` (`mma` and `padel` are not supported). The list is fixed by SofaScore and cannot be paged or searched; a sport with no such competition returns an empty list. Use search-typed with `type` `unique_tournaments` to find other competitions.", - "operationId": "sofascore-tournaments-with-feature", - "parameters": [ - { - "description": "Competition feature", - "enum": [ - "cuptree", - "standings", - "totw", - "power_rankings" - ], - "in": "query", - "name": "feature", - "required": true, - "type": "string", - "x-example": "cuptree" - }, - { - "description": "Sport key", - "enum": [ - "american-football", - "aussie-rules", - "badminton", - "bandy", - "baseball", - "basketball", - "beach-volley", - "cricket", - "darts", - "esports", - "floorball", - "football", - "futsal", - "handball", - "ice-hockey", - "minifootball", - "rugby", - "snooker", - "table-tennis", - "tennis", - "volleyball", - "waterpolo" - ], - "in": "query", - "name": "sport", - "required": true, - "type": "string", - "x-example": "football" - } - ], + "description": "Lists the regions (`us` and `india`) of the Sportskeeda event calendar, each with the sport names and `YYYY-MM` months currently on offer. Takes no parameters. Pass the exact `region`, `sport` and `month` values to `/sportskeeda/event-calendar`; no year parameter exists.", + "operationId": "sportskeeda-event-calendar-options", "produces": [ "application/json" ], @@ -474793,19 +490001,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.tournamentsWithFeatureResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sportskeedaEventCalendarOptionsResponseDoc" } }, "503": { @@ -474820,27 +490016,33 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore competitions that carry a feature", + "summary": "Discover Sportskeeda calendar regions, sports, and months", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/trending-events": { + "/sportskeeda/feed": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the events trending in one country across every sport (live, recent and upcoming), each as the usual event summary plus its `sport` key. `country` is a two-letter ISO 3166-1 alpha-2 code such as `GB` or `US` (any case); SofaScore serves a trending list per country, and a code it does not serve returns 404. The list is about twenty events and changes through the day.", - "operationId": "sofascore-trending-events", + "description": "Fetches the public article cards for a Sportskeeda section, event, team-news, or player-news slug. Page pagination is accepted only when the source advertises it.", + "operationId": "sportskeeda-feed", "parameters": [ { - "description": "Two-letter ISO 3166-1 alpha-2 country code", + "description": "Sportskeeda path without host, such as wwe, go/epl, or player/jannik-sinner/news", "in": "query", - "name": "country", + "name": "slug", "required": true, "type": "string", - "x-example": "GB" + "x-example": "wwe" + }, + { + "default": 1, + "description": "Source page, for feeds with pagination; defaults to 1", + "in": "query", + "maximum": 1000, + "minimum": 1, + "name": "page", + "type": "integer" } ], "produces": [ @@ -474850,7 +490052,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.trendingEventsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaFeedResponseDoc" } }, "400": { @@ -474865,12 +490067,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -474883,31 +490079,31 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore trending events", + "summary": "Get articles from a Sportskeeda section or topic", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/trending-players": { + "/sportskeeda/football-data": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a sport's trending top players: standout performers from recent matches with the player, team, the match and that match's numbers as a snake_case metric map (`rating`, `minutes_played`, `goals` and more; the metric set depends on the sport and position). The `sport` enum accepts `football` and `basketball`, the sports for which SofaScore publishes this list. Returns 404 when SofaScore has no trending players for the sport right now.", - "operationId": "sofascore-trending-players", + "description": "Returns first-party football widget fixtures and standings. Event and optional matchday must be offered by football-options. Omit matchday for the widget's selected round. Scores and standings reflect upstream data, which may be stale.", + "operationId": "sportskeeda-football-data", "parameters": [ { - "description": "Sport key", - "enum": [ - "football", - "basketball" - ], + "description": "Tournament slug from football-options; current selector: featured, epl, uefa-champions-league, uefa-nations-league, la-liga, ligue-1, mls, bundesliga", "in": "query", - "name": "sport", + "name": "event", "required": true, "type": "string", - "x-example": "football" + "x-example": "epl" + }, + { + "description": "Round slug from football-options for the selected event", + "in": "query", + "name": "matchday", + "type": "string", + "x-example": "round-5" } ], "produces": [ @@ -474917,23 +490113,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.trendingPlayersResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sportskeedaFootballDataResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -474950,27 +490134,23 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore trending players", + "summary": "Get football fixtures and standings", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/venue": { + "/sportskeeda/football-options": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one venue (stadium or arena): name, capacity, city, country, coordinates, its home teams, the venue-wide match totals (matches, goals, home and away win shares, and for football cards and corners per game) and a per-sport record in `sports`, most matches first. `hidden` venues, such as NBA arenas, have no venue-wide match list in venue-events and are listed per competition season instead. An unknown venue id answers 404. Get `id` from search-typed with `type` `venues`, from tournament-venues or from an event's venue.", - "operationId": "sofascore-venue", + "description": "Lists the live football widget's tournament selector. With event, follows the full previous/next matchday chain and returns every currently offered round slug. The discovered values feed sportskeeda-football-data.", + "operationId": "sportskeeda-football-options", "parameters": [ { - "description": "Numeric SofaScore venue id", + "description": "Live tournament slug; current selector: featured, epl, uefa-champions-league, uefa-nations-league, la-liga, ligue-1, mls, bundesliga. Omit to list tournaments only", "in": "query", - "name": "id", - "required": true, + "name": "event", "type": "string", - "x-example": "624" + "x-example": "epl" } ], "produces": [ @@ -474980,7 +490160,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.venueResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaFootballOptionsResponseDoc" } }, "400": { @@ -474989,18 +490169,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -475013,95 +490181,36 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore venue", + "summary": "Discover football tournaments and matchdays", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sofascore/venue-events": { + "/sportskeeda/guessing-game": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page (up to 30) of the matches played (`direction` `last`, newest page first) or scheduled (`next`) at a venue, as match summaries. Without `tournament` and `season` it lists every match at the venue, optionally narrowed by `sport` (`all`, or any key listed in the venue's `sports`, such as `football`, `rugby`, `basketball`, `mma`); with both it lists that competition season's matches at the venue and `sport` must be omitted. Hidden venues (see venue) have no venue-wide list and answer 404 without `tournament` and `season`. A direction with no matches, a sport the venue never hosted and a page past the last one also answer 404; follow `has_next_page`.", - "operationId": "sofascore-venue-events", + "description": "Returns the public clues and image metadata for a discovered player-guessing game and ISO date. The answer is omitted so the endpoint does not reveal the active puzzle solution.", + "operationId": "sportskeeda-guessing-game", "parameters": [ { - "description": "Numeric SofaScore venue id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "624" - }, - { - "description": "Upcoming matches or finished matches", + "description": "Discovered host-free game page path", "enum": [ - "next", - "last" + "wwe/brainbuster-wwe-player-guessing-game", + "nfl/gridle-nfl-player-guessing-game" ], "in": "query", - "name": "direction", + "name": "slug", "required": true, "type": "string", - "x-example": "last" - }, - { - "description": "Sport filter for the venue-wide list. Defaults to all", - "enum": [ - "all", - "american-football", - "aussie-rules", - "badminton", - "bandy", - "baseball", - "basketball", - "beach-volley", - "cricket", - "darts", - "esports", - "floorball", - "football", - "futsal", - "handball", - "ice-hockey", - "mma", - "minifootball", - "padel", - "rugby", - "snooker", - "table-tennis", - "tennis", - "volleyball", - "waterpolo" - ], - "in": "query", - "name": "sport", - "type": "string", - "x-example": "football" - }, - { - "description": "Zero-based page number. Defaults to 0", - "in": "query", - "minimum": 0, - "name": "page", - "type": "integer", - "x-example": 0 - }, - { - "description": "Numeric unique-tournament id; with season, lists that competition season's matches at the venue", - "in": "query", - "name": "tournament", - "type": "string", - "x-example": "17" + "x-example": "wwe/brainbuster-wwe-player-guessing-game" }, { - "description": "Numeric season id; with tournament, lists that competition season's matches at the venue", + "description": "Puzzle date in YYYY-MM-DD format", "in": "query", - "name": "season", + "name": "date", + "required": true, "type": "string", - "x-example": "96668" + "x-example": "2026-09-30" } ], "produces": [ @@ -475111,7 +490220,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sofascore.venueEventsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaGuessingGameResponseDoc" } }, "400": { @@ -475126,12 +490235,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -475144,37 +490247,28 @@ "ApiKeyAuth": [] } ], - "summary": "SofaScore matches at a venue", + "summary": "Get a Sportskeeda daily guessing-game puzzle", "tags": [ - "SofaScore" + "Sportskeeda" ] } }, - "/sonic/availability": { + "/sportskeeda/guessing-game-entities": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the bookable order-ahead windows for one Sonic Drive-In restaurant, grouped by service channel and local date. Each window has a UTC start_time and end_time. Also returns the store's timezone, how long each window lasts (slot_duration_minutes), the prep/handoff buffer before the first bookable window (lead_time_minutes), and service_types -- every channel the store supports, which is a superset of the channels that currently have windows. fulfillment selects the request method and accepts exactly `PICKUP` or `DELIVERY`; note the per-window service_type is a separate, finer vocabulary and can be `ORDER_AHEAD`, `CURBSIDE_PICKUP`, `DRIVE_THROUGH`, `STORE`, `PICKUP` or `DELIVERY`. A closed or fully-booked restaurant returns an empty channels array with total_slots 0, not an error. An unknown store_id returns 404.", - "operationId": "sonic-availability", + "description": "Returns the live public entity list used by a discovered player-guessing game, including the game-specific team, position, and profile fields.", + "operationId": "sportskeeda-guessing-game-entities", "parameters": [ { - "description": "Sonic store number, e.g. from /sonic/nearby", - "in": "query", - "name": "store_id", - "required": true, - "type": "string", - "x-example": "4521" - }, - { - "description": "Fulfillment method: PICKUP or DELIVERY. Defaults to PICKUP.", + "description": "Discovered host-free game page path", "enum": [ - "PICKUP", - "DELIVERY" + "wwe/brainbuster-wwe-player-guessing-game", + "nfl/gridle-nfl-player-guessing-game" ], "in": "query", - "name": "fulfillment", - "type": "string" + "name": "slug", + "required": true, + "type": "string", + "x-example": "wwe/brainbuster-wwe-player-guessing-game" } ], "produces": [ @@ -475184,7 +490278,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.availabilityResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaGuessingGameEntitiesResponseDoc" } }, "400": { @@ -475199,12 +490293,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -475217,19 +490305,16 @@ "ApiKeyAuth": [] } ], - "summary": "List a Sonic Drive-In restaurant's order-ahead time slots", + "summary": "List players for a Sportskeeda guessing game", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/categories": { + "/sportskeeda/guessing-games": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Sonic Drive-In's national menu's top-level categories -- Breakfast, Value, Limited Time, Combos, Burgers, Chicken, Hot Dogs, Sandwiches, Snacks & Sides, Sweets, Tea & Coffee, Lemonades & Limeades, Sodas, Slushes, Refreshers, Wacky Pack Kids Meals and others -- each with its slug (the value GET /sonic/menu takes) and a page_count of subcategory/item pages nested under it.", - "operationId": "sonic-categories", + "description": "Lists the player-guessing games currently linked on Sportskeeda. Each has a display `name`, a host-free page `slug` such as `wwe/brainbuster-wwe-player-guessing-game`, and its `game_slug`. Pass `slug` to `/sportskeeda/guessing-game` or `/sportskeeda/guessing-game-entities`. Takes no parameters.", + "operationId": "sportskeeda-guessing-games", "produces": [ "application/json" ], @@ -475237,11 +490322,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.categoriesResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaGuessingGamesResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -475258,19 +490343,45 @@ "ApiKeyAuth": [] } ], - "summary": "List Sonic Drive-In menu categories", + "summary": "List Sportskeeda player-guessing games", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/deals": { + "/sportskeeda/nba-queries": { "get": { - "consumes": [ - "application/json" + "description": "Pages through the server-rendered questions on Sportskeeda's Top NBA Queries page. Slugs are host-free and can be passed to sportskeeda_page_data for the linked player stats table. The live category directory is returned on every page.", + "operationId": "sportskeeda-nba-queries", + "parameters": [ + { + "description": "Optional category id", + "enum": [ + "player-stat", + "player-vs-team" + ], + "in": "query", + "name": "category", + "type": "string" + }, + { + "default": 0, + "description": "Zero-based result offset", + "in": "query", + "minimum": 0, + "name": "offset", + "type": "integer" + }, + { + "default": 100, + "description": "Page size; 0 or omitted defaults to 100, maximum is 500", + "in": "query", + "maximum": 500, + "minimum": 0, + "name": "limit", + "type": "integer" + } ], - "description": "Returns the promotions currently published on Sonic Drive-In's national deals page -- each with its marketing headline, public name, description, legal terms, call-to-action label and link, and creative image. This page is not listed in Sonic's own sitemap, so GET /sonic/sitemap will never surface it. Deals are national marketing offers, not per-store pricing; there is no price field in this source. Between campaigns Sonic can publish the page with no promotions at all, which returns an empty deals array with count 0 rather than an error.", - "operationId": "sonic-deals", "produces": [ "application/json" ], @@ -475278,11 +490389,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.dealsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaNBAQueriesResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -475299,19 +490410,16 @@ "ApiKeyAuth": [] } ], - "summary": "List Sonic Drive-In's current promotions", + "summary": "List Sportskeeda NBA player query pages", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/directory": { + "/sportskeeda/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Sonic Drive-In's restaurant directory as a country to state to city tree, with a restaurant count at every level. Use it to discover which states and cities have restaurants before calling GET /sonic/locations or GET /sonic/nearby. Each city carries both its display name and the slug that composes into a store path. Counts here describe listed restaurants and are internally consistent (the city counts sum to total_count); GET /sonic/locations enumerates a larger set of store pages, so the two totals intentionally differ.", - "operationId": "sonic-directory", + "description": "Returns the current public Sportskeeda news sitemap entries. Use /sportskeeda/sections to discover all navigation groups and sports landing pages, and /sportskeeda/taxonomy-search to search categories, events, teams, players, wiki pages, and wiki tags.", + "operationId": "sportskeeda-news", "produces": [ "application/json" ], @@ -475319,13 +490427,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.directoryResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "503": { @@ -475340,27 +490442,76 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Sonic Drive-In's restaurant directory by country, state and city", + "summary": "Get Sportskeeda's latest news", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/item": { + "/sportskeeda/page-data": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one menu page's detail: name, description, image, and a link to Sonic's site-wide nutrition/allergen guide PDF. path must be a \"menu\" section path with kind category, subcategory, or item from GET /sonic/sitemap (or a path copied from a GET /sonic/menu-adjacent page you already know).", - "operationId": "sonic-item", + "description": "Returns team, player, roster, leaderboard, ranking, depth, playoff, and game-log tables. NFL team stats include team-leader cards, player-category tables, and Basic, Advanced, and Expert team tables. Season and type are accepted only if offered by the selected page; discover their values with page-options. Player game-log seasons use their discovered season-specific path and return every table offered by the page; NFL category tabs are listed by page-options. College-football schedule slugs accept a discovered conference slug and filter the schedule rows; an offered group with no games on that week returns status no_data. The trade value chart has a separate endpoint. A page with no structured tables returns an upstream error.", + "operationId": "sportskeeda-page-data", "parameters": [ { - "description": "A menu page path from /sonic/sitemap (section=menu)", + "description": "Sportskeeda path without host", "in": "query", - "name": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "menu/categories/breakfast/local-breakfast-favorites/bacon-egg-and-cheese-bagel" + "x-example": "nfl/team-stat/net-yards-per-game-leaders" + }, + { + "description": "Season year offered by this page's page-options filter", + "in": "query", + "name": "season", + "type": "integer", + "x-example": 2026 + }, + { + "description": "Season phase offered by this page's page-options filter; leaderboard pages offer pre, regular, post", + "in": "query", + "name": "type", + "type": "string", + "x-example": "regular" + }, + { + "description": "College-football schedule conference slug from page-options", + "enum": [ + "all-conferences", + "all-fbs-i-a", + "atlantic-coast", + "big-ten", + "mid-american", + "pac-12", + "southeastern", + "independents-fbs", + "big-12", + "conference-usa", + "mountain-west", + "sun-belt", + "aac", + "all-fcs-i-aa", + "big-sky", + "missouri-valley", + "ivy-league", + "mid-eastern-athletic", + "ohio-valley", + "patriot-league", + "pioneer-league", + "southern", + "southland", + "swac", + "northeast", + "independents-fcs", + "big-south", + "caa", + "united-athletic" + ], + "in": "query", + "name": "conference", + "type": "string", + "x-example": "big-ten" } ], "produces": [ @@ -475370,7 +490521,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.itemResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTablesResponseDoc" } }, "400": { @@ -475385,12 +490536,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -475403,41 +490548,24 @@ "ApiKeyAuth": [] } ], - "summary": "Look up one Sonic Drive-In menu item's detail", + "summary": "Get Sportskeeda structured sports tables", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/location-suggest": { + "/sportskeeda/page-options": { "get": { - "consumes": [ - "application/json" - ], - "description": "Completes a partial address, place, city, state or ZIP into ranked matches, each already carrying the latitude and longitude that GET /sonic/nearby takes -- so a caller can run a Sonic restaurant search from free text instead of coordinates. Each suggestion's layer describes its granularity and is one of `address`, `locality`, `state`, `postalCode` or `place`, and confidence is one of `exact`, `interpolated` or `fallback`. Results are restricted to one country (default US). A query that matches nothing returns an empty suggestions array with count 0, not an error.", - "operationId": "sonic-location-suggest", + "description": "Returns the page's live contextual menus, team and ranking links, tabs, schedule views, and every currently offered select-filter value. Leaderboard category and metric values carry their destination slugs. College-football schedule pages expose the client-side conference selector here.", + "operationId": "sportskeeda-page-options", "parameters": [ { - "description": "Partial address, place, city, state or ZIP to complete", + "description": "Sportskeeda path without host", "in": "query", - "name": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "cheyenne wy" - }, - { - "description": "Maximum suggestions, 1-25. Defaults to 5. Upstream may return fewer.", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 5 - }, - { - "description": "ISO 3166-1 alpha-2 country code to restrict results to. Defaults to US.", - "in": "query", - "name": "country", - "type": "string", - "x-example": "US" + "x-example": "nfl" } ], "produces": [ @@ -475447,7 +490575,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.locationSuggestResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaPageOptionsResponseDoc" } }, "400": { @@ -475456,8 +490584,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -475474,47 +490602,37 @@ "ApiKeyAuth": [] } ], - "summary": "Complete an address into coordinates for Sonic Drive-In store search", + "summary": "Discover Sportskeeda page menus and filters", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/locations": { + "/sportskeeda/player-stats": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Sonic Drive-In's restaurant listing one page at a time, each entry already split into its country, state, city and address parts plus a ready-made path value that GET /sonic/store takes -- so enumerating restaurants needs no path parsing. Filter by state and/or city to narrow the list; city slugs come from GET /sonic/directory. Results are sorted by path so paging is reproducible. This listing covers more store pages than GET /sonic/directory counts, since the directory counts listed restaurants while this enumerates every published store page; a filter that matches nothing returns an empty locations array with total 0, not an error. If Sonic's live store-locator service refuses the request, the list is built from Sonic's public store sitemap instead (same entry shape; it can omit stores without a published page, and source_url shows which source answered).", - "operationId": "sonic-locations", + "description": "Returns the season stats for an NFL or NBA player stats page. Without event_type, returns all event phases offered by that page's selector. NBA data may contain extra phases that the page does not offer; these are excluded. Discover the current event_type values with sportskeeda-page-options for the same slug.", + "operationId": "sportskeeda-player-stats", "parameters": [ { - "description": "Two-letter state or province code to filter by", + "description": "NFL or NBA player stats path without host", "in": "query", - "name": "state", + "name": "slug", + "required": true, "type": "string", - "x-example": "WY" + "x-example": "nfl/jacoby-brissett/stats" }, { - "description": "City slug to filter by, from /sonic/directory", + "description": "Event phase offered by this player's stats-event-type-dropdown; NFL offers 0,1,2,3 and NBA offers 0,1,2", + "enum": [ + "0", + "1", + "2", + "3" + ], "in": "query", - "name": "city", + "name": "event_type", "type": "string", - "x-example": "cheyenne" - }, - { - "description": "1-based page number. Defaults to 1.", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Entries per page, 1-500. Defaults to 100.", - "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 100 + "x-example": "1" } ], "produces": [ @@ -475524,7 +490642,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.locationsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaPlayerStatsResponseDoc" } }, "400": { @@ -475533,8 +490651,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -475551,27 +490669,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Sonic Drive-In restaurants with ready-made store paths", + "summary": "Get NFL or NBA player season stats across event phases", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/menu": { + "/sportskeeda/profile": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the items in one Sonic Drive-In menu category, each with its name and published calorie count. Category slugs come from GET /sonic/categories. Some entries are themselves a nested size/variant group (e.g. \"Coffee\" expands to Small/Medium/Large/Rt.44 orderable sizes) rather than a single orderable product -- there is no price or full nutrition panel in this source, only calories; see GET /sonic/item for description, image, and a link to Sonic's nutrition guide.", - "operationId": "sonic-menu", + "description": "Returns a Sportskeeda player or team profile by host-free `slug`, such as `player/jannik-sinner` or `nfl/green-bay-packers`. The response has its name, `kind`, a description, fact rows as name and value pairs (names vary by sport), and any news cards. A page without fact rows returns an upstream error.", + "operationId": "sportskeeda-profile", "parameters": [ { - "description": "Category slug from /sonic/categories", + "description": "Sportskeeda player or team profile path without host", "in": "query", - "name": "category", + "name": "slug", "required": true, "type": "string", - "x-example": "breakfast" + "x-example": "player/jannik-sinner" } ], "produces": [ @@ -475581,7 +490696,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.menuResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaProfileResponseDoc" } }, "400": { @@ -475596,12 +490711,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -475614,56 +490723,24 @@ "ApiKeyAuth": [] } ], - "summary": "List one Sonic Drive-In menu category's items", + "summary": "Get a Sportskeeda player or team profile", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/nearby": { + "/sportskeeda/quiz": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Sonic Drive-In restaurants within a radius of a latitude/longitude, nearest first, one page at a time. Each result carries the same detail as GET /sonic/store -- address, phone, coordinates, open/closed status, amenities, weekly hours per fulfillment channel, and delivery-provider deep links -- plus distance_miles from the search centre, so ranking or mapping results needs no follow-up call per store. Use this instead of paging GET /sonic/sitemap when you know roughly where you are looking. An area with no restaurants returns an empty stores array with total_stores 0, not an error.", - "operationId": "sonic-nearby", + "description": "Returns public question prompts and choice text from a quiz page, sorted by question number. The source does not expose correct answers in its anonymous page data; answer checking and user submissions are not included.", + "operationId": "sportskeeda-quiz", "parameters": [ { - "description": "Latitude of the search centre, -90 to 90", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 35.4676 - }, - { - "description": "Longitude of the search centre, -180 to 180", + "description": "Sportskeeda quiz path without host, discovered through /sportskeeda/quizzes", "in": "query", - "name": "longitude", + "name": "slug", "required": true, - "type": "number", - "x-example": -97.5164 - }, - { - "description": "Search radius in miles, 1-100. Defaults to 25.", - "in": "query", - "name": "radius", - "type": "integer", - "x-example": 25 - }, - { - "description": "Stores per page, 1-50. Defaults to 10.", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Zero-based page number. Defaults to 0.", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 0 + "type": "string", + "x-example": "wwe/quiz/how-well-know-cody-rhodes" } ], "produces": [ @@ -475673,7 +490750,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.nearbyResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaQuizResponseDoc" } }, "400": { @@ -475682,8 +490759,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -475700,19 +490777,77 @@ "ApiKeyAuth": [] } ], - "summary": "Find Sonic Drive-In restaurants near a coordinate", + "summary": "Get a Sportskeeda quiz definition", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/nutrition-documents": { + "/sportskeeda/quiz-categories": { "get": { - "consumes": [ + "description": "Lists the quiz categories currently linked from Sportskeeda's quiz hub, each with a `name` and a host-free `slug` such as `cricket/quiz`. Pass a `slug` to `sportskeeda-quizzes`. Takes no parameters, and the list changes with the site, so fetch it rather than assuming fixed categories.", + "operationId": "sportskeeda-quiz-categories", + "produces": [ "application/json" ], - "description": "Returns the nutrition, allergen and ingredient documents Sonic Drive-In publishes nationally -- the printable menu, the Spanish-language menu, the nutrition guide, allergen information, and the ingredient statement -- each with a directly fetchable URL, file name, MIME type, size in bytes, and the date it was last republished. These are the only structured nutrition source Sonic publishes; per-item macro and micronutrient values are not available anywhere on the public site, and GET /sonic/menu carries calories only. Files are large print-ready PDFs (several megabytes each), so check size_bytes before downloading.", - "operationId": "sonic-nutrition-documents", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sportskeedaQuizCategoriesResponseDoc" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "List current Sportskeeda quiz categories", + "tags": [ + "Sportskeeda" + ] + } + }, + "/sportskeeda/quizzes": { + "get": { + "description": "Returns public quiz cards for one category path discovered through /sportskeeda/quiz-categories. The source currently renders its first quiz page; page pagination is not exposed because the visible page links currently repeat the same cards.", + "operationId": "sportskeeda-quizzes", + "parameters": [ + { + "description": "Sportskeeda quiz category path without host", + "enum": [ + "anime/quiz", + "cricket/quiz", + "daily-soaps/quiz", + "esports/quiz", + "fortnite/quiz", + "minecraft/quiz", + "movies/quiz", + "pokemon/quiz", + "shows/quiz", + "tennis/quiz", + "wwe/quiz" + ], + "in": "query", + "name": "slug", + "required": true, + "type": "string", + "x-example": "anime/quiz" + } + ], "produces": [ "application/json" ], @@ -475720,17 +490855,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.nutritionDocumentsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaQuizzesResponseDoc" } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -475747,60 +490882,61 @@ "ApiKeyAuth": [] } ], - "summary": "List Sonic Drive-In's official nutrition and allergen documents", + "summary": "List quizzes in a Sportskeeda category", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/sitemap": { + "/sportskeeda/salary-cap": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of Sonic Drive-In's own sitemap: section=menu lists every menu category/subcategory/item page (298 pages), section=locations lists every store-directory page (state/city/store, ~3,365 stores). Each entry's path is what GET /sonic/item (menu section) or GET /sonic/store (locations section, kind=store) takes.", - "operationId": "sonic-sitemap", + "description": "Returns the source's published season, team totals, every player cap scenario and expanded salary breakdown. The site's player search and sortable columns are applied to the complete server-rendered rows. The published season may lag the current season.", + "operationId": "sportskeeda-salary-cap", "parameters": [ { - "description": "Which sitemap to read", - "enum": [ - "menu", - "locations" - ], + "description": "NFL team salary-cap page path without host", "in": "query", - "name": "section", + "name": "slug", "required": true, "type": "string", - "x-example": "menu" + "x-example": "nfl/san-francisco-49ers/salary-cap" }, { - "description": "Optional. Filter by page kind. menu: index, category, subcategory, item. locations: index, state, city, store.", - "enum": [ - "index", - "category", - "subcategory", - "item", - "state", - "city", - "store" - ], + "description": "Case-insensitive player-name substring, at most 100 characters", "in": "query", - "name": "kind", - "type": "string" + "name": "q", + "type": "string", + "x-example": "Purdy" }, { - "description": "Optional. 1-based page, default 1.", + "description": "Sortable column; omit to preserve source order", + "enum": [ + "player", + "cap_number", + "cut_pre_june_1_dead_money", + "cut_pre_june_1_cap_saving", + "cut_post_june_1_dead_money", + "cut_post_june_1_cap_saving", + "trade_pre_june_1_dead_money", + "trade_pre_june_1_cap_saving", + "trade_post_june_1_dead_money", + "trade_post_june_1_cap_saving", + "restructure_cap_saving", + "extension_cap_saving" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "sort_by", + "type": "string" }, { - "description": "Optional. Entries per page, 1-500, default 100.", + "description": "Sort direction; requires sort_by; default asc", + "enum": [ + "asc", + "desc" + ], "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 100 + "name": "order", + "type": "string" } ], "produces": [ @@ -475810,7 +490946,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.sitemapResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaSalaryCapResponseDoc" } }, "400": { @@ -475819,8 +490955,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -475837,27 +490973,24 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Sonic Drive-In's menu-page or store-locator sitemap", + "summary": "Get NFL team salary-cap figures from Sportskeeda", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/sonic/store": { + "/sportskeeda/schedule": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Sonic Drive-In restaurant's address, phone, coordinates, open/closed status, amenities, weekly hours broken down per fulfillment channel (order-ahead, pickup, curbside, in-store, delivery, drive-through), and delivery-provider deep links (DoorDash, GrubHub, Uber Eats, Postmates). path must be a \"locations\" section, kind=store path from GET /sonic/sitemap.", - "operationId": "sonic-store", + "description": "Returns a Sportskeeda fixtures or schedule page by host-free `slug`, such as `nfl/schedule` or `cricket/schedule`. Cricket and football give `matches` with teams, time, status, score, competition, venue and result; other sports give `tables` with `columns` and `rows`. An empty fixture widget returns `status` `no_matches`.", + "operationId": "sportskeeda-schedule", "parameters": [ { - "description": "A store path from /sonic/sitemap (section=locations, kind=store)", + "description": "Sportskeeda schedule path without host", "in": "query", - "name": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "locations/us/wy/cheyenne/2540-dell-range-blvd/store-4521" + "x-example": "nfl/schedule" } ], "produces": [ @@ -475867,7 +491000,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sonic.storeResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTablesResponseDoc" } }, "400": { @@ -475882,11 +491015,37 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Sportskeeda fixtures and results", + "tags": [ + "Sportskeeda" + ] + } + }, + "/sportskeeda/sections": { + "get": { + "description": "Returns the live parent/child navigation tree, including external destinations marked explicitly, plus every public sports landing URL from Sportskeeda's sports sitemap.", + "operationId": "sportskeeda-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sportskeedaSectionsResponseDoc" + } }, "503": { "description": "Service Unavailable", @@ -475900,27 +491059,48 @@ "ApiKeyAuth": [] } ], - "summary": "Look up one Sonic Drive-In restaurant by its locator path", + "summary": "Discover Sportskeeda sections and topics", "tags": [ - "Sonic" + "Sportskeeda" ] } }, - "/soundcloud/playlist": { + "/sportskeeda/sitemap-items": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one playlist or album's metadata plus its full track list: owner, likes/reposts counts, and every track's title, artwork, and playback/likes counts. Public data sourced from SoundCloud's own JSON API.", - "operationId": "soundcloud-playlist", + "description": "Returns canonical URLs and host-free path slugs from one sitemap discovered by /sportskeeda/sitemaps. Returned path slugs preserve case and percent-encode unusual characters. A sitemap_url remains accepted for existing callers. Provide exactly one; the source is checked against the live index and robots sitemap list on each call.", + "operationId": "sportskeeda-sitemap-items", "parameters": [ { - "description": "Full soundcloud.com playlist/album URL (a playlist's permalink_url)", + "description": "Sitemap slug returned by /sportskeeda/sitemaps; preferred", "in": "query", - "name": "url", - "required": true, + "name": "slug", "type": "string", - "x-example": "https://soundcloud.com/lofi_chill/sets/lofi-chill" + "x-example": "tournaments.xml" + }, + { + "description": "Exact sitemap URL; alternative to slug", + "in": "query", + "name": "sitemap_url", + "type": "string", + "x-example": "https://www.sportskeeda.com/tournaments.xml" + }, + { + "default": 0, + "description": "Zero-based item offset", + "in": "query", + "maximum": 1000000, + "minimum": 0, + "name": "offset", + "type": "integer" + }, + { + "default": 100, + "description": "Page size from 1 to 500; defaults to 100", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "limit", + "type": "integer" } ], "produces": [ @@ -475930,7 +491110,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/soundcloud.playlistResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaSitemapItemsResponseDoc" } }, "400": { @@ -475939,16 +491119,36 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } - }, - "429": { - "description": "Too Many Requests", + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Page through a Sportskeeda sitemap", + "tags": [ + "Sportskeeda" + ] + } + }, + "/sportskeeda/sitemaps": { + "get": { + "description": "Returns Sportskeeda's current public sitemaps. Pass a returned slug to /sportskeeda/sitemap-items to page through its complete URL set.", + "operationId": "sportskeeda-sitemaps", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sportskeedaSitemapsResponseDoc" } }, "503": { @@ -475963,27 +491163,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SoundCloud playlist or album's detail", + "summary": "Discover Sportskeeda sitemap sources", "tags": [ - "SoundCloud" + "Sportskeeda" ] } }, - "/soundcloud/profile": { + "/sportskeeda/standings": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a SoundCloud user or artist profile for a full profile `url` such as `https://soundcloud.com/artist`. Fields are username, full name, bio, avatar, city, country, verified status, and counts of followers, followings, tracks, playlists and likes. A URL for a track or other entity returns 400; an unresolvable URL returns 404.", - "operationId": "soundcloud-profile", + "description": "Returns Sportskeeda standings or rankings tables for a host-free `slug`, such as `nfl/standings`, with column labels, rows, linked cell slugs and view slugs. `season` (starting year, 2013 to 2026) applies only to college basketball standings. The current college basketball season returns `status` `no_data` with empty `tables`.", + "operationId": "sportskeeda-standings", "parameters": [ { - "description": "Full soundcloud.com user/artist profile URL", + "description": "Sportskeeda standings or rankings path without host", "in": "query", - "name": "url", + "name": "slug", "required": true, "type": "string", - "x-example": "https://soundcloud.com/lofi_girl" + "x-example": "nfl/standings" + }, + { + "description": "College basketball season starting year; live values from standings-options", + "enum": [ + 2026, + 2025, + 2024, + 2023, + 2022, + 2021, + 2020, + 2019, + 2018, + 2017, + 2016, + 2015, + 2014, + 2013 + ], + "in": "query", + "name": "season", + "type": "integer", + "x-example": 2025 } ], "produces": [ @@ -475993,7 +491213,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/soundcloud.profileResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTablesResponseDoc" } }, "400": { @@ -476008,12 +491228,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -476026,34 +491240,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SoundCloud user/artist profile", + "summary": "Get Sportskeeda standings or rankings", "tags": [ - "SoundCloud" + "Sportskeeda" ] } }, - "/soundcloud/search": { + "/sportskeeda/standings-options": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches SoundCloud tracks for `query`, in SoundCloud's default relevance order. `limit` defaults to 20 and is capped at 50. Each track has its title, artwork, genre, tags, `duration_ms`, play, like, comment and repost counts, and uploader details including follower count and verified status.", - "operationId": "soundcloud-search", + "description": "Lists the seasons and conferences available for Sportskeeda college basketball standings. `slug` is required and must be `college-basketball/college-basketball-standings`. Without `season` you get all offered season years and the current season's conferences; with it, that season's conferences, each with a name and a slug usable as the standings `slug`.", + "operationId": "sportskeeda-standings-options", "parameters": [ { - "description": "Search text", + "description": "College basketball standings slug", "in": "query", - "name": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "lofi hip hop" + "x-example": "college-basketball/college-basketball-standings" }, { - "description": "Number of tracks to return (default 20, max 50)", + "description": "A live-offered starting year; selects its conference list", + "enum": [ + 2026, + 2025, + 2024, + 2023, + 2022, + 2021, + 2020, + 2019, + 2018, + 2017, + 2016, + 2015, + 2014, + 2013 + ], "in": "query", - "name": "limit", + "name": "season", "type": "integer", - "x-example": 20 + "x-example": 2025 } ], "produces": [ @@ -476063,7 +491290,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/soundcloud.searchResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaStandingsOptionsResponseDoc" } }, "400": { @@ -476072,12 +491299,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -476090,27 +491311,24 @@ "ApiKeyAuth": [] } ], - "summary": "Search SoundCloud tracks", + "summary": "Discover Sportskeeda college standings seasons and conferences", "tags": [ - "SoundCloud" + "Sportskeeda" ] } }, - "/soundcloud/track": { + "/sportskeeda/taxonomy-search": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one track's full metadata: title, artwork, description, genre, tags, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.", - "operationId": "soundcloud-track", + "description": "Calls Sportskeeda's anonymous frontend taxonomy search across categories, events, teams, players, wiki pages, and wiki tags. The upstream UI always searches all six types; the q phrase is sanitized and capped at 100 characters just like the site.", + "operationId": "sportskeeda-taxonomy-search", "parameters": [ { - "description": "Full soundcloud.com track URL (a track's permalink_url)", + "description": "Search phrase; punctuation is replaced with spaces and the result is capped at 100 characters", "in": "query", - "name": "url", + "name": "q", "required": true, "type": "string", - "x-example": "https://soundcloud.com/lofi_girl/4-am-studysession" + "x-example": "nfl draft" } ], "produces": [ @@ -476120,7 +491338,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/soundcloud.trackResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTaxonomySearchResponseDoc" } }, "400": { @@ -476129,18 +491347,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -476153,34 +491359,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SoundCloud track's detail", + "summary": "Search Sportskeeda categories and entities", "tags": [ - "SoundCloud" + "Sportskeeda" ] } }, - "/soundcloud/user-tracks": { + "/sportskeeda/topic": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a user/artist's own uploaded tracks, most recent first: title, artwork, playback/likes/comment/repost counts. Public data sourced from SoundCloud's own JSON API.", - "operationId": "soundcloud-user-tracks", + "description": "Returns ordered prose, headings, lists, tables, images and embeds from a public topic, event, team or player overview page, plus available byline, modification text and related stories. Discover slugs with /sportskeeda/sitemap-items using tags.xml, tournaments.xml, teams.xml, players.xml or us-sitemap.xml. Pages without a CMS body return an upstream error.", + "operationId": "sportskeeda-topic", "parameters": [ { - "description": "Full soundcloud.com user/artist profile URL", + "description": "Canonical Sportskeeda topic, event, team or player path without host", "in": "query", - "name": "url", + "name": "slug", "required": true, "type": "string", - "x-example": "https://soundcloud.com/lofi_girl" - }, - { - "description": "Number of tracks to return (default 20, max 50)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "football/jurgen-klopp" } ], "produces": [ @@ -476190,7 +491386,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/soundcloud.userTracksResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTopicResponseDoc" } }, "400": { @@ -476205,12 +491401,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -476220,27 +491410,82 @@ }, "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Get a SoundCloud user's own uploaded tracks", - "tags": [ - "SoundCloud" - ] - } - }, - "/space/article": { - "get": { - "description": "Returns a Space.com article by canonical `url` in any of the site's URL shapes, including older `.html` reference pages: title, description, section, authors, publication and update times, image and body `paragraphs`. `/news/live/` pages return only their introductory paragraphs, and membership-gated content returns only its public preview.", - "operationId": "space-article", - "parameters": [ + "ApiKeyAuth": [] + } + ], + "summary": "Get a Sportskeeda topic or entity overview's full content", + "tags": [ + "Sportskeeda" + ] + } + }, + "/sportskeeda/trade-values": { + "get": { + "description": "Reads the same anonymous JSON asset as the public chart. Returns source update time, ranks, values, and linked player slugs. The All position includes all source rows, including positions not displayed as chart sections. Discover current chart and filter choices with page-options.", + "operationId": "sportskeeda-trade-values", + "parameters": [ + { + "description": "Chart path without host", + "enum": [ + "nfl/fantasy-football-trade-value-charts", + "nfl/dynasty-trade-value-charts" + ], + "in": "query", + "name": "slug", + "required": true, + "type": "string", + "x-example": "nfl/fantasy-football-trade-value-charts" + }, + { + "default": "All", + "description": "Displayed position section; defaults to All", + "enum": [ + "All", + "QB", + "RB", + "WR", + "TE" + ], + "in": "query", + "name": "position", + "type": "string" + }, + { + "default": "ppr", + "description": "Scoring system; defaults to ppr", + "enum": [ + "ppr", + "non_ppr", + "0.5_ppr" + ], + "in": "query", + "name": "scoring", + "type": "string" + }, + { + "default": false, + "description": "Use superflex chart; defaults to false", + "in": "query", + "name": "superflex", + "type": "boolean" + }, + { + "default": 0, + "description": "Zero-based player offset", + "in": "query", + "maximum": 1000000, + "minimum": 0, + "name": "offset", + "type": "integer" + }, { - "description": "Canonical Space.com article URL", + "default": 100, + "description": "Page size from 1 to 500", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.space.com/astronomy/solar-system/asteroids/astronomers-just-named-an-asteroid-after-weird-al-yankovic" + "maximum": 500, + "minimum": 1, + "name": "limit", + "type": "integer" } ], "produces": [ @@ -476250,7 +491495,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTradeValuesResponseDoc" } }, "400": { @@ -476277,30 +491522,142 @@ "ApiKeyAuth": [] } ], - "summary": "Get Space.com article content", + "summary": "Get NFL redraft or dynasty trade values", "tags": [ - "Space" + "Sportskeeda" ] } }, - "/space/author": { + "/sportskeeda/transactions": { "get": { - "description": "Returns a Space.com author's profile, looked up by `slug` (for example `elizabeth-howell`) or canonical `url`; exactly one is required. The response has the name, `job_title`, biography, image and the first batch of recent articles on the author page. That page has no URL-based pagination, so no further articles are available.", - "operationId": "space-author", + "description": "Reads the first-party public transaction feed in month-sized windows, avoiding its 10000-row broad-range cap. Discover accepted seasons, months, and team slugs with sportskeeda-transactions-options.", + "operationId": "sportskeeda-transactions", "parameters": [ { - "description": "Author slug, e.g. elizabeth-howell", + "description": "Host-free page slug; nfl/transactions or an NFL team transactions slug", "in": "query", "name": "slug", "type": "string", - "x-example": "elizabeth-howell" + "x-example": "nfl/dallas-cowboys/transactions" }, { - "description": "Canonical space.com/author/ URL; alternative to slug", + "description": "Season start year; current live choices: 2020,2021,2022,2023,2024,2025,2026; defaults to current", + "enum": [ + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026 + ], "in": "query", - "name": "url", + "name": "season", + "type": "integer" + }, + { + "description": "MMYYYY month code from transactions-options for the selected season; current live union is listed here", + "enum": [ + "022020", + "032020", + "042020", + "052020", + "062020", + "072020", + "082020", + "092020", + "102020", + "112020", + "122020", + "012021", + "022021", + "032021", + "042021", + "052021", + "062021", + "072021", + "082021", + "092021", + "102021", + "112021", + "122021", + "012022", + "022022", + "032022", + "042022", + "052022", + "062022", + "072022", + "082022", + "092022", + "102022", + "112022", + "122022", + "012023", + "022023", + "032023", + "042023", + "052023", + "062023", + "072023", + "082023", + "092023", + "102023", + "112023", + "122023", + "012024", + "022024", + "032024", + "042024", + "052024", + "062024", + "072024", + "082024", + "092024", + "102024", + "112024", + "122024", + "012025", + "022025", + "032025", + "042025", + "052025", + "062025", + "072025", + "082025", + "092025", + "102025", + "112025", + "122025", + "012026", + "022026", + "032026", + "042026", + "052026", + "062026", + "072026", + "082026", + "092026" + ], + "in": "query", + "name": "month", + "required": true, "type": "string", - "x-example": "https://www.space.com/author/elizabeth-howell" + "x-example": "092026" + }, + { + "description": "Page number, 1-1000; default 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Records per page, 1-500; default 100", + "in": "query", + "name": "per_page", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -476310,7 +491667,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.spaceAuthorResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTransactionsResponseDoc" } }, "400": { @@ -476337,87 +491694,31 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Space.com author profile", + "summary": "Get complete monthly NFL league or team transactions", "tags": [ - "Space" + "Sportskeeda" ] } }, - "/space/headlines": { + "/sportskeeda/transactions-options": { "get": { - "description": "Returns the latest Space.com stories for one category. `section` is required and takes a slug from `space-sections`, which joins nested category paths with hyphens, such as `astronomy`, `astronomy-solar-system-mars` or `stargazing-meteor-showers`. Each item has its title, URL, summary, author, publication time and image. Other values return a 400.", - "operationId": "space-headlines", + "description": "Discovers the complete live NFL transaction season list, months for the selected season, and all team transaction page slugs. Use these values with sportskeeda-transactions.", + "operationId": "sportskeeda-transactions-options", "parameters": [ { - "description": "Space.com category slug", + "description": "Season start year; current live choices: 2020,2021,2022,2023,2024,2025,2026; defaults to current", "enum": [ - "astronomy", - "astronomy-black-holes", - "astronomy-dark-universe", - "astronomy-exoplanets", - "astronomy-galaxies", - "astronomy-hubble-space-telescope", - "astronomy-james-webb-space-telescope", - "astronomy-solar-system", - "astronomy-solar-system-asteroids", - "astronomy-solar-system-comets", - "astronomy-solar-system-dwarf-planets", - "astronomy-solar-system-earth", - "astronomy-solar-system-jupiter", - "astronomy-solar-system-mars", - "astronomy-solar-system-mercury", - "astronomy-solar-system-moon", - "astronomy-solar-system-neptune", - "astronomy-solar-system-pluto", - "astronomy-solar-system-saturn", - "astronomy-solar-system-sun", - "astronomy-solar-system-uranus", - "astronomy-solar-system-venus", - "astronomy-stars", - "entertainment", - "entertainment-space-books", - "entertainment-space-games", - "entertainment-space-movies-shows", - "entertainment-space-toys-lego", - "science", - "science-astrophysics", - "science-climate-change", - "science-particle-physics", - "science-weather", - "space-exploration", - "space-exploration-human-spaceflight", - "space-exploration-launches-spacecraft", - "space-exploration-missions", - "space-exploration-missions-apollo", - "space-exploration-missions-artemis", - "space-exploration-missions-asteroid-comet-missions", - "space-exploration-missions-international-space-station", - "space-exploration-missions-mars-rovers", - "space-exploration-missions-new-horizons", - "space-exploration-missions-parker-solar-probe", - "space-exploration-missions-space-shuttle", - "space-exploration-missions-voyager", - "space-exploration-private-spaceflight", - "space-exploration-satellites", - "space-exploration-search-for-life", - "stargazing", - "stargazing-astrophotography", - "stargazing-auroras", - "stargazing-constellations", - "stargazing-eclipses", - "stargazing-eclipses-lunar-eclipses", - "stargazing-eclipses-solar-eclipses", - "stargazing-meteor-showers", - "stargazing-skywatching-kit", - "technology", - "technology-aerospace", - "technology-drones" + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026 ], "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "astronomy" + "name": "season", + "type": "integer" } ], "produces": [ @@ -476427,7 +491728,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaTransactionsOptionsResponseDoc" } }, "400": { @@ -476448,16 +491749,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get Space.com section headlines", + "summary": "List NFL transaction seasons, months and team slugs", "tags": [ - "Space" + "Sportskeeda" ] } }, - "/space/news": { + "/sportskeeda/video": { "get": { - "description": "Returns the latest Space.com top stories (space, astronomy and skywatching news) from the site's latest-news hub. Takes no parameters. Each item has its title, URL, summary, author, publication time and image.", - "operationId": "space-news", + "description": "Returns metadata for one Sportskeeda video page by host-free `slug`, such as `cricket/sunil-naraine-batting-cpl`: its id, title, poster image, stream URL and, when available, a description. A page without a video player returns an upstream error, and stream availability can depend on geography.", + "operationId": "sportskeeda-video", + "parameters": [ + { + "description": "Individual Sportskeeda video page path without host", + "in": "query", + "name": "slug", + "required": true, + "type": "string", + "x-example": "cricket/sunil-naraine-batting-cpl" + } + ], "produces": [ "application/json" ], @@ -476465,11 +491776,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaVideoResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -476486,42 +491803,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get Space.com top stories", + "summary": "Get Sportskeeda video metadata", "tags": [ - "Space" + "Sportskeeda" ] } }, - "/space/sections": { + "/sportskeeda/videos": { "get": { - "description": "Lists the Space.com categories that `space-headlines` accepts, from `astronomy`, `entertainment`, `science`, `space-exploration`, `stargazing` and `technology` down to their subcategories. Each entry has a `slug`, a display `name` and the category `url`. Slugs join the nested path with hyphens, so `astronomy-solar-system-mars` maps to `/astronomy/solar-system/mars`.", - "operationId": "space-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ + "description": "Lists video cards from Sportskeeda's main video library, or from a listing given by `slug` (default `videos`, for example `go/epl/videos`). Items have a title, slug, URL, and thumbnail, duration and channel when present. The response also lists channels with their slugs. An empty or blocked listing returns an upstream error.", + "operationId": "sportskeeda-videos", + "parameters": [ { - "ApiKeyAuth": [] + "default": "videos", + "description": "Video listing path without host; defaults to videos", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "go/epl/videos" } ], - "summary": "Get Space.com sections", - "tags": [ - "Space" - ] - } - }, - "/sparkfun/categories": { - "get": { - "description": "Lists SparkFun's top-level browse categories. Each has an id, name, `url_key` and `url_path`. Pass a category's `url_key` to `sparkfun-category` to browse it. Takes no parameters, and the set follows the live storefront catalogue.", - "operationId": "sparkfun-categories", "produces": [ "application/json" ], @@ -476529,11 +491830,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sparkfun.categoriesResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaVideosResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -476550,53 +491857,64 @@ "ApiKeyAuth": [] } ], - "summary": "List SparkFun categories", + "summary": "List Sportskeeda videos and channels", "tags": [ - "SparkFun" + "Sportskeeda" ] } }, - "/sparkfun/category": { + "/sportskeeda/wiki-activity": { "get": { - "description": "Returns paginated public products and dynamic facet filters for a SparkFun category URL key. Each filter must be `attribute:value`; use values from the response's filters array.", - "operationId": "sparkfun-category", + "description": "Returns the public accepted activity history for one Wiki article, with bounded pagination and the page's live sort fields. The source page slug is obtained from sportskeeda-wiki-pages.", + "operationId": "sportskeeda-wiki-activity", "parameters": [ { - "description": "SparkFun category URL key", + "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", "in": "query", - "name": "url_key", + "name": "slug", "required": true, "type": "string", - "x-example": "development-boards" + "x-example": "minecraft-wiki/achievements" }, { "default": 1, - "description": "One-based result page (1-100)", + "description": "1-based page", "in": "query", - "maximum": 100, + "maximum": 10000, "minimum": 1, "name": "page", "type": "integer" }, { - "default": 24, - "description": "Products per page (1-24)", + "default": 50, + "description": "Activity items per page", "in": "query", - "maximum": 24, + "maximum": 100, "minimum": 1, - "name": "per_page", + "name": "limit", "type": "integer" }, { - "collectionFormat": "multi", - "description": "Repeatable dynamic facet in attribute:value form", + "default": "desc", + "description": "Sort direction", + "enum": [ + "asc", + "desc" + ], "in": "query", - "items": { - "type": "string" - }, - "name": "filter", - "type": "array", - "x-example": "sf_qwiic_dev_board_type:8417" + "name": "sort", + "type": "string" + }, + { + "default": "updated_at", + "description": "Activity sort field", + "enum": [ + "author_name", + "updated_at" + ], + "in": "query", + "name": "sort_by", + "type": "string" } ], "produces": [ @@ -476606,7 +491924,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sparkfun.categoryResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiActivityResponseDoc" } }, "400": { @@ -476621,8 +491939,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -476639,24 +491957,24 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a SparkFun category", + "summary": "List accepted edits for a Sportskeeda Wiki page", "tags": [ - "SparkFun" + "Sportskeeda" ] } }, - "/sparkfun/product": { + "/sportskeeda/wiki-article": { "get": { - "description": "Returns one SparkFun product by `sku`, for example `DEV-18158`: name, URL, stock status, current minimum price and currency, main image and media gallery, categories, and a cleaned short description. `recommendations` lists related, upsell or crosssell products when available. An unknown SKU returns 404.", - "operationId": "sparkfun-product", + "description": "Returns the rendered article title, metadata, and body paragraphs. Pass the path_slug returned by sportskeeda-wiki-pages; URL and host input are not accepted.", + "operationId": "sportskeeda-wiki-article", "parameters": [ { - "description": "SparkFun product SKU", + "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", "in": "query", - "name": "sku", + "name": "slug", "required": true, "type": "string", - "x-example": "DEV-18158" + "x-example": "minecraft-wiki/achievements" } ], "produces": [ @@ -476666,7 +491984,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sparkfun.productResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiArticleResponseDoc" } }, "400": { @@ -476681,8 +491999,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -476699,53 +492017,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a SparkFun product", + "summary": "Get a Sportskeeda Wiki article", "tags": [ - "SparkFun" + "Sportskeeda" ] } }, - "/sparkfun/search": { + "/sportskeeda/wiki-categories": { "get": { - "description": "Searches public SparkFun product data with pagination and dynamic facet filters. Each filter must be `attribute:value`; use values from the response's filters array.", - "operationId": "sparkfun-search", + "description": "Returns the nested category menu of one Sportskeeda Wiki project, chosen by `wiki` (`minecraft`, `terraria`, `naruto`, `tiktok`, `youtube`, `gta`, `one-piece` or `sk-communities`). Each category has a title, slug, `path_slug`, taxonomy id, sequence and `children`. Category names, ids and paths change over time.", + "operationId": "sportskeeda-wiki-categories", "parameters": [ { - "description": "Product search query", + "description": "Project slug returned by sportskeeda-wiki-options", + "enum": [ + "minecraft", + "terraria", + "naruto", + "tiktok", + "youtube", + "gta", + "one-piece", + "sk-communities" + ], "in": "query", - "name": "q", + "name": "wiki", "required": true, "type": "string", - "x-example": "arduino" - }, - { - "default": 1, - "description": "One-based result page (1-100)", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 24, - "description": "Products per page (1-24)", - "in": "query", - "maximum": 24, - "minimum": 1, - "name": "per_page", - "type": "integer" - }, - { - "collectionFormat": "multi", - "description": "Repeatable dynamic facet in attribute:value form", - "in": "query", - "items": { - "type": "string" - }, - "name": "filter", - "type": "array", - "x-example": "sf_qwiic_dev_board_type:8417" + "x-example": "minecraft" } ], "produces": [ @@ -476755,7 +492054,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/sparkfun.searchResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiCategoriesResponseDoc" } }, "400": { @@ -476764,8 +492063,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -476782,24 +492087,65 @@ "ApiKeyAuth": [] } ], - "summary": "Search SparkFun products", + "summary": "List Sportskeeda Wiki categories", "tags": [ - "SparkFun" + "Sportskeeda" ] } }, - "/sportingnews/article": { + "/sportskeeda/wiki-contributors": { "get": { - "description": "Returns a Sporting News US article by canonical `url`, such as `https://www.sportingnews.com/us/nfl/dallas-cowboys/news//`: title, description, section (the sport or topic in the URL, for example `NFL`), authors, publication and update times, image and body `paragraphs`. Tables, embeds, ad slots and related-story lists are excluded. Non-US editions and hub pages are rejected.", - "operationId": "sportingnews-article", + "description": "Returns public accepted contributors for one Wiki article. The source page slug is obtained from sportskeeda-wiki-pages; user IP and private account fields are never returned.", + "operationId": "sportskeeda-wiki-contributors", "parameters": [ { - "description": "Canonical Sporting News US article URL", + "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", "in": "query", - "name": "url", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.sportingnews.com/us/nfl/dallas-cowboys/news/cowboys-george-pickens-production-way-down/30f07d65f36691600b3f97ba" + "x-example": "minecraft-wiki/achievements" + }, + { + "default": 1, + "description": "1-based page", + "in": "query", + "maximum": 10000, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 50, + "description": "Contributors per page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer" + }, + { + "default": "desc", + "description": "Sort direction", + "enum": [ + "asc", + "desc" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": "contributions", + "description": "Contributor sort field", + "enum": [ + "author_name", + "contributions", + "updated_at" + ], + "in": "query", + "name": "sort_by", + "type": "string" } ], "produces": [ @@ -476809,7 +492155,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiContributorsResponseDoc" } }, "400": { @@ -476824,6 +492170,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -476836,130 +492188,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sporting News article content", + "summary": "List contributors to a Sportskeeda Wiki page", "tags": [ - "Sporting News" + "Sportskeeda" ] } }, - "/sportingnews/author": { + "/sportskeeda/wiki-issues": { "get": { - "description": "Returns a Sporting News US author's profile, looked up by `slug` (for example `anne-erickson`) or canonical `url`; exactly one is required. The response has the name, `bio`, photo, social links and about 20 recent articles, each with title, URL, section, author, publication time and image. There is no pagination, and an unknown author returns not-found.", - "operationId": "sportingnews-author", + "description": "Returns public opened or closed issues for one Wiki article. The upstream also returns submitter IP addresses; this endpoint deliberately omits them.", + "operationId": "sportskeeda-wiki-issues", "parameters": [ { - "description": "Author slug, e.g. anne-erickson", + "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", "in": "query", "name": "slug", + "required": true, "type": "string", - "x-example": "anne-erickson" + "x-example": "minecraft-wiki/achievements" }, { - "description": "Canonical sportingnews.com/us/author/ URL; alternative to slug", + "default": 1, + "description": "1-based page", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.sportingnews.com/us/author/anne-erickson" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sportingNewsAuthorResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } + "maximum": 10000, + "minimum": 1, + "name": "page", + "type": "integer" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Get a Sporting News author profile", - "tags": [ - "Sporting News" - ] - } - }, - "/sportingnews/headlines": { - "get": { - "description": "Returns up to 20 of the newest Sporting News US stories for one sport, league or topic. `section` is required and takes one of 44 slugs such as `nfl`, `nba`, `mlb`, `premier-league`, `formula-1`, `ufc` or `college`. Each item has its title, URL, summary, publication time, author and image. Off-season leagues may return older stories.", - "operationId": "sportingnews-headlines", - "parameters": [ + "default": 10, + "description": "Issues per page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer" + }, { - "description": "Sporting News section slug", + "default": "opened", + "description": "Issue status", "enum": [ - "baseball", - "basketball", - "boxing", - "bundesliga", - "champions-league", - "club-world-cup", - "college", - "cricket", - "culture", - "darts", - "fantasy", - "football", - "formula-1", - "golf", - "high-school", - "horse-racing", - "la-liga", - "liga-mx", - "mlb", - "mls", - "mma", - "nascar", - "nba", - "nba-draft", - "ncaa", - "ncaa-basketball", - "ncaa-football", - "nfl", - "nfl-draft", - "nhl", - "olympics", - "premier-league", - "sec", - "serie-a", - "soccer", - "softball", - "tennis", - "tickets", - "tsn", - "ufc", - "watch", - "wnba", - "womens-college-basketball", - "wwe" + "opened", + "closed" ], "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "baseball" + "name": "status", + "type": "string" } ], "produces": [ @@ -476969,7 +492244,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiIssuesResponseDoc" } }, "400": { @@ -476978,40 +492253,14 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Sporting News section headlines", - "tags": [ - "Sporting News" - ] - } - }, - "/sportingnews/news": { - "get": { - "description": "Returns fresh top stories from the Sporting News US edition public RSS feed. Only the US edition (sportingnews.com/us) is covered.", - "operationId": "sportingnews-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -477028,16 +492277,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sporting News top stories", + "summary": "List reported issues for a Sportskeeda Wiki page", "tags": [ - "Sporting News" + "Sportskeeda" ] } }, - "/sportingnews/sections": { + "/sportskeeda/wiki-options": { "get": { - "description": "Lists the 44 Sporting News US sport, league and topic feeds that `sportingnews-headlines` accepts. Each entry has a `slug`, a display `name` and the feed `url`. Off-season leagues such as `club-world-cup` and `softball` are listed and may return older items. Team feeds and non-US editions are not covered.", - "operationId": "sportingnews-sections", + "description": "Lists the Sportskeeda Wiki projects, each with a `slug`, display `name`, `taxonomy_id` and `taxonomy_slug`. Current slugs are `minecraft`, `terraria`, `naruto`, `tiktok`, `youtube`, `gta`, `one-piece` and `sk-communities`. Use a `slug` with `wiki-categories` and `wiki-pages`. Takes no parameters.", + "operationId": "sportskeeda-wiki-options", "produces": [ "application/json" ], @@ -477045,11 +492294,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiOptionsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -477066,30 +492315,83 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sporting News sections", + "summary": "List Sportskeeda Wiki projects", "tags": [ - "Sporting News" + "Sportskeeda" ] } }, - "/sportskeeda/article": { + "/sportskeeda/wiki-pages": { "get": { - "description": "Returns public article metadata and body paragraphs for a Sportskeeda article slug. Discovered slugs may contain case-preserving percent-encoded characters. A canonical Sportskeeda URL remains accepted for existing clients. Provide exactly one of slug or url; use /sportskeeda/sections and /sportskeeda/sitemaps for topic discovery.", - "operationId": "sportskeeda-article", + "description": "Returns catalog pages for one Wiki project. Use path_slug as the preferred host-free slug for sportskeeda-wiki-article. total_items is the record count; the upstream field named total_pages is mislabelled and does not mean page count.", + "operationId": "sportskeeda-wiki-pages", "parameters": [ { - "description": "Sportskeeda article path without host; preferred over url", + "description": "Project slug returned by sportskeeda-wiki-options", + "enum": [ + "minecraft", + "terraria", + "naruto", + "tiktok", + "youtube", + "gta", + "one-piece", + "sk-communities" + ], "in": "query", - "name": "slug", + "name": "wiki", + "required": true, "type": "string", - "x-example": "football/rumor-psg-handed-major-lionel-messi-injury-scare-ahead-bayern-munich-clash-latest-fitness-update-reports" + "x-example": "minecraft" }, { - "description": "Canonical Sportskeeda article URL; alternative to slug", + "default": 1, + "description": "1-based catalog page", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.sportskeeda.com/football/rumor-psg-handed-major-lionel-messi-injury-scare-ahead-bayern-munich-clash-latest-fitness-update-reports" + "maximum": 10000, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 10, + "description": "Items per page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer" + }, + { + "default": "DESC", + "description": "Sort direction", + "enum": [ + "ASC", + "DESC" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": "last_updated", + "description": "Catalog field to sort by", + "enum": [ + "last_updated", + "page_size", + "ratings", + "issues_count" + ], + "in": "query", + "name": "sort_by", + "type": "string" + }, + { + "description": "Title or page search text; sent upstream as searchText", + "in": "query", + "maxLength": 100, + "name": "search", + "type": "string" } ], "produces": [ @@ -477099,7 +492401,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiPagesResponseDoc" } }, "400": { @@ -477114,6 +492416,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -477126,30 +492434,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda article", + "summary": "Search and paginate Sportskeeda Wiki pages", "tags": [ "Sportskeeda" ] } }, - "/sportskeeda/author": { + "/sportskeeda/wiki-summary": { "get": { - "description": "Returns a Sportskeeda author's profile, looked up by `slug` (for example `sripad`) or canonical `url`; at least one is required. The response has the name and the articles listed on the profile, each with title and URL, and can also carry `biography`, `role` and `image_url`.", - "operationId": "sportskeeda-author", + "description": "Returns accepted contributor and activity totals plus the open-issue count for one Wiki article. The source page slug is obtained from sportskeeda-wiki-pages.", + "operationId": "sportskeeda-wiki-summary", "parameters": [ { - "description": "Sportskeeda author slug, e.g. sripad", + "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", "in": "query", "name": "slug", + "required": true, "type": "string", - "x-example": "sripad" - }, - { - "description": "Canonical Sportskeeda /author/ URL; alternative to slug", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.sportskeeda.com/author/sripad" + "x-example": "minecraft-wiki/achievements" } ], "produces": [ @@ -477159,7 +492461,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaAuthorResponseDoc" + "$ref": "#/definitions/publicnews.sportskeedaWikiSummaryResponseDoc" } }, "400": { @@ -477174,6 +492476,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -477186,85 +492494,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda author profile", + "summary": "Get community counts for a Sportskeeda Wiki page", "tags": [ "Sportskeeda" ] } }, - "/sportskeeda/college-basketball-schedule": { + "/spotify-podcasts/categories": { "get": { - "description": "Returns all games and published scores for the requested date and season from Sportskeeda's first-party JSON feed. Discover valid season values with college-basketball-schedule-options. The upstream conference filter is currently unreliable and this endpoint does not accept it.", - "operationId": "sportskeeda-college-basketball-schedule", + "consumes": [ + "application/json" + ], + "description": "Returns the Spotify podcast categories page as sections of items such as Arts, for `uri` (default `spotify:page:0JQ5DArNBzkmxXHCqFLx2U`). Each section has a title, `totalCount` and items with title, image and Spotify URL. `page_limit` and `section_limit` default to 10 and run 1 to 50; the offsets default to 0.", + "operationId": "spotify-podcasts-categories", "parameters": [ { - "description": "Game date in YYYY-MM-DD format", + "description": "Spotify podcast categories page URI", "in": "query", - "name": "date", - "required": true, + "name": "uri", "type": "string", - "x-example": "2026-11-02" + "x-example": "spotify:page:0JQ5DArNBzkmxXHCqFLx2U" }, { - "description": "Season starting year returned by college-basketball-schedule-options", + "description": "Page pagination offset", "in": "query", - "name": "season", - "required": true, + "name": "page_offset", "type": "integer", - "x-example": 2026 - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sportskeedaCollegeBasketballScheduleResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } + "x-example": 0 }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Page pagination limit, clamped to 1-50", + "in": "query", + "name": "page_limit", + "type": "integer", + "x-example": 10 }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Get Sportskeeda college basketball games for a date", - "tags": [ - "Sportskeeda" - ] - } - }, - "/sportskeeda/college-basketball-schedule-options": { - "get": { - "description": "Reads Sportskeeda's current college basketball schedule configuration. It returns every season from the published minimum through the current schedule season and the date-picker window. The conference selector is shown by the site, but its current-season feed metadata is incomplete.", - "operationId": "sportskeeda-college-basketball-schedule-options", - "parameters": [ + "description": "Section pagination offset", + "in": "query", + "name": "section_offset", + "type": "integer", + "x-example": 0 + }, { - "description": "A season starting year from the live seasons list; defaults to the current schedule season", + "description": "Section pagination limit, clamped to 1-50", "in": "query", - "name": "season", + "name": "section_limit", "type": "integer", - "x-example": 2026 + "x-example": 10 + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -477274,17 +492558,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaCollegeBasketballScheduleOptionsResponseDoc" + "$ref": "#/definitions/spotify.browsePageResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477295,45 +492585,90 @@ "ApiKeyAuth": [] } ], - "summary": "Discover college basketball schedule seasons and date window", + "summary": "Retrieve Spotify Podcasts categories", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/cricket-commentary": { + "/spotify-podcasts/charts": { "get": { - "description": "Returns the current commentary feed. To page to older events, pass a 24-character lowercase hexadecimal cursor from an event in /sportskeeda/cricket-match's commentary field (the full feed may contain zero-filled IDs); language then selects an upstream language. The match page's commentary selector offers en, hi, ta, te, and bho. Language without cursor is rejected because the upstream feed ignores it.", - "operationId": "sportskeeda-cricket-commentary", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify podcast chart rankings from podcastcharts.byspotify.com. The chart and region parameters are validated against Spotify's supported podcast chart slugs and countries. Category charts are available only in au, br, de, gb, mx, se, and us.", + "operationId": "spotify-podcasts-charts", "parameters": [ { - "description": "Host-free match path returned by /sportskeeda/schedule", + "description": "Chart slug. Allowed: top-podcasts, top-episodes, trending, arts, business, comedy, education, fiction, health-fitness, history, leisure, music, news, religion-spirituality, science, society-culture, sports, technology, true-crime, tv-film", + "enum": [ + "top-podcasts", + "top-episodes", + "trending", + "arts", + "business", + "comedy", + "education", + "fiction", + "health-fitness", + "history", + "leisure", + "music", + "news", + "religion-spirituality", + "science", + "society-culture", + "sports", + "technology", + "true-crime", + "tv-film" + ], "in": "query", - "name": "slug", - "required": true, + "name": "chart", "type": "string", - "x-example": "live-cricket-score/india-vs-west-indies-2nd-odi-30-september-2026" + "x-example": "religion-spirituality" }, { - "description": "Nonzero 24-character lowercase hexadecimal commentary ID from /sportskeeda/cricket-match commentary", + "description": "Two-letter region code. Allowed: ar, au, at, br, ca, cl, co, dk, fi, fr, de, in, id, ie, it, jp, mx, nz, no, ph, pl, es, se, nl, gb, us", + "enum": [ + "ar", + "au", + "at", + "br", + "ca", + "cl", + "co", + "dk", + "fi", + "fr", + "de", + "in", + "id", + "ie", + "it", + "jp", + "mx", + "nz", + "no", + "ph", + "pl", + "es", + "se", + "nl", + "gb", + "us" + ], "in": "query", - "name": "cursor", + "name": "region", "type": "string", - "x-example": "6abba0970c04cda719d37b18" + "x-example": "us" }, { - "description": "Older-comment language; valid only with cursor", - "enum": [ - "en", - "hi", - "ta", - "te", - "bho" - ], + "description": "Result limit, clamped to 1-100", "in": "query", - "name": "language", - "type": "string", - "x-example": "en" + "name": "limit", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -477343,23 +492678,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaCricketCommentaryResponseDoc" + "$ref": "#/definitions/spotify.chartsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477370,24 +492705,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sportskeeda cricket ball-by-ball commentary", + "summary": "Retrieve Spotify podcast charts", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/cricket-match": { + "/spotify-podcasts/episode": { "get": { - "description": "Returns the public scorecard, innings, teams, squads, player data, and latest commentary for a cricket match slug discovered from /sportskeeda/schedule. Betting fields are excluded.", - "operationId": "sportskeeda-cricket-match", + "consumes": [ + "application/json" + ], + "description": "Returns public episode metadata. Provide either uri or id; defaults to a known public episode when omitted.", + "operationId": "spotify-podcasts-episode", "parameters": [ { - "description": "Host-free match path returned by /sportskeeda/schedule", + "description": "Spotify episode URI or open.spotify.com episode URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "live-cricket-score/india-vs-west-indies-2nd-odi-30-september-2026" + "x-example": "spotify:episode:2C2Y5kNq7qCVOVhbA0G3os" + }, + { + "description": "Spotify episode ID. Used when uri is omitted", + "in": "query", + "name": "id", + "type": "string", + "x-example": "2C2Y5kNq7qCVOVhbA0G3os" } ], "produces": [ @@ -477397,23 +492741,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaCricketMatchResponseDoc" + "$ref": "#/definitions/spotify.episodeResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477424,27 +492768,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda cricket match center", + "summary": "Retrieve Spotify podcast episode details", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/depth-chart": { + "/spotify-podcasts/home": { "get": { - "description": "Returns every team and listed position/player from the live NFL depth chart. Players and team detail pages include slugs when Sportskeeda links them.", - "operationId": "sportskeeda-depth-chart", + "consumes": [ + "application/json" + ], + "description": "Returns the Spotify podcasts home page as sections of items, for `uri` (default `spotify:genre:podcasts-web`). Each section has a title and items with type, title, publisher, images and Spotify URL. `page_limit` and `section_limit` default to 10 and run 1 to 50; the offsets default to 0.", + "operationId": "spotify-podcasts-home", "parameters": [ { - "description": "Must be nfl/depth-chart", - "enum": [ - "nfl/depth-chart" - ], + "description": "Spotify page or genre URI", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "nfl/depth-chart" + "x-example": "spotify:genre:podcasts-web" + }, + { + "description": "Page pagination offset", + "in": "query", + "name": "page_offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Page pagination limit, clamped to 1-50", + "in": "query", + "name": "page_limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Section pagination offset", + "in": "query", + "name": "section_offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Section pagination limit, clamped to 1-50", + "in": "query", + "name": "section_limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -477454,23 +492832,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaDepthChartResponseDoc" + "$ref": "#/definitions/spotify.browsePageResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477481,66 +492859,83 @@ "ApiKeyAuth": [] } ], - "summary": "Get the NFL depth chart for all teams", + "summary": "Retrieve Spotify Podcasts home", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/draft-picks": { + "/spotify-podcasts/search": { "get": { - "description": "Reads the complete public draft JSON asset, not only the rows initially visible on the page. Filter by year, round, position or player name. Discover each team's exact filter values with draft-picks-options. Source history and latest available year are published by Sportskeeda and may lag the current season.", - "operationId": "sportskeeda-draft-picks", + "consumes": [ + "application/json" + ], + "description": "Searches Spotify podcasts for `q`, returning matching `shows`, `episodes` and `topResults`, with counts in `meta`. `limit` and `number_of_top_results` run 1 to 50. Optional flags (`include_pre_releases`, `include_audiobooks`, `include_authors`) widen the results. Episodes carry duration and release date; shows carry publisher.", + "operationId": "spotify-podcasts-search", "parameters": [ { - "description": "NFL team draft-picks page path without host", + "description": "Podcast search term", "in": "query", - "name": "slug", + "name": "q", "required": true, "type": "string", - "x-example": "nfl/san-francisco-49ers/draft-picks" + "x-example": "chatgpt" }, { - "description": "Year from draft-picks-options; omit for all years", + "description": "Search offset", "in": "query", - "name": "year", + "name": "offset", "type": "integer", - "x-example": 2025 + "x-example": 0 }, { - "description": "Exact round from draft-picks-options; historical special labels are accepted", + "description": "Result limit, clamped to 1-50", "in": "query", - "name": "round", - "type": "string", - "x-example": "1" + "name": "limit", + "type": "integer", + "x-example": 30 }, { - "description": "Exact position from draft-picks-options", + "description": "Top result limit, clamped to 1-50", "in": "query", - "name": "position", - "type": "string", - "x-example": "QB" + "name": "number_of_top_results", + "type": "integer", + "x-example": 20 }, { - "description": "Case-insensitive player-name substring, at most 100 characters", + "description": "Include pre-release results", "in": "query", - "name": "q", - "type": "string", - "x-example": "Purdy" + "name": "include_pre_releases", + "type": "boolean", + "x-example": false }, { - "description": "Page number, 1-1000; default 1", + "description": "Include album pre-release results", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "include_album_pre_releases", + "type": "boolean", + "x-example": false }, { - "description": "Records per page, 1-500; default 100", + "description": "Include audiobooks", "in": "query", - "name": "per_page", - "type": "integer", - "x-example": 100 + "name": "include_audiobooks", + "type": "boolean", + "x-example": true + }, + { + "description": "Include authors", + "in": "query", + "name": "include_authors", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -477550,23 +492945,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaDraftPicksResponseDoc" + "$ref": "#/definitions/spotify.searchResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477577,24 +492972,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get all historical NFL team draft picks from Sportskeeda", + "summary": "Search Spotify Podcasts", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/draft-picks-options": { + "/spotify-podcasts/show": { "get": { - "description": "Reads the public draft JSON asset named by the team page and returns every available year, round and position, including historical special rounds. Team page slugs are discoverable from page-options on an NFL team overview.", - "operationId": "sportskeeda-draft-picks-options", + "consumes": [ + "application/json" + ], + "description": "Returns metadata for one Spotify podcast show by `uri` (default `spotify:show:1QQJ7FElLE0K6CIfZNCxU4`): name, publisher, description, media type, explicit flag, `totalEpisodes`, cover images and Spotify URL. The two `include_` flags request extra content capability and content rating fields when Spotify supplies them.", + "operationId": "spotify-podcasts-show", "parameters": [ { - "description": "NFL team draft-picks page path without host", + "description": "Spotify show URI", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "nfl/san-francisco-49ers/draft-picks" + "x-example": "spotify:show:1QQJ7FElLE0K6CIfZNCxU4" + }, + { + "description": "Include content capability trait", + "in": "query", + "name": "include_content_capability_trait", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -477604,23 +493015,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaDraftPicksOptionsResponseDoc" + "$ref": "#/definitions/spotify.showResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477631,93 +493042,47 @@ "ApiKeyAuth": [] } ], - "summary": "Discover an NFL team's complete Sportskeeda draft filters", + "summary": "Retrieve Spotify podcast show metadata", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/event-calendar": { + "/spotify-podcasts/show/episodes": { "get": { - "description": "Returns all events from the embedded Sports Calendar, optionally filtered by an offered region-specific sport, one or more offered months, or an inclusive date range. Discover the current region, sport, and month values through /sportskeeda/event-calendar-options.", - "operationId": "sportskeeda-event-calendar", + "consumes": [ + "application/json" + ], + "description": "Returns the episodes of a Spotify podcast by show URI, with `offset` and `limit` (1-50). Each episode has its name, description, release date, duration in milliseconds, explicit and playable flags, Spotify URI, external URL and images; `total` gives the show's episode count.", + "operationId": "spotify-podcasts-show-episodes", "parameters": [ { - "default": "us", - "description": "Calendar region", - "enum": [ - "us", - "india" - ], - "in": "query", - "name": "region", - "type": "string" - }, - { - "description": "Exact sport label offered for the selected region; see event-calendar-options", - "enum": [ - "NFL", - "Football", - "MLB", - "College Football", - "NBA", - "College Basketball", - "NHL", - "WNBA", - "Golf", - "Tennis", - "NASCAR", - "WWE", - "Boxing", - "UFC", - "MMA", - "Formula 1", - "College Baseball", - "IndyCar", - "AEW", - "MotoGP", - "Wrestling", - "Cricket", - "Table Tennis", - "Chess", - "Kabaddi", - "Hockey", - "Badminton", - "Athletics" - ], + "description": "Spotify show URI", "in": "query", - "name": "sport", - "type": "string" + "name": "uri", + "type": "string", + "x-example": "spotify:show:1QQJ7FElLE0K6CIfZNCxU4" }, { - "collectionFormat": "multi", - "description": "One or more offered calendar months in YYYY-MM format; repeat this parameter for multiple months", + "description": "Episode offset", "in": "query", - "items": { - "enum": [ - "2026-09", - "2026-10", - "2026-11", - "2026-12" - ], - "type": "string" - }, - "name": "month", - "type": "array" + "name": "offset", + "type": "integer", + "x-example": 0 }, { - "description": "Inclusive range start in YYYY-MM-DD; provide together with end_date", + "description": "Episode limit, clamped to 1-50", "in": "query", - "name": "start_date", - "type": "string", - "x-example": "2026-09-01" + "name": "limit", + "type": "integer", + "x-example": 50 }, { - "description": "Inclusive range end in YYYY-MM-DD; provide together with start_date", + "description": "Include Spotify episode content ratings v2", "in": "query", - "name": "end_date", - "type": "string", - "x-example": "2026-09-30" + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -477727,49 +493092,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaEventCalendarResponseDoc" + "$ref": "#/definitions/spotify.showEpisodesResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Sportskeeda regional sports calendar events", - "tags": [ - "Sportskeeda" - ] - } - }, - "/sportskeeda/event-calendar-options": { - "get": { - "description": "Lists the regions (`us` and `india`) of the Sportskeeda event calendar, each with the sport names and `YYYY-MM` months currently on offer. Takes no parameters. Pass the exact `region`, `sport` and `month` values to `/sportskeeda/event-calendar`; no year parameter exists.", - "operationId": "sportskeeda-event-calendar-options", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sportskeedaEventCalendarOptionsResponseDoc" - } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477780,33 +493119,26 @@ "ApiKeyAuth": [] } ], - "summary": "Discover Sportskeeda calendar regions, sports, and months", + "summary": "Retrieve Spotify podcast show episodes", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/feed": { + "/spotify-podcasts/show/recommendations": { "get": { - "description": "Fetches the public article cards for a Sportskeeda section, event, team-news, or player-news slug. Page pagination is accepted only when the source advertises it.", - "operationId": "sportskeeda-feed", + "consumes": [ + "application/json" + ], + "description": "Lists shows and episodes that Spotify recommends alongside a podcast show given by `uri`. Each recommendation has a type, title, publisher, description, images and Spotify URL, and `meta.count` gives the number returned. The response echoes the show `uri` it was requested for.", + "operationId": "spotify-podcasts-show-recommendations", "parameters": [ { - "description": "Sportskeeda path without host, such as wwe, go/epl, or player/jannik-sinner/news", + "description": "Spotify show URI", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "wwe" - }, - { - "default": 1, - "description": "Source page, for feeds with pagination; defaults to 1", - "in": "query", - "maximum": 1000, - "minimum": 1, - "name": "page", - "type": "integer" + "x-example": "spotify:show:1QQJ7FElLE0K6CIfZNCxU4" } ], "produces": [ @@ -477816,23 +493148,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaFeedResponseDoc" + "$ref": "#/definitions/spotify.showRecommendationsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -477843,31 +493175,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get articles from a Sportskeeda section or topic", + "summary": "Retrieve Spotify podcast recommendations", "tags": [ - "Sportskeeda" + "SpotifyPodcasts" ] } }, - "/sportskeeda/football-data": { + "/spotify/album": { "get": { - "description": "Returns first-party football widget fixtures and standings. Event and optional matchday must be offered by football-options. Omit matchday for the widget's selected round. Scores and standings reflect upstream data, which may be stale.", - "operationId": "sportskeeda-football-data", + "consumes": [ + "application/json" + ], + "description": "Returns a Spotify album from `uri` (a Spotify URI or open.spotify.com URL) or `id`: name, album type, artists, release date, copyrights, cover images, total tracks and duration. The `tracks` page is set by `offset` (default 0) and `limit` (1 to 50, default 50). A missing or invalid identifier returns 400.", + "operationId": "spotify-album", "parameters": [ { - "description": "Tournament slug from football-options; current selector: featured, epl, uefa-champions-league, uefa-nations-league, la-liga, ligue-1, mls, bundesliga", + "description": "Spotify album URI or open.spotify.com album URL", "in": "query", - "name": "event", - "required": true, + "name": "uri", "type": "string", - "x-example": "epl" + "x-example": "spotify:album:4aawyAB9vmqN3uQ7FjRGTy" }, { - "description": "Round slug from football-options for the selected event", + "description": "Spotify album ID", "in": "query", - "name": "matchday", + "name": "id", "type": "string", - "x-example": "round-5" + "x-example": "4aawyAB9vmqN3uQ7FjRGTy" + }, + { + "description": "Track offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Track limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -477877,7 +493225,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaFootballDataResponseDoc" + "$ref": "#/definitions/spotify.albumResponseDoc" } }, "400": { @@ -477886,6 +493234,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -477898,23 +493252,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get football fixtures and standings", + "summary": "Retrieve Spotify album details", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/football-options": { + "/spotify/album/tracks": { "get": { - "description": "Lists the live football widget's tournament selector. With event, follows the full previous/next matchday chain and returns every currently offered round slug. The discovered values feed sportskeeda-football-data.", - "operationId": "sportskeeda-football-options", + "consumes": [ + "application/json" + ], + "description": "Lists the tracks of a Spotify album, identified by `uri` (a Spotify URI or open.spotify.com URL) or `id`. `offset` defaults to 0 and `limit` runs 1 to 50, default 50. Each track has its title, URI, subtitle, image and URL. The album's name, artists and track total come back alongside. An invalid identifier returns 400.", + "operationId": "spotify-album-tracks", "parameters": [ { - "description": "Live tournament slug; current selector: featured, epl, uefa-champions-league, uefa-nations-league, la-liga, ligue-1, mls, bundesliga. Omit to list tournaments only", + "description": "Spotify album URI or open.spotify.com album URL", "in": "query", - "name": "event", + "name": "uri", "type": "string", - "x-example": "epl" + "x-example": "spotify:album:4aawyAB9vmqN3uQ7FjRGTy" + }, + { + "description": "Spotify album ID", + "in": "query", + "name": "id", + "type": "string", + "x-example": "4aawyAB9vmqN3uQ7FjRGTy" + }, + { + "description": "Track offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Track limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -477924,7 +493302,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaFootballOptionsResponseDoc" + "$ref": "#/definitions/spotify.albumResponseDoc" } }, "400": { @@ -477933,6 +493311,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -477945,36 +493329,83 @@ "ApiKeyAuth": [] } ], - "summary": "Discover football tournaments and matchdays", + "summary": "Retrieve Spotify album tracks", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/guessing-game": { + "/spotify/albums/search": { "get": { - "description": "Returns the public clues and image metadata for a discovered player-guessing game and ISO date. The answer is omitted so the endpoint does not reveal the active puzzle solution.", - "operationId": "sportskeeda-guessing-game", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify album search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", + "operationId": "spotify-albums-search", "parameters": [ { - "description": "Discovered host-free game page path", - "enum": [ - "wwe/brainbuster-wwe-player-guessing-game", - "nfl/gridle-nfl-player-guessing-game" - ], + "description": "Search term", "in": "query", - "name": "slug", + "name": "q", "required": true, "type": "string", - "x-example": "wwe/brainbuster-wwe-player-guessing-game" + "x-example": "hello" }, { - "description": "Puzzle date in YYYY-MM-DD format", + "description": "Search offset", "in": "query", - "name": "date", - "required": true, - "type": "string", - "x-example": "2026-09-30" + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Album result limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 30 + }, + { + "description": "Top result limit, clamped to 1-50", + "in": "query", + "name": "number_of_top_results", + "type": "integer", + "x-example": 20 + }, + { + "description": "Include audiobook context where available", + "in": "query", + "name": "include_audiobooks", + "type": "boolean", + "x-example": true + }, + { + "description": "Include pre-release results", + "in": "query", + "name": "include_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include album pre-release results", + "in": "query", + "name": "include_album_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include authors", + "in": "query", + "name": "include_authors", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -477984,23 +493415,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaGuessingGameResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -478011,28 +493442,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda daily guessing-game puzzle", + "summary": "Search Spotify albums", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/guessing-game-entities": { + "/spotify/artist": { "get": { - "description": "Returns the live public entity list used by a discovered player-guessing game, including the game-specific team, position, and profile fields.", - "operationId": "sportskeeda-guessing-game-entities", + "consumes": [ + "application/json" + ], + "description": "Returns a Spotify artist's profile by artist URI, `open.spotify.com` URL or id: name, verified flag, follower count, monthly listeners (`monthlyUsers`), biography and images, plus top tracks, selected discography, related artists and artist playlists when Spotify returns them.", + "operationId": "spotify-artist", "parameters": [ { - "description": "Discovered host-free game page path", - "enum": [ - "wwe/brainbuster-wwe-player-guessing-game", - "nfl/gridle-nfl-player-guessing-game" - ], + "description": "Spotify artist URI or open.spotify.com artist URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "wwe/brainbuster-wwe-player-guessing-game" + "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" + }, + { + "description": "Spotify artist ID", + "in": "query", + "name": "id", + "type": "string", + "x-example": "0TnOYISbd1XYRBk9myaseg" } ], "produces": [ @@ -478042,7 +493478,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaGuessingGameEntitiesResponseDoc" + "$ref": "#/definitions/spotify.artistResponseDoc" } }, "400": { @@ -478051,8 +493487,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478069,81 +493505,74 @@ "ApiKeyAuth": [] } ], - "summary": "List players for a Sportskeeda guessing game", + "summary": "Retrieve Spotify artist details", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/guessing-games": { + "/spotify/artist/albums": { "get": { - "description": "Lists the player-guessing games currently linked on Sportskeeda. Each has a display `name`, a host-free page `slug` such as `wwe/brainbuster-wwe-player-guessing-game`, and its `game_slug`. Pass `slug` to `/sportskeeda/guessing-game` or `/sportskeeda/guessing-game-entities`. Takes no parameters.", - "operationId": "sportskeeda-guessing-games", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sportskeedaGuessingGamesResponseDoc" - } + "description": "Returns an artist's Spotify discography by artist URI, `open.spotify.com` URL or id. Choose `type` (`album`, `single`, `compilation`, `appears_on` or `all`; default `album`) and `order` (default `date_desc`), and page with `offset` and `limit` (1-50, default 50). Each item has a type, title, subtitle, Spotify URI, external URL and images; `total` gives the full count.", + "operationId": "spotify-artist-albums", + "parameters": [ + { + "description": "Spotify artist URI or open.spotify.com artist URL", + "in": "query", + "name": "uri", + "type": "string", + "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Spotify artist ID", + "in": "query", + "name": "id", + "type": "string", + "x-example": "0TnOYISbd1XYRBk9myaseg" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "List Sportskeeda player-guessing games", - "tags": [ - "Sportskeeda" - ] - } - }, - "/sportskeeda/nba-queries": { - "get": { - "description": "Pages through the server-rendered questions on Sportskeeda's Top NBA Queries page. Slugs are host-free and can be passed to sportskeeda_page_data for the linked player stats table. The live category directory is returned on every page.", - "operationId": "sportskeeda-nba-queries", - "parameters": [ + "description": "album, single, compilation, appears_on, or all", + "enum": [ + "album", + "single", + "compilation", + "appears_on", + "all" + ], + "in": "query", + "name": "type", + "type": "string", + "x-example": "album" + }, { - "description": "Optional category id", + "description": "date_desc, date_asc, name_asc, or name_desc", "enum": [ - "player-stat", - "player-vs-team" + "date_desc", + "date_asc", + "name_asc", + "name_desc" ], "in": "query", - "name": "category", - "type": "string" + "name": "order", + "type": "string", + "x-example": "date_desc" }, { - "default": 0, - "description": "Zero-based result offset", + "description": "Offset", "in": "query", - "minimum": 0, "name": "offset", - "type": "integer" + "type": "integer", + "x-example": 0 }, { - "default": 100, - "description": "Page size; 0 or omitted defaults to 100, maximum is 500", + "description": "Limit, clamped to 1-50", "in": "query", - "maximum": 500, - "minimum": 0, "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -478153,7 +493582,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaNBAQueriesResponseDoc" + "$ref": "#/definitions/spotify.artistAlbumsResponseDoc" } }, "400": { @@ -478162,37 +493591,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List Sportskeeda NBA player query pages", - "tags": [ - "Sportskeeda" - ] - } - }, - "/sportskeeda/news": { - "get": { - "description": "Returns the current public Sportskeeda news sitemap entries. Use /sportskeeda/sections to discover all navigation groups and sports landing pages, and /sportskeeda/taxonomy-search to search categories, events, teams, players, wiki pages, and wiki tags.", - "operationId": "sportskeeda-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "503": { "description": "Service Unavailable", @@ -478206,76 +493609,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sportskeeda's latest news", + "summary": "Retrieve Spotify artist albums", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/page-data": { + "/spotify/artist/playlists": { "get": { - "description": "Returns team, player, roster, leaderboard, ranking, depth, playoff, and game-log tables. NFL team stats include team-leader cards, player-category tables, and Basic, Advanced, and Expert team tables. Season and type are accepted only if offered by the selected page; discover their values with page-options. Player game-log seasons use their discovered season-specific path and return every table offered by the page; NFL category tabs are listed by page-options. College-football schedule slugs accept a discovered conference slug and filter the schedule rows; an offered group with no games on that week returns status no_data. The trade value chart has a separate endpoint. A page with no structured tables returns an upstream error.", - "operationId": "sportskeeda-page-data", + "consumes": [ + "application/json" + ], + "description": "Returns the Spotify playlists associated with an artist, by artist URI, `open.spotify.com` URL or id. Each playlist has a title, subtitle, description, Spotify URI, external URL and images. Some artists have no playlists, in which case `items` is empty.", + "operationId": "spotify-artist-playlists", "parameters": [ { - "description": "Sportskeeda path without host", - "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "nfl/team-stat/net-yards-per-game-leaders" - }, - { - "description": "Season year offered by this page's page-options filter", - "in": "query", - "name": "season", - "type": "integer", - "x-example": 2026 - }, - { - "description": "Season phase offered by this page's page-options filter; leaderboard pages offer pre, regular, post", + "description": "Spotify artist URI or open.spotify.com artist URL", "in": "query", - "name": "type", + "name": "uri", "type": "string", - "x-example": "regular" + "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" }, { - "description": "College-football schedule conference slug from page-options", - "enum": [ - "all-conferences", - "all-fbs-i-a", - "atlantic-coast", - "big-ten", - "mid-american", - "pac-12", - "southeastern", - "independents-fbs", - "big-12", - "conference-usa", - "mountain-west", - "sun-belt", - "aac", - "all-fcs-i-aa", - "big-sky", - "missouri-valley", - "ivy-league", - "mid-eastern-athletic", - "ohio-valley", - "patriot-league", - "pioneer-league", - "southern", - "southland", - "swac", - "northeast", - "independents-fcs", - "big-south", - "caa", - "united-athletic" - ], + "description": "Spotify artist ID", "in": "query", - "name": "conference", + "name": "id", "type": "string", - "x-example": "big-ten" + "x-example": "0TnOYISbd1XYRBk9myaseg" } ], "produces": [ @@ -478285,7 +493645,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTablesResponseDoc" + "$ref": "#/definitions/spotify.artistCollectionResponseDoc" } }, "400": { @@ -478294,8 +493654,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478312,24 +493672,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sportskeeda structured sports tables", + "summary": "Retrieve Spotify artist playlists", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/page-options": { + "/spotify/artist/related": { "get": { - "description": "Returns the page's live contextual menus, team and ranking links, tabs, schedule views, and every currently offered select-filter value. Leaderboard category and metric values carry their destination slugs. College-football schedule pages expose the client-side conference selector here.", - "operationId": "sportskeeda-page-options", + "consumes": [ + "application/json" + ], + "description": "Returns the artists Spotify lists as related to a given artist, by artist URI, `open.spotify.com` URL or id. Each related artist has a title, Spotify URI, external URL and images. An invalid identifier returns `400`.", + "operationId": "spotify-artist-related", "parameters": [ { - "description": "Sportskeeda path without host", + "description": "Spotify artist URI or open.spotify.com artist URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "nfl" + "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" + }, + { + "description": "Spotify artist ID", + "in": "query", + "name": "id", + "type": "string", + "x-example": "0TnOYISbd1XYRBk9myaseg" } ], "produces": [ @@ -478339,7 +493708,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaPageOptionsResponseDoc" + "$ref": "#/definitions/spotify.artistCollectionResponseDoc" } }, "400": { @@ -478348,8 +493717,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478366,37 +493735,41 @@ "ApiKeyAuth": [] } ], - "summary": "Discover Sportskeeda page menus and filters", + "summary": "Retrieve Spotify related artists", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/player-stats": { + "/spotify/artists/search": { "get": { - "description": "Returns the season stats for an NFL or NBA player stats page. Without event_type, returns all event phases offered by that page's selector. NBA data may contain extra phases that the page does not offer; these are excluded. Discover the current event_type values with sportskeeda-page-options for the same slug.", - "operationId": "sportskeeda-player-stats", + "consumes": [ + "application/json" + ], + "description": "Searches Spotify for artists matching a term, with `offset` and `limit` (1-50). Each artist has a title, Spotify URI, external URL and images. Matching artists are returned in both `results` and `artists`.", + "operationId": "spotify-artists-search", "parameters": [ { - "description": "NFL or NBA player stats path without host", + "description": "Search term", "in": "query", - "name": "slug", + "name": "q", "required": true, "type": "string", - "x-example": "nfl/jacoby-brissett/stats" + "x-example": "hello" }, { - "description": "Event phase offered by this player's stats-event-type-dropdown; NFL offers 0,1,2,3 and NBA offers 0,1,2", - "enum": [ - "0", - "1", - "2", - "3" - ], + "description": "Search offset", "in": "query", - "name": "event_type", - "type": "string", - "x-example": "1" + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Result limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -478406,7 +493779,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaPlayerStatsResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { @@ -478415,8 +493788,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478433,24 +493806,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get NFL or NBA player season stats across event phases", + "summary": "Search Spotify artists", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/profile": { + "/spotify/audiobook": { "get": { - "description": "Returns a Sportskeeda player or team profile by host-free `slug`, such as `player/jannik-sinner` or `nfl/green-bay-packers`. The response has its name, `kind`, a description, fact rows as name and value pairs (names vary by sport), and any news cards. A page without fact rows returns an upstream error.", - "operationId": "sportskeeda-profile", + "consumes": [ + "application/json" + ], + "description": "Returns a Spotify audiobook by `uri` or `id`; Spotify identifies audiobooks with show URIs (`spotify:show:...`). The response has name, authors, narrators, publisher, description, `totalChapters`, explicit flag and cover images. Passing a podcast show instead of an audiobook returns an upstream error, and an invalid identifier returns 400.", + "operationId": "spotify-audiobook", "parameters": [ { - "description": "Sportskeeda player or team profile path without host", + "description": "Spotify audiobook/show URI or open.spotify.com show URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "player/jannik-sinner" + "x-example": "spotify:show:76GTo4lM62dFR11VuALF01" + }, + { + "description": "Spotify show ID", + "in": "query", + "name": "id", + "type": "string", + "x-example": "76GTo4lM62dFR11VuALF01" } ], "produces": [ @@ -478460,7 +493842,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaProfileResponseDoc" + "$ref": "#/definitions/spotify.audiobookResponseDoc" } }, "400": { @@ -478469,8 +493851,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478487,24 +493869,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda player or team profile", + "summary": "Retrieve Spotify audiobook details", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/quiz": { + "/spotify/audiobook/chapters": { "get": { - "description": "Returns public question prompts and choice text from a quiz page, sorted by question number. The source does not expose correct answers in its anonymous page data; answer checking and user submissions are not included.", - "operationId": "sportskeeda-quiz", + "consumes": [ + "application/json" + ], + "description": "Returns the chapters of a Spotify audiobook by URI, `open.spotify.com` URL or id, with `offset` and `limit` (1-50, default 50). Each chapter has its name, description, duration in milliseconds, release date, explicit and playable flags, Spotify URI, external URL and images; `total` gives the chapter count.", + "operationId": "spotify-audiobook-chapters", "parameters": [ { - "description": "Sportskeeda quiz path without host, discovered through /sportskeeda/quizzes", + "description": "Spotify audiobook/show URI or open.spotify.com show URL", + "in": "query", + "name": "uri", + "type": "string", + "x-example": "spotify:show:76GTo4lM62dFR11VuALF01" + }, + { + "description": "Spotify show ID", + "in": "query", + "name": "id", + "type": "string", + "x-example": "76GTo4lM62dFR11VuALF01" + }, + { + "description": "Chapter offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Chapter limit, clamped to 1-50", "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "wwe/quiz/how-well-know-cody-rhodes" + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -478514,7 +493919,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaQuizResponseDoc" + "$ref": "#/definitions/spotify.audiobookChaptersResponseDoc" } }, "400": { @@ -478523,8 +493928,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478541,16 +493946,85 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda quiz definition", + "summary": "Retrieve Spotify audiobook chapters", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/quiz-categories": { + "/spotify/audiobooks/search": { "get": { - "description": "Lists the quiz categories currently linked from Sportskeeda's quiz hub, each with a `name` and a host-free `slug` such as `cricket/quiz`. Pass a `slug` to `sportskeeda-quizzes`. Takes no parameters, and the list changes with the site, so fetch it rather than assuming fixed categories.", - "operationId": "sportskeeda-quiz-categories", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify audiobook search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", + "operationId": "spotify-audiobooks-search", + "parameters": [ + { + "description": "Search term", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "hello" + }, + { + "description": "Search offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Audiobook result limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 30 + }, + { + "description": "Top result limit, clamped to 1-50", + "in": "query", + "name": "number_of_top_results", + "type": "integer", + "x-example": 20 + }, + { + "description": "Include audiobook results", + "in": "query", + "name": "include_audiobooks", + "type": "boolean", + "x-example": true + }, + { + "description": "Include pre-release results", + "in": "query", + "name": "include_pre_releases", + "type": "boolean", + "x-example": true + }, + { + "description": "Include album pre-release results", + "in": "query", + "name": "include_album_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include authors", + "in": "query", + "name": "include_authors", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false + } + ], "produces": [ "application/json" ], @@ -478558,17 +494032,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaQuizCategoriesResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -478579,37 +494059,33 @@ "ApiKeyAuth": [] } ], - "summary": "List current Sportskeeda quiz categories", + "summary": "Search Spotify audiobooks", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/quizzes": { + "/spotify/chapter": { "get": { - "description": "Returns public quiz cards for one category path discovered through /sportskeeda/quiz-categories. The source currently renders its first quiz page; page pagination is not exposed because the visible page links currently repeat the same cards.", - "operationId": "sportskeeda-quizzes", + "consumes": [ + "application/json" + ], + "description": "Returns a Spotify audiobook chapter by `uri` or `id`; chapters are often addressed with `spotify:episode:` identifiers. Fields include name, description, duration, release date, explicit and paywall flags, playability reasons, preview audio URL, cover images and the parent show. An invalid identifier returns 400.", + "operationId": "spotify-chapter", "parameters": [ { - "description": "Sportskeeda quiz category path without host", - "enum": [ - "anime/quiz", - "cricket/quiz", - "daily-soaps/quiz", - "esports/quiz", - "fortnite/quiz", - "minecraft/quiz", - "movies/quiz", - "pokemon/quiz", - "shows/quiz", - "tennis/quiz", - "wwe/quiz" - ], + "description": "Spotify chapter or episode URI/URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "anime/quiz" + "x-example": "spotify:episode:2C2Y5kNq7qCVOVhbA0G3os" + }, + { + "description": "Spotify chapter/episode ID", + "in": "query", + "name": "id", + "type": "string", + "x-example": "2C2Y5kNq7qCVOVhbA0G3os" } ], "produces": [ @@ -478619,7 +494095,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaQuizzesResponseDoc" + "$ref": "#/definitions/spotify.episodeResponseDoc" } }, "400": { @@ -478628,8 +494104,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478646,61 +494122,41 @@ "ApiKeyAuth": [] } ], - "summary": "List quizzes in a Sportskeeda category", + "summary": "Retrieve Spotify audiobook chapter details", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/salary-cap": { + "/spotify/episodes/search": { "get": { - "description": "Returns the source's published season, team totals, every player cap scenario and expanded salary breakdown. The site's player search and sortable columns are applied to the complete server-rendered rows. The published season may lag the current season.", - "operationId": "sportskeeda-salary-cap", + "consumes": [ + "application/json" + ], + "description": "Searches Spotify podcast episodes for the search term `q`, paged with `offset` (default 0) and `limit` (1 to 50). Each episode has its title, URI, description, publisher, images and Spotify URL. Episode matches appear under both `results` and `episodes`. A missing `q` returns 400.", + "operationId": "spotify-episodes-search", "parameters": [ { - "description": "NFL team salary-cap page path without host", - "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "nfl/san-francisco-49ers/salary-cap" - }, - { - "description": "Case-insensitive player-name substring, at most 100 characters", + "description": "Search term", "in": "query", "name": "q", + "required": true, "type": "string", - "x-example": "Purdy" + "x-example": "hello" }, { - "description": "Sortable column; omit to preserve source order", - "enum": [ - "player", - "cap_number", - "cut_pre_june_1_dead_money", - "cut_pre_june_1_cap_saving", - "cut_post_june_1_dead_money", - "cut_post_june_1_cap_saving", - "trade_pre_june_1_dead_money", - "trade_pre_june_1_cap_saving", - "trade_post_june_1_dead_money", - "trade_post_june_1_cap_saving", - "restructure_cap_saving", - "extension_cap_saving" - ], + "description": "Search offset", "in": "query", - "name": "sort_by", - "type": "string" + "name": "offset", + "type": "integer", + "x-example": 0 }, { - "description": "Sort direction; requires sort_by; default asc", - "enum": [ - "asc", - "desc" - ], + "description": "Result limit, clamped to 1-50", "in": "query", - "name": "order", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -478710,7 +494166,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaSalaryCapResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { @@ -478719,8 +494175,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -478737,24 +494193,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get NFL team salary-cap figures from Sportskeeda", + "summary": "Search Spotify episodes", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/schedule": { + "/spotify/featured-charts-by-country": { "get": { - "description": "Returns a Sportskeeda fixtures or schedule page by host-free `slug`, such as `nfl/schedule` or `cricket/schedule`. Cricket and football give `matches` with teams, time, status, score, competition, venue and result; other sports give `tables` with `columns` and `rows`. An empty fixture widget returns `status` `no_matches`.", - "operationId": "sportskeeda-schedule", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify country hub content. Defaults to the CHARTS content shelf for the requested country.", + "operationId": "spotify-featured-charts-by-country", "parameters": [ { - "description": "Sportskeeda schedule path without host", + "description": "Two-letter Spotify popular-in country code", "in": "query", - "name": "slug", - "required": true, + "name": "country_code", "type": "string", - "x-example": "nfl/schedule" + "x-example": "id" + }, + { + "description": "Country hub content ID. Allowed: CHARTS, POPULAR_ALBUMS, POPULAR_ARTISTS, TRENDING_SONGS", + "enum": [ + "CHARTS", + "POPULAR_ALBUMS", + "POPULAR_ARTISTS", + "TRENDING_SONGS" + ], + "in": "query", + "name": "content_id", + "type": "string", + "x-example": "CHARTS" } ], "produces": [ @@ -478764,23 +494235,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTablesResponseDoc" + "$ref": "#/definitions/spotify.countryHubContentResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -478791,16 +494262,63 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sportskeeda fixtures and results", + "summary": "Retrieve Spotify featured charts by country", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/sections": { + "/spotify/genre": { "get": { - "description": "Returns the live parent/child navigation tree, including external destinations marked explicitly, plus every public sports landing URL from Sportskeeda's sports sitemap.", - "operationId": "sportskeeda-sections", + "consumes": [ + "application/json" + ], + "description": "Returns the sections of a Spotify genre or browse page for `uri` (default `spotify:page:0JQ5DAB3zgCauRwnvdEQjJ`). Each section has a title, type, `totalCount` and items with title, subtitle, image and Spotify URL. `page_limit` and `section_limit` default to 10 and run 1 to 50; matching offsets default to 0.", + "operationId": "spotify-genre", + "parameters": [ + { + "description": "Spotify genre or page URI", + "in": "query", + "name": "uri", + "type": "string", + "x-example": "spotify:page:0JQ5DAB3zgCauRwnvdEQjJ" + }, + { + "description": "Page pagination offset", + "in": "query", + "name": "page_offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Page pagination limit, clamped to 1-50", + "in": "query", + "name": "page_limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Section pagination offset", + "in": "query", + "name": "section_offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Section pagination limit, clamped to 1-50", + "in": "query", + "name": "section_limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false + } + ], "produces": [ "application/json" ], @@ -478808,11 +494326,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaSectionsResponseDoc" + "$ref": "#/definitions/spotify.browsePageResponseDoc" + } + }, + "400": { + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -478823,48 +494353,54 @@ "ApiKeyAuth": [] } ], - "summary": "Discover Sportskeeda sections and topics", + "summary": "Retrieve Spotify genre page", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/sitemap-items": { + "/spotify/home": { "get": { - "description": "Returns canonical URLs and host-free path slugs from one sitemap discovered by /sportskeeda/sitemaps. Returned path slugs preserve case and percent-encode unusual characters. A sitemap_url remains accepted for existing callers. Provide exactly one; the source is checked against the live index and robots sitemap list on each call.", - "operationId": "sportskeeda-sitemap-items", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify home shelves and items. Caller-supplied Spotify bearer or client tokens are not required.", + "operationId": "spotify-home", "parameters": [ { - "description": "Sitemap slug returned by /sportskeeda/sitemaps; preferred", + "description": "IANA time zone used by Spotify home personalization", "in": "query", - "name": "slug", + "name": "time_zone", "type": "string", - "x-example": "tournaments.xml" + "x-example": "Asia/Shanghai" }, { - "description": "Exact sitemap URL; alternative to slug", + "description": "Optional Spotify session token. A random UUID is generated when omitted", "in": "query", - "name": "sitemap_url", + "name": "sp_t", "type": "string", - "x-example": "https://www.sportskeeda.com/tournaments.xml" + "x-example": "00000000-0000-4000-8000-000000000000" }, { - "default": 0, - "description": "Zero-based item offset", + "description": "Optional Spotify home facet", "in": "query", - "maximum": 1000000, - "minimum": 0, - "name": "offset", - "type": "integer" + "name": "facet", + "type": "string", + "x-example": "" }, { - "default": 100, - "description": "Page size from 1 to 500; defaults to 100", + "description": "Per-section item limit, clamped to 1-50", "in": "query", - "maximum": 500, - "minimum": 1, - "name": "limit", - "type": "integer" + "name": "section_items_limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -478874,49 +494410,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaSitemapItemsResponseDoc" + "$ref": "#/definitions/spotify.homeResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Page through a Sportskeeda sitemap", - "tags": [ - "Sportskeeda" - ] - } - }, - "/sportskeeda/sitemaps": { - "get": { - "description": "Returns Sportskeeda's current public sitemaps. Pass a returned slug to /sportskeeda/sitemap-items to page through its complete URL set.", - "operationId": "sportskeeda-sitemaps", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sportskeedaSitemapsResponseDoc" - } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -478927,47 +494437,61 @@ "ApiKeyAuth": [] } ], - "summary": "Discover Sportskeeda sitemap sources", + "summary": "Retrieve Spotify home sections", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/standings": { + "/spotify/playlist": { "get": { - "description": "Returns Sportskeeda standings or rankings tables for a host-free `slug`, such as `nfl/standings`, with column labels, rows, linked cell slugs and view slugs. `season` (starting year, 2013 to 2026) applies only to college basketball standings. The current college basketball season returns `status` `no_data` with empty `tables`.", - "operationId": "sportskeeda-standings", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify playlist metadata and items. Provide either uri or id; defaults to a known public playlist when omitted.", + "operationId": "spotify-playlist", "parameters": [ { - "description": "Sportskeeda standings or rankings path without host", + "description": "Spotify playlist URI or open.spotify.com playlist URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "nfl/standings" + "x-example": "spotify:playlist:37i9dQZEVXbLwpL8TjsxOG" }, { - "description": "College basketball season starting year; live values from standings-options", - "enum": [ - 2026, - 2025, - 2024, - 2023, - 2022, - 2021, - 2020, - 2019, - 2018, - 2017, - 2016, - 2015, - 2014, - 2013 - ], + "description": "Spotify playlist ID. Used when uri is omitted", "in": "query", - "name": "season", + "name": "id", + "type": "string", + "x-example": "37i9dQZEVXbLwpL8TjsxOG" + }, + { + "description": "Playlist item offset", + "in": "query", + "name": "offset", "type": "integer", - "x-example": 2025 + "x-example": 0 + }, + { + "description": "Playlist item limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 25 + }, + { + "description": "Enable watch feed entrypoint", + "in": "query", + "name": "enable_watch_feed_entrypoint", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -478977,23 +494501,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTablesResponseDoc" + "$ref": "#/definitions/spotify.playlistResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479004,47 +494528,83 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sportskeeda standings or rankings", + "summary": "Retrieve Spotify playlist details", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/standings-options": { + "/spotify/playlists/search": { "get": { - "description": "Lists the seasons and conferences available for Sportskeeda college basketball standings. `slug` is required and must be `college-basketball/college-basketball-standings`. Without `season` you get all offered season years and the current season's conferences; with it, that season's conferences, each with a name and a slug usable as the standings `slug`.", - "operationId": "sportskeeda-standings-options", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify playlist search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", + "operationId": "spotify-playlists-search", "parameters": [ { - "description": "College basketball standings slug", + "description": "Search term", "in": "query", - "name": "slug", + "name": "q", "required": true, "type": "string", - "x-example": "college-basketball/college-basketball-standings" + "x-example": "hello" }, { - "description": "A live-offered starting year; selects its conference list", - "enum": [ - 2026, - 2025, - 2024, - 2023, - 2022, - 2021, - 2020, - 2019, - 2018, - 2017, - 2016, - 2015, - 2014, - 2013 - ], + "description": "Search offset", "in": "query", - "name": "season", + "name": "offset", "type": "integer", - "x-example": 2025 + "x-example": 0 + }, + { + "description": "Playlist result limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 30 + }, + { + "description": "Top result limit, clamped to 1-50", + "in": "query", + "name": "number_of_top_results", + "type": "integer", + "x-example": 20 + }, + { + "description": "Include audiobook context where available", + "in": "query", + "name": "include_audiobooks", + "type": "boolean", + "x-example": true + }, + { + "description": "Include pre-release results", + "in": "query", + "name": "include_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include album pre-release results", + "in": "query", + "name": "include_album_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include authors", + "in": "query", + "name": "include_authors", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -479054,17 +494614,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaStandingsOptionsResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479075,24 +494641,26 @@ "ApiKeyAuth": [] } ], - "summary": "Discover Sportskeeda college standings seasons and conferences", + "summary": "Search Spotify playlists", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/taxonomy-search": { + "/spotify/popular-by-country": { "get": { - "description": "Calls Sportskeeda's anonymous frontend taxonomy search across categories, events, teams, players, wiki pages, and wiki tags. The upstream UI always searches all six types; the q phrase is sanitized and capped at 100 characters just like the site.", - "operationId": "sportskeeda-taxonomy-search", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify country hub shelves. The country_code parameter accepts Spotify popular-in country codes from open.spotify.com/popular-in/us.", + "operationId": "spotify-popular-by-country", "parameters": [ { - "description": "Search phrase; punctuation is replaced with spaces and the result is capped at 100 characters", + "description": "Two-letter Spotify popular-in country code", "in": "query", - "name": "q", - "required": true, + "name": "country_code", "type": "string", - "x-example": "nfl draft" + "x-example": "us" } ], "produces": [ @@ -479102,17 +494670,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTaxonomySearchResponseDoc" + "$ref": "#/definitions/spotify.countryHubResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479123,24 +494697,61 @@ "ApiKeyAuth": [] } ], - "summary": "Search Sportskeeda categories and entities", + "summary": "Retrieve Spotify popular by country", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/topic": { + "/spotify/profile": { "get": { - "description": "Returns ordered prose, headings, lists, tables, images and embeds from a public topic, event, team or player overview page, plus available byline, modification text and related stories. Discover slugs with /sportskeeda/sitemap-items using tags.xml, tournaments.xml, teams.xml, players.xml or us-sitemap.xml. Pages without a CMS body return an upstream error.", - "operationId": "sportskeeda-topic", + "consumes": [ + "application/json" + ], + "description": "Returns public Spotify profile metadata and preview playlists. Provide username, uri, or url; defaults to Spotify's official profile.", + "operationId": "spotify-profile", "parameters": [ { - "description": "Canonical Sportskeeda topic, event, team or player path without host", + "description": "Spotify username", "in": "query", - "name": "slug", - "required": true, + "name": "username", "type": "string", - "x-example": "football/jurgen-klopp" + "x-example": "spotify" + }, + { + "description": "Spotify user URI", + "in": "query", + "name": "uri", + "type": "string", + "x-example": "spotify:user:spotify" + }, + { + "description": "open.spotify.com user URL", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://open.spotify.com/user/spotify" + }, + { + "description": "Embedded public playlist limit, clamped to 0-50", + "in": "query", + "name": "playlist_limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recently played artist limit, clamped to 0-50", + "in": "query", + "name": "artist_limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Embedded episode limit, clamped to 0-50", + "in": "query", + "name": "episode_limit", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -479150,23 +494761,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTopicResponseDoc" + "$ref": "#/definitions/spotify.userProfileResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479177,79 +494788,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda topic or entity overview's full content", + "summary": "Retrieve Spotify public profile", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/trade-values": { + "/spotify/profile/followers": { "get": { - "description": "Reads the same anonymous JSON asset as the public chart. Returns source update time, ranks, values, and linked player slugs. The All position includes all source rows, including positions not displayed as chart sections. Discover current chart and filter choices with page-options.", - "operationId": "sportskeeda-trade-values", + "consumes": [ + "application/json" + ], + "description": "Returns public Spotify follower profiles. Spotify exposes this publicly for some profiles; private or restricted profiles may return an upstream error.", + "operationId": "spotify-profile-followers", "parameters": [ { - "description": "Chart path without host", - "enum": [ - "nfl/fantasy-football-trade-value-charts", - "nfl/dynasty-trade-value-charts" - ], + "description": "Spotify username", "in": "query", - "name": "slug", - "required": true, + "name": "username", "type": "string", - "x-example": "nfl/fantasy-football-trade-value-charts" - }, - { - "default": "All", - "description": "Displayed position section; defaults to All", - "enum": [ - "All", - "QB", - "RB", - "WR", - "TE" - ], - "in": "query", - "name": "position", - "type": "string" + "x-example": "spotify" }, { - "default": "ppr", - "description": "Scoring system; defaults to ppr", - "enum": [ - "ppr", - "non_ppr", - "0.5_ppr" - ], + "description": "Spotify user URI", "in": "query", - "name": "scoring", - "type": "string" + "name": "uri", + "type": "string", + "x-example": "spotify:user:spotify" }, { - "default": false, - "description": "Use superflex chart; defaults to false", + "description": "open.spotify.com user URL", "in": "query", - "name": "superflex", - "type": "boolean" + "name": "url", + "type": "string", + "x-example": "https://open.spotify.com/user/spotify" }, { - "default": 0, - "description": "Zero-based player offset", + "description": "Follower offset applied locally", "in": "query", - "maximum": 1000000, - "minimum": 0, "name": "offset", - "type": "integer" + "type": "integer", + "x-example": 0 }, { - "default": 100, - "description": "Page size from 1 to 500", + "description": "Follower limit, clamped to 1-200", "in": "query", - "maximum": 500, - "minimum": 1, "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -479259,23 +494845,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTradeValuesResponseDoc" + "$ref": "#/definitions/spotify.userProfileFollowersResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479286,142 +494872,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get NFL redraft or dynasty trade values", + "summary": "Retrieve Spotify public profile followers", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/transactions": { + "/spotify/profile/playlists": { "get": { - "description": "Reads the first-party public transaction feed in month-sized windows, avoiding its 10000-row broad-range cap. Discover accepted seasons, months, and team slugs with sportskeeda-transactions-options.", - "operationId": "sportskeeda-transactions", + "consumes": [ + "application/json" + ], + "description": "Returns public Spotify playlists. Provide username, uri, or url; defaults to Spotify's official profile.", + "operationId": "spotify-profile-playlists", "parameters": [ { - "description": "Host-free page slug; nfl/transactions or an NFL team transactions slug", + "description": "Spotify username", "in": "query", - "name": "slug", + "name": "username", "type": "string", - "x-example": "nfl/dallas-cowboys/transactions" + "x-example": "spotify" }, { - "description": "Season start year; current live choices: 2020,2021,2022,2023,2024,2025,2026; defaults to current", - "enum": [ - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026 - ], + "description": "Spotify user URI", "in": "query", - "name": "season", - "type": "integer" + "name": "uri", + "type": "string", + "x-example": "spotify:user:spotify" }, { - "description": "MMYYYY month code from transactions-options for the selected season; current live union is listed here", - "enum": [ - "022020", - "032020", - "042020", - "052020", - "062020", - "072020", - "082020", - "092020", - "102020", - "112020", - "122020", - "012021", - "022021", - "032021", - "042021", - "052021", - "062021", - "072021", - "082021", - "092021", - "102021", - "112021", - "122021", - "012022", - "022022", - "032022", - "042022", - "052022", - "062022", - "072022", - "082022", - "092022", - "102022", - "112022", - "122022", - "012023", - "022023", - "032023", - "042023", - "052023", - "062023", - "072023", - "082023", - "092023", - "102023", - "112023", - "122023", - "012024", - "022024", - "032024", - "042024", - "052024", - "062024", - "072024", - "082024", - "092024", - "102024", - "112024", - "122024", - "012025", - "022025", - "032025", - "042025", - "052025", - "062025", - "072025", - "082025", - "092025", - "102025", - "112025", - "122025", - "012026", - "022026", - "032026", - "042026", - "052026", - "062026", - "072026", - "082026", - "092026" - ], + "description": "open.spotify.com user URL", "in": "query", - "name": "month", - "required": true, + "name": "url", "type": "string", - "x-example": "092026" + "x-example": "https://open.spotify.com/user/spotify" }, { - "description": "Page number, 1-1000; default 1", + "description": "Playlist offset", "in": "query", - "name": "page", + "name": "offset", "type": "integer", - "x-example": 1 + "x-example": 0 }, { - "description": "Records per page, 1-500; default 100", + "description": "Playlist limit, clamped to 1-50", "in": "query", - "name": "per_page", + "name": "limit", "type": "integer", - "x-example": 100 + "x-example": 20 } ], "produces": [ @@ -479431,23 +494929,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTransactionsResponseDoc" + "$ref": "#/definitions/spotify.userProfilePlaylistsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479458,79 +494956,83 @@ "ApiKeyAuth": [] } ], - "summary": "Get complete monthly NFL league or team transactions", + "summary": "Retrieve Spotify public profile playlists", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/transactions-options": { + "/spotify/profiles/search": { "get": { - "description": "Discovers the complete live NFL transaction season list, months for the selected season, and all team transaction page slugs. Use these values with sportskeeda-transactions.", - "operationId": "sportskeeda-transactions-options", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify profile search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", + "operationId": "spotify-profiles-search", "parameters": [ { - "description": "Season start year; current live choices: 2020,2021,2022,2023,2024,2025,2026; defaults to current", - "enum": [ - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026 - ], + "description": "Search term", "in": "query", - "name": "season", - "type": "integer" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sportskeedaTransactionsOptionsResponseDoc" - } + "name": "q", + "required": true, + "type": "string", + "x-example": "hello" }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Search offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Profile result limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 30 + }, + { + "description": "Top result limit, clamped to 1-50", + "in": "query", + "name": "number_of_top_results", + "type": "integer", + "x-example": 20 + }, + { + "description": "Include audiobook context where available", + "in": "query", + "name": "include_audiobooks", + "type": "boolean", + "x-example": true + }, + { + "description": "Include pre-release results", + "in": "query", + "name": "include_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include album pre-release results", + "in": "query", + "name": "include_album_pre_releases", + "type": "boolean", + "x-example": false }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "List NFL transaction seasons, months and team slugs", - "tags": [ - "Sportskeeda" - ] - } - }, - "/sportskeeda/video": { - "get": { - "description": "Returns metadata for one Sportskeeda video page by host-free `slug`, such as `cricket/sunil-naraine-batting-cpl`: its id, title, poster image, stream URL and, when available, a description. A page without a video player returns an upstream error, and stream availability can depend on geography.", - "operationId": "sportskeeda-video", - "parameters": [ + "description": "Include authors", + "in": "query", + "name": "include_authors", + "type": "boolean", + "x-example": false + }, { - "description": "Individual Sportskeeda video page path without host", + "description": "Include Spotify episode content ratings v2", "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "cricket/sunil-naraine-batting-cpl" + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -479540,23 +495042,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaVideoResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479567,24 +495069,97 @@ "ApiKeyAuth": [] } ], - "summary": "Get Sportskeeda video metadata", + "summary": "Search Spotify profiles", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/videos": { + "/spotify/search": { "get": { - "description": "Lists video cards from Sportskeeda's main video library, or from a listing given by `slug` (default `videos`, for example `go/epl/videos`). Items have a title, slug, URL, and thumbnail, duration and channel when present. The response also lists channels with their slugs. An empty or blocked listing returns an upstream error.", - "operationId": "sportskeeda-videos", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify catalog search results across tracks, artists, albums, playlists, shows, episodes, audiobooks, and top results. Caller-supplied Spotify bearer or client tokens are not required.", + "operationId": "spotify-search", "parameters": [ { - "default": "videos", - "description": "Video listing path without host; defaults to videos", + "description": "Search term", "in": "query", - "name": "slug", + "name": "q", + "required": true, "type": "string", - "x-example": "go/epl/videos" + "x-example": "hello" + }, + { + "description": "Search offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Result limit per section, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Top result limit, clamped to 1-50", + "in": "query", + "name": "number_of_top_results", + "type": "integer", + "x-example": 5 + }, + { + "description": "Include audiobook results", + "in": "query", + "name": "include_audiobooks", + "type": "boolean", + "x-example": true + }, + { + "description": "Include artist concert availability fields", + "in": "query", + "name": "include_artist_has_concerts_field", + "type": "boolean", + "x-example": false + }, + { + "description": "Include pre-release results", + "in": "query", + "name": "include_pre_releases", + "type": "boolean", + "x-example": true + }, + { + "description": "Include album pre-release results", + "in": "query", + "name": "include_album_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include authors", + "in": "query", + "name": "include_authors", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false + }, + { + "description": "Treat the search term as a prefix", + "in": "query", + "name": "is_prefix", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -479594,23 +495169,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaVideosResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479621,64 +495196,47 @@ "ApiKeyAuth": [] } ], - "summary": "List Sportskeeda videos and channels", + "summary": "Search Spotify catalog", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/wiki-activity": { + "/spotify/section": { "get": { - "description": "Returns the public accepted activity history for one Wiki article, with bounded pagination and the page's live sort fields. The source page slug is obtained from sportskeeda-wiki-pages.", - "operationId": "sportskeeda-wiki-activity", + "consumes": [ + "application/json" + ], + "description": "Returns the items of one Spotify browse section for `uri` (default `spotify:section:0JQ5IMCbQBLqNPkcmYxQPQ`), with its title, subtitle and `totalCount`. Each item has a type, title, subtitle, images and Spotify URL. `offset` defaults to 0; `limit` runs 1 to 50 and defaults to 20.", + "operationId": "spotify-section", "parameters": [ { - "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", + "description": "Spotify section URI", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "minecraft-wiki/achievements" + "x-example": "spotify:section:0JQ5IMCbQBLqNPkcmYxQPQ" }, { - "default": 1, - "description": "1-based page", + "description": "Section item offset", "in": "query", - "maximum": 10000, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "offset", + "type": "integer", + "x-example": 0 }, { - "default": 50, - "description": "Activity items per page", + "description": "Section item limit, clamped to 1-50", "in": "query", - "maximum": 100, - "minimum": 1, "name": "limit", - "type": "integer" - }, - { - "default": "desc", - "description": "Sort direction", - "enum": [ - "asc", - "desc" - ], - "in": "query", - "name": "sort", - "type": "string" + "type": "integer", + "x-example": 20 }, { - "default": "updated_at", - "description": "Activity sort field", - "enum": [ - "author_name", - "updated_at" - ], + "description": "Include Spotify episode content ratings v2", "in": "query", - "name": "sort_by", - "type": "string" + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -479688,29 +495246,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiActivityResponseDoc" + "$ref": "#/definitions/spotify.browseSectionResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479721,24 +495273,41 @@ "ApiKeyAuth": [] } ], - "summary": "List accepted edits for a Sportskeeda Wiki page", + "summary": "Retrieve Spotify browse section", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/wiki-article": { + "/spotify/shows/search": { "get": { - "description": "Returns the rendered article title, metadata, and body paragraphs. Pass the path_slug returned by sportskeeda-wiki-pages; URL and host input are not accepted.", - "operationId": "sportskeeda-wiki-article", + "consumes": [ + "application/json" + ], + "description": "Searches Spotify podcast shows for the search term `q`, paged with `offset` (default 0) and `limit` (1 to 50). Each show has its title, URI, publisher, description, images and Spotify URL. Show matches appear under both `results` and `shows`. A missing `q` returns 400.", + "operationId": "spotify-shows-search", "parameters": [ { - "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", + "description": "Search term", "in": "query", - "name": "slug", + "name": "q", "required": true, "type": "string", - "x-example": "minecraft-wiki/achievements" + "x-example": "hello" + }, + { + "description": "Search offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Result limit, clamped to 1-50", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -479748,7 +495317,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiArticleResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { @@ -479757,14 +495326,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -479781,34 +495344,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sportskeeda Wiki article", + "summary": "Search Spotify shows", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/wiki-categories": { + "/spotify/track": { "get": { - "description": "Returns the nested category menu of one Sportskeeda Wiki project, chosen by `wiki` (`minecraft`, `terraria`, `naruto`, `tiktok`, `youtube`, `gta`, `one-piece` or `sk-communities`). Each category has a title, slug, `path_slug`, taxonomy id, sequence and `children`. Category names, ids and paths change over time.", - "operationId": "sportskeeda-wiki-categories", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify track metadata. Provide either uri or id; defaults to a known public track when omitted.", + "operationId": "spotify-track", "parameters": [ { - "description": "Project slug returned by sportskeeda-wiki-options", - "enum": [ - "minecraft", - "terraria", - "naruto", - "tiktok", - "youtube", - "gta", - "one-piece", - "sk-communities" - ], + "description": "Spotify track URI or open.spotify.com track URL", "in": "query", - "name": "wiki", - "required": true, + "name": "uri", "type": "string", - "x-example": "minecraft" + "x-example": "spotify:track:4vGg44GdCw3X8i8r01XJH0" + }, + { + "description": "Spotify track ID. Used when uri is omitted", + "in": "query", + "name": "id", + "type": "string", + "x-example": "4vGg44GdCw3X8i8r01XJH0" } ], "produces": [ @@ -479818,29 +495380,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiCategoriesResponseDoc" + "$ref": "#/definitions/spotify.trackResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479851,65 +495407,40 @@ "ApiKeyAuth": [] } ], - "summary": "List Sportskeeda Wiki categories", + "summary": "Retrieve Spotify track details", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/wiki-contributors": { + "/spotify/track/recommended": { "get": { - "description": "Returns public accepted contributors for one Wiki article. The source page slug is obtained from sportskeeda-wiki-pages; user IP and private account fields are never returned.", - "operationId": "sportskeeda-wiki-contributors", + "consumes": [ + "application/json" + ], + "description": "Returns Spotify's recommendations for a track, given its URI, `open.spotify.com` URL or track id. Each recommendation has a type, title, subtitle, description, Spotify URI, external URL and images. `limit` is clamped to 1-50 and defaults to 5.", + "operationId": "spotify-track-recommended", "parameters": [ { - "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", + "description": "Spotify track URI or open.spotify.com track URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "minecraft-wiki/achievements" + "x-example": "spotify:track:4vGg44GdCw3X8i8r01XJH0" }, { - "default": 1, - "description": "1-based page", + "description": "Spotify track ID. Used when uri is omitted", "in": "query", - "maximum": 10000, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "id", + "type": "string", + "x-example": "4vGg44GdCw3X8i8r01XJH0" }, { - "default": 50, - "description": "Contributors per page", + "description": "Recommendation limit, clamped to 1-50", "in": "query", - "maximum": 100, - "minimum": 1, "name": "limit", - "type": "integer" - }, - { - "default": "desc", - "description": "Sort direction", - "enum": [ - "asc", - "desc" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": "contributions", - "description": "Contributor sort field", - "enum": [ - "author_name", - "contributions", - "updated_at" - ], - "in": "query", - "name": "sort_by", - "type": "string" + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -479919,29 +495450,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiContributorsResponseDoc" + "$ref": "#/definitions/spotify.trackRecommendedResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -479952,53 +495477,47 @@ "ApiKeyAuth": [] } ], - "summary": "List contributors to a Sportskeeda Wiki page", + "summary": "Retrieve Spotify recommended tracks", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/wiki-issues": { + "/spotify/track/similar-albums": { "get": { - "description": "Returns public opened or closed issues for one Wiki article. The upstream also returns submitter IP addresses; this endpoint deliberately omits them.", - "operationId": "sportskeeda-wiki-issues", + "consumes": [ + "application/json" + ], + "description": "Lists albums similar to a Spotify track, identified by `uri` or `id`. `limit` runs 1 to 50, default 50, and `albums_only` requests albums-only recommendations. Each album has its title, subtitle, publisher, images and Spotify URL. With neither `uri` nor `id`, a known public track is used.", + "operationId": "spotify-track-similar-albums", "parameters": [ { - "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", + "description": "Spotify track URI or open.spotify.com track URL", "in": "query", - "name": "slug", - "required": true, + "name": "uri", "type": "string", - "x-example": "minecraft-wiki/achievements" + "x-example": "spotify:track:4vGg44GdCw3X8i8r01XJH0" }, { - "default": 1, - "description": "1-based page", + "description": "Spotify track ID. Used when uri is omitted", "in": "query", - "maximum": 10000, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "id", + "type": "string", + "x-example": "4vGg44GdCw3X8i8r01XJH0" }, { - "default": 10, - "description": "Issues per page", + "description": "Album limit, clamped to 1-50", "in": "query", - "maximum": 100, - "minimum": 1, "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 50 }, { - "default": "opened", - "description": "Issue status", - "enum": [ - "opened", - "closed" - ], + "description": "Request albums-only recommendations", "in": "query", - "name": "status", - "type": "string" + "name": "albums_only", + "type": "boolean", + "x-example": true } ], "produces": [ @@ -480008,29 +495527,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiIssuesResponseDoc" + "$ref": "#/definitions/spotify.trackSimilarAlbumsResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -480041,121 +495554,83 @@ "ApiKeyAuth": [] } ], - "summary": "List reported issues for a Sportskeeda Wiki page", + "summary": "Retrieve Spotify track similar albums", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/wiki-options": { + "/spotify/tracks/search": { "get": { - "description": "Lists the Sportskeeda Wiki projects, each with a `slug`, display `name`, `taxonomy_id` and `taxonomy_slug`. Current slugs are `minecraft`, `terraria`, `naruto`, `tiktok`, `youtube`, `gta`, `one-piece` and `sk-communities`. Use a `slug` with `wiki-categories` and `wiki-pages`. Takes no parameters.", - "operationId": "sportskeeda-wiki-options", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiOptionsResponseDoc" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List Sportskeeda Wiki projects", - "tags": [ - "Sportskeeda" - ] - } - }, - "/sportskeeda/wiki-pages": { - "get": { - "description": "Returns catalog pages for one Wiki project. Use path_slug as the preferred host-free slug for sportskeeda-wiki-article. total_items is the record count; the upstream field named total_pages is mislabelled and does not mean page count.", - "operationId": "sportskeeda-wiki-pages", + "description": "Returns Spotify track search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", + "operationId": "spotify-tracks-search", "parameters": [ { - "description": "Project slug returned by sportskeeda-wiki-options", - "enum": [ - "minecraft", - "terraria", - "naruto", - "tiktok", - "youtube", - "gta", - "one-piece", - "sk-communities" - ], + "description": "Search term", "in": "query", - "name": "wiki", + "name": "q", "required": true, "type": "string", - "x-example": "minecraft" + "x-example": "hello" }, { - "default": 1, - "description": "1-based catalog page", + "description": "Search offset", "in": "query", - "maximum": 10000, - "minimum": 1, - "name": "page", - "type": "integer" + "name": "offset", + "type": "integer", + "x-example": 0 }, { - "default": 10, - "description": "Items per page", + "description": "Track result limit, clamped to 1-50", "in": "query", - "maximum": 100, - "minimum": 1, "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 20 }, { - "default": "DESC", - "description": "Sort direction", - "enum": [ - "ASC", - "DESC" - ], + "description": "Top result limit, clamped to 1-50", "in": "query", - "name": "sort", - "type": "string" + "name": "number_of_top_results", + "type": "integer", + "x-example": 20 }, { - "default": "last_updated", - "description": "Catalog field to sort by", - "enum": [ - "last_updated", - "page_size", - "ratings", - "issues_count" - ], + "description": "Include audiobook context where available", "in": "query", - "name": "sort_by", - "type": "string" + "name": "include_audiobooks", + "type": "boolean", + "x-example": true }, { - "description": "Title or page search text; sent upstream as searchText", + "description": "Include pre-release results", "in": "query", - "maxLength": 100, - "name": "search", - "type": "string" + "name": "include_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include album pre-release results", + "in": "query", + "name": "include_album_pre_releases", + "type": "boolean", + "x-example": false + }, + { + "description": "Include authors", + "in": "query", + "name": "include_authors", + "type": "boolean", + "x-example": false + }, + { + "description": "Include Spotify episode content ratings v2", + "in": "query", + "name": "include_episode_content_ratings_v2", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -480165,29 +495640,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiPagesResponseDoc" + "$ref": "#/definitions/spotify.searchCatalogResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Missing or invalid parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Spotify upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -480198,24 +495667,24 @@ "ApiKeyAuth": [] } ], - "summary": "Search and paginate Sportskeeda Wiki pages", + "summary": "Search Spotify tracks", "tags": [ - "Sportskeeda" + "Spotify" ] } }, - "/sportskeeda/wiki-summary": { + "/standard/article": { "get": { - "description": "Returns accepted contributor and activity totals plus the open-issue count for one Wiki article. The source page slug is obtained from sportskeeda-wiki-pages.", - "operationId": "sportskeeda-wiki-summary", + "description": "Returns one Evening Standard article by its canonical `standard.co.uk` article `url`. The response has the title, description, publish and update times, section, authors, lead image, body `paragraphs` and a `paywalled` flag.", + "operationId": "standard-article", "parameters": [ { - "description": "Host-free Wiki page path_slug from sportskeeda-wiki-pages", + "description": "Canonical Evening Standard article URL", "in": "query", - "name": "slug", + "name": "url", "required": true, "type": "string", - "x-example": "minecraft-wiki/achievements" + "x-example": "https://www.standard.co.uk/news/politics/example-story-b1234567.html" } ], "produces": [ @@ -480225,7 +495694,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sportskeedaWikiSummaryResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -480240,12 +495709,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -480258,61 +495721,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get community counts for a Sportskeeda Wiki page", + "summary": "Get Evening Standard article content", "tags": [ - "Sportskeeda" + "Evening Standard" ] } }, - "/spotify-podcasts/categories": { + "/standard/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the Spotify podcast categories page as sections of items such as Arts, for `uri` (default `spotify:page:0JQ5DArNBzkmxXHCqFLx2U`). Each section has a title, `totalCount` and items with title, image and Spotify URL. `page_limit` and `section_limit` default to 10 and run 1 to 50; the offsets default to 0.", - "operationId": "spotify-podcasts-categories", + "description": "Returns an Evening Standard author profile, found by `slug` (for example `nicholas-cecil`) or by a canonical `url`; send exactly one of the two. The response has the name, job title, bio, X/Twitter link and the author's recent articles with their section. It is one page, with no further pagination.", + "operationId": "standard-author", "parameters": [ { - "description": "Spotify podcast categories page URI", + "description": "Author slug, e.g. nicholas-cecil", "in": "query", - "name": "uri", + "name": "slug", "type": "string", - "x-example": "spotify:page:0JQ5DArNBzkmxXHCqFLx2U" - }, - { - "description": "Page pagination offset", - "in": "query", - "name": "page_offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Page pagination limit, clamped to 1-50", - "in": "query", - "name": "page_limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Section pagination offset", - "in": "query", - "name": "section_offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Section pagination limit, clamped to 1-50", - "in": "query", - "name": "section_limit", - "type": "integer", - "x-example": 10 + "x-example": "nicholas-cecil" }, { - "description": "Include Spotify episode content ratings v2", + "description": "Canonical standard.co.uk/author/ URL; alternative to slug", "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "url", + "type": "string", + "x-example": "https://www.standard.co.uk/author/nicholas-cecil" } ], "produces": [ @@ -480322,23 +495754,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.browsePageResponseDoc" + "$ref": "#/definitions/publicnews.standardAuthorResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -480349,90 +495781,79 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify Podcasts categories", + "summary": "Get an Evening Standard author profile", "tags": [ - "SpotifyPodcasts" + "Evening Standard" ] } }, - "/spotify-podcasts/charts": { + "/standard/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Spotify podcast chart rankings from podcastcharts.byspotify.com. The chart and region parameters are validated against Spotify's supported podcast chart slugs and countries. Category charts are available only in au, br, de, gb, mx, se, and us.", - "operationId": "spotify-podcasts-charts", + "description": "Returns the latest Evening Standard headlines for one section. `section` is required and takes a slug such as `news/london`, `news/politics`, `sport/football`, `business/markets`, `culture/theatre` or `homesandproperty/renting`. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "standard-headlines", "parameters": [ { - "description": "Chart slug. Allowed: top-podcasts, top-episodes, trending, arts, business, comedy, education, fiction, health-fitness, history, leisure, music, news, religion-spirituality, science, society-culture, sports, technology, true-crime, tv-film", + "description": "Evening Standard RSS section slug", "enum": [ - "top-podcasts", - "top-episodes", - "trending", - "arts", - "business", - "comedy", - "education", - "fiction", - "health-fitness", - "history", - "leisure", - "music", "news", - "religion-spirituality", - "science", - "society-culture", - "sports", - "technology", - "true-crime", - "tv-film" - ], - "in": "query", - "name": "chart", - "type": "string", - "x-example": "religion-spirituality" - }, - { - "description": "Two-letter region code. Allowed: ar, au, at, br, ca, cl, co, dk, fi, fr, de, in, id, ie, it, jp, mx, nz, no, ph, pl, es, se, nl, gb, us", - "enum": [ - "ar", - "au", - "at", - "br", - "ca", - "cl", - "co", - "dk", - "fi", - "fr", - "de", - "in", - "id", - "ie", - "it", - "jp", - "mx", - "nz", - "no", - "ph", - "pl", - "es", - "se", - "nl", - "gb", - "us" + "news/london", + "news/politics", + "news/transport", + "news/crime", + "news/world", + "news/education", + "news/health", + "news/tech", + "sport", + "sport/football", + "sport/rugby", + "sport/cricket", + "sport/boxing", + "sport/formula-one", + "sport/tennis", + "business", + "business/business-news", + "business/markets", + "business/economy", + "business/technology-media", + "business/leisure-retail", + "business/money", + "business/property", + "lifestyle", + "lifestyle/fashion", + "lifestyle/beauty", + "lifestyle/travel", + "lifestyle/wellness", + "lifestyle/dating", + "culture", + "culture/theatre", + "culture/film", + "culture/tvfilm", + "culture/music", + "culture/books", + "going-out", + "going-out/restaurants", + "going-out/foodanddrink", + "going-out/bars", + "going-out/attractions", + "going-out/events", + "homesandproperty", + "homesandproperty/property-news", + "homesandproperty/buying-mortgages", + "homesandproperty/renting", + "homesandproperty/where-to-live", + "homesandproperty/interiors", + "homesandproperty/gardening", + "comment", + "comment/podcasts", + "showbiz", + "showbiz/celebrity-news" ], "in": "query", - "name": "region", + "name": "section", + "required": true, "type": "string", - "x-example": "us" - }, - { - "description": "Result limit, clamped to 1-100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 100 + "x-example": "news" } ], "produces": [ @@ -480442,23 +495863,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.chartsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -480469,35 +495884,16 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify podcast charts", + "summary": "Get Evening Standard section headlines", "tags": [ - "SpotifyPodcasts" + "Evening Standard" ] } }, - "/spotify-podcasts/episode": { + "/standard/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns public episode metadata. Provide either uri or id; defaults to a known public episode when omitted.", - "operationId": "spotify-podcasts-episode", - "parameters": [ - { - "description": "Spotify episode URI or open.spotify.com episode URL", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:episode:2C2Y5kNq7qCVOVhbA0G3os" - }, - { - "description": "Spotify episode ID. Used when uri is omitted", - "in": "query", - "name": "id", - "type": "string", - "x-example": "2C2Y5kNq7qCVOVhbA0G3os" - } - ], + "description": "Returns the current Evening Standard top stories. Each item has its title, URL, summary, publication time, author and image. Takes no parameters; use `standard-headlines` for a single section.", + "operationId": "standard-news", "produces": [ "application/json" ], @@ -480505,23 +495901,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.episodeResponseDoc" - } - }, - "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -480532,63 +495922,16 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify podcast episode details", + "summary": "Get Evening Standard top stories", "tags": [ - "SpotifyPodcasts" + "Evening Standard" ] } }, - "/spotify-podcasts/home": { + "/standard/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the Spotify podcasts home page as sections of items, for `uri` (default `spotify:genre:podcasts-web`). Each section has a title and items with type, title, publisher, images and Spotify URL. `page_limit` and `section_limit` default to 10 and run 1 to 50; the offsets default to 0.", - "operationId": "spotify-podcasts-home", - "parameters": [ - { - "description": "Spotify page or genre URI", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:genre:podcasts-web" - }, - { - "description": "Page pagination offset", - "in": "query", - "name": "page_offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Page pagination limit, clamped to 1-50", - "in": "query", - "name": "page_limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Section pagination offset", - "in": "query", - "name": "section_offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Section pagination limit, clamped to 1-50", - "in": "query", - "name": "section_limit", - "type": "integer", - "x-example": 10 - }, - { - "description": "Include Spotify episode content ratings v2", - "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false - } - ], + "description": "Lists the Evening Standard sections accepted by `standard-headlines`, as parent and child slugs such as `news`, `news/london`, `sport/rugby`, `going-out/restaurants` and `homesandproperty/gardening`. Each entry has the `slug`, display `name` and feed `url`.", + "operationId": "standard-sections", "produces": [ "application/json" ], @@ -480596,25 +495939,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.browsePageResponseDoc" - } - }, - "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Spotify upstream request failed", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -480623,83 +495948,37 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify Podcasts home", + "summary": "Get Evening Standard RSS sections", "tags": [ - "SpotifyPodcasts" + "Evening Standard" ] } }, - "/spotify-podcasts/search": { + "/starbucks/menu": { "get": { "consumes": [ - "application/json" - ], - "description": "Searches Spotify podcasts for `q`, returning matching `shows`, `episodes` and `topResults`, with counts in `meta`. `limit` and `number_of_top_results` run 1 to 50. Optional flags (`include_pre_releases`, `include_audiobooks`, `include_authors`) widen the results. Episodes carry duration and release date; shows carry publisher.", - "operationId": "spotify-podcasts-search", - "parameters": [ - { - "description": "Podcast search term", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "chatgpt" - }, - { - "description": "Search offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Result limit, clamped to 1-50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 30 - }, - { - "description": "Top result limit, clamped to 1-50", - "in": "query", - "name": "number_of_top_results", - "type": "integer", - "x-example": 20 - }, - { - "description": "Include pre-release results", - "in": "query", - "name": "include_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include album pre-release results", - "in": "query", - "name": "include_album_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include audiobooks", - "in": "query", - "name": "include_audiobooks", - "type": "boolean", - "x-example": true - }, + "application/json" + ], + "description": "Returns Starbucks' full menu as a category tree: top-level categories, their child categories, and every product with its product number, form, product type, sizes, default size, availability, and image. Pair a product's product_number and form with /starbucks/product to fetch full detail including nutrition. store_number optionally scopes the menu to one store, using a store number from /starbucks/stores; a store-scoped menu marks items that store does not carry with availability NotAvailableHere, while the unscoped menu reports everything as Available. market selects which country catalog to return, one of us or ca, defaulting to us; the two differ substantially (roughly 282 US products vs 253 CA, with exclusives on both sides). Only these two markets are available.", + "operationId": "starbucks-menu", + "parameters": [ { - "description": "Include authors", + "description": "Starbucks store number to scope availability to, e.g. 101-54", "in": "query", - "name": "include_authors", - "type": "boolean", - "x-example": false + "name": "store_number", + "type": "string", + "x-example": "101-54" }, { - "description": "Include Spotify episode content ratings v2", + "description": "Starbucks country site to read. One of: us, ca. Defaults to us", + "enum": [ + "us", + "ca" + ], "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "market", + "type": "string", + "x-example": "us" } ], "produces": [ @@ -480709,23 +495988,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchResponseDoc" + "$ref": "#/definitions/starbucks.menuResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -480736,40 +496015,46 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify Podcasts", + "summary": "Browse the full Starbucks menu", "tags": [ - "SpotifyPodcasts" + "Starbucks" ] } }, - "/spotify-podcasts/show": { + "/starbucks/nearest-store": { "get": { "consumes": [ "application/json" ], - "description": "Returns metadata for one Spotify podcast show by `uri` (default `spotify:show:1QQJ7FElLE0K6CIfZNCxU4`): name, publisher, description, media type, explicit flag, `totalEpisodes`, cover images and Spotify URL. The two `include_` flags request extra content capability and content rating fields when Spotify supplies them.", - "operationId": "spotify-podcasts-show", + "description": "Returns the coordinates and distance of the single closest Starbucks store to a point. Both lat and lng are required. This endpoint returns coordinates only, not store details: it is what Starbucks' own store locator uses to centre its map. Use /starbucks/stores for full store records. A point with no nearby store returns a well-formed result with found set to false rather than an error. market selects which Starbucks country site answers, one of us or ca, defaulting to us.", + "operationId": "starbucks-nearest-store", "parameters": [ { - "description": "Spotify show URI", + "description": "Latitude", "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:show:1QQJ7FElLE0K6CIfZNCxU4" + "name": "lat", + "required": true, + "type": "number", + "x-example": 47.6062 }, { - "description": "Include content capability trait", + "description": "Longitude", "in": "query", - "name": "include_content_capability_trait", - "type": "boolean", - "x-example": false + "name": "lng", + "required": true, + "type": "number", + "x-example": -122.3321 }, { - "description": "Include Spotify episode content ratings v2", + "description": "Starbucks country site to read. One of: us, ca. Defaults to us", + "enum": [ + "us", + "ca" + ], "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "market", + "type": "string", + "x-example": "us" } ], "produces": [ @@ -480779,23 +496064,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.showResponseDoc" + "$ref": "#/definitions/starbucks.nearestStoreResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -480806,47 +496091,61 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify podcast show metadata", + "summary": "Locate the closest Starbucks to a coordinate", "tags": [ - "SpotifyPodcasts" + "Starbucks" ] } }, - "/spotify-podcasts/show/episodes": { + "/starbucks/product/{product_number}/{form}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the episodes of a Spotify podcast by show URI, with `offset` and `limit` (1-50). Each episode has its name, description, release date, duration in milliseconds, explicit and playable flags, Spotify URI, external URL and images; `total` gives the show's episode count.", - "operationId": "spotify-podcasts-show-episodes", + "description": "Returns one Starbucks product's full detail: name, description, product type, image, Rewards star cost, customization options, and every size with its own nutrition panel (serving size, calories, calories from fat, and per-fact values for total fat with saturated and trans fat subfacts, cholesterol, sodium, total carbohydrates, protein, and caffeine). product_number is the numeric id from a /starbucks/menu result or a product page URL. form is that product's form; allowed values are hot, iced, single, packaged, whole-bean, and via. store_number optionally scopes availability to one store. Starbucks does not expose dollar pricing on this surface, so no price is returned; star_cost is the Rewards star cost. market selects which country catalog to resolve against, one of us or ca, defaulting to us. Each size also carries its default_recipe, the standard build, which is the required starting point for the /starbucks/product/{product_number}/{form}/nutrition endpoint. An unknown product number, or a form that product is not sold in, returns not found.", + "operationId": "starbucks-product", "parameters": [ { - "description": "Spotify show URI", - "in": "query", - "name": "uri", + "description": "Starbucks numeric product id", + "in": "path", + "name": "product_number", + "required": true, "type": "string", - "x-example": "spotify:show:1QQJ7FElLE0K6CIfZNCxU4" + "x-example": "2123774" }, { - "description": "Episode offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "description": "Product form. One of: hot, iced, single, packaged, whole-bean, via", + "enum": [ + "hot", + "iced", + "single", + "packaged", + "whole-bean", + "via" + ], + "in": "path", + "name": "form", + "required": true, + "type": "string", + "x-example": "iced" }, { - "description": "Episode limit, clamped to 1-50", + "description": "Starbucks store number to scope availability to, e.g. 101-54", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "store_number", + "type": "string", + "x-example": "101-54" }, { - "description": "Include Spotify episode content ratings v2", + "description": "Starbucks country site to read. One of: us, ca. Defaults to us", + "enum": [ + "us", + "ca" + ], "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "market", + "type": "string", + "x-example": "us" } ], "produces": [ @@ -480856,23 +496155,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.showEpisodesResponseDoc" + "$ref": "#/definitions/starbucks.productResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -480883,26 +496188,47 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify podcast show episodes", + "summary": "Get one Starbucks product with nutrition", "tags": [ - "SpotifyPodcasts" + "Starbucks" ] } }, - "/spotify-podcasts/show/recommendations": { - "get": { + "/starbucks/product/{product_number}/{form}/nutrition": { + "post": { "consumes": [ "application/json" ], - "description": "Lists shows and episodes that Spotify recommends alongside a podcast show given by `uri`. Each recommendation has a type, title, publisher, description, images and Spotify URL, and `meta.count` gives the number returned. The response echoes the show `uri` it was requested for.", - "operationId": "spotify-podcasts-show-recommendations", + "description": "Recalculates calories, fat, sugars, and protein for a customized build of a Starbucks beverage: swap the milk, change the number of espresso shots or syrup pumps, and get the real figures for that exact drink rather than the standard recipe. Starbucks only offers this for four hot espresso beverages; product_number and form must be one of 406/hot (Caffe Americano), 407/hot (Caffe Latte), 408/hot (Caffe Mocha), or 413/hot (Caramel Macchiato). Any other product returns an invalid-parameter error naming the four that work. size_sku comes from a /starbucks/product result's sizes[].sku. modifiers is the COMPLETE build, not a change-set: start from that size's default_recipe, adjust what you want, and send the whole list back; an empty list is rejected. Each modifier needs a sku, an optional quantity (defaults to 1, and is the dial that matters for countable modifiers like espresso shots), and an optional replaced_sku when substituting a pick-one slot such as the milk. This returns Starbucks' own four-value dynamic-nutrition panel, which is smaller than the full per-size panel /starbucks/product returns for the standard build.", + "operationId": "starbucks-nutrition", "parameters": [ { - "description": "Spotify show URI", - "in": "query", - "name": "uri", + "description": "Starbucks numeric product id. One of: 406, 407, 408, 413", + "in": "path", + "name": "product_number", + "required": true, "type": "string", - "x-example": "spotify:show:1QQJ7FElLE0K6CIfZNCxU4" + "x-example": "406" + }, + { + "description": "Product form. Only hot is supported for this endpoint", + "enum": [ + "hot" + ], + "in": "path", + "name": "form", + "required": true, + "type": "string", + "x-example": "hot" + }, + { + "description": "The size and the complete modifier build", + "in": "body", + "name": "request", + "required": true, + "schema": { + "$ref": "#/definitions/starbucks.NutritionOption" + } } ], "produces": [ @@ -480912,23 +496238,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.showRecommendationsResponseDoc" + "$ref": "#/definitions/starbucks.nutritionResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -480939,47 +496265,51 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify podcast recommendations", + "summary": "Recalculate nutrition for a customized Starbucks drink", "tags": [ - "SpotifyPodcasts" + "Starbucks" ] } }, - "/spotify/album": { + "/starbucks/stores": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Spotify album from `uri` (a Spotify URI or open.spotify.com URL) or `id`: name, album type, artists, release date, copyrights, cover images, total tracks and duration. The `tracks` page is set by `offset` (default 0) and `limit` (1 to 50, default 50). A missing or invalid identifier returns 400.", - "operationId": "spotify-album", + "description": "Returns Starbucks store locations near a point: store number, name, phone, full address, coordinates, weekly opening hours, amenities, and pick-up options. Either place, or both lat and lng, is required. place is free-text (city, address, or postal code) and is geocoded by Starbucks itself, so it works worldwide. market selects which Starbucks country site answers, one of us or ca, defaulting to us; this is not cosmetic even for stores, because the same store reports different operational data depending on the host. There is no filter parameter: Starbucks' own API accepts a features amenity filter but silently ignores it, so it is deliberately not offered here; filter on each store's returned amenities instead. A place Starbucks cannot resolve returns a well-formed empty result with place_not_found set to true rather than an error. The upstream returns at most 50 stores per request and supports no pagination; result_capped is true when that ceiling was reached. Store discovery works worldwide, but hours, amenities, and phone numbers are populated per market and may be absent outside the US and UK.", + "operationId": "starbucks-stores", "parameters": [ { - "description": "Spotify album URI or open.spotify.com album URL", + "description": "Free-text city, address, or postal code, geocoded by Starbucks", "in": "query", - "name": "uri", + "name": "place", "type": "string", - "x-example": "spotify:album:4aawyAB9vmqN3uQ7FjRGTy" + "x-example": "Seattle, WA" }, { - "description": "Spotify album ID", + "description": "Latitude, requires lng", "in": "query", - "name": "id", - "type": "string", - "x-example": "4aawyAB9vmqN3uQ7FjRGTy" + "name": "lat", + "type": "number", + "x-example": 47.6062 }, { - "description": "Track offset", + "description": "Longitude, requires lat", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "lng", + "type": "number", + "x-example": -122.3321 }, { - "description": "Track limit, clamped to 1-50", + "description": "Starbucks country site to read. One of: us, ca. Defaults to us", + "enum": [ + "us", + "ca" + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "market", + "type": "string", + "x-example": "us" } ], "produces": [ @@ -480989,7 +496319,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.albumResponseDoc" + "$ref": "#/definitions/starbucks.storesResponseDoc" } }, "400": { @@ -481016,47 +496346,36 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify album details", + "summary": "Find nearby Starbucks stores worldwide", "tags": [ - "Spotify" + "Starbucks" ] } }, - "/spotify/album/tracks": { + "/startpage/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Lists the tracks of a Spotify album, identified by `uri` (a Spotify URI or open.spotify.com URL) or `id`. `offset` defaults to 0 and `limit` runs 1 to 50, default 50. Each track has its title, URI, subtitle, image and URL. The album's name, artists and track total come back alongside. An invalid identifier returns 400.", - "operationId": "spotify-album-tracks", + "description": "Returns Startpage search-box autocomplete completions for a query prefix, in Startpage's own ranking order. Startpage never returns more than 10 suggestions per prefix.", + "operationId": "startpage-suggest", "parameters": [ { - "description": "Spotify album URI or open.spotify.com album URL", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:album:4aawyAB9vmqN3uQ7FjRGTy" - }, - { - "description": "Spotify album ID", + "description": "Search query prefix", "in": "query", - "name": "id", + "name": "q", + "required": true, "type": "string", - "x-example": "4aawyAB9vmqN3uQ7FjRGTy" - }, - { - "description": "Track offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "x-example": "openai" }, { - "description": "Track limit, clamped to 1-50", + "description": "Suggestions to return; defaults to 10, clamped to 1..10", "in": "query", - "name": "limit", + "maximum": 10, + "minimum": 1, + "name": "count", "type": "integer", - "x-example": 50 + "x-example": 10 } ], "produces": [ @@ -481066,14 +496385,58 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.albumResponseDoc" + "$ref": "#/definitions/startpage.suggestResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Startpage upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Suggest Startpage search queries", + "tags": [ + "Startpage" + ] + } + }, + "/startribune/news": { + "get": { + "description": "Returns the public Star Tribune RSS feed with current story titles and canonical URLs; publisher summaries and publication dates are included when supplied by the feed. Optional bylines and images are returned only when present. Summaries are publisher teasers, not full article text. This feed-only route does not claim a complete section taxonomy or retrieve article bodies; use attribution when republishing feed content.", + "operationId": "startribune-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -481093,83 +496456,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify album tracks", + "summary": "Get Minnesota Star Tribune top stories", "tags": [ - "Spotify" + "Minnesota Star Tribune" ] } }, - "/spotify/albums/search": { + "/steam/achievements": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify album search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", - "operationId": "spotify-albums-search", + "description": "Returns the global unlock percentage for each of an app's achievements, sorted most-unlocked first. Apps without global achievement stats return an empty list.", + "operationId": "steam-achievements", "parameters": [ { - "description": "Search term", + "description": "Numeric Steam app id", "in": "query", - "name": "q", + "name": "appid", "required": true, "type": "string", - "x-example": "hello" - }, - { - "description": "Search offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Album result limit, clamped to 1-50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 30 - }, - { - "description": "Top result limit, clamped to 1-50", - "in": "query", - "name": "number_of_top_results", - "type": "integer", - "x-example": 20 - }, - { - "description": "Include audiobook context where available", - "in": "query", - "name": "include_audiobooks", - "type": "boolean", - "x-example": true - }, - { - "description": "Include pre-release results", - "in": "query", - "name": "include_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include album pre-release results", - "in": "query", - "name": "include_album_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include authors", - "in": "query", - "name": "include_authors", - "type": "boolean", - "x-example": false - }, - { - "description": "Include Spotify episode content ratings v2", - "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "x-example": "440" } ], "produces": [ @@ -481179,23 +496486,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/steam.achievementsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -481206,33 +496507,47 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify albums", + "summary": "Get global achievement completion percentages for a Steam app", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/artist": { + "/steam/app": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Spotify artist's profile by artist URI, `open.spotify.com` URL or id: name, verified flag, follower count, monthly listeners (`monthlyUsers`), biography and images, plus top tracks, selected discography, related artists and artist playlists when Spotify returns them.", - "operationId": "spotify-artist", + "description": "Returns store metadata for a single Steam app (title, type, price, developers/publishers, platforms, genres, categories, release date, metacritic, recommendation and achievement counts). cc selects the store region (and price currency) and l the text language. filters is a comma-separated subset of allowed fields to shrink the payload.", + "operationId": "steam-app", "parameters": [ { - "description": "Spotify artist URI or open.spotify.com artist URL", + "description": "Numeric Steam app id", "in": "query", - "name": "uri", + "name": "appid", + "required": true, "type": "string", - "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" + "x-example": "570" }, { - "description": "Spotify artist ID", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "id", - "type": "string", - "x-example": "0TnOYISbd1XYRBk9myaseg" + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" + }, + { + "description": "Comma-separated fields: basic, price_overview, developers, publishers, categories, genres, release_date, platforms, metacritic, achievements, screenshots, movies, recommendations, controller_support, dlc, short_description, supported_languages, packages, package_groups, ratings, content_descriptors, background", + "in": "query", + "name": "filters", + "type": "string" } ], "produces": [ @@ -481242,7 +496557,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.artistResponseDoc" + "$ref": "#/definitions/steam.appResponseDoc" } }, "400": { @@ -481251,8 +496566,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -481269,74 +496584,76 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify artist details", + "summary": "Get Steam store details for an app", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/artist/albums": { + "/steam/category/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns an artist's Spotify discography by artist URI, `open.spotify.com` URL or id. Choose `type` (`album`, `single`, `compilation`, `appears_on` or `all`; default `album`) and `order` (default `date_desc`), and page with `offset` and `limit` (1-50, default 50). Each item has a type, title, subtitle, Spotify URI, external URL and images; `total` gives the full count.", - "operationId": "spotify-artist-albums", + "description": "Returns a catalog slice for a community tag / category, carrying each item's WEIGHTED community tags, review-score breakdown, developer/publisher credits, release date, platforms and price. The slug is a numeric tag id or a tag name (case- and separator-insensitive, e.g. rogue_like); resolve ids via /steam/tags/list. Ordering is Steam's default relevance — for sorted or os/price-faceted browse use /steam/tags.", + "operationId": "steam-category", "parameters": [ { - "description": "Spotify artist URI or open.spotify.com artist URL", - "in": "query", - "name": "uri", + "description": "Community tag id (numeric) or tag name slug", + "in": "path", + "name": "slug", + "required": true, "type": "string", - "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" + "x-example": "rogue_like" }, { - "description": "Spotify artist ID", + "default": false, + "description": "Only free titles", "in": "query", - "name": "id", - "type": "string", - "x-example": "0TnOYISbd1XYRBk9myaseg" + "name": "free", + "type": "boolean" }, { - "description": "album, single, compilation, appears_on, or all", - "enum": [ - "album", - "single", - "compilation", - "appears_on", - "all" - ], + "default": false, + "description": "Only already-released titles", "in": "query", - "name": "type", - "type": "string", - "x-example": "album" + "name": "released_only", + "type": "boolean" }, { - "description": "date_desc, date_asc, name_asc, or name_desc", - "enum": [ - "date_desc", - "date_asc", - "name_asc", - "name_desc" - ], + "default": false, + "description": "Only unreleased / coming-soon titles", "in": "query", - "name": "order", - "type": "string", - "x-example": "date_desc" + "name": "coming_soon_only", + "type": "boolean" }, { - "description": "Offset", + "default": 0, + "description": "Result offset for pagination", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "start", + "type": "integer" }, { - "description": "Limit, clamped to 1-50", + "default": 25, + "description": "Results per page (max 100)", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "count", + "type": "integer" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "english", + "description": "Steam store language name", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -481346,7 +496663,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.artistAlbumsResponseDoc" + "$ref": "#/definitions/steam.categoryBrowseResponseDoc" } }, "400": { @@ -481355,8 +496672,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -481373,33 +496690,40 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify artist albums", + "summary": "Browse a store category (tag) with weighted community tags", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/artist/playlists": { + "/steam/charts/concurrent": { "get": { "consumes": [ "application/json" ], - "description": "Returns the Spotify playlists associated with an artist, by artist URI, `open.spotify.com` URL or id. Each playlist has a title, subtitle, description, Spotify URI, external URL and images. Some artists have no playlists, in which case `items` is empty.", - "operationId": "spotify-artist-playlists", + "description": "Returns the live leaderboard of games ranked by current concurrent players (rank, appid, current concurrent, peak). By default each row is enriched with the game name and review summary; pass enrich=false for raw ranked app ids.", + "operationId": "steam-charts-concurrent", "parameters": [ { - "description": "Spotify artist URI or open.spotify.com artist URL", + "default": true, + "description": "Attach game name and review summary to each rank", "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" + "name": "enrich", + "type": "boolean" }, { - "description": "Spotify artist ID", + "default": "us", + "description": "Store country code (ISO) for name enrichment", "in": "query", - "name": "id", - "type": "string", - "x-example": "0TnOYISbd1XYRBk9myaseg" + "name": "cc", + "type": "string" + }, + { + "default": "english", + "description": "Steam store language name for name enrichment", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -481409,19 +496733,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.artistCollectionResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/steam.chartResponseDoc" } }, "503": { @@ -481436,33 +496748,40 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify artist playlists", + "summary": "Get Steam's live games-by-concurrent-players leaderboard", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/artist/related": { + "/steam/charts/most-played": { "get": { "consumes": [ "application/json" ], - "description": "Returns the artists Spotify lists as related to a given artist, by artist URI, `open.spotify.com` URL or id. Each related artist has a title, Spotify URI, external URL and images. An invalid identifier returns `400`.", - "operationId": "spotify-artist-related", + "description": "Returns Steam's weekly most-played chart: the top games ranked by peak concurrent players over the last week (rank, appid, previous-week rank, peak players). By default each row is enriched with the game name and review summary; pass enrich=false for the raw ranked app ids only.", + "operationId": "steam-charts-most-played", "parameters": [ { - "description": "Spotify artist URI or open.spotify.com artist URL", + "default": true, + "description": "Attach game name and review summary to each rank", "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:artist:0TnOYISbd1XYRBk9myaseg" + "name": "enrich", + "type": "boolean" }, { - "description": "Spotify artist ID", + "default": "us", + "description": "Store country code (ISO) for name enrichment", "in": "query", - "name": "id", - "type": "string", - "x-example": "0TnOYISbd1XYRBk9myaseg" + "name": "cc", + "type": "string" + }, + { + "default": "english", + "description": "Steam store language name for name enrichment", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -481472,19 +496791,42 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.artistCollectionResponseDoc" + "$ref": "#/definitions/steam.chartResponseDoc" } }, - "400": { - "description": "Bad Request", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } - }, - "429": { - "description": "Too Many Requests", + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Steam's weekly most-played games chart", + "tags": [ + "Steam" + ] + } + }, + "/steam/charts/top-releases": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns Steam's monthly top-releases index: one page per month, each listing that month's top-released app ids (with the month label and start date). The app-id lists are large and not name-enriched; resolve names via /steam/items.", + "operationId": "steam-charts-top-releases", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/steam.topReleasesResponseDoc" } }, "503": { @@ -481499,41 +496841,66 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify related artists", + "summary": "Get Steam's monthly best-new-releases index", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/artists/search": { + "/steam/community-recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Searches Spotify for artists matching a term, with `offset` and `limit` (1-50). Each artist has a title, Spotify URI, external URL and images. Matching artists are returned in both `results` and `artists`.", - "operationId": "spotify-artists-search", + "description": "Returns a batch of recent, quality user reviews recommended across the whole store (author, playtime, helpful votes, and the recommended app). Filter by review kind/sort, reviewer playtime window, review language, and store region. The endpoint serves a fixed batch and does not support tag filtering or deep pagination.", + "operationId": "steam-community-recommendations", "parameters": [ { - "description": "Search term", + "default": "helpful", + "description": "Review kind / sort", + "enum": [ + "helpful", + "recent", + "funny" + ], "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "hello" + "name": "review_filter", + "type": "string" }, { - "description": "Search offset", + "default": 0, + "description": "Minimum reviewer playtime in hours (0 = no minimum)", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "playtime_min", + "type": "integer" }, { - "description": "Result limit, clamped to 1-50", + "default": 0, + "description": "Maximum reviewer playtime in hours (0 = no maximum)", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "name": "playtime_max", + "type": "integer" + }, + { + "default": "my_languages", + "description": "Review language: 'my_languages' or a Steam language name", + "in": "query", + "name": "review_language", + "type": "string" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -481543,7 +496910,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/steam.communityRecommendationsResponseDoc" } }, "400": { @@ -481552,12 +496919,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -481570,33 +496931,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify artists", + "summary": "Get the store's community-recommended reviews feed", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/audiobook": { + "/steam/featured": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Spotify audiobook by `uri` or `id`; Spotify identifies audiobooks with show URIs (`spotify:show:...`). The response has name, authors, narrators, publisher, description, `totalChapters`, explicit flag and cover images. Passing a podcast show instead of an audiobook returns an upstream error, and an invalid identifier returns 400.", - "operationId": "spotify-audiobook", + "description": "Returns the storefront's featured capsules for a region (per-platform featured lists plus large spotlight capsules), including discount and price fields.", + "operationId": "steam-featured", "parameters": [ { - "description": "Spotify audiobook/show URI or open.spotify.com show URL", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:show:76GTo4lM62dFR11VuALF01" + "name": "cc", + "type": "string" }, { - "description": "Spotify show ID", + "default": "en", + "description": "Language code", "in": "query", - "name": "id", - "type": "string", - "x-example": "76GTo4lM62dFR11VuALF01" + "name": "l", + "type": "string" } ], "produces": [ @@ -481606,19 +496967,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.audiobookResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/steam.featuredResponseDoc" } }, "503": { @@ -481633,47 +496982,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify audiobook details", + "summary": "Get the Steam store featured capsules", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/audiobook/chapters": { + "/steam/featured-categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the chapters of a Spotify audiobook by URI, `open.spotify.com` URL or id, with `offset` and `limit` (1-50, default 50). Each chapter has its name, description, duration in milliseconds, release date, explicit and playable flags, Spotify URI, external URL and images; `total` gives the chapter count.", - "operationId": "spotify-audiobook-chapters", + "description": "Returns the storefront merchandising buckets for a region: specials, top_sellers, new_releases, and coming_soon, each with its item list.", + "operationId": "steam-featured-categories", "parameters": [ { - "description": "Spotify audiobook/show URI or open.spotify.com show URL", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:show:76GTo4lM62dFR11VuALF01" - }, - { - "description": "Spotify show ID", - "in": "query", - "name": "id", - "type": "string", - "x-example": "76GTo4lM62dFR11VuALF01" - }, - { - "description": "Chapter offset", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "cc", + "type": "string" }, { - "description": "Chapter limit, clamped to 1-50", + "default": "en", + "description": "Language code", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "l", + "type": "string" } ], "produces": [ @@ -481683,19 +497018,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.audiobookChaptersResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/steam.featuredCategoriesResponseDoc" } }, "503": { @@ -481710,83 +497033,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify audiobook chapters", + "summary": "Get Steam top sellers, new releases, specials and coming soon", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/audiobooks/search": { + "/steam/items": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify audiobook search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", - "operationId": "spotify-audiobooks-search", + "description": "Resolves up to 100 Steam app ids in one call to store items, each carrying its WEIGHTED community tags, review-score breakdown, developer/publisher credits, release date, platforms and price. The batch enrichment primitive for the community-tag taxonomy.", + "operationId": "steam-items", "parameters": [ { - "description": "Search term", + "description": "Comma-separated numeric app ids (max 100)", "in": "query", - "name": "q", + "name": "appids", "required": true, "type": "string", - "x-example": "hello" - }, - { - "description": "Search offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Audiobook result limit, clamped to 1-50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 30 - }, - { - "description": "Top result limit, clamped to 1-50", - "in": "query", - "name": "number_of_top_results", - "type": "integer", - "x-example": 20 - }, - { - "description": "Include audiobook results", - "in": "query", - "name": "include_audiobooks", - "type": "boolean", - "x-example": true - }, - { - "description": "Include pre-release results", - "in": "query", - "name": "include_pre_releases", - "type": "boolean", - "x-example": true - }, - { - "description": "Include album pre-release results", - "in": "query", - "name": "include_album_pre_releases", - "type": "boolean", - "x-example": false + "x-example": "570,730,1623730" }, { - "description": "Include authors", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "include_authors", - "type": "boolean", - "x-example": false + "name": "cc", + "type": "string" }, { - "description": "Include Spotify episode content ratings v2", + "default": "english", + "description": "Steam store language name", "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "l", + "type": "string" } ], "produces": [ @@ -481796,23 +497077,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/steam.itemsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -481823,33 +497098,41 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify audiobooks", + "summary": "Resolve a batch of app ids to store items with weighted tags", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/chapter": { + "/steam/news": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Spotify audiobook chapter by `uri` or `id`; chapters are often addressed with `spotify:episode:` identifiers. Fields include name, description, duration, release date, explicit and paywall flags, playability reasons, preview audio URL, cover images and the parent show. An invalid identifier returns 400.", - "operationId": "spotify-chapter", + "description": "Returns recent news and announcement posts for a Steam app by numeric `appid` (for example `570`). `count` sets the number of posts (default 10, max 50) and `maxlength` caps each post body in characters (default 300, `-1` for the full body). Each post has `gid`, title, URL, author, contents, feed label and name, `date`, `is_external_url` and `tags`.", + "operationId": "steam-news", "parameters": [ { - "description": "Spotify chapter or episode URI/URL", + "description": "Numeric Steam app id", "in": "query", - "name": "uri", + "name": "appid", + "required": true, "type": "string", - "x-example": "spotify:episode:2C2Y5kNq7qCVOVhbA0G3os" + "x-example": "570" }, { - "description": "Spotify chapter/episode ID", + "default": 10, + "description": "Number of posts (max 50)", "in": "query", - "name": "id", - "type": "string", - "x-example": "2C2Y5kNq7qCVOVhbA0G3os" + "name": "count", + "type": "integer" + }, + { + "default": 300, + "description": "Max characters of each post body; default 300, set -1 for full content", + "in": "query", + "name": "maxlength", + "type": "integer" } ], "produces": [ @@ -481859,7 +497142,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.episodeResponseDoc" + "$ref": "#/definitions/steam.newsResponseDoc" } }, "400": { @@ -481868,12 +497151,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -481886,41 +497163,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify audiobook chapter details", + "summary": "Get recent news posts for a Steam app", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/episodes/search": { + "/steam/package": { "get": { "consumes": [ "application/json" ], - "description": "Searches Spotify podcast episodes for the search term `q`, paged with `offset` (default 0) and `limit` (1 to 50). Each episode has its title, URI, description, publisher, images and Spotify URL. Episode matches appear under both `results` and `episodes`. A missing `q` returns 400.", - "operationId": "spotify-episodes-search", + "description": "Returns details for a Steam package (a purchasable bundle): name, the apps it contains, price, platforms, and release date. cc selects the store region and price currency.", + "operationId": "steam-package", "parameters": [ { - "description": "Search term", + "description": "Numeric Steam package id", "in": "query", - "name": "q", + "name": "packageid", "required": true, "type": "string", - "x-example": "hello" + "x-example": "68179" }, { - "description": "Search offset", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "cc", + "type": "string" }, { - "description": "Result limit, clamped to 1-50", + "default": "en", + "description": "Language code", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "name": "l", + "type": "string" } ], "produces": [ @@ -481930,7 +497207,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/steam.packageResponseDoc" } }, "400": { @@ -481939,8 +497216,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -481957,39 +497234,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify episodes", + "summary": "Get Steam store details for a package", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/featured-charts-by-country": { + "/steam/players": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify country hub content. Defaults to the CHARTS content shelf for the requested country.", - "operationId": "spotify-featured-charts-by-country", + "description": "Returns the current number of concurrent players for a Steam app, given its numeric `appid` such as `570`. The response has `appid`, `player_count` and a `source_url`. An app with no player-count data returns 404.", + "operationId": "steam-players", "parameters": [ - { - "description": "Two-letter Spotify popular-in country code", - "in": "query", - "name": "country_code", - "type": "string", - "x-example": "id" - }, - { - "description": "Country hub content ID. Allowed: CHARTS, POPULAR_ALBUMS, POPULAR_ARTISTS, TRENDING_SONGS", - "enum": [ - "CHARTS", - "POPULAR_ALBUMS", - "POPULAR_ARTISTS", - "TRENDING_SONGS" - ], + { + "description": "Numeric Steam app id", "in": "query", - "name": "content_id", + "name": "appid", + "required": true, "type": "string", - "x-example": "CHARTS" + "x-example": "570" } ], "produces": [ @@ -481999,23 +497264,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.countryHubContentResponseDoc" + "$ref": "#/definitions/steam.playersResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482026,61 +497291,91 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify featured charts by country", + "summary": "Get the current concurrent-player count for a Steam app", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/genre": { + "/steam/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns the sections of a Spotify genre or browse page for `uri` (default `spotify:page:0JQ5DAB3zgCauRwnvdEQjJ`). Each section has a title, type, `totalCount` and items with title, subtitle, image and Spotify URL. `page_limit` and `section_limit` default to 10 and run 1 to 50; matching offsets default to 0.", - "operationId": "spotify-genre", + "description": "Returns a page of user reviews for an app with cursor pagination and an aggregate query_summary (score, positive/negative totals). Aggregate totals populate only on the first page (cursor=*). Pass the returned cursor back to page.", + "operationId": "steam-reviews", "parameters": [ { - "description": "Spotify genre or page URI", + "description": "Numeric Steam app id", "in": "query", - "name": "uri", + "name": "appid", + "required": true, "type": "string", - "x-example": "spotify:page:0JQ5DAB3zgCauRwnvdEQjJ" + "x-example": "570" }, { - "description": "Page pagination offset", + "default": "recent", + "description": "Sort order", + "enum": [ + "recent", + "updated", + "all" + ], "in": "query", - "name": "page_offset", - "type": "integer", - "x-example": 0 + "name": "filter", + "type": "string" }, { - "description": "Page pagination limit, clamped to 1-50", + "default": "english", + "description": "Steam language name or 'all'", "in": "query", - "name": "page_limit", - "type": "integer", - "x-example": 10 + "name": "language", + "type": "string" }, { - "description": "Section pagination offset", + "default": "all", + "description": "Review sentiment filter", + "enum": [ + "all", + "positive", + "negative" + ], "in": "query", - "name": "section_offset", - "type": "integer", - "x-example": 0 + "name": "review_type", + "type": "string" }, { - "description": "Section pagination limit, clamped to 1-50", + "default": "all", + "description": "Purchase source filter", + "enum": [ + "all", + "steam", + "non_steam_purchase" + ], "in": "query", - "name": "section_limit", - "type": "integer", - "x-example": 10 + "name": "purchase_type", + "type": "string" }, { - "description": "Include Spotify episode content ratings v2", + "default": 365, + "description": "Look-back window in days (filter=all only, max 365)", "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "day_range", + "type": "integer" + }, + { + "default": 20, + "description": "Reviews per page (max 100)", + "in": "query", + "name": "num_per_page", + "type": "integer" + }, + { + "default": "*", + "description": "Pagination cursor from the previous page", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -482090,23 +497385,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.browsePageResponseDoc" + "$ref": "#/definitions/steam.reviewsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482117,54 +497412,34 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify genre page", + "summary": "List reviews for a Steam app", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/home": { + "/steam/reviews/histogram": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify home shelves and items. Caller-supplied Spotify bearer or client tokens are not required.", - "operationId": "spotify-home", + "description": "Returns the positive/negative recommendation counts over time (the store review graph): weekly/monthly rollups plus recent daily buckets.", + "operationId": "steam-reviews-histogram", "parameters": [ { - "description": "IANA time zone used by Spotify home personalization", - "in": "query", - "name": "time_zone", - "type": "string", - "x-example": "Asia/Shanghai" - }, - { - "description": "Optional Spotify session token. A random UUID is generated when omitted", - "in": "query", - "name": "sp_t", - "type": "string", - "x-example": "00000000-0000-4000-8000-000000000000" - }, - { - "description": "Optional Spotify home facet", + "description": "Numeric Steam app id", "in": "query", - "name": "facet", + "name": "appid", + "required": true, "type": "string", - "x-example": "" - }, - { - "description": "Per-section item limit, clamped to 1-50", - "in": "query", - "name": "section_items_limit", - "type": "integer", - "x-example": 10 + "x-example": "570" }, { - "description": "Include Spotify episode content ratings v2", + "default": "english", + "description": "Steam language name or 'all'", "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "language", + "type": "string" } ], "produces": [ @@ -482174,23 +497449,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.homeResponseDoc" + "$ref": "#/definitions/steam.histogramResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482201,61 +497476,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify home sections", + "summary": "Get the review up/down histogram for a Steam app", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/playlist": { + "/steam/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify playlist metadata and items. Provide either uri or id; defaults to a known public playlist when omitted.", - "operationId": "spotify-playlist", + "description": "Resolves a search term to Steam apps via the store typeahead (title, appid, price, platforms, metascore). Best for title -> appid lookup; returns roughly ten results. For faceted, paginated search use /steam/search/results.", + "operationId": "steam-search", "parameters": [ { - "description": "Spotify playlist URI or open.spotify.com playlist URL", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:playlist:37i9dQZEVXbLwpL8TjsxOG" - }, - { - "description": "Spotify playlist ID. Used when uri is omitted", + "description": "Search term", "in": "query", - "name": "id", + "name": "term", + "required": true, "type": "string", - "x-example": "37i9dQZEVXbLwpL8TjsxOG" - }, - { - "description": "Playlist item offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Playlist item limit, clamped to 1-50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 25 + "x-example": "portal" }, { - "description": "Enable watch feed entrypoint", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "enable_watch_feed_entrypoint", - "type": "boolean", - "x-example": false + "name": "cc", + "type": "string" }, { - "description": "Include Spotify episode content ratings v2", + "default": "en", + "description": "Language code", "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "l", + "type": "string" } ], "produces": [ @@ -482265,23 +497520,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.playlistResponseDoc" + "$ref": "#/definitions/steam.searchResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482292,83 +497541,70 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify playlist details", + "summary": "Search the Steam store by title", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/playlists/search": { + "/steam/search/results": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify playlist search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", - "operationId": "spotify-playlists-search", + "description": "Runs the Steam store search with pagination and sorting and returns the result rows (appid, title, release date, review summary, price, platforms). Supports start/count paging and sort_by.", + "operationId": "steam-search-results", "parameters": [ { "description": "Search term", "in": "query", - "name": "q", + "name": "term", "required": true, "type": "string", - "x-example": "hello" - }, - { - "description": "Search offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Playlist result limit, clamped to 1-50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 30 - }, - { - "description": "Top result limit, clamped to 1-50", - "in": "query", - "name": "number_of_top_results", - "type": "integer", - "x-example": 20 + "x-example": "roguelike" }, { - "description": "Include audiobook context where available", + "default": 0, + "description": "Result offset for pagination", "in": "query", - "name": "include_audiobooks", - "type": "boolean", - "x-example": true + "name": "start", + "type": "integer" }, { - "description": "Include pre-release results", + "default": 25, + "description": "Results per page (max 100)", "in": "query", - "name": "include_pre_releases", - "type": "boolean", - "x-example": false + "name": "count", + "type": "integer" }, { - "description": "Include album pre-release results", + "default": "Relevance", + "description": "Sort order", + "enum": [ + "Relevance", + "Released_DESC", + "Name_ASC", + "Price_ASC", + "Price_DESC", + "Reviews_DESC" + ], "in": "query", - "name": "include_album_pre_releases", - "type": "boolean", - "x-example": false + "name": "sort_by", + "type": "string" }, { - "description": "Include authors", + "default": "us", + "description": "Store country code (ISO, selects currency)", "in": "query", - "name": "include_authors", - "type": "boolean", - "x-example": false + "name": "cc", + "type": "string" }, { - "description": "Include Spotify episode content ratings v2", + "default": "en", + "description": "Language code", "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "name": "l", + "type": "string" } ], "produces": [ @@ -482378,23 +497614,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/steam.searchResultsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482405,26 +497635,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify playlists", + "summary": "Faceted, paginated Steam store search", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/popular-by-country": { + "/steam/steamspy": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify country hub shelves. The country_code parameter accepts Spotify popular-in country codes from open.spotify.com/popular-in/us.", - "operationId": "spotify-popular-by-country", + "description": "Returns third-party ownership, concurrent-user, playtime, and review estimates for an app from SteamSpy. These are SteamSpy estimates, not official Steam figures.", + "operationId": "steam-steamspy", "parameters": [ { - "description": "Two-letter Spotify popular-in country code", + "description": "Numeric Steam app id", "in": "query", - "name": "country_code", + "name": "appid", + "required": true, "type": "string", - "x-example": "us" + "x-example": "570" } ], "produces": [ @@ -482434,23 +497665,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.countryHubResponseDoc" + "$ref": "#/definitions/steam.steamspyResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482461,61 +497692,162 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify popular by country", + "summary": "Get SteamSpy third-party ownership and playtime estimates", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/profile": { + "/steam/tags": { "get": { "consumes": [ "application/json" ], - "description": "Returns public Spotify profile metadata and preview playlists. Provide username, uri, or url; defaults to Spotify's official profile.", - "operationId": "spotify-profile", + "description": "Browses the store by the community-tag taxonomy (Roguelike, Metroidvania, Cozy...) and the store filter facets, with no free-text term. Filter by one or more tag ids, a store category id, platform (os), a maximum price, specials-only, and hide-free-to-play; sort and page the browse-rank rows. Each row includes its community tag ids (resolve names via /steam/tags/list). Pagination runs the full result set (total is the real, fully-pageable match count); paging past total returns an empty page.", + "operationId": "steam-tags", "parameters": [ { - "description": "Spotify username", + "description": "Comma-separated numeric community tag ids (all must match); resolve ids via /steam/tags/list", "in": "query", - "name": "username", + "name": "tags", "type": "string", - "x-example": "spotify" + "x-example": "492,4136" }, { - "description": "Spotify user URI", + "description": "Comma-separated numeric community tag ids to EXCLUDE", "in": "query", - "name": "uri", + "name": "untags", "type": "string", - "x-example": "spotify:user:spotify" + "x-example": "4136" }, { - "description": "open.spotify.com user URL", + "description": "Numeric Steam store category id (e.g. 998 games, 21 dlc)", "in": "query", - "name": "url", + "name": "category1", "type": "string", - "x-example": "https://open.spotify.com/user/spotify" + "x-example": "998" }, { - "description": "Embedded public playlist limit, clamped to 0-50", + "description": "Additional numeric store category id (feature)", "in": "query", - "name": "playlist_limit", - "type": "integer", - "x-example": 10 + "name": "category2", + "type": "string", + "x-example": "29" }, { - "description": "Recently played artist limit, clamped to 0-50", + "description": "Additional numeric store category id (feature)", "in": "query", - "name": "artist_limit", - "type": "integer", - "x-example": 10 + "name": "category3", + "type": "string", + "x-example": "3" }, { - "description": "Embedded episode limit, clamped to 0-50", + "description": "Comma-separated platform filter subset of: win, mac, linux", "in": "query", - "name": "episode_limit", - "type": "integer", - "x-example": 0 + "name": "os", + "type": "string", + "x-example": "win,linux" + }, + { + "description": "Maximum price as whole cents in the cc currency, or the literal 'free'", + "in": "query", + "name": "maxprice", + "type": "string", + "x-example": "2000" + }, + { + "default": false, + "description": "Only discounted titles", + "in": "query", + "name": "specials", + "type": "boolean" + }, + { + "default": false, + "description": "Hide free-to-play titles", + "in": "query", + "name": "hidef2p", + "type": "boolean" + }, + { + "description": "Steam Deck compatibility filter: 1 unsupported, 2 playable, 3 verified", + "enum": [ + "1", + "2", + "3" + ], + "in": "query", + "name": "deck_compatibility", + "type": "string" + }, + { + "description": "Comma-separated VR-support filter ids (e.g. 401 seated, 402 standing, 403 roomscale)", + "in": "query", + "name": "vrsupport", + "type": "string", + "x-example": "401" + }, + { + "description": "Curated preset applied within the other facets", + "enum": [ + "globaltopsellers", + "topsellers", + "popularnew", + "comingsoon" + ], + "in": "query", + "name": "filter", + "type": "string" + }, + { + "description": "Only titles supporting this Steam language name", + "in": "query", + "name": "supportedlang", + "type": "string", + "x-example": "english" + }, + { + "default": "Relevance", + "description": "Sort order", + "enum": [ + "Relevance", + "Released_DESC", + "Name_ASC", + "Price_ASC", + "Price_DESC", + "Reviews_DESC" + ], + "in": "query", + "name": "sort_by", + "type": "string" + }, + { + "default": 0, + "description": "Result offset for pagination", + "in": "query", + "name": "start", + "type": "integer" + }, + { + "default": 25, + "description": "Results per page (max 100)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": "us", + "description": "Store country code (ISO, selects currency)", + "in": "query", + "name": "cc", + "type": "string" + }, + { + "default": "en", + "description": "Language code", + "in": "query", + "name": "l", + "type": "string" } ], "produces": [ @@ -482525,23 +497857,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.userProfileResponseDoc" + "$ref": "#/definitions/steam.searchResultsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482552,54 +497878,26 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify public profile", + "summary": "Browse the Steam store by community tag and store facets", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/profile/followers": { + "/steam/tags/list": { "get": { "consumes": [ "application/json" ], - "description": "Returns public Spotify follower profiles. Spotify exposes this publicly for some profiles; private or restricted profiles may return an upstream error.", - "operationId": "spotify-profile-followers", + "description": "Returns Steam's popular community tags (numeric id + localized name) so callers can map a tag name to the id that /steam/tags and /steam/category expect.", + "operationId": "steam-tags-list", "parameters": [ { - "description": "Spotify username", - "in": "query", - "name": "username", - "type": "string", - "x-example": "spotify" - }, - { - "description": "Spotify user URI", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:user:spotify" - }, - { - "description": "open.spotify.com user URL", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://open.spotify.com/user/spotify" - }, - { - "description": "Follower offset applied locally", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Follower limit, clamped to 1-200", + "default": "english", + "description": "Steam store language name for the tag labels", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "l", + "type": "string" } ], "produces": [ @@ -482609,23 +497907,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.userProfileFollowersResponseDoc" + "$ref": "#/definitions/steam.tagsListResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482636,54 +497928,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify public profile followers", + "summary": "List Steam community tag ids and names", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/profile/playlists": { + "/steam/top-sellers": { "get": { "consumes": [ "application/json" ], - "description": "Returns public Spotify playlists. Provide username, uri, or url; defaults to Spotify's official profile.", - "operationId": "spotify-profile-playlists", + "description": "Returns the store's weekly top-sellers chart for a country, each rank carrying the full store item (name, price, weighted community tags, review summary, platforms). cc selects the country whose sales ranking and currency are returned.", + "operationId": "steam-top-sellers", "parameters": [ { - "description": "Spotify username", - "in": "query", - "name": "username", - "type": "string", - "x-example": "spotify" - }, - { - "description": "Spotify user URI", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:user:spotify" - }, - { - "description": "open.spotify.com user URL", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://open.spotify.com/user/spotify" - }, - { - "description": "Playlist offset", + "default": "us", + "description": "Country code (ISO) whose weekly sales ranking is returned", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "cc", + "type": "string" }, { - "description": "Playlist limit, clamped to 1-50", + "default": "english", + "description": "Steam store language name", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "name": "l", + "type": "string" } ], "produces": [ @@ -482693,23 +497964,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.userProfilePlaylistsResponseDoc" - } - }, - "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/steam.topSellersResponseDoc" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482720,83 +497979,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify public profile playlists", + "summary": "Get Steam's weekly top-sellers chart for a country", "tags": [ - "Spotify" + "Steam" ] } }, - "/spotify/profiles/search": { + "/stevemadden/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify profile search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", - "operationId": "spotify-profiles-search", + "description": "Returns collections from Steve Madden (https://www.stevemadden.com). The storefront URL is fixed. Valid empty result pages return `200` with an empty collections array.", + "operationId": "stevemadden-collections", "parameters": [ { - "description": "Search term", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "hello" - }, - { - "description": "Search offset", + "description": "1-based page, defaults to 1", "in": "query", - "name": "offset", + "name": "page", "type": "integer", - "x-example": 0 + "x-example": 1 }, { - "description": "Profile result limit, clamped to 1-50", + "description": "Maximum collections, defaults to 50 and supports up to 250", "in": "query", "name": "limit", "type": "integer", - "x-example": 30 - }, - { - "description": "Top result limit, clamped to 1-50", - "in": "query", - "name": "number_of_top_results", - "type": "integer", - "x-example": 20 - }, - { - "description": "Include audiobook context where available", - "in": "query", - "name": "include_audiobooks", - "type": "boolean", - "x-example": true - }, - { - "description": "Include pre-release results", - "in": "query", - "name": "include_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include album pre-release results", - "in": "query", - "name": "include_album_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include authors", - "in": "query", - "name": "include_authors", - "type": "boolean", - "x-example": false - }, - { - "description": "Include Spotify episode content ratings v2", - "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "x-example": 50 } ], "produces": [ @@ -482806,23 +498015,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482833,97 +498042,41 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify profiles", + "summary": "List Steve Madden collections", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/spotify/search": { + "/stevemadden/collections/{handle}/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify catalog search results across tracks, artists, albums, playlists, shows, episodes, audiobooks, and top results. Caller-supplied Spotify bearer or client tokens are not required.", - "operationId": "spotify-search", + "description": "Returns products from one Steve Madden (https://www.stevemadden.com) collection. The storefront URL is fixed; `handle` is the collection's URL slug.", + "operationId": "stevemadden-collection-products", "parameters": [ { - "description": "Search term", - "in": "query", - "name": "q", + "description": "Collection handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "hello" + "x-example": "collection-handle" }, { - "description": "Search offset", + "description": "1-based page, defaults to 1", "in": "query", - "name": "offset", + "name": "page", "type": "integer", - "x-example": 0 + "x-example": 1 }, { - "description": "Result limit per section, clamped to 1-50", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", "name": "limit", "type": "integer", - "x-example": 10 - }, - { - "description": "Top result limit, clamped to 1-50", - "in": "query", - "name": "number_of_top_results", - "type": "integer", - "x-example": 5 - }, - { - "description": "Include audiobook results", - "in": "query", - "name": "include_audiobooks", - "type": "boolean", - "x-example": true - }, - { - "description": "Include artist concert availability fields", - "in": "query", - "name": "include_artist_has_concerts_field", - "type": "boolean", - "x-example": false - }, - { - "description": "Include pre-release results", - "in": "query", - "name": "include_pre_releases", - "type": "boolean", - "x-example": true - }, - { - "description": "Include album pre-release results", - "in": "query", - "name": "include_album_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include authors", - "in": "query", - "name": "include_authors", - "type": "boolean", - "x-example": false - }, - { - "description": "Include Spotify episode content ratings v2", - "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false - }, - { - "description": "Treat the search term as a prefix", - "in": "query", - "name": "is_prefix", - "type": "boolean", - "x-example": false + "x-example": 50 } ], "produces": [ @@ -482933,23 +498086,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -482960,47 +498119,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify catalog", + "summary": "List Steve Madden collection products", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/spotify/section": { + "/stevemadden/pages": { "get": { "consumes": [ "application/json" ], - "description": "Returns the items of one Spotify browse section for `uri` (default `spotify:section:0JQ5IMCbQBLqNPkcmYxQPQ`), with its title, subtitle and `totalCount`. Each item has a type, title, subtitle, images and Spotify URL. `offset` defaults to 0; `limit` runs 1 to 50 and defaults to 20.", - "operationId": "spotify-section", + "description": "Lists Steve Madden static pages, 50 per request by default (`limit` up to 250), with `page` starting at 1. Each page has its handle, title, URL, plain-text content and timestamps. An empty result is a normal 200. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", + "operationId": "stevemadden-pages", "parameters": [ { - "description": "Spotify section URI", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:section:0JQ5IMCbQBLqNPkcmYxQPQ" - }, - { - "description": "Section item offset", + "description": "1-based page, defaults to 1", "in": "query", - "name": "offset", + "name": "page", "type": "integer", - "x-example": 0 + "x-example": 1 }, { - "description": "Section item limit, clamped to 1-50", + "description": "Maximum static pages, defaults to 50 and supports up to 250", "in": "query", "name": "limit", "type": "integer", - "x-example": 20 - }, - { - "description": "Include Spotify episode content ratings v2", - "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "x-example": 50 } ], "produces": [ @@ -483010,23 +498155,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.browseSectionResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -483037,41 +498182,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify browse section", + "summary": "List Steve Madden static pages", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/spotify/shows/search": { + "/stevemadden/pages/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Searches Spotify podcast shows for the search term `q`, paged with `offset` (default 0) and `limit` (1 to 50). Each show has its title, URI, publisher, description, images and Spotify URL. Show matches appear under both `results` and `shows`. A missing `q` returns 400.", - "operationId": "spotify-shows-search", + "description": "Returns one Steve Madden static page by its `handle`: id, title, URL, plain-text `content` and the created, published and updated timestamps. Page text is cleaned, not raw HTML. An unknown handle returns 404. When the reduced form is served, `transport_mode` is `ssr_embedded` and `id` is omitted.", + "operationId": "stevemadden-page", "parameters": [ { - "description": "Search term", - "in": "query", - "name": "q", + "description": "Page handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "hello" - }, - { - "description": "Search offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Result limit, clamped to 1-50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "page-handle" } ], "produces": [ @@ -483081,7 +498212,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" } }, "400": { @@ -483090,6 +498221,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -483108,33 +498245,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify shows", + "summary": "Get a Steve Madden static page", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/spotify/track": { + "/stevemadden/products": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify track metadata. Provide either uri or id; defaults to a known public track when omitted.", - "operationId": "spotify-track", + "description": "Returns products from Steve Madden's (https://www.stevemadden.com) public product catalog. The storefront URL is fixed. Valid empty result pages return `200` with an empty products array.", + "operationId": "stevemadden-products", "parameters": [ { - "description": "Spotify track URI or open.spotify.com track URL", + "description": "1-based page, defaults to 1", "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:track:4vGg44GdCw3X8i8r01XJH0" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Spotify track ID. Used when uri is omitted", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "id", - "type": "string", - "x-example": "4vGg44GdCw3X8i8r01XJH0" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -483144,23 +498281,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.trackResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -483171,40 +498308,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify track details", + "summary": "List Steve Madden products", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/spotify/track/recommended": { + "/stevemadden/products/{handle}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify's recommendations for a track, given its URI, `open.spotify.com` URL or track id. Each recommendation has a type, title, subtitle, description, Spotify URI, external URL and images. `limit` is clamped to 1-50 and defaults to 5.", - "operationId": "spotify-track-recommended", + "description": "Returns product detail for one Steve Madden (https://www.stevemadden.com) product handle. The storefront URL is fixed; `handle` is the product's URL slug.", + "operationId": "stevemadden-product", "parameters": [ { - "description": "Spotify track URI or open.spotify.com track URL", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:track:4vGg44GdCw3X8i8r01XJH0" - }, - { - "description": "Spotify track ID. Used when uri is omitted", - "in": "query", - "name": "id", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, "type": "string", - "x-example": "4vGg44GdCw3X8i8r01XJH0" - }, - { - "description": "Recommendation limit, clamped to 1-50", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 5 + "x-example": "product-handle" } ], "produces": [ @@ -483214,23 +498338,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.trackRecommendedResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -483241,47 +498371,45 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify recommended tracks", + "summary": "Get a Steve Madden product", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/spotify/track/similar-albums": { + "/stevemadden/products/{handle}/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Lists albums similar to a Spotify track, identified by `uri` or `id`. `limit` runs 1 to 50, default 50, and `albums_only` requests albums-only recommendations. Each album has its title, subtitle, publisher, images and Spotify URL. With neither `uri` nor `id`, a known public track is used.", - "operationId": "spotify-track-similar-albums", + "description": "Returns recommended products for one Steve Madden (https://www.stevemadden.com) product handle. The storefront URL is fixed.", + "operationId": "stevemadden-product-recommendations", "parameters": [ { - "description": "Spotify track URI or open.spotify.com track URL", - "in": "query", - "name": "uri", - "type": "string", - "x-example": "spotify:track:4vGg44GdCw3X8i8r01XJH0" - }, - { - "description": "Spotify track ID. Used when uri is omitted", - "in": "query", - "name": "id", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, "type": "string", - "x-example": "4vGg44GdCw3X8i8r01XJH0" + "x-example": "product-handle" }, { - "description": "Album limit, clamped to 1-50", + "description": "Maximum products, defaults to 10 and supports up to 20", "in": "query", "name": "limit", "type": "integer", - "x-example": 50 + "x-example": 10 }, { - "description": "Request albums-only recommendations", + "description": "Recommendation intent. Allowed values: related, complementary", + "enum": [ + "related", + "complementary" + ], "in": "query", - "name": "albums_only", - "type": "boolean", - "x-example": true + "name": "intent", + "type": "string", + "x-example": "related" } ], "produces": [ @@ -483291,23 +498419,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.trackSimilarAlbumsResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -483318,83 +498452,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Spotify track similar albums", + "summary": "List Steve Madden product recommendations", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/spotify/tracks/search": { + "/stevemadden/search/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns Spotify track search results for a search term. Caller-supplied Spotify bearer or client tokens are not required.", - "operationId": "spotify-tracks-search", + "description": "Returns products, collections, and query suggestions from Steve Madden's (https://www.stevemadden.com) predictive search. The storefront URL is fixed.", + "operationId": "stevemadden-search-suggest", "parameters": [ { - "description": "Search term", + "description": "Search query", "in": "query", "name": "q", "required": true, "type": "string", - "x-example": "hello" + "x-example": "wool" }, { - "description": "Search offset", + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "name": "types", + "type": "string", + "x-example": "product,collection,query" }, { - "description": "Track result limit, clamped to 1-50", + "description": "Maximum results per type, defaults to 10 and supports up to 20", "in": "query", "name": "limit", "type": "integer", - "x-example": 20 - }, - { - "description": "Top result limit, clamped to 1-50", - "in": "query", - "name": "number_of_top_results", - "type": "integer", - "x-example": 20 - }, - { - "description": "Include audiobook context where available", - "in": "query", - "name": "include_audiobooks", - "type": "boolean", - "x-example": true - }, - { - "description": "Include pre-release results", - "in": "query", - "name": "include_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include album pre-release results", - "in": "query", - "name": "include_album_pre_releases", - "type": "boolean", - "x-example": false - }, - { - "description": "Include authors", - "in": "query", - "name": "include_authors", - "type": "boolean", - "x-example": false - }, - { - "description": "Include Spotify episode content ratings v2", - "in": "query", - "name": "include_episode_content_ratings_v2", - "type": "boolean", - "x-example": false + "x-example": 10 } ], "produces": [ @@ -483404,23 +498496,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/spotify.searchCatalogResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Spotify upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -483431,24 +498523,42 @@ "ApiKeyAuth": [] } ], - "summary": "Search Spotify tracks", + "summary": "Get Steve Madden search suggestions", "tags": [ - "Spotify" + "Steve Madden" ] } }, - "/standard/article": { + "/stevemadden/sitemap/urls": { "get": { - "description": "Returns one Evening Standard article by its canonical `standard.co.uk` article `url`. The response has the title, description, publish and update times, section, authors, lead image, body `paragraphs` and a `paywalled` flag.", - "operationId": "standard-article", + "consumes": [ + "application/json" + ], + "description": "Returns capped URL entries from Steve Madden's (https://www.stevemadden.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", + "operationId": "stevemadden-sitemap-urls", "parameters": [ { - "description": "Canonical Evening Standard article URL", + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], "in": "query", - "name": "url", - "required": true, + "name": "type", "type": "string", - "x-example": "https://www.standard.co.uk/news/politics/example-story-b1234567.html" + "x-example": "products" + }, + { + "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -483458,7 +498568,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" } }, "400": { @@ -483467,8 +498577,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -483485,32 +498595,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Evening Standard article content", + "summary": "List Steve Madden sitemap URLs", "tags": [ - "Evening Standard" + "Steve Madden" ] } }, - "/standard/author": { + "/stevemadden/sitemaps": { "get": { - "description": "Returns an Evening Standard author profile, found by `slug` (for example `nicholas-cecil`) or by a canonical `url`; send exactly one of the two. The response has the name, job title, bio, X/Twitter link and the author's recent articles with their section. It is one page, with no further pagination.", - "operationId": "standard-author", - "parameters": [ - { - "description": "Author slug, e.g. nicholas-cecil", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "nicholas-cecil" - }, - { - "description": "Canonical standard.co.uk/author/ URL; alternative to slug", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.standard.co.uk/author/nicholas-cecil" - } + "consumes": [ + "application/json" ], + "description": "Returns child sitemap URLs from Steve Madden's (https://www.stevemadden.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", + "operationId": "stevemadden-sitemaps", "produces": [ "application/json" ], @@ -483518,7 +498615,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.standardAuthorResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" } }, "400": { @@ -483527,8 +498624,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -483545,81 +498642,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Evening Standard author profile", + "summary": "List Steve Madden sitemaps", "tags": [ - "Evening Standard" + "Steve Madden" ] } }, - "/standard/headlines": { + "/stevemadden/store": { "get": { - "description": "Returns the latest Evening Standard headlines for one section. `section` is required and takes a slug such as `news/london`, `news/politics`, `sport/football`, `business/markets`, `culture/theatre` or `homesandproperty/renting`. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "standard-headlines", - "parameters": [ - { - "description": "Evening Standard RSS section slug", - "enum": [ - "news", - "news/london", - "news/politics", - "news/transport", - "news/crime", - "news/world", - "news/education", - "news/health", - "news/tech", - "sport", - "sport/football", - "sport/rugby", - "sport/cricket", - "sport/boxing", - "sport/formula-one", - "sport/tennis", - "business", - "business/business-news", - "business/markets", - "business/economy", - "business/technology-media", - "business/leisure-retail", - "business/money", - "business/property", - "lifestyle", - "lifestyle/fashion", - "lifestyle/beauty", - "lifestyle/travel", - "lifestyle/wellness", - "lifestyle/dating", - "culture", - "culture/theatre", - "culture/film", - "culture/tvfilm", - "culture/music", - "culture/books", - "going-out", - "going-out/restaurants", - "going-out/foodanddrink", - "going-out/bars", - "going-out/attractions", - "going-out/events", - "homesandproperty", - "homesandproperty/property-news", - "homesandproperty/buying-mortgages", - "homesandproperty/renting", - "homesandproperty/where-to-live", - "homesandproperty/interiors", - "homesandproperty/gardening", - "comment", - "comment/podcasts", - "showbiz", - "showbiz/celebrity-news" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "news" - } + "consumes": [ + "application/json" ], + "description": "Returns storefront metadata for Steve Madden (https://www.stevemadden.com). The storefront URL is fixed, so no `url` parameter is accepted.", + "operationId": "stevemadden-store", "produces": [ "application/json" ], @@ -483627,7 +498662,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, "400": { @@ -483636,6 +498671,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -483648,16 +498689,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Evening Standard section headlines", + "summary": "Get Steve Madden store metadata", "tags": [ - "Evening Standard" + "Steve Madden" ] } }, - "/standard/news": { + "/stockx/brands": { "get": { - "description": "Returns the current Evening Standard top stories. Each item has its title, URL, summary, publication time, author and image. Takes no parameters; use `standard-headlines` for a single section.", - "operationId": "standard-news", + "consumes": [ + "application/json" + ], + "description": "Returns StockX's full brand catalog (name and URL slug for every brand in its own brand directory), suitable for building GET /stockx/search's brand parameter or GET /stockx/search's model parameter's required single-brand context.", + "operationId": "stockx-brands", "produces": [ "application/json" ], @@ -483665,11 +498709,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/stockx.brandsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -483686,16 +498730,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Evening Standard top stories", + "summary": "Get StockX brand catalog", "tags": [ - "Evening Standard" + "StockX" ] } }, - "/standard/sections": { + "/stockx/categories": { "get": { - "description": "Lists the Evening Standard sections accepted by `standard-headlines`, as parent and child slugs such as `news`, `news/london`, `sport/rugby`, `going-out/restaurants` and `homesandproperty/gardening`. Each entry has the `slug`, display `name` and feed `url`.", - "operationId": "standard-sections", + "consumes": [ + "application/json" + ], + "description": "Returns StockX's full category/subcategory reference: the 7 top-level categories accepted by GET /stockx/search's category parameter, each with its subcategories (e.g. Shoes -> Boots, Cleats, Clogs).", + "operationId": "stockx-categories", "produces": [ "application/json" ], @@ -483703,7 +498750,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/stockx.categoriesResponseDoc" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -483712,37 +498771,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Evening Standard RSS sections", + "summary": "Get StockX category/subcategory taxonomy", "tags": [ - "Evening Standard" + "StockX" ] } }, - "/starbucks/menu": { + "/stockx/product/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Starbucks' full menu as a category tree: top-level categories, their child categories, and every product with its product number, form, product type, sizes, default size, availability, and image. Pair a product's product_number and form with /starbucks/product to fetch full detail including nutrition. store_number optionally scopes the menu to one store, using a store number from /starbucks/stores; a store-scoped menu marks items that store does not carry with availability NotAvailableHere, while the unscoped menu reports everything as Available. market selects which country catalog to return, one of us or ca, defaulting to us; the two differ substantially (roughly 282 US products vs 253 CA, with exclusives on both sides). Only these two markets are available.", - "operationId": "starbucks-menu", + "description": "Returns a StockX product: identity (title, brand, model, colorway, style id, retail price, release date, description, image), current market data (lowest ask, highest bid, last sale, trailing average price/sales count, delivery-speed ask tiers), individual seller listings (price, condition, size), related-product recommendations (other colorways/siblings StockX surfaces on the product page), and any promotional badges.", + "operationId": "stockx-product", "parameters": [ { - "description": "Starbucks store number to scope availability to, e.g. 101-54", - "in": "query", - "name": "store_number", - "type": "string", - "x-example": "101-54" - }, - { - "description": "Starbucks country site to read. One of: us, ca. Defaults to us", - "enum": [ - "us", - "ca" - ], - "in": "query", - "name": "market", + "description": "StockX product URL slug (the urlKey), the path segment of a https://stockx.com/{slug} product page", + "in": "path", + "name": "slug", + "required": true, "type": "string", - "x-example": "us" + "x-example": "air-jordan-5-retro-black-university-blue-2026" } ], "produces": [ @@ -483752,7 +498801,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/starbucks.menuResponseDoc" + "$ref": "#/definitions/stockx.productResponseDoc" } }, "400": { @@ -483761,8 +498810,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -483779,46 +498834,40 @@ "ApiKeyAuth": [] } ], - "summary": "Browse the full Starbucks menu", + "summary": "Get StockX product detail", "tags": [ - "Starbucks" + "StockX" ] } }, - "/starbucks/nearest-store": { + "/stockx/releases": { "get": { "consumes": [ "application/json" ], - "description": "Returns the coordinates and distance of the single closest Starbucks store to a point. Both lat and lng are required. This endpoint returns coordinates only, not store details: it is what Starbucks' own store locator uses to centre its map. Use /starbucks/stores for full store records. A point with no nearby store returns a well-formed result with found set to false rather than an error. market selects which Starbucks country site answers, one of us or ca, defaulting to us.", - "operationId": "starbucks-nearest-store", + "description": "Returns a date-ordered page (release date ascending) of StockX's upcoming release calendar: new and restocked products releasing on or after the given date, with product summaries, headline pricing, and each item's published release date.", + "operationId": "stockx-releases", "parameters": [ { - "description": "Latitude", + "description": "Only include releases on or after this date (YYYY-MM-DD, UTC). Defaults to today", "in": "query", - "name": "lat", - "required": true, - "type": "number", - "x-example": 47.6062 + "name": "from", + "type": "string", + "x-example": "2026-08-04" }, { - "description": "Longitude", + "description": "1-indexed result page, defaults to 1", "in": "query", - "name": "lng", - "required": true, - "type": "number", - "x-example": -122.3321 + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Starbucks country site to read. One of: us, ca. Defaults to us", - "enum": [ - "us", - "ca" - ], + "description": "Results per page, defaults to 20, maximum 100", "in": "query", - "name": "market", - "type": "string", - "x-example": "us" + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -483828,7 +498877,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/starbucks.nearestStoreResponseDoc" + "$ref": "#/definitions/stockx.releasesResponseDoc" } }, "400": { @@ -483837,8 +498886,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -483855,61 +498904,165 @@ "ApiKeyAuth": [] } ], - "summary": "Locate the closest Starbucks to a coordinate", + "summary": "Get StockX upcoming release calendar", "tags": [ - "Starbucks" + "StockX" ] } }, - "/starbucks/product/{product_number}/{form}": { + "/stockx/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Starbucks product's full detail: name, description, product type, image, Rewards star cost, customization options, and every size with its own nutrition panel (serving size, calories, calories from fat, and per-fact values for total fat with saturated and trans fat subfacts, cholesterol, sodium, total carbohydrates, protein, and caffeine). product_number is the numeric id from a /starbucks/menu result or a product page URL. form is that product's form; allowed values are hot, iced, single, packaged, whole-bean, and via. store_number optionally scopes availability to one store. Starbucks does not expose dollar pricing on this surface, so no price is returned; star_cost is the Rewards star cost. market selects which country catalog to resolve against, one of us or ca, defaulting to us. Each size also carries its default_recipe, the standard build, which is the required starting point for the /starbucks/product/{product_number}/{form}/nutrition endpoint. An unknown product number, or a form that product is not sold in, returns not found.", - "operationId": "starbucks-product", + "description": "Browses StockX's product catalog by category with optional free-text keyword search and facet filters (gender, brand, color, shoe height, activity, availability), returning product summaries with headline pricing plus the total matching count.", + "operationId": "stockx-search", "parameters": [ { - "description": "Starbucks numeric product id", - "in": "path", - "name": "product_number", + "description": "StockX top-level category", + "enum": [ + "sneakers", + "shoes", + "apparel", + "accessories", + "collectibles", + "trading-cards", + "electronics" + ], + "in": "query", + "name": "category", "required": true, "type": "string", - "x-example": "2123774" + "x-example": "sneakers" }, { - "description": "Product form. One of: hot, iced, single, packaged, whole-bean, via", + "description": "Free-text keyword search within the category, e.g. a model name or colorway", + "in": "query", + "name": "query", + "type": "string", + "x-example": "jordan 5" + }, + { + "description": "Filter by gender, comma-separated for multiple values", "enum": [ - "hot", - "iced", - "single", - "packaged", - "whole-bean", - "via" + "men", + "women", + "kids", + "unisex" ], - "in": "path", - "name": "form", - "required": true, + "in": "query", + "name": "gender", "type": "string", - "x-example": "iced" + "x-example": "men" }, { - "description": "Starbucks store number to scope availability to, e.g. 101-54", + "description": "Filter by one or more brand slugs, comma-separated, e.g. jordan,nike", "in": "query", - "name": "store_number", + "name": "brand", "type": "string", - "x-example": "101-54" + "x-example": "jordan,nike" }, { - "description": "Starbucks country site to read. One of: us, ca. Defaults to us", + "description": "Filter by a single model slug, e.g. air-force-1. Requires exactly one value in brand", + "in": "query", + "name": "model", + "type": "string", + "x-example": "air-force-1" + }, + { + "description": "Filter by color, comma-separated for multiple values", "enum": [ - "us", - "ca" + "white", + "black", + "multi", + "blue", + "grey", + "pink", + "red", + "brown", + "yellow", + "green", + "purple", + "orange" ], "in": "query", - "name": "market", + "name": "color", "type": "string", - "x-example": "us" + "x-example": "black" + }, + { + "description": "Filter by shoe height, comma-separated for multiple values", + "enum": [ + "low", + "mid", + "high" + ], + "in": "query", + "name": "shoe_height", + "type": "string", + "x-example": "low" + }, + { + "description": "Filter by activity, comma-separated for multiple values", + "enum": [ + "basketball", + "football", + "golf", + "hiking", + "running", + "skateboarding", + "soccer" + ], + "in": "query", + "name": "activity", + "type": "string", + "x-example": "basketball" + }, + { + "description": "Only include products with at least one active ask", + "in": "query", + "name": "available_now", + "type": "boolean", + "x-example": false + }, + { + "description": "Only include products with StockX Xpress Ship availability", + "in": "query", + "name": "xpress_ship", + "type": "boolean", + "x-example": false + }, + { + "description": "Only include products currently trading below original retail price", + "in": "query", + "name": "below_retail", + "type": "boolean", + "x-example": false + }, + { + "description": "Result sort order, defaults to featured", + "enum": [ + "featured", + "most-active" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "featured" + }, + { + "description": "1-indexed result page, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Results per page, defaults to 20, maximum 100", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -483919,7 +499072,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/starbucks.productResponseDoc" + "$ref": "#/definitions/stockx.searchResponseDoc" } }, "400": { @@ -483928,14 +499081,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -483952,47 +499099,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Starbucks product with nutrition", + "summary": "Search/browse StockX products", "tags": [ - "Starbucks" + "StockX" ] } }, - "/starbucks/product/{product_number}/{form}/nutrition": { - "post": { - "consumes": [ - "application/json" - ], - "description": "Recalculates calories, fat, sugars, and protein for a customized build of a Starbucks beverage: swap the milk, change the number of espresso shots or syrup pumps, and get the real figures for that exact drink rather than the standard recipe. Starbucks only offers this for four hot espresso beverages; product_number and form must be one of 406/hot (Caffe Americano), 407/hot (Caffe Latte), 408/hot (Caffe Mocha), or 413/hot (Caramel Macchiato). Any other product returns an invalid-parameter error naming the four that work. size_sku comes from a /starbucks/product result's sizes[].sku. modifiers is the COMPLETE build, not a change-set: start from that size's default_recipe, adjust what you want, and send the whole list back; an empty list is rejected. Each modifier needs a sku, an optional quantity (defaults to 1, and is the dial that matters for countable modifiers like espresso shots), and an optional replaced_sku when substituting a pick-one slot such as the milk. This returns Starbucks' own four-value dynamic-nutrition panel, which is smaller than the full per-size panel /starbucks/product returns for the standard build.", - "operationId": "starbucks-nutrition", + "/straitstimes/article": { + "get": { + "description": "Returns public The Straits Times article metadata and body paragraphs from a canonical article URL. A subscriber-only article returns only its publicly served teaser paragraphs with paywalled set to true.", + "operationId": "straitstimes-article", "parameters": [ { - "description": "Starbucks numeric product id. One of: 406, 407, 408, 413", - "in": "path", - "name": "product_number", - "required": true, - "type": "string", - "x-example": "406" - }, - { - "description": "Product form. Only hot is supported for this endpoint", - "enum": [ - "hot" - ], - "in": "path", - "name": "form", + "description": "Canonical The Straits Times article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "hot" - }, - { - "description": "The size and the complete modifier build", - "in": "body", - "name": "request", - "required": true, - "schema": { - "$ref": "#/definitions/starbucks.NutritionOption" - } + "x-example": "https://www.straitstimes.com/singapore/example-article-slug" } ], "produces": [ @@ -484002,7 +499126,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/starbucks.nutritionResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -484011,8 +499135,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -484029,51 +499153,24 @@ "ApiKeyAuth": [] } ], - "summary": "Recalculate nutrition for a customized Starbucks drink", + "summary": "Get The Straits Times article content", "tags": [ - "Starbucks" + "The Straits Times" ] } }, - "/starbucks/stores": { + "/straitstimes/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Starbucks store locations near a point: store number, name, phone, full address, coordinates, weekly opening hours, amenities, and pick-up options. Either place, or both lat and lng, is required. place is free-text (city, address, or postal code) and is geocoded by Starbucks itself, so it works worldwide. market selects which Starbucks country site answers, one of us or ca, defaulting to us; this is not cosmetic even for stores, because the same store reports different operational data depending on the host. There is no filter parameter: Starbucks' own API accepts a features amenity filter but silently ignores it, so it is deliberately not offered here; filter on each store's returned amenities instead. A place Starbucks cannot resolve returns a well-formed empty result with place_not_found set to true rather than an error. The upstream returns at most 50 stores per request and supports no pagination; result_capped is true when that ceiling was reached. Store discovery works worldwide, but hours, amenities, and phone numbers are populated per market and may be absent outside the US and UK.", - "operationId": "starbucks-stores", + "description": "Returns a The Straits Times author's profile by `url`, a canonical `straitstimes.com/authors/` link: name, email when the author's page publishes one, and recent articles with title, URL, summary, author, image, `type` and publication time.", + "operationId": "straitstimes-author", "parameters": [ { - "description": "Free-text city, address, or postal code, geocoded by Starbucks", - "in": "query", - "name": "place", - "type": "string", - "x-example": "Seattle, WA" - }, - { - "description": "Latitude, requires lng", - "in": "query", - "name": "lat", - "type": "number", - "x-example": 47.6062 - }, - { - "description": "Longitude, requires lat", - "in": "query", - "name": "lng", - "type": "number", - "x-example": -122.3321 - }, - { - "description": "Starbucks country site to read. One of: us, ca. Defaults to us", - "enum": [ - "us", - "ca" - ], + "description": "Canonical The Straits Times author URL", "in": "query", - "name": "market", + "name": "url", + "required": true, "type": "string", - "x-example": "us" + "x-example": "https://www.straitstimes.com/authors/example-author" } ], "produces": [ @@ -484083,7 +499180,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/starbucks.storesResponseDoc" + "$ref": "#/definitions/publicnews.straitstimesAuthorResponseDoc" } }, "400": { @@ -484092,8 +499189,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -484110,36 +499207,69 @@ "ApiKeyAuth": [] } ], - "summary": "Find nearby Starbucks stores worldwide", + "summary": "Get a The Straits Times author profile", "tags": [ - "Starbucks" + "The Straits Times" ] } }, - "/startpage/suggest": { + "/straitstimes/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Startpage search-box autocomplete completions for a query prefix, in Startpage's own ranking order. Startpage never returns more than 10 suggestions per prefix.", - "operationId": "startpage-suggest", + "description": "Returns the current headlines for one The Straits Times section. `section` is required and takes a slug such as `singapore`, `singapore/housing`, `asia/se-asia`, `business/economy`, `sport/formula-one` or `breaking-news`. Items carry the title and URL. Top-level sections such as `singapore` and `business` add summary and publication time; subsection pages such as `singapore/housing` add an image when shown.", + "operationId": "straitstimes-headlines", "parameters": [ { - "description": "Search query prefix", + "description": "The Straits Times section slug", + "enum": [ + "singapore", + "singapore/housing", + "singapore/health", + "singapore/transport", + "singapore/parenting-education", + "singapore/politics", + "singapore/jobs", + "singapore/environment", + "singapore/courts-crime", + "singapore/community", + "asia", + "asia/se-asia", + "asia/east-asia", + "asia/south-asia", + "asia/australianz", + "world", + "world/united-states", + "world/europe", + "world/middle-east", + "opinion", + "opinion/forum", + "life", + "life/entertainment", + "life/travel", + "life/food", + "life/home-design", + "life/style", + "life/arts", + "business", + "business/economy", + "business/banking", + "business/companies-markets", + "business/invest", + "sport", + "sport/basketball", + "sport/football", + "sport/formula-one", + "sport/golf", + "sport/schools", + "sport/tennis", + "sport/racing", + "tech", + "breaking-news" + ], "in": "query", - "name": "q", + "name": "section", "required": true, "type": "string", - "x-example": "openai" - }, - { - "description": "Suggestions to return; defaults to 10, clamped to 1..10", - "in": "query", - "maximum": 10, - "minimum": 1, - "name": "count", - "type": "integer", - "x-example": 10 + "x-example": "singapore" } ], "produces": [ @@ -484149,29 +499279,55 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/startpage.suggestResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The Straits Times section headlines", + "tags": [ + "The Straits Times" + ] + } + }, + "/straitstimes/news": { + "get": { + "description": "Returns the current top stories from The Straits Times. It takes no parameters. Each item has its title, URL and, where the outlet gives them, a summary, author, publication time, image URL and `type`. Use the headlines endpoint for one section.", + "operationId": "straitstimes-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, - "500": { - "description": "Internal server error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Startpage upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -484182,16 +499338,16 @@ "ApiKeyAuth": [] } ], - "summary": "Suggest Startpage search queries", + "summary": "Get The Straits Times top stories", "tags": [ - "Startpage" + "The Straits Times" ] } }, - "/startribune/news": { + "/straitstimes/sections": { "get": { - "description": "Returns the public Star Tribune RSS feed with current story titles and canonical URLs; publisher summaries and publication dates are included when supplied by the feed. Optional bylines and images are returned only when present. Summaries are publisher teasers, not full article text. This feed-only route does not claim a complete section taxonomy or retrieve article bodies; use attribution when republishing feed content.", - "operationId": "startribune-news", + "description": "Lists The Straits Times section slugs that the headlines endpoint accepts, including nested ones such as `singapore/politics`, `asia/east-asia`, `world/europe`, `life/food`, `business/invest`, `sport/tennis`, `tech` and `breaking-news`. Each entry has a `slug`, display `name` and `url`.", + "operationId": "straitstimes-sections", "produces": [ "application/json" ], @@ -484199,7 +499355,36 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The Straits Times sections", + "tags": [ + "The Straits Times" + ] + } + }, + "/strava/challenges": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns Strava's public challenge gallery: the currently promoted challenge plus every gallery section (partner challenges, and one section per sport such as run/ride), each with its challenges' goal, duration, and cover art. Public data, sourced from Strava's own challenge gallery.", + "operationId": "strava-challenges", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/strava.challengesResponseDoc" } }, "429": { @@ -484208,6 +499393,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -484220,27 +499411,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Minnesota Star Tribune top stories", + "summary": "Strava's public challenge gallery", "tags": [ - "Minnesota Star Tribune" + "Strava" ] } }, - "/steam/achievements": { + "/strava/clubs/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the global unlock percentage for each of an app's achievements, sorted most-unlocked first. Apps without global achievement stats return an empty list.", - "operationId": "steam-achievements", + "description": "Returns a Strava club's public profile: name, verified/private flags, location, description, member count, and cover/avatar images. Only the base public profile is returned -- discussion, leaderboard, member list, and recent-activity data require a logged-in Strava session and are not available. Public data, sourced from Strava's own server-rendered club page.", + "operationId": "strava-club", "parameters": [ { - "description": "Numeric Steam app id", - "in": "query", - "name": "appid", + "description": "Strava club ID", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "440" + "x-example": "521703" } ], "produces": [ @@ -484250,7 +499441,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.achievementsResponseDoc" + "$ref": "#/definitions/strava.clubResponseDoc" } }, "400": { @@ -484259,6 +499450,24 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -484271,47 +499480,57 @@ "ApiKeyAuth": [] } ], - "summary": "Get global achievement completion percentages for a Steam app", + "summary": "A Strava club's public profile", "tags": [ - "Steam" + "Strava" ] } }, - "/steam/app": { + "/strava/routes": { "get": { "consumes": [ "application/json" ], - "description": "Returns store metadata for a single Steam app (title, type, price, developers/publishers, platforms, genres, categories, release date, metacritic, recommendation and achievement counts). cc selects the store region (and price currency) and l the text language. filters is a comma-separated subset of allowed fields to shrink the payload.", - "operationId": "steam-app", + "description": "Returns a page of Strava's public route recommendations for a sport, country, and region (state, or state/city). `sport` values: `hiking`, `road-biking`, `mountain-biking`, `trail-running`, `gravel-biking`. Public data, sourced from Strava's own server-rendered route pages.", + "operationId": "strava-routes", "parameters": [ { - "description": "Numeric Steam app id", + "description": "Route sport. Allowed values: hiking, road-biking, mountain-biking, trail-running, gravel-biking", + "enum": [ + "hiking", + "road-biking", + "mountain-biking", + "trail-running", + "gravel-biking" + ], "in": "query", - "name": "appid", + "name": "sport", "required": true, "type": "string", - "x-example": "570" + "x-example": "hiking" }, { - "default": "us", - "description": "Store country code (ISO, selects currency)", + "description": "Country slug, e.g. usa", "in": "query", - "name": "cc", - "type": "string" + "name": "country", + "required": true, + "type": "string", + "x-example": "usa" }, { - "default": "en", - "description": "Language code", + "description": "Region slug: a state (colorado) or state/city (colorado/boulder)", "in": "query", - "name": "l", - "type": "string" + "name": "region", + "required": true, + "type": "string", + "x-example": "colorado" }, { - "description": "Comma-separated fields: basic, price_overview, developers, publishers, categories, genres, release_date, platforms, metacritic, achievements, screenshots, movies, recommendations, controller_support, dlc, short_description, supported_languages, packages, package_groups, ratings, content_descriptors, background", + "description": "Page number, starting at 1", "in": "query", - "name": "filters", - "type": "string" + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -484321,7 +499540,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.appResponseDoc" + "$ref": "#/definitions/strava.routesResponseDoc" } }, "400": { @@ -484336,6 +499555,18 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -484348,78 +499579,88 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steam store details for an app", + "summary": "Strava route-index listing for a sport, country, and region", "tags": [ - "Steam" + "Strava" ] } }, - "/steam/category/{slug}": { + "/strava/routes/detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns a catalog slice for a community tag / category, carrying each item's WEIGHTED community tags, review-score breakdown, developer/publisher credits, release date, platforms and price. The slug is a numeric tag id or a tag name (case- and separator-insensitive, e.g. rogue_like); resolve ids via /steam/tags/list. Ordering is Steam's default relevance — for sorted or os/price-faceted browse use /steam/tags.", - "operationId": "steam-category", + "description": "Returns a single Strava route's detail: type, difficulty, distance, elevation gain, estimated time, and summary. `path` is the relative route path returned by `/strava/routes` results (e.g. `hiking/usa/colorado/boulder/mallory-cave_5171952737974445730`). Public data, sourced from Strava's own server-rendered route pages.", + "operationId": "strava-route-detail", "parameters": [ { - "description": "Community tag id (numeric) or tag name slug", - "in": "path", - "name": "slug", + "description": "Relative route path, from a /strava/routes result's path field", + "in": "query", + "name": "path", "required": true, "type": "string", - "x-example": "rogue_like" - }, - { - "default": false, - "description": "Only free titles", - "in": "query", - "name": "free", - "type": "boolean" - }, - { - "default": false, - "description": "Only already-released titles", - "in": "query", - "name": "released_only", - "type": "boolean" + "x-example": "hiking/usa/colorado/boulder/mallory-cave_5171952737974445730" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/strava.routeDetailResponseDoc" + } }, - { - "default": false, - "description": "Only unreleased / coming-soon titles", - "in": "query", - "name": "coming_soon_only", - "type": "boolean" + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } }, - { - "default": 0, - "description": "Result offset for pagination", - "in": "query", - "name": "start", - "type": "integer" + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } }, - { - "default": 25, - "description": "Results per page (max 100)", - "in": "query", - "name": "count", - "type": "integer" + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "default": "english", - "description": "Steam store language name", - "in": "query", - "name": "l", - "type": "string" + "ApiKeyAuth": [] } ], + "summary": "A single Strava route's detail page", + "tags": [ + "Strava" + ] + } + }, + "/streeteasy/areas": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Lists StreetEasy's search area hierarchy: NYC and NJ roots, boroughs, neighborhoods and sub-neighborhoods. Each area has an `id`, `parentId`, `level`, `name` and `short` name. Use an `id` as a repeated `area_id` in `/streeteasy/rentals/search`. The list was 349 options on 2026-09-29 and can change.", + "operationId": "streeteasy-areas", "produces": [ "application/json" ], @@ -484427,17 +499668,14 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.categoryBrowseResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "items": { + "$ref": "#/definitions/streeteasy.Area" + }, + "type": "array" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -484454,40 +499692,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a store category (tag) with weighted community tags", + "summary": "List StreetEasy search areas", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/charts/concurrent": { + "/streeteasy/buildings/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the live leaderboard of games ranked by current concurrent players (rank, appid, current concurrent, peak). By default each row is enriched with the game name and review summary; pass enrich=false for raw ranked app ids.", - "operationId": "steam-charts-concurrent", + "description": "Retrieves public building facts, location, description, policies, amenities, and available sale/rental listing cards from StreetEasy's server-rendered building page. Pass the building slug from a StreetEasy /building/{slug} URL.", + "operationId": "streeteasy-building", "parameters": [ { - "default": true, - "description": "Attach game name and review summary to each rank", - "in": "query", - "name": "enrich", - "type": "boolean" - }, - { - "default": "us", - "description": "Store country code (ISO) for name enrichment", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "english", - "description": "Steam store language name for name enrichment", - "in": "query", - "name": "l", - "type": "string" + "description": "StreetEasy building slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "tribeca-space" } ], "produces": [ @@ -484497,7 +499722,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.chartResponseDoc" + "$ref": "#/definitions/streeteasy.BuildingDetails" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -484512,42 +499755,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steam's live games-by-concurrent-players leaderboard", + "summary": "Get StreetEasy building details", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/charts/most-played": { + "/streeteasy/market-data/catalog": { "get": { "consumes": [ "application/json" ], - "description": "Returns Steam's weekly most-played chart: the top games ranked by peak concurrent players over the last week (rank, appid, previous-week rank, peak players). By default each row is enriched with the game name and review summary; pass enrich=false for the raw ranked app ids only.", - "operationId": "steam-charts-most-played", - "parameters": [ - { - "default": true, - "description": "Attach game name and review summary to each rank", - "in": "query", - "name": "enrich", - "type": "boolean" - }, - { - "default": "us", - "description": "Store country code (ISO) for name enrichment", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "english", - "description": "Steam store language name for name enrichment", - "in": "query", - "name": "l", - "type": "string" - } - ], + "description": "Lists the 63 monthly metrics selectable in StreetEasy's Data Dashboard. Each has an `id`, display `label`, a sales or rentals `type`, a `bedrooms` segment and a `property_type`. Pass an `id` to `streeteasy-market-data-series` to get that metric's data. Takes no parameters.", + "operationId": "streeteasy-market-data-catalog", "produces": [ "application/json" ], @@ -484555,7 +499775,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.chartResponseDoc" + "$ref": "#/definitions/streeteasy.MarketDataCatalog" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -484570,19 +499796,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steam's weekly most-played games chart", + "summary": "List StreetEasy dashboard metric datasets", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/charts/top-releases": { + "/streeteasy/market-data/indices": { "get": { "consumes": [ "application/json" ], - "description": "Returns Steam's monthly top-releases index: one page per month, each listing that month's top-released app ids (with the month label and start date). The app-id lists are large and not name-enriched; resolve names via /steam/items.", - "operationId": "steam-charts-top-releases", + "description": "Returns public sale-price and rent index values by dashboard area. The datasets have different historical start dates; missing values are omitted. Defaults to the latest 12 months and limits each request to 36 months.", + "operationId": "streeteasy-market-indices", + "parameters": [ + { + "description": "First month, inclusive, in YYYY-MM format", + "in": "query", + "name": "start_month", + "type": "string" + }, + { + "description": "Last month, inclusive, in YYYY-MM format; defaults to the latest available month", + "in": "query", + "name": "end_month", + "type": "string" + } + ], "produces": [ "application/json" ], @@ -484590,7 +499830,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.topReleasesResponseDoc" + "$ref": "#/definitions/streeteasy.MarketIndices" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -484605,65 +499857,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steam's monthly best-new-releases index", + "summary": "Get StreetEasy monthly market indices", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/community-recommendations": { + "/streeteasy/market-data/inventory": { "get": { "consumes": [ "application/json" ], - "description": "Returns a batch of recent, quality user reviews recommended across the whole store (author, playtime, helpful votes, and the recommended app). Filter by review kind/sort, reviewer playtime window, review language, and store region. The endpoint serves a fixed batch and does not support tag filtering or deep pagination.", - "operationId": "steam-community-recommendations", + "description": "Returns monthly sales and rental inventory counts for every area in StreetEasy's public Data Dashboard. Defaults to the latest 12 available months; each request is limited to 36 months.", + "operationId": "streeteasy-market-inventory", "parameters": [ { - "default": "helpful", - "description": "Review kind / sort", - "enum": [ - "helpful", - "recent", - "funny" - ], - "in": "query", - "name": "review_filter", - "type": "string" - }, - { - "default": 0, - "description": "Minimum reviewer playtime in hours (0 = no minimum)", - "in": "query", - "name": "playtime_min", - "type": "integer" - }, - { - "default": 0, - "description": "Maximum reviewer playtime in hours (0 = no maximum)", - "in": "query", - "name": "playtime_max", - "type": "integer" - }, - { - "default": "my_languages", - "description": "Review language: 'my_languages' or a Steam language name", - "in": "query", - "name": "review_language", - "type": "string" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", + "description": "First month, inclusive, in YYYY-MM format", "in": "query", - "name": "cc", + "name": "start_month", "type": "string" }, { - "default": "en", - "description": "Language code", + "description": "Last month, inclusive, in YYYY-MM format; defaults to the latest available month", "in": "query", - "name": "l", + "name": "end_month", "type": "string" } ], @@ -484674,7 +499891,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.communityRecommendationsResponseDoc" + "$ref": "#/definitions/streeteasy.MarketInventory" } }, "400": { @@ -484683,6 +499900,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -484695,32 +499918,103 @@ "ApiKeyAuth": [] } ], - "summary": "Get the store's community-recommended reviews feed", + "summary": "Get StreetEasy monthly market inventory", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/featured": { + "/streeteasy/market-data/series": { "get": { "consumes": [ "application/json" ], - "description": "Returns the storefront's featured capsules for a region (per-platform featured lists plus large spotlight capsules), including discount and price fields.", - "operationId": "steam-featured", + "description": "Returns a public dashboard metric for every published area. Obtain the complete dataset ID set and its labels/dimensions from streeteasy-market-data-catalog. Defaults to the latest 12 months and limits requests to 36 months.", + "operationId": "streeteasy-market-data-series", "parameters": [ { - "default": "us", - "description": "Store country code (ISO, selects currency)", + "description": "StreetEasy dashboard dataset ID", + "enum": [ + "medianAskingPPSF", + "medianAskingPPSFOneBd", + "medianAskingPPSFStudio", + "medianAskingPPSFThreePlusBd", + "medianAskingPPSFTwoBd", + "medianAskingPrice", + "medianAskingPriceCondo", + "medianAskingPriceCoop", + "medianAskingPriceSfr", + "medianAskingRent", + "medianAskingRentOneBd", + "medianAskingRentStudio", + "medianAskingRentThreePlusBd", + "medianAskingRentTwoBd", + "medianDaysMarket", + "medianDaysMarketCondo", + "medianDaysMarketCoop", + "medianRecordedSalesPrice", + "medianRecordedSalesPriceCondo", + "medianRecordedSalesPriceCoop", + "medianRecordedSalesPriceSfr", + "medianRentalDiscount", + "medianRentalDiscountOneBd", + "medianRentalDiscountStudio", + "medianRentalDiscountThreePlusBd", + "medianRentalDiscountTwoBd", + "newInventory", + "newInventoryCondo", + "newInventoryCoop", + "newInventorySfr", + "priceIndex", + "recordedSales", + "recordedSalesCondo", + "recordedSalesCoop", + "recordedSalesSfr", + "rentIndex", + "rentalConcessions", + "rentalInventory", + "rentalInventoryOneBd", + "rentalInventoryStudio", + "rentalInventoryThreePlusBd", + "rentalInventoryTwoBd", + "saleListRatio", + "saleListRatioCondo", + "saleListRatioCoop", + "saleListRatioSfr", + "salesInventory", + "salesInventoryCondo", + "salesInventoryCoop", + "salesInventoryOneBd", + "salesInventorySfr", + "salesInventoryStudio", + "salesInventoryThreePlusBd", + "salesInventoryTwoBd", + "shareOfRentalsDiscounted", + "shareOfRentalsDiscountedOneBd", + "shareOfRentalsDiscountedStudio", + "shareOfRentalsDiscountedThreePlusBd", + "shareOfRentalsDiscountedTwoBd", + "sharePriceCut", + "sharePriceCutCondo", + "sharePriceCutCoop", + "sharePriceCutSfr" + ], "in": "query", - "name": "cc", + "name": "dataset", + "required": true, + "type": "string", + "x-example": "medianAskingPPSF" + }, + { + "description": "First month, inclusive, in YYYY-MM format", + "in": "query", + "name": "start_month", "type": "string" }, { - "default": "en", - "description": "Language code", + "description": "Last month, inclusive, in YYYY-MM format; defaults to the latest available month", "in": "query", - "name": "l", + "name": "end_month", "type": "string" } ], @@ -484731,7 +500025,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.featuredResponseDoc" + "$ref": "#/definitions/streeteasy.MarketDataSeries" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -484746,33 +500052,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get the Steam store featured capsules", + "summary": "Get one StreetEasy monthly market metric", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/featured-categories": { + "/streeteasy/quick-search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the storefront merchandising buckets for a region: specials, top_sellers, new_releases, and coming_soon, each with its item list.", - "operationId": "steam-featured-categories", + "description": "Searches StreetEasy's public quick-search page and returns its rendered neighborhood, building, complex, school, agent, and recorded-sale groups. Recorded-sale entries are a limited anonymous preview when the page requires registration to see the remaining matches.", + "operationId": "streeteasy-quick-search", "parameters": [ { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "en", - "description": "Language code", + "description": "Free-text StreetEasy quick-search query (1-160 characters)", "in": "query", - "name": "l", - "type": "string" + "name": "query", + "required": true, + "type": "string", + "x-example": "Astoria" } ], "produces": [ @@ -484782,7 +500082,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.featuredCategoriesResponseDoc" + "$ref": "#/definitions/streeteasy.QuickSearchResult" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -484797,41 +500109,256 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steam top sellers, new releases, specials and coming soon", + "summary": "Search StreetEasy across public result types", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/items": { + "/streeteasy/rentals/search": { "get": { "consumes": [ "application/json" ], - "description": "Resolves up to 100 Steam app ids in one call to store items, each carrying its WEIGHTED community tags, review-score breakdown, developer/publisher credits, release date, platforms and price. The batch enrichment primitive for the community-tag taxonomy.", - "operationId": "steam-items", + "description": "Searches active StreetEasy rentals in one or more areas with the public site's price, room, building, amenity, pet, open-house, tour, transit, and sort filters. Obtain valid area IDs from /streeteasy/areas.", + "operationId": "streeteasy-rentals-search", "parameters": [ { - "description": "Comma-separated numeric app ids (max 100)", + "collectionFormat": "multi", + "description": "StreetEasy area ID from /streeteasy/areas; repeat for multiple areas", "in": "query", - "name": "appids", + "items": { + "type": "integer" + }, + "name": "area_id", "required": true, - "type": "string", - "x-example": "570,730,1623730" + "type": "array", + "x-example": 271 }, { - "default": "us", - "description": "Store country code (ISO, selects currency)", + "default": 1, + "description": "1-based result page", "in": "query", - "name": "cc", - "type": "string" + "name": "page", + "type": "integer" }, { - "default": "english", - "description": "Steam store language name", + "default": 500, + "description": "Results per page, 1-500", "in": "query", - "name": "l", + "name": "per_page", + "type": "integer" + }, + { + "description": "Result order", + "enum": [ + "default", + "newest", + "recently_updated", + "price_desc", + "price_asc", + "largest", + "smallest" + ], + "in": "query", + "name": "sort", "type": "string" + }, + { + "description": "Minimum monthly rent", + "in": "query", + "name": "min_price", + "type": "integer" + }, + { + "description": "Maximum monthly rent", + "in": "query", + "name": "max_price", + "type": "integer" + }, + { + "description": "Minimum bedrooms; zero means studio", + "in": "query", + "name": "min_bedrooms", + "type": "integer" + }, + { + "description": "Maximum bedrooms", + "in": "query", + "name": "max_bedrooms", + "type": "integer" + }, + { + "description": "Minimum bathrooms", + "in": "query", + "name": "min_bathrooms", + "type": "number" + }, + { + "description": "Maximum bathrooms", + "in": "query", + "name": "max_bathrooms", + "type": "number" + }, + { + "description": "Minimum square footage", + "in": "query", + "name": "min_sqft", + "type": "integer" + }, + { + "description": "Maximum square footage", + "in": "query", + "name": "max_sqft", + "type": "integer" + }, + { + "collectionFormat": "multi", + "description": "Building type; repeat for multiple", + "in": "query", + "items": { + "enum": [ + "rental", + "condo", + "co-op", + "house", + "multifamily" + ], + "type": "string" + }, + "name": "building_type", + "type": "array" + }, + { + "collectionFormat": "multi", + "description": "Required amenity; repeat for multiple", + "in": "query", + "items": { + "enum": [ + "washer_dryer", + "dishwasher", + "private_outdoor_space", + "central_air", + "furnished", + "fireplace", + "loft", + "city_view", + "garden_view", + "park_view", + "skyline_view", + "water_view", + "elevator", + "doorman", + "laundry", + "gym", + "parking", + "shared_outdoor_space", + "pool", + "pied_a_terre", + "childrens_playroom", + "smoke_free", + "storage" + ], + "type": "string" + }, + "name": "amenity", + "type": "array" + }, + { + "collectionFormat": "multi", + "description": "Preferred amenity; results may omit these. Repeat for multiple.", + "in": "query", + "items": { + "enum": [ + "washer_dryer", + "dishwasher", + "private_outdoor_space", + "central_air", + "furnished", + "fireplace", + "loft", + "city_view", + "garden_view", + "park_view", + "skyline_view", + "water_view", + "elevator", + "doorman", + "laundry", + "gym", + "parking", + "shared_outdoor_space", + "pool", + "pied_a_terre", + "childrens_playroom", + "smoke_free", + "storage" + ], + "type": "string" + }, + "name": "optional_amenity", + "type": "array" + }, + { + "description": "Require listings that allow pets", + "in": "query", + "name": "pets_allowed", + "type": "boolean" + }, + { + "description": "Require an open house within the next seven days", + "in": "query", + "name": "open_house", + "type": "boolean" + }, + { + "description": "Require a 3D tour", + "in": "query", + "name": "tour_3d", + "type": "boolean" + }, + { + "description": "Require a video tour", + "in": "query", + "name": "video_tour", + "type": "boolean" + }, + { + "collectionFormat": "multi", + "description": "Nearby transit line; repeat for multiple", + "in": "query", + "items": { + "enum": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "A", + "C", + "E", + "B", + "D", + "F", + "M", + "G", + "N", + "Q", + "R", + "W", + "J", + "Z", + "L", + "S", + "HBLR", + "PATH" + ], + "type": "string" + }, + "name": "transit_line", + "type": "array" } ], "produces": [ @@ -484841,7 +500368,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.itemsResponseDoc" + "$ref": "#/definitions/streeteasy.RentalSearch" } }, "400": { @@ -484850,6 +500377,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -484862,41 +500395,386 @@ "ApiKeyAuth": [] } ], - "summary": "Resolve a batch of app ids to store items with weighted tags", + "summary": "Search StreetEasy rental listings", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/news": { + "/streeteasy/sales/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns recent news and announcement posts for a Steam app by numeric `appid` (for example `570`). `count` sets the number of posts (default 10, max 50) and `maxlength` caps each post body in characters (default 300, `-1` for the full body). Each post has `gid`, title, URL, author, contents, feed label and name, `date`, `is_external_url` and `tags`.", - "operationId": "steam-news", + "description": "Searches public sale listings with location, status, sale type, price, bedroom, bathroom, square-footage, carrying cost, building age, school, ZIP, keyword, building type, amenity, pet, open-house, virtual-tour, transit, and sort filters. Obtain area IDs from /streeteasy/areas. When sale_status is omitted, active, preview, and coming_soon listings are included.", + "operationId": "streeteasy-sales-search", "parameters": [ { - "description": "Numeric Steam app id", + "collectionFormat": "multi", + "description": "StreetEasy area ID from /streeteasy/areas; repeat for multiple areas", "in": "query", - "name": "appid", + "items": { + "type": "integer" + }, + "name": "area_id", "required": true, - "type": "string", - "x-example": "570" + "type": "array", + "x-example": 100 }, { - "default": 10, - "description": "Number of posts (max 50)", + "collectionFormat": "multi", + "description": "Sale status; repeat for multiple. Defaults to active, preview, and coming_soon.", "in": "query", - "name": "count", + "items": { + "enum": [ + "active", + "preview", + "coming_soon", + "in_contract", + "sold", + "unavailable" + ], + "type": "string" + }, + "name": "sale_status", + "type": "array" + }, + { + "collectionFormat": "multi", + "description": "Sale type; repeat for multiple.", + "in": "query", + "items": { + "enum": [ + "sponsor_unit", + "foreclosure", + "resale", + "restricted_sale" + ], + "type": "string" + }, + "name": "sale_type", + "type": "array" + }, + { + "default": 1, + "description": "1-based result page", + "in": "query", + "name": "page", "type": "integer" }, { - "default": 300, - "description": "Max characters of each post body; default 300, set -1 for full content", + "default": 500, + "description": "Results per page, 1-500", "in": "query", - "name": "maxlength", + "name": "per_page", + "type": "integer" + }, + { + "description": "default, newest, recently_updated, price_desc, price_asc, largest, or smallest", + "enum": [ + "default", + "newest", + "recently_updated", + "price_desc", + "price_asc", + "largest", + "smallest" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Minimum sale price", + "in": "query", + "name": "min_price", + "type": "integer" + }, + { + "description": "Maximum sale price", + "in": "query", + "name": "max_price", + "type": "integer" + }, + { + "description": "Minimum bedrooms; zero means studio", + "in": "query", + "name": "min_bedrooms", + "type": "integer" + }, + { + "description": "Maximum bedrooms", + "in": "query", + "name": "max_bedrooms", + "type": "integer" + }, + { + "description": "Minimum bathrooms", + "in": "query", + "name": "min_bathrooms", + "type": "number" + }, + { + "description": "Maximum bathrooms", + "in": "query", + "name": "max_bathrooms", + "type": "number" + }, + { + "description": "Minimum square footage", + "in": "query", + "name": "min_sqft", + "type": "integer" + }, + { + "description": "Maximum square footage", + "in": "query", + "name": "max_sqft", + "type": "integer" + }, + { + "description": "Minimum monthly maintenance fee", + "in": "query", + "name": "min_maintenance", + "type": "integer" + }, + { + "description": "Maximum monthly maintenance fee", + "in": "query", + "name": "max_maintenance", + "type": "integer" + }, + { + "description": "Minimum monthly property taxes", + "in": "query", + "name": "min_monthly_taxes", + "type": "integer" + }, + { + "description": "Maximum monthly property taxes", + "in": "query", + "name": "max_monthly_taxes", + "type": "integer" + }, + { + "description": "Minimum price per square foot", + "in": "query", + "name": "min_price_per_sqft", + "type": "integer" + }, + { + "description": "Maximum price per square foot", + "in": "query", + "name": "max_price_per_sqft", + "type": "integer" + }, + { + "description": "Include listings with unknown price per square foot", + "in": "query", + "name": "include_unknown_price_per_sqft", + "type": "boolean" + }, + { + "description": "Minimum building year built", + "in": "query", + "name": "min_year_built", + "type": "integer" + }, + { + "description": "Maximum building year built", + "in": "query", + "name": "max_year_built", "type": "integer" + }, + { + "description": "Set true to select prewar buildings", + "in": "query", + "name": "prewar", + "type": "boolean" + }, + { + "description": "New development filter", + "enum": [ + "pre_construction" + ], + "in": "query", + "name": "development", + "type": "string" + }, + { + "description": "Set true to select income-restricted homes", + "in": "query", + "name": "income_restricted", + "type": "boolean" + }, + { + "collectionFormat": "multi", + "description": "StreetEasy school ID selected by the public search UI; repeat for multiple schools", + "in": "query", + "items": { + "type": "integer" + }, + "name": "school_id", + "type": "array" + }, + { + "description": "Five-digit ZIP code", + "in": "query", + "name": "zip_code", + "type": "string" + }, + { + "description": "Listing-description keyword filter", + "in": "query", + "name": "keywords", + "type": "string" + }, + { + "collectionFormat": "multi", + "description": "Building type", + "in": "query", + "items": { + "enum": [ + "condo", + "co-op", + "house", + "multifamily" + ], + "type": "string" + }, + "name": "building_type", + "type": "array" + }, + { + "collectionFormat": "multi", + "description": "Amenity filter; repeat for multiple", + "in": "query", + "items": { + "enum": [ + "washer_dryer", + "dishwasher", + "private_outdoor_space", + "central_air", + "furnished", + "fireplace", + "loft", + "city_view", + "garden_view", + "park_view", + "skyline_view", + "water_view", + "elevator", + "doorman", + "laundry", + "gym", + "parking", + "shared_outdoor_space", + "pool", + "pied_a_terre", + "childrens_playroom", + "smoke_free", + "storage" + ], + "type": "string" + }, + "name": "amenity", + "type": "array" + }, + { + "collectionFormat": "multi", + "description": "Nice-to-have amenity; results may omit these. Repeat for multiple.", + "in": "query", + "items": { + "enum": [ + "washer_dryer", + "dishwasher", + "private_outdoor_space", + "central_air", + "furnished", + "fireplace", + "loft", + "city_view", + "garden_view", + "park_view", + "skyline_view", + "water_view", + "elevator", + "doorman", + "laundry", + "gym", + "parking", + "shared_outdoor_space", + "pool", + "pied_a_terre", + "childrens_playroom", + "smoke_free", + "storage" + ], + "type": "string" + }, + "name": "optional_amenity", + "type": "array" + }, + { + "description": "Require pets allowed", + "in": "query", + "name": "pets_allowed", + "type": "boolean" + }, + { + "description": "Require open house within the next seven days", + "in": "query", + "name": "open_house", + "type": "boolean" + }, + { + "description": "Require a 3D tour", + "in": "query", + "name": "tour_3d", + "type": "boolean" + }, + { + "description": "Require a video tour", + "in": "query", + "name": "video_tour", + "type": "boolean" + }, + { + "collectionFormat": "multi", + "description": "Nearby transit line; repeat for multiple", + "in": "query", + "items": { + "enum": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "A", + "C", + "E", + "B", + "D", + "F", + "M", + "G", + "N", + "Q", + "R", + "W", + "J", + "Z", + "L", + "S", + "HBLR", + "PATH" + ], + "type": "string" + }, + "name": "transit_line", + "type": "array" } ], "produces": [ @@ -484906,7 +500784,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.newsResponseDoc" + "$ref": "#/definitions/streeteasy.SaleSearch" } }, "400": { @@ -484915,6 +500793,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -484927,41 +500811,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get recent news posts for a Steam app", + "summary": "Search StreetEasy sale listings", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/package": { + "/streeteasy/schools/{slug}": { "get": { "consumes": [ "application/json" ], - "description": "Returns details for a Steam package (a purchasable bundle): name, the apps it contains, price, platforms, and release date. cc selects the store region and price currency.", - "operationId": "steam-package", - "parameters": [ - { - "description": "Numeric Steam package id", - "in": "query", - "name": "packageid", - "required": true, - "type": "string", - "x-example": "68179" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" - }, + "description": "Retrieves the public school facts rendered on StreetEasy, including neighborhood, grade labels, district, address, phone, and fax when available. Use the school slug from a public /nyc/school/{slug} link, including the school results returned by streeteasy-quick-search.", + "operationId": "streeteasy-school", + "parameters": [ { - "default": "en", - "description": "Language code", - "in": "query", - "name": "l", - "type": "string" + "description": "StreetEasy school slug", + "in": "path", + "name": "slug", + "required": true, + "type": "string", + "x-example": "q286-queens" } ], "produces": [ @@ -484971,7 +500841,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.packageResponseDoc" + "$ref": "#/definitions/streeteasy.SchoolDetails" } }, "400": { @@ -484986,6 +500856,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -484998,27 +500874,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steam store details for a package", + "summary": "Get StreetEasy school details", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/players": { + "/streeteasy/units/{building_slug}/{unit}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the current number of concurrent players for a Steam app, given its numeric `appid` such as `570`. The response has `appid`, `player_count` and a `source_url`. An app with no player-count data returns 404.", - "operationId": "steam-players", + "description": "Retrieves a public unit's structured listing details from its server-rendered page, including address, asking price, description, amenities, and scheduled open houses.", + "operationId": "streeteasy-unit", "parameters": [ { - "description": "Numeric Steam app id", - "in": "query", - "name": "appid", + "description": "StreetEasy building slug", + "in": "path", + "name": "building_slug", "required": true, "type": "string", - "x-example": "570" + "x-example": "nusun-vernon" + }, + { + "description": "StreetEasy unit segment from /building/{building_slug}/{unit}", + "in": "path", + "name": "unit", + "required": true, + "type": "string", + "x-example": "2p" } ], "produces": [ @@ -485028,7 +500912,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.playersResponseDoc" + "$ref": "#/definitions/streeteasy.UnitDetails" } }, "400": { @@ -485043,6 +500927,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -485055,91 +500945,81 @@ "ApiKeyAuth": [] } ], - "summary": "Get the current concurrent-player count for a Steam app", + "summary": "Get StreetEasy unit details", "tags": [ - "Steam" + "StreetEasy" ] } }, - "/steam/reviews": { + "/stubhub/carousel": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of user reviews for an app with cursor pagination and an aggregate query_summary (score, positive/negative totals). Aggregate totals populate only on the first page (cursor=*). Pass the returned cursor back to page.", - "operationId": "steam-reviews", + "description": "Returns the performer-page alternative, recently viewed, maybe-interested, and trending-event carousel sections. Obtain performer_slug and performer_id from a real StubHub performer URL or another StubHub result.", + "operationId": "stubhub-carousel", "parameters": [ { - "description": "Numeric Steam app id", + "description": "StubHub performer URL slug", "in": "query", - "name": "appid", + "name": "performer_slug", "required": true, "type": "string", - "x-example": "570" - }, - { - "default": "recent", - "description": "Sort order", - "enum": [ - "recent", - "updated", - "all" - ], - "in": "query", - "name": "filter", - "type": "string" + "x-example": "g-e-m-tickets" }, { - "default": "english", - "description": "Steam language name or 'all'", + "description": "StubHub performer numeric id", "in": "query", - "name": "language", - "type": "string" + "name": "performer_id", + "required": true, + "type": "integer", + "x-example": 1503169 }, { - "default": "all", - "description": "Review sentiment filter", + "description": "Top-level category: 1 (Theater), 2 (Sports), or 3 (Concerts)", "enum": [ - "all", - "positive", - "negative" + 1, + 2, + 3 ], "in": "query", - "name": "review_type", - "type": "string" + "name": "top_level_category_id", + "required": true, + "type": "integer", + "x-example": 1 }, { - "default": "all", - "description": "Purchase source filter", - "enum": [ - "all", - "steam", - "non_steam_purchase" - ], + "description": "StubHub category id", "in": "query", - "name": "purchase_type", - "type": "string" + "name": "category_id", + "required": true, + "type": "integer", + "x-example": 23022 }, { - "default": 365, - "description": "Look-back window in days (filter=all only, max 365)", + "description": "Latitude", "in": "query", - "name": "day_range", - "type": "integer" + "name": "lat", + "required": true, + "type": "number", + "x-example": 22.364 }, { - "default": 20, - "description": "Reviews per page (max 100)", + "description": "Longitude", "in": "query", - "name": "num_per_page", - "type": "integer" + "name": "lon", + "required": true, + "type": "number", + "x-example": 114.109 }, { - "default": "*", - "description": "Pagination cursor from the previous page", + "default": 10, + "description": "Maximum items per carousel section; defaults to 10", "in": "query", - "name": "cursor", - "type": "string" + "maximum": 50, + "minimum": 1, + "name": "max", + "type": "integer" } ], "produces": [ @@ -485149,7 +501029,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.reviewsResponseDoc" + "$ref": "#/definitions/stubhub.carouselResponseDoc" } }, "400": { @@ -485158,12 +501038,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -485176,34 +501050,49 @@ "ApiKeyAuth": [] } ], - "summary": "List reviews for a Steam app", + "summary": "List StubHub performer discovery carousels", "tags": [ - "Steam" + "StubHub" ] } }, - "/steam/reviews/histogram": { + "/stubhub/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the positive/negative recommendation counts over time (the store review graph): weekly/monthly rollups plus recent daily buckets.", - "operationId": "steam-reviews-histogram", + "description": "Lists categories with currently-listed minimum ticket prices for a location and date range. This is a changing location/date-scoped feed, not the complete navigation taxonomy; use stubhub-navigation-categories for the full Theater, Sports, and Concerts tree.", + "operationId": "stubhub-categories", "parameters": [ { - "description": "Numeric Steam app id", + "description": "Latitude, -90 to 90", "in": "query", - "name": "appid", + "name": "lat", + "required": true, + "type": "number", + "x-example": 34.0549076 + }, + { + "description": "Longitude, -180 to 180", + "in": "query", + "name": "lon", "required": true, + "type": "number", + "x-example": -118.242643 + }, + { + "description": "Start of the date range: RFC3339 or a bare date (e.g. 2026-09-15). Defaults to now.", + "in": "query", + "name": "from", "type": "string", - "x-example": "570" + "x-example": "2026-09-15" }, { - "default": "english", - "description": "Steam language name or 'all'", + "description": "End of the date range, same accepted formats as from. Defaults to 14 days after from.", "in": "query", - "name": "language", - "type": "string" + "name": "to", + "type": "string", + "x-example": "2026-09-29" } ], "produces": [ @@ -485213,7 +501102,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.histogramResponseDoc" + "$ref": "#/definitions/stubhub.categoriesResponseDoc" } }, "400": { @@ -485222,12 +501111,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -485240,41 +501123,81 @@ "ApiKeyAuth": [] } ], - "summary": "Get the review up/down histogram for a Steam app", + "summary": "List StubHub's location-scoped category prices", "tags": [ - "Steam" + "StubHub" ] } }, - "/steam/search": { + "/stubhub/category-events": { "get": { "consumes": [ "application/json" ], - "description": "Resolves a search term to Steam apps via the store typeahead (title, appid, price, platforms, metascore). Best for title -> appid lookup; returns roughly ten results. For faceted, paginated search use /steam/search/results.", - "operationId": "steam-search", + "description": "Lists paginated events in a single StubHub category (a sport league, team, or a top-level vertical -- use stubhub-categories to discover category ids) filtered by location, radius, and date range. A zero count with an empty events list is a valid no-results response.", + "operationId": "stubhub-category-events", "parameters": [ { - "description": "Search term", + "description": "A category id from stubhub-categories", "in": "query", - "name": "term", + "name": "category_id", + "required": true, + "type": "integer", + "x-example": 3 + }, + { + "description": "Latitude, -90 to 90", + "in": "query", + "name": "lat", + "required": true, + "type": "number", + "x-example": 40.7127753 + }, + { + "description": "Longitude, -180 to 180", + "in": "query", + "name": "lon", "required": true, + "type": "number", + "x-example": -74.0059728 + }, + { + "description": "Start of the date range: RFC3339 or a bare date (e.g. 2026-09-15). Defaults to now.", + "in": "query", + "name": "from", "type": "string", - "x-example": "portal" + "x-example": "2026-09-15" }, { - "default": "us", - "description": "Store country code (ISO, selects currency)", + "description": "End of the date range, same accepted formats as from. Defaults to 14 days after from.", "in": "query", - "name": "cc", - "type": "string" + "name": "to", + "type": "string", + "x-example": "2026-09-29" }, { - "default": "en", - "description": "Language code", + "default": 1, + "description": "One-based result page", "in": "query", - "name": "l", - "type": "string" + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 50, + "description": "Search radius in miles from lat/lon", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "radius_miles", + "type": "integer" + }, + { + "default": false, + "description": "Also include parking-pass-only listings alongside regular events", + "in": "query", + "name": "include_parking_passes", + "type": "boolean" } ], "produces": [ @@ -485284,7 +501207,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.searchResponseDoc" + "$ref": "#/definitions/stubhub.categoryEventsResponseDoc" } }, "400": { @@ -485305,70 +501228,81 @@ "ApiKeyAuth": [] } ], - "summary": "Search the Steam store by title", + "summary": "List StubHub events in one category near a location", "tags": [ - "Steam" + "StubHub" ] } }, - "/steam/search/results": { + "/stubhub/explore": { "get": { "consumes": [ "application/json" ], - "description": "Runs the Steam store search with pagination and sorting and returns the result rows (appid, title, release date, review summary, price, platforms). Supports start/count paging and sort_by.", - "operationId": "steam-search-results", + "description": "Discovers events near a location within a date range, optionally bounded by ticket price and by category. A zero count with an empty events list is a valid no-results response.", + "operationId": "stubhub-explore", "parameters": [ { - "description": "Search term", + "description": "Latitude, -90 to 90", "in": "query", - "name": "term", + "name": "lat", + "required": true, + "type": "number", + "x-example": 34.0549076 + }, + { + "description": "Longitude, -180 to 180", + "in": "query", + "name": "lon", "required": true, + "type": "number", + "x-example": -118.242643 + }, + { + "description": "Start of the date range: RFC3339 or a bare date (e.g. 2026-09-15). Defaults to now.", + "in": "query", + "name": "from", "type": "string", - "x-example": "roguelike" + "x-example": "2026-09-15" }, { - "default": 0, - "description": "Result offset for pagination", + "description": "End of the date range, same accepted formats as from. Defaults to 14 days after from.", "in": "query", - "name": "start", - "type": "integer" + "name": "to", + "type": "string", + "x-example": "2026-09-29" }, { - "default": 25, - "description": "Results per page (max 100)", + "description": "Minimum ticket price filter", "in": "query", - "name": "count", + "name": "price_min", "type": "integer" }, { - "default": "Relevance", - "description": "Sort order", - "enum": [ - "Relevance", - "Released_DESC", - "Name_ASC", - "Price_ASC", - "Price_DESC", - "Reviews_DESC" - ], + "description": "Maximum ticket price filter", "in": "query", - "name": "sort_by", - "type": "string" + "name": "price_max", + "type": "integer" }, { - "default": "us", - "description": "Store country code (ISO, selects currency)", + "default": 0, + "description": "Filter to one top-level vertical", + "enum": [ + 0, + 1, + 2, + 3 + ], "in": "query", - "name": "cc", - "type": "string" + "name": "top_level_category_id", + "type": "integer" }, { - "default": "en", - "description": "Language code", + "description": "Filter to one category/subcategory id. stubhub-categories discovers ids with a currently-listed event nearby, but only a small subset -- known-good ids: NBA 6453, MLB 6456, NFL 5084, NHL 4871, MLS 5062, Tennis 1012, Golf 1009 (Sports); Pop/Rock 260542, Alternative Music 1059, Classical 1014, R&B 1027, Rap and Hip-Hop Music 1026 (Concerts); Comedy 1015, Musicals 1017, Plays 358959, Family 2294 (Theater); Festival Tickets 1023 (works alone, no top_level_category_id needed)", "in": "query", - "name": "l", - "type": "string" + "name": "category_id", + "type": "integer", + "x-example": 6453 } ], "produces": [ @@ -485378,7 +501312,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.searchResultsResponseDoc" + "$ref": "#/definitions/stubhub.exploreResponseDoc" } }, "400": { @@ -485399,27 +501333,32 @@ "ApiKeyAuth": [] } ], - "summary": "Faceted, paginated Steam store search", + "summary": "Discover StubHub events near a location", "tags": [ - "Steam" + "StubHub" ] } }, - "/steam/steamspy": { + "/stubhub/navigation-categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns third-party ownership, concurrent-user, playtime, and review estimates for an app from SteamSpy. These are SteamSpy estimates, not official Steam figures.", - "operationId": "steam-steamspy", + "description": "Lists the nested navigation taxonomy for one StubHub top-level category. The upstream accepts exactly category_id 1 (Theater), 2 (Sports), or 3 (Concerts). Use the returned ids and URLs to discover category and subcategory pages.", + "operationId": "stubhub-navigation-categories", "parameters": [ { - "description": "Numeric Steam app id", + "description": "Top-level category: 1=Theater, 2=Sports, 3=Concerts", + "enum": [ + 1, + 2, + 3 + ], "in": "query", - "name": "appid", + "name": "category_id", "required": true, - "type": "string", - "x-example": "570" + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -485429,7 +501368,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.steamspyResponseDoc" + "$ref": "#/definitions/stubhub.navigationCategoriesResponseDoc" } }, "400": { @@ -485438,12 +501377,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -485456,162 +501389,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get SteamSpy third-party ownership and playtime estimates", + "summary": "List StubHub's complete top-level navigation tree", "tags": [ - "Steam" + "StubHub" ] } }, - "/steam/tags": { + "/stubhub/performer-events": { "get": { "consumes": [ "application/json" ], - "description": "Browses the store by the community-tag taxonomy (Roguelike, Metroidvania, Cozy...) and the store filter facets, with no free-text term. Filter by one or more tag ids, a store category id, platform (os), a maximum price, specials-only, and hide-free-to-play; sort and page the browse-rank rows. Each row includes its community tag ids (resolve names via /steam/tags/list). Pagination runs the full result set (total is the real, fully-pageable match count); paging past total returns an empty page.", - "operationId": "steam-tags", + "description": "Lists a performer or team's own upcoming schedule (event name, date, venue, starting price) from their StubHub page. Obtain a real performer_slug+performer_id pair from stubhub-trending's url field (e.g. https://www.stubhub.com/kansas-city-chiefs-tickets/performer/6063 -- slug \"kansas-city-chiefs-tickets\", id 6063). A zero count with an empty events list is a valid no-upcoming-events response.", + "operationId": "stubhub-performer-events", "parameters": [ { - "description": "Comma-separated numeric community tag ids (all must match); resolve ids via /steam/tags/list", - "in": "query", - "name": "tags", - "type": "string", - "x-example": "492,4136" - }, - { - "description": "Comma-separated numeric community tag ids to EXCLUDE", - "in": "query", - "name": "untags", - "type": "string", - "x-example": "4136" - }, - { - "description": "Numeric Steam store category id (e.g. 998 games, 21 dlc)", - "in": "query", - "name": "category1", - "type": "string", - "x-example": "998" - }, - { - "description": "Additional numeric store category id (feature)", - "in": "query", - "name": "category2", - "type": "string", - "x-example": "29" - }, - { - "description": "Additional numeric store category id (feature)", - "in": "query", - "name": "category3", - "type": "string", - "x-example": "3" - }, - { - "description": "Comma-separated platform filter subset of: win, mac, linux", - "in": "query", - "name": "os", - "type": "string", - "x-example": "win,linux" - }, - { - "description": "Maximum price as whole cents in the cc currency, or the literal 'free'", - "in": "query", - "name": "maxprice", - "type": "string", - "x-example": "2000" - }, - { - "default": false, - "description": "Only discounted titles", - "in": "query", - "name": "specials", - "type": "boolean" - }, - { - "default": false, - "description": "Hide free-to-play titles", - "in": "query", - "name": "hidef2p", - "type": "boolean" - }, - { - "description": "Steam Deck compatibility filter: 1 unsupported, 2 playable, 3 verified", - "enum": [ - "1", - "2", - "3" - ], - "in": "query", - "name": "deck_compatibility", - "type": "string" - }, - { - "description": "Comma-separated VR-support filter ids (e.g. 401 seated, 402 standing, 403 roomscale)", - "in": "query", - "name": "vrsupport", - "type": "string", - "x-example": "401" - }, - { - "description": "Curated preset applied within the other facets", - "enum": [ - "globaltopsellers", - "topsellers", - "popularnew", - "comingsoon" - ], - "in": "query", - "name": "filter", - "type": "string" - }, - { - "description": "Only titles supporting this Steam language name", + "description": "The performer's URL slug, e.g. kansas-city-chiefs-tickets", "in": "query", - "name": "supportedlang", + "name": "performer_slug", + "required": true, "type": "string", - "x-example": "english" - }, - { - "default": "Relevance", - "description": "Sort order", - "enum": [ - "Relevance", - "Released_DESC", - "Name_ASC", - "Price_ASC", - "Price_DESC", - "Reviews_DESC" - ], - "in": "query", - "name": "sort_by", - "type": "string" - }, - { - "default": 0, - "description": "Result offset for pagination", - "in": "query", - "name": "start", - "type": "integer" - }, - { - "default": 25, - "description": "Results per page (max 100)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": "us", - "description": "Store country code (ISO, selects currency)", - "in": "query", - "name": "cc", - "type": "string" + "x-example": "kansas-city-chiefs-tickets" }, { - "default": "en", - "description": "Language code", + "description": "The performer's numeric id", "in": "query", - "name": "l", - "type": "string" + "name": "performer_id", + "required": true, + "type": "integer", + "x-example": 6063 } ], "produces": [ @@ -485621,7 +501427,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.searchResultsResponseDoc" + "$ref": "#/definitions/stubhub.performerEventsResponseDoc" } }, "400": { @@ -485642,26 +501448,27 @@ "ApiKeyAuth": [] } ], - "summary": "Browse the Steam store by community tag and store facets", + "summary": "List a StubHub performer or team's upcoming events", "tags": [ - "Steam" + "StubHub" ] } }, - "/steam/tags/list": { + "/stubhub/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Steam's popular community tags (numeric id + localized name) so callers can map a tag name to the id that /steam/tags and /steam/category expect.", - "operationId": "steam-tags-list", + "description": "Searches StubHub's anonymous grouped-search endpoint. Results are returned in StubHub's own performer/grouping/event result groups; the upstream request uses multipart form data and requires no cookies or CSRF token.", + "operationId": "stubhub-search", "parameters": [ { - "default": "english", - "description": "Steam store language name for the tag labels", + "description": "Search query", "in": "query", - "name": "l", - "type": "string" + "name": "query", + "required": true, + "type": "string", + "x-example": "The Weeknd" } ], "produces": [ @@ -485671,7 +501478,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.tagsListResponseDoc" + "$ref": "#/definitions/stubhub.searchResponseDoc" } }, "400": { @@ -485692,35 +501499,19 @@ "ApiKeyAuth": [] } ], - "summary": "List Steam community tag ids and names", + "summary": "Search StubHub for performers, events, and groupings", "tags": [ - "Steam" + "StubHub" ] } }, - "/steam/top-sellers": { + "/stubhub/suggested-searches": { "get": { "consumes": [ "application/json" ], - "description": "Returns the store's weekly top-sellers chart for a country, each rank carrying the full store item (name, price, weighted community tags, review summary, platforms). cc selects the country whose sales ranking and currency are returned.", - "operationId": "steam-top-sellers", - "parameters": [ - { - "default": "us", - "description": "Country code (ISO) whose weekly sales ranking is returned", - "in": "query", - "name": "cc", - "type": "string" - }, - { - "default": "english", - "description": "Steam store language name", - "in": "query", - "name": "l", - "type": "string" - } - ], + "description": "Returns StubHub's short, changing list of performers, groupings, and categories currently suggested by its search UI. It takes no query parameters.", + "operationId": "stubhub-suggested-searches", "produces": [ "application/json" ], @@ -485728,7 +501519,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/steam.topSellersResponseDoc" + "$ref": "#/definitions/stubhub.suggestedSearchesResponseDoc" } }, "503": { @@ -485743,33 +501534,32 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steam's weekly top-sellers chart for a country", + "summary": "List StubHub's current search suggestions", "tags": [ - "Steam" + "StubHub" ] } }, - "/stevemadden/collections": { + "/stubhub/trending": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from Steve Madden (https://www.stevemadden.com). The storefront URL is fixed. Valid empty result pages return `200` with an empty collections array.", - "operationId": "stevemadden-collections", + "description": "Lists the performers/teams StubHub itself is currently featuring on its homepage hero rotation, each with a follower/favorites count and its upcoming event date range. A zero count with an empty performers list is a valid no-results response.", + "operationId": "stubhub-trending", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "default": 0, + "description": "Filter to one top-level vertical", + "enum": [ + 0, + 1, + 2, + 3 + ], "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "top_level_category_id", + "type": "integer" } ], "produces": [ @@ -485779,7 +501569,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/stubhub.trendingResponseDoc" } }, "400": { @@ -485788,12 +501578,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -485806,41 +501590,40 @@ "ApiKeyAuth": [] } ], - "summary": "List Steve Madden collections", + "summary": "List StubHub's currently-featured trending performers", "tags": [ - "Steve Madden" + "StubHub" ] } }, - "/stevemadden/collections/{handle}/products": { + "/stubhub/trending-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one Steve Madden (https://www.stevemadden.com) collection. The storefront URL is fixed; `handle` is the collection's URL slug.", - "operationId": "stevemadden-collection-products", + "description": "Lists a paginated global feed of StubHub's currently-trending individual events (name, date, venue, canonical URL), optionally filtered to one top-level category vertical. Distinct from stubhub-trending, which rotates featured performers/teams rather than individual events. A zero count with an empty events list is a valid no-results response.", + "operationId": "stubhub-trending-events", "parameters": [ { - "description": "Collection handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "collection-handle" - }, - { - "description": "1-based page, defaults to 1", + "default": 0, + "description": "Filter to one top-level vertical", + "enum": [ + 0, + 1, + 2, + 3 + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "top_level_category_id", + "type": "integer" }, { - "description": "Maximum products, defaults to 50 and supports up to 250", + "default": 1, + "description": "One-based result page", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "minimum": 1, + "name": "page", + "type": "integer" } ], "produces": [ @@ -485850,7 +501633,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" + "$ref": "#/definitions/stubhub.trendingEventsResponseDoc" } }, "400": { @@ -485859,18 +501642,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -485883,33 +501654,35 @@ "ApiKeyAuth": [] } ], - "summary": "List Steve Madden collection products", + "summary": "List StubHub's currently-trending individual events", "tags": [ - "Steve Madden" + "StubHub" ] } }, - "/stevemadden/pages": { + "/stubhub/venue-events": { "get": { "consumes": [ "application/json" ], - "description": "Lists Steve Madden static pages, 50 per request by default (`limit` up to 250), with `page` starting at 1. Each page has its handle, title, URL, plain-text content and timestamps. An empty result is a normal 200. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", - "operationId": "stevemadden-pages", + "description": "Lists a venue's own upcoming event calendar (event name, date, starting price) from its StubHub page. Obtain a real venue_slug+venue_id pair from another endpoint's event url field (e.g. https://www.stubhub.com/geha-field-at-arrowhead-stadium-tickets/venue/4467/ -- slug \"geha-field-at-arrowhead-stadium-tickets\", id 4467). A zero count with an empty events list is a valid no-upcoming-events response.", + "operationId": "stubhub-venue-events", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "The venue's URL slug, e.g. geha-field-at-arrowhead-stadium-tickets", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "venue_slug", + "required": true, + "type": "string", + "x-example": "geha-field-at-arrowhead-stadium-tickets" }, { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "The venue's numeric id", "in": "query", - "name": "limit", + "name": "venue_id", + "required": true, "type": "integer", - "x-example": 50 + "x-example": 4467 } ], "produces": [ @@ -485919,7 +501692,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/stubhub.venueEventsResponseDoc" } }, "400": { @@ -485928,12 +501701,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -485946,27 +501713,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Steve Madden static pages", + "summary": "List a StubHub venue's upcoming events", "tags": [ - "Steve Madden" + "StubHub" ] } }, - "/stevemadden/pages/{handle}": { + "/stuff/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Steve Madden static page by its `handle`: id, title, URL, plain-text `content` and the created, published and updated timestamps. Page text is cleaned, not raw HTML. An unknown handle returns 404. When the reduced form is served, `transport_mode` is `ssr_embedded` and `id` is omitted.", - "operationId": "stevemadden-page", + "description": "Returns public Stuff article metadata and body paragraphs from a canonical article URL. A story the publisher marks premium is reported as paywalled, or refused with a permission error when no free text is available.", + "operationId": "stuff-article", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", + "description": "Canonical Stuff article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "https://www.stuff.co.nz/sport/361037655/new-mum-sarah-hirini-eyes-third-olympic-gold-after-confirming-return-rugby" } ], "produces": [ @@ -485976,7 +501740,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -485985,14 +501749,14 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "403": { + "description": "Forbidden", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -486009,33 +501773,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Steve Madden static page", + "summary": "Get Stuff article content", "tags": [ - "Steve Madden" + "Stuff" ] } }, - "/stevemadden/products": { + "/stuff/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns products from Steve Madden's (https://www.stevemadden.com) public product catalog. The storefront URL is fixed. Valid empty result pages return `200` with an empty products array.", - "operationId": "stevemadden-products", + "description": "Returns a Stuff (New Zealand) author's profile, looked up by `slug` (for example `damien-venuto`) or canonical `url`; exactly one is required. The response has the name, `job_title`, `location`, biography, headshot, `email` and recent stories. Fields show only what the profile has; shared team bylines usually carry just a job title. An unknown author returns not found.", + "operationId": "stuff-author", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Author slug, e.g. damien-venuto", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "slug", + "type": "string", + "x-example": "damien-venuto" }, { - "description": "Maximum products, defaults to 50 and supports up to 250", + "description": "Canonical stuff.co.nz/authors/ URL; alternative to slug", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "url", + "type": "string", + "x-example": "https://www.stuff.co.nz/authors/damien-venuto" } ], "produces": [ @@ -486045,7 +501806,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" + "$ref": "#/definitions/publicnews.stuffAuthorResponseDoc" } }, "400": { @@ -486054,8 +501815,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -486072,27 +501833,57 @@ "ApiKeyAuth": [] } ], - "summary": "List Steve Madden products", + "summary": "Get a Stuff author profile", "tags": [ - "Steve Madden" + "Stuff" ] } }, - "/stevemadden/products/{handle}": { + "/stuff/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns product detail for one Steve Madden (https://www.stevemadden.com) product handle. The storefront URL is fixed; `handle` is the product's URL slug.", - "operationId": "stevemadden-product", + "description": "Returns the latest Stuff (New Zealand) stories for one section. `section` is required and takes one of 31 slugs, including slash-separated regional and sport ones such as `nz-news/auckland` and `sport/rugby`, plus `world-news`, `business`, `politics` and `motoring`. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "stuff-headlines", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Stuff section slug", + "enum": [ + "latest-news", + "nz-news", + "nz-news/auckland", + "nz-news/wellington", + "nz-news/canterbury", + "nz-news/north-island", + "nz-news/south-island", + "world-news", + "business", + "money", + "politics", + "perspectives", + "pou-tiaki", + "forever-project", + "sport", + "sport/rugby", + "sport/cricket", + "sport/netball", + "sport/football", + "sport/rugby-league", + "home-property", + "home-property/good-life", + "travel", + "life-and-style", + "wellbeing", + "wellbeing/house-wellness", + "food-drink", + "culture", + "motoring", + "health", + "quizzes" + ], + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "latest-news" } ], "produces": [ @@ -486102,7 +501893,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -486111,11 +501902,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Stuff section headlines", + "tags": [ + "Stuff" + ] + } + }, + "/stuff/news": { + "get": { + "description": "Returns the latest Stuff (New Zealand) top stories from the site-wide feed. Takes no parameters. Each item has its title, URL, summary, publication time, author and image where the feed provides them.", + "operationId": "stuff-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -486135,47 +501952,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Steve Madden product", + "summary": "Get Stuff top stories", "tags": [ - "Steve Madden" + "Stuff" ] } }, - "/stevemadden/products/{handle}/recommendations": { + "/stuff/sections": { "get": { - "consumes": [ + "description": "Lists the 31 Stuff sections that `stuff-headlines` accepts, including regional and sport slugs that contain a slash, such as `nz-news/auckland` and `sport/rugby`. Each entry has a `slug`, a display `name` and the section's Atom feed `url`.", + "operationId": "stuff-sections", + "produces": [ "application/json" ], - "description": "Returns recommended products for one Steve Madden (https://www.stevemadden.com) product handle. The storefront URL is fixed.", - "operationId": "stevemadden-product-recommendations", - "parameters": [ - { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" - }, - { - "description": "Maximum products, defaults to 10 and supports up to 20", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 - }, + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], - "in": "query", - "name": "intent", - "type": "string", - "x-example": "related" + "ApiKeyAuth": [] } ], + "summary": "Get Stuff sections", + "tags": [ + "Stuff" + ] + } + }, + "/substack/categories": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns every public Substack category, with the category id required by /substack/category. Ids span two spaces: 32 categories use a numeric id and one uses the string id `podcast`. Both are accepted by /substack/category.", + "operationId": "substack-categories", "produces": [ "application/json" ], @@ -486183,7 +501998,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/substack.categoriesResponseDoc" } }, "400": { @@ -486192,12 +502007,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -486216,41 +502025,45 @@ "ApiKeyAuth": [] } ], - "summary": "List Steve Madden product recommendations", + "summary": "List Substack categories", "tags": [ - "Steve Madden" + "Substack" ] } }, - "/stevemadden/search/suggest": { + "/substack/category": { "get": { "consumes": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from Steve Madden's (https://www.stevemadden.com) predictive search. The storefront URL is fixed.", - "operationId": "stevemadden-search-suggest", + "description": "Returns one page of a category's public publication leaderboard. Each row carries the publication's subscriber signals and its full subscription offering (web plans with multi-currency pricing, App Store plans, and per-tier benefits). Subscriber totals are published to roughly three significant figures and are opt-in per writer; paid subscriber figures are only ever buckets. Upstream serves 25 publications per page and accepts pages 0-26, so at most 675 publications are reachable per category and type.", + "operationId": "substack-category", "parameters": [ { - "description": "Search query", + "description": "Category id from /substack/categories. Numeric for 32 categories, or the string podcast.", "in": "query", - "name": "q", + "name": "category_id", "required": true, "type": "string", - "x-example": "wool" + "x-example": "4" }, { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "default": "paid", + "description": "Ranking to read", + "enum": [ + "paid", + "free" + ], "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" + "name": "type", + "type": "string" }, { - "description": "Maximum results per type, defaults to 10 and supports up to 20", + "default": 0, + "description": "Zero-based page, 0-26", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "page", + "type": "integer" } ], "produces": [ @@ -486260,7 +502073,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + "$ref": "#/definitions/substack.categoryResponseDoc" } }, "400": { @@ -486287,42 +502100,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steve Madden search suggestions", + "summary": "List the publications ranked in one Substack category", "tags": [ - "Steve Madden" + "Substack" ] } }, - "/stevemadden/sitemap/urls": { + "/substack/explore": { "get": { "consumes": [ "application/json" ], - "description": "Returns capped URL entries from Steve Madden's (https://www.stevemadden.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", - "operationId": "stevemadden-sitemap-urls", + "description": "Returns one page of Substack's Explore surface. Explore is a feed of heterogeneous modules rather than a flat list, so each page returns the modules it contains and every module names its own type. Known module types are `trendingTopicsExplore` (trending topics and suggested searches), `trendingPostsExplore`, `newBestsellersExplore`, `videoSuggestionsExplore`, `categoryLeaderboard`, `comment` (a single Note) and `post` (a single post). Only the collections a module actually carries are populated. Pagination is cursor-based; early pages are curated shelves and later pages are individual Notes and posts.", + "operationId": "substack-explore", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "default": "explore", + "description": "Explore tab id from the tabs endpoint with surface=explore", + "in": "query", + "name": "tab", + "type": "string", + "x-example": "explore" + }, + { + "default": "base", + "description": "Tab type", "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" + "base", + "secondary", + "category" ], "in": "query", "name": "type", - "type": "string", - "x-example": "products" + "type": "string" }, { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "description": "Opaque cursor from a previous response's next_cursor", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "cursor", + "type": "string" } ], "produces": [ @@ -486332,7 +502148,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/substack.exploreResponseDoc" } }, "400": { @@ -486359,19 +502175,48 @@ "ApiKeyAuth": [] } ], - "summary": "List Steve Madden sitemap URLs", + "summary": "Browse the public Substack Explore surface", "tags": [ - "Steve Madden" + "Substack" ] } }, - "/stevemadden/sitemaps": { + "/substack/leaderboard": { "get": { "consumes": [ "application/json" ], - "description": "Returns child sitemap URLs from Steve Madden's (https://www.stevemadden.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", - "operationId": "stevemadden-sitemaps", + "description": "Returns one page of a category's bestseller leaderboard, pairing each ranked publication with its author. This is a different surface from /substack/category: it exposes the trending ranking (the site's \"Rising\" tab), validates its ranking values rather than silently defaulting, accepts the extra cross-category id `bestseller`, and returns the author alongside the publication. Use a category_id from /substack/categories whose in_leaderboard is true. Upstream serves 25 rows per page and accepts pages 0-25.", + "operationId": "substack-leaderboard", + "parameters": [ + { + "description": "Category id from /substack/categories with in_leaderboard true. Numeric, or the string ids podcast or bestseller.", + "in": "query", + "name": "category_id", + "required": true, + "type": "string", + "x-example": "96" + }, + { + "default": "trending", + "description": "Ranking to read", + "enum": [ + "trending", + "paid", + "all" + ], + "in": "query", + "name": "type", + "type": "string" + }, + { + "default": 0, + "description": "Zero-based page, 0-25", + "in": "query", + "name": "page", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -486379,7 +502224,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/substack.leaderboardResponseDoc" } }, "400": { @@ -486406,19 +502251,29 @@ "ApiKeyAuth": [] } ], - "summary": "List Steve Madden sitemaps", + "summary": "List a Substack category's bestseller leaderboard", "tags": [ - "Steve Madden" + "Substack" ] } }, - "/stevemadden/store": { + "/substack/note": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for Steve Madden (https://www.stevemadden.com). The storefront URL is fixed, so no `url` parameter is accepted.", - "operationId": "stevemadden-store", + "description": "Returns one public Note with its author, engagement counts, and the post it links to when it has one. Notes are Substack's short-form social posts. note_id is the numeric id from a Note URL: in `/@handle/note/c-316240438` it is `316240438`.", + "operationId": "substack-note", + "parameters": [ + { + "description": "Numeric Note id", + "in": "query", + "name": "note_id", + "required": true, + "type": "integer", + "x-example": 316240438 + } + ], "produces": [ "application/json" ], @@ -486426,7 +502281,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/substack.noteResponseDoc" } }, "400": { @@ -486435,6 +502290,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -486453,19 +502314,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get Steve Madden store metadata", + "summary": "Get one public Substack Note", "tags": [ - "Steve Madden" + "Substack" ] } }, - "/stockx/brands": { + "/substack/note/replies": { "get": { "consumes": [ "application/json" ], - "description": "Returns StockX's full brand catalog (name and URL slug for every brand in its own brand directory), suitable for building GET /stockx/search's brand parameter or GET /stockx/search's model parameter's required single-brand context.", - "operationId": "stockx-brands", + "description": "Returns one page of public replies to a Note, each in the same shape as /substack/note. Pagination is cursor-based: pass the previous response's next_cursor back as cursor.", + "operationId": "substack-note-replies", + "parameters": [ + { + "description": "Numeric Note id", + "in": "query", + "name": "note_id", + "required": true, + "type": "integer", + "x-example": 316240438 + }, + { + "description": "Opaque cursor from a previous response's next_cursor", + "in": "query", + "name": "cursor", + "type": "string" + } + ], "produces": [ "application/json" ], @@ -486473,52 +502350,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stockx.brandsResponseDoc" + "$ref": "#/definitions/substack.noteRepliesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get StockX brand catalog", - "tags": [ - "StockX" - ] - } - }, - "/stockx/categories": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns StockX's full category/subcategory reference: the 7 top-level categories accepted by GET /stockx/search's category parameter, each with its subcategories (e.g. Shoes -> Boots, Cleats, Clogs).", - "operationId": "stockx-categories", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/stockx.categoriesResponseDoc" - } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -486535,27 +502383,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get StockX category/subcategory taxonomy", + "summary": "List replies to a Substack Note", "tags": [ - "StockX" + "Substack" ] } }, - "/stockx/product/{slug}": { + "/substack/note/restacks": { "get": { "consumes": [ "application/json" ], - "description": "Returns a StockX product: identity (title, brand, model, colorway, style id, retail price, release date, description, image), current market data (lowest ask, highest bid, last sale, trailing average price/sales count, delivery-speed ask tiers), individual seller listings (price, condition, size), related-product recommendations (other colorways/siblings StockX surfaces on the product page), and any promotional badges.", - "operationId": "stockx-product", + "description": "Returns one page of the Notes that restacked a given Note, each in the same shape as the single-Note endpoint. A restack may carry its own commentary in `body` or be a bare reshare with an empty body. Pagination is cursor-based.", + "operationId": "substack-note-restacks", "parameters": [ { - "description": "StockX product URL slug (the urlKey), the path segment of a https://stockx.com/{slug} product page", - "in": "path", - "name": "slug", + "description": "Numeric Note id", + "in": "query", + "name": "note_id", "required": true, - "type": "string", - "x-example": "air-jordan-5-retro-black-university-blue-2026" + "type": "integer", + "x-example": 316240438 + }, + { + "description": "Opaque cursor from a previous response's next_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -486565,7 +502419,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stockx.productResponseDoc" + "$ref": "#/definitions/substack.noteRestacksResponseDoc" } }, "400": { @@ -486580,8 +502434,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -486598,40 +502452,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get StockX product detail", + "summary": "List the Notes that restacked a Substack Note", "tags": [ - "StockX" + "Substack" ] } }, - "/stockx/releases": { + "/substack/notes": { "get": { "consumes": [ "application/json" ], - "description": "Returns a date-ordered page (release date ascending) of StockX's upcoming release calendar: new and restocked products releasing on or after the given date, with product summaries, headline pricing, and each item's published release date.", - "operationId": "stockx-releases", + "description": "Returns one page of the public Notes feed for one tab. tab and type come as a pair from the Notes feed tabs endpoint. Pagination is cursor-based: pass the previous response's next_cursor back as cursor. Post-only rows in the upstream feed are omitted; every returned row is a Note.", + "operationId": "substack-notes", "parameters": [ { - "description": "Only include releases on or after this date (YYYY-MM-DD, UTC). Defaults to today", + "default": "for-you", + "description": "Feed tab id from the Notes feed tabs endpoint", "in": "query", - "name": "from", + "name": "tab", "type": "string", - "x-example": "2026-08-04" + "x-example": "for-you" }, { - "description": "1-indexed result page, defaults to 1", + "default": "base", + "description": "Tab type from the Notes feed tabs endpoint", + "enum": [ + "base", + "secondary", + "category" + ], "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "type", + "type": "string" }, { - "description": "Results per page, defaults to 20, maximum 100", + "description": "Opaque cursor from a previous response's next_cursor", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "name": "cursor", + "type": "string" } ], "produces": [ @@ -486641,7 +502500,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stockx.releasesResponseDoc" + "$ref": "#/definitions/substack.notesFeedResponseDoc" } }, "400": { @@ -486650,8 +502509,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -486668,165 +502527,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get StockX upcoming release calendar", + "summary": "Browse the public Substack Notes feed", "tags": [ - "StockX" + "Substack" ] } }, - "/stockx/search": { + "/substack/notes/tabs": { "get": { "consumes": [ "application/json" ], - "description": "Browses StockX's product catalog by category with optional free-text keyword search and facet filters (gender, brand, color, shoe height, activity, availability), returning product summaries with headline pricing plus the total matching count.", - "operationId": "stockx-search", + "description": "Returns every selectable tab for one surface. The two surfaces expose different tab sets: `feed` has 34 tabs (the main feed, the bestseller feed, and one per category) and `explore` has 33. Each row's id and type must be passed together to the matching feed endpoint, which rejects a tab whose type does not match.", + "operationId": "substack-notes-tabs", "parameters": [ { - "description": "StockX top-level category", - "enum": [ - "sneakers", - "shoes", - "apparel", - "accessories", - "collectibles", - "trading-cards", - "electronics" - ], - "in": "query", - "name": "category", - "required": true, - "type": "string", - "x-example": "sneakers" - }, - { - "description": "Free-text keyword search within the category, e.g. a model name or colorway", - "in": "query", - "name": "query", - "type": "string", - "x-example": "jordan 5" - }, - { - "description": "Filter by gender, comma-separated for multiple values", - "enum": [ - "men", - "women", - "kids", - "unisex" - ], - "in": "query", - "name": "gender", - "type": "string", - "x-example": "men" - }, - { - "description": "Filter by one or more brand slugs, comma-separated, e.g. jordan,nike", - "in": "query", - "name": "brand", - "type": "string", - "x-example": "jordan,nike" - }, - { - "description": "Filter by a single model slug, e.g. air-force-1. Requires exactly one value in brand", - "in": "query", - "name": "model", - "type": "string", - "x-example": "air-force-1" - }, - { - "description": "Filter by color, comma-separated for multiple values", - "enum": [ - "white", - "black", - "multi", - "blue", - "grey", - "pink", - "red", - "brown", - "yellow", - "green", - "purple", - "orange" - ], - "in": "query", - "name": "color", - "type": "string", - "x-example": "black" - }, - { - "description": "Filter by shoe height, comma-separated for multiple values", - "enum": [ - "low", - "mid", - "high" - ], - "in": "query", - "name": "shoe_height", - "type": "string", - "x-example": "low" - }, - { - "description": "Filter by activity, comma-separated for multiple values", - "enum": [ - "basketball", - "football", - "golf", - "hiking", - "running", - "skateboarding", - "soccer" - ], - "in": "query", - "name": "activity", - "type": "string", - "x-example": "basketball" - }, - { - "description": "Only include products with at least one active ask", - "in": "query", - "name": "available_now", - "type": "boolean", - "x-example": false - }, - { - "description": "Only include products with StockX Xpress Ship availability", - "in": "query", - "name": "xpress_ship", - "type": "boolean", - "x-example": false - }, - { - "description": "Only include products currently trading below original retail price", - "in": "query", - "name": "below_retail", - "type": "boolean", - "x-example": false - }, - { - "description": "Result sort order, defaults to featured", + "default": "feed", + "description": "Which surface's tabs to list", "enum": [ - "featured", - "most-active" + "feed", + "explore" ], "in": "query", - "name": "sort", - "type": "string", - "x-example": "featured" - }, - { - "description": "1-indexed result page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Results per page, defaults to 20, maximum 100", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "name": "surface", + "type": "string" } ], "produces": [ @@ -486836,7 +502560,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stockx.searchResponseDoc" + "$ref": "#/definitions/substack.notesFeedTabsResponseDoc" } }, "400": { @@ -486845,8 +502569,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -486863,24 +502587,35 @@ "ApiKeyAuth": [] } ], - "summary": "Search/browse StockX products", + "summary": "List the Substack feed tabs", "tags": [ - "StockX" + "Substack" ] } }, - "/straitstimes/article": { + "/substack/post": { "get": { - "description": "Returns public The Straits Times article metadata and body paragraphs from a canonical article URL. A subscriber-only article returns only its publicly served teaser paragraphs with paywalled set to true.", - "operationId": "straitstimes-article", + "consumes": [ + "application/json" + ], + "description": "Returns one public post with the extended metadata the archive listing omits, including word count, every credited byline, and podcast audio details where the post has them. Post bodies are not returned.", + "operationId": "substack-post", "parameters": [ { - "description": "Canonical The Straits Times article URL", + "description": "Publication subdomain or custom domain", "in": "query", - "name": "url", + "name": "publication", "required": true, "type": "string", - "x-example": "https://www.straitstimes.com/singapore/example-article-slug" + "x-example": "semianalysis" + }, + { + "description": "Post slug, the trailing path segment of the post URL", + "in": "query", + "name": "slug", + "required": true, + "type": "string", + "x-example": "koreas-trillion-dollar-sovereign" } ], "produces": [ @@ -486890,7 +502625,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/substack.postResponseDoc" } }, "400": { @@ -486905,6 +502640,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -486917,24 +502658,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Straits Times article content", + "summary": "Get one public Substack post", "tags": [ - "The Straits Times" + "Substack" ] } }, - "/straitstimes/author": { + "/substack/publication": { "get": { - "description": "Returns a The Straits Times author's profile by `url`, a canonical `straitstimes.com/authors/` link: name, email when the author's page publishes one, and recent articles with title, URL, summary, author, image, `type` and publication time.", - "operationId": "straitstimes-author", + "consumes": [ + "application/json" + ], + "description": "Returns a publication's public profile and its complete subscription offering: every purchasable web plan with per-currency pricing, the separately priced App Store plans, per-tier benefit copy, and the toggles governing which tiers are sold. Identify the publication by name (a subdomain such as semianalysis, or a custom domain such as www.thefp.com) or by numeric publication_id -- exactly one is required. Prefer publication_id when you have it: it reads a compact document, while resolving by name has to parse the publication's full homepage.", + "operationId": "substack-publication", "parameters": [ { - "description": "Canonical The Straits Times author URL", + "description": "Publication subdomain or custom domain. Provide this or publication_id.", "in": "query", - "name": "url", - "required": true, + "name": "publication", "type": "string", - "x-example": "https://www.straitstimes.com/authors/example-author" + "x-example": "semianalysis" + }, + { + "description": "Numeric publication id. Cheaper than resolving by name. Provide this or publication.", + "in": "query", + "name": "publication_id", + "type": "integer", + "x-example": 6349492 } ], "produces": [ @@ -486944,7 +502694,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.straitstimesAuthorResponseDoc" + "$ref": "#/definitions/substack.publicationResponseDoc" } }, "400": { @@ -486959,6 +502709,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -486971,69 +502727,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Straits Times author profile", + "summary": "Get a Substack publication and its subscription offering", "tags": [ - "The Straits Times" + "Substack" ] } }, - "/straitstimes/headlines": { + "/substack/publication/contributors": { "get": { - "description": "Returns the current headlines for one The Straits Times section. `section` is required and takes a slug such as `singapore`, `singapore/housing`, `asia/se-asia`, `business/economy`, `sport/formula-one` or `breaking-news`. Items carry the title and URL. Top-level sections such as `singapore` and `business` add summary and publication time; subsection pages such as `singapore/housing` add an image when shown.", - "operationId": "straitstimes-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one page of the writers credited on a publication, ranked as Substack ranks them. Rows include each writer's handle, profile URL, and bestseller badge tier, so a publication can be fanned out into individual /substack/user lookups. Large publications return several hundred contributors on the first page.", + "operationId": "substack-publication-contributors", "parameters": [ { - "description": "The Straits Times section slug", - "enum": [ - "singapore", - "singapore/housing", - "singapore/health", - "singapore/transport", - "singapore/parenting-education", - "singapore/politics", - "singapore/jobs", - "singapore/environment", - "singapore/courts-crime", - "singapore/community", - "asia", - "asia/se-asia", - "asia/east-asia", - "asia/south-asia", - "asia/australianz", - "world", - "world/united-states", - "world/europe", - "world/middle-east", - "opinion", - "opinion/forum", - "life", - "life/entertainment", - "life/travel", - "life/food", - "life/home-design", - "life/style", - "life/arts", - "business", - "business/economy", - "business/banking", - "business/companies-markets", - "business/invest", - "sport", - "sport/basketball", - "sport/football", - "sport/formula-one", - "sport/golf", - "sport/schools", - "sport/tennis", - "sport/racing", - "tech", - "breaking-news" - ], + "description": "Publication subdomain or custom domain", "in": "query", - "name": "section", + "name": "publication", "required": true, "type": "string", - "x-example": "singapore" + "x-example": "www.thefp.com" + }, + { + "default": 0, + "description": "Zero-based page", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -487043,7 +502764,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/substack.contributorsResponseDoc" } }, "400": { @@ -487052,37 +502773,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get The Straits Times section headlines", - "tags": [ - "The Straits Times" - ] - } - }, - "/straitstimes/news": { - "get": { - "description": "Returns the current top stories from The Straits Times. It takes no parameters. Each item has its title, URL and, where the outlet gives them, a summary, author, publication time, image URL and `type`. Use the headlines endpoint for one section.", - "operationId": "straitstimes-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -487102,45 +502797,62 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Straits Times top stories", + "summary": "List a Substack publication's public contributors", "tags": [ - "The Straits Times" + "Substack" ] } }, - "/straitstimes/sections": { + "/substack/publication/posts": { "get": { - "description": "Lists The Straits Times section slugs that the headlines endpoint accepts, including nested ones such as `singapore/politics`, `asia/east-asia`, `world/europe`, `life/food`, `business/invest`, `sport/tennis`, `tech` and `breaking-news`. Each entry has a `slug`, display `name` and `url`.", - "operationId": "straitstimes-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ + "description": "Returns one page of a publication's public post archive with title, subtitle, canonical URL, publish date, engagement counts, and whether each post is paywalled. search filters the publication's own posts full-text; a query with no matches returns an empty list rather than the unfiltered archive.", + "operationId": "substack-publication-posts", + "parameters": [ { - "ApiKeyAuth": [] + "description": "Publication subdomain or custom domain", + "in": "query", + "name": "publication", + "required": true, + "type": "string", + "x-example": "semianalysis" + }, + { + "description": "Full-text filter over the publication's own posts", + "in": "query", + "name": "search", + "type": "string", + "x-example": "nvidia" + }, + { + "default": "new", + "description": "Archive ordering", + "enum": [ + "new", + "top", + "community" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": 0, + "description": "Zero-based row offset", + "in": "query", + "name": "offset", + "type": "integer" + }, + { + "default": 12, + "description": "Rows per page, 1-50", + "in": "query", + "name": "limit", + "type": "integer" } ], - "summary": "Get The Straits Times sections", - "tags": [ - "The Straits Times" - ] - } - }, - "/strava/challenges": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Strava's public challenge gallery: the currently promoted challenge plus every gallery section (partner challenges, and one section per sport such as run/ride), each with its challenges' goal, duration, and cover art. Public data, sourced from Strava's own challenge gallery.", - "operationId": "strava-challenges", "produces": [ "application/json" ], @@ -487148,17 +502860,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/strava.challengesResponseDoc" + "$ref": "#/definitions/substack.postsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -487175,27 +502893,27 @@ "ApiKeyAuth": [] } ], - "summary": "Strava's public challenge gallery", + "summary": "List a Substack publication's public post archive", "tags": [ - "Strava" + "Substack" ] } }, - "/strava/clubs/{id}": { + "/substack/publication/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Strava club's public profile: name, verified/private flags, location, description, member count, and cover/avatar images. Only the base public profile is returned -- discussion, leaderboard, member list, and recent-activity data require a logged-in Strava session and are not available. Public data, sourced from Strava's own server-rendered club page.", - "operationId": "strava-club", + "description": "Returns the publications a given publication recommends to its own readers, as a publication-to-publication graph. Useful for discovering publications beyond the 675-per-category ceiling on /substack/category. publication_id is the numeric id returned by /substack/publication, /substack/category, or /substack/user.", + "operationId": "substack-publication-recommendations", "parameters": [ { - "description": "Strava club ID", - "in": "path", - "name": "id", + "description": "Numeric publication id", + "in": "query", + "name": "publication_id", "required": true, - "type": "string", - "x-example": "521703" + "type": "integer", + "x-example": 6349492 } ], "produces": [ @@ -487205,7 +502923,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/strava.clubResponseDoc" + "$ref": "#/definitions/substack.recommendationsResponseDoc" } }, "400": { @@ -487226,12 +502944,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -487244,57 +502956,47 @@ "ApiKeyAuth": [] } ], - "summary": "A Strava club's public profile", + "summary": "List the publications one Substack publication recommends", "tags": [ - "Strava" + "Substack" ] } }, - "/strava/routes": { + "/substack/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of Strava's public route recommendations for a sport, country, and region (state, or state/city). `sport` values: `hiking`, `road-biking`, `mountain-biking`, `trail-running`, `gravel-biking`. Public data, sourced from Strava's own server-rendered route pages.", - "operationId": "strava-routes", + "description": "Searches posts across all of Substack and returns the publications that also matched, unlike /substack/publication/posts which searches within a single publication. Set focus_publication_id to additionally receive that one publication's own matching posts in focused_posts alongside the site-wide results.", + "operationId": "substack-search", "parameters": [ { - "description": "Route sport. Allowed values: hiking, road-biking, mountain-biking, trail-running, gravel-biking", - "enum": [ - "hiking", - "road-biking", - "mountain-biking", - "trail-running", - "gravel-biking" - ], + "description": "Search text", "in": "query", - "name": "sport", + "name": "query", "required": true, "type": "string", - "x-example": "hiking" + "x-example": "artificial intelligence" }, { - "description": "Country slug, e.g. usa", + "default": 0, + "description": "Zero-based page, 20 posts per page", "in": "query", - "name": "country", - "required": true, - "type": "string", - "x-example": "usa" + "name": "page", + "type": "integer" }, { - "description": "Region slug: a state (colorado) or state/city (colorado/boulder)", + "description": "Numeric publication id whose own matching posts are returned in focused_posts", "in": "query", - "name": "region", - "required": true, - "type": "string", - "x-example": "colorado" + "name": "focus_publication_id", + "type": "integer", + "x-example": 6349492 }, { - "description": "Page number, starting at 1", + "description": "Cap on focused_posts, 1-20. Requires focus_publication_id.", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "focus_limit", + "type": "integer" } ], "produces": [ @@ -487304,7 +503006,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/strava.routesResponseDoc" + "$ref": "#/definitions/substack.searchResponseDoc" } }, "400": { @@ -487313,24 +503015,12 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -487343,27 +503033,27 @@ "ApiKeyAuth": [] } ], - "summary": "Strava route-index listing for a sport, country, and region", + "summary": "Search posts and publications across Substack", "tags": [ - "Strava" + "Substack" ] } }, - "/strava/routes/detail": { + "/substack/user": { "get": { "consumes": [ "application/json" ], - "description": "Returns a single Strava route's detail: type, difficulty, distance, elevation gain, estimated time, and summary. `path` is the relative route path returned by `/strava/routes` results (e.g. `hiking/usa/colorado/boulder/mallory-cave_5171952737974445730`). Public data, sourced from Strava's own server-rendered route pages.", - "operationId": "strava-route-detail", + "description": "Returns one public Substack profile: identity, the publications the writer contributes to, their publicly visible subscriptions, and every subscriber signal Substack publishes. total is opt-in per writer and rounded to roughly three significant figures; when a writer hides it, total_hidden is true and total is 0, which must not be read as zero subscribers. paid_rough, paid_rough_int, and paid_tier are buckets - no exact paid subscriber count is published anywhere. follower_count is exact but counts followers, not subscribers.", + "operationId": "substack-user", "parameters": [ { - "description": "Relative route path, from a /strava/routes result's path field", + "description": "Substack profile handle", "in": "query", - "name": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "hiking/usa/colorado/boulder/mallory-cave_5171952737974445730" + "x-example": "pragmaticengineer" } ], "produces": [ @@ -487373,7 +503063,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/strava.routeDetailResponseDoc" + "$ref": "#/definitions/substack.userResponseDoc" } }, "400": { @@ -487394,56 +503084,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "A single Strava route's detail page", - "tags": [ - "Strava" - ] - } - }, - "/streeteasy/areas": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Lists StreetEasy's search area hierarchy: NYC and NJ roots, boroughs, neighborhoods and sub-neighborhoods. Each area has an `id`, `parentId`, `level`, `name` and `short` name. Use an `id` as a repeated `area_id` in `/streeteasy/rentals/search`. The list was 349 options on 2026-09-29 and can change.", - "operationId": "streeteasy-areas", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "items": { - "$ref": "#/definitions/streeteasy.Area" - }, - "type": "array" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -487456,27 +503096,40 @@ "ApiKeyAuth": [] } ], - "summary": "List StreetEasy search areas", + "summary": "Get a public Substack writer profile", "tags": [ - "StreetEasy" + "Substack" ] } }, - "/streeteasy/buildings/{slug}": { + "/substack/user/activity": { "get": { "consumes": [ "application/json" ], - "description": "Retrieves public building facts, location, description, policies, amenities, and available sale/rental listing cards from StreetEasy's server-rendered building page. Pass the building slug from a StreetEasy /building/{slug} URL.", - "operationId": "streeteasy-building", + "description": "Returns one page of a user's public activity: the notes they wrote, posts they published, and items they liked, replied to, or restacked. types is an optional comma-separated filter accepting `note`, `post`, `like`, `replies` and `restack`; omit it for the default mixed feed. Each item's kind is the upstream's own finer-grained label, so filtering on `restack` returns both `comment_restack` and `post_restack` items. Pagination is cursor-based.", + "operationId": "substack-user-activity", "parameters": [ { - "description": "StreetEasy building slug", - "in": "path", - "name": "slug", + "description": "Numeric user id from the user endpoint", + "in": "query", + "name": "user_id", "required": true, + "type": "integer", + "x-example": 49731969 + }, + { + "description": "Comma-separated activity kinds: note, post, like, replies, restack", + "in": "query", + "name": "types", "type": "string", - "x-example": "tribeca-space" + "x-example": "note,post" + }, + { + "description": "Opaque cursor from a previous response's next_cursor", + "in": "query", + "name": "cursor", + "type": "string" } ], "produces": [ @@ -487486,7 +503139,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.BuildingDetails" + "$ref": "#/definitions/substack.userActivityResponseDoc" } }, "400": { @@ -487519,19 +503172,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get StreetEasy building details", + "summary": "List a Substack user's public activity", "tags": [ - "StreetEasy" + "Substack" ] } }, - "/streeteasy/market-data/catalog": { + "/substack/user/connections": { "get": { "consumes": [ "application/json" ], - "description": "Lists the 63 monthly metrics selectable in StreetEasy's Data Dashboard. Each has an `id`, display `label`, a sales or rentals `type`, a `bedrooms` segment and a `property_type`. Pass an `id` to `streeteasy-market-data-series` to get that metric's data. Takes no parameters.", - "operationId": "streeteasy-market-data-catalog", + "description": "Returns one of a user's public connection lists. Each entry is a full profile in the same shape as /substack/user, subscriber signals included. user_id is the numeric id returned by /substack/user. The upstream returns a bounded preview of each list rather than the complete membership.", + "operationId": "substack-user-connections", + "parameters": [ + { + "description": "Numeric user id from /substack/user", + "in": "query", + "name": "user_id", + "required": true, + "type": "integer", + "x-example": 49731969 + }, + { + "default": "followers", + "description": "Which list to read", + "enum": [ + "followers", + "following", + "subscribers" + ], + "in": "query", + "name": "list", + "type": "string" + } + ], "produces": [ "application/json" ], @@ -487539,7 +503214,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.MarketDataCatalog" + "$ref": "#/definitions/substack.userConnectionsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -487560,31 +503247,34 @@ "ApiKeyAuth": [] } ], - "summary": "List StreetEasy dashboard metric datasets", + "summary": "List a Substack user's followers, following, or subscribers", "tags": [ - "StreetEasy" + "Substack" ] } }, - "/streeteasy/market-data/indices": { + "/substack/user/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns public sale-price and rent index values by dashboard area. The datasets have different historical start dates; missing values are omitted. Defaults to the latest 12 months and limits each request to 36 months.", - "operationId": "streeteasy-market-indices", + "description": "Searches public Substack profiles by name or handle. Each result carries the same subscriber signals as /substack/user, so a search enumerates writers without a second lookup per profile. Returns 20 profiles per page; use has_more rather than assuming a fixed depth, since result counts vary by query.", + "operationId": "substack-user-search", "parameters": [ { - "description": "First month, inclusive, in YYYY-MM format", + "description": "Search text matched against profile names and handles", "in": "query", - "name": "start_month", - "type": "string" + "name": "query", + "required": true, + "type": "string", + "x-example": "pragmatic engineer" }, { - "description": "Last month, inclusive, in YYYY-MM format; defaults to the latest available month", + "default": 0, + "description": "Zero-based page", "in": "query", - "name": "end_month", - "type": "string" + "name": "page", + "type": "integer" } ], "produces": [ @@ -487594,7 +503284,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.MarketIndices" + "$ref": "#/definitions/substack.userSearchResponseDoc" } }, "400": { @@ -487621,31 +503311,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get StreetEasy monthly market indices", + "summary": "Search public Substack writer profiles", "tags": [ - "StreetEasy" + "Substack" ] } }, - "/streeteasy/market-data/inventory": { + "/subway/available-times": { "get": { "consumes": [ "application/json" ], - "description": "Returns monthly sales and rental inventory counts for every area in StreetEasy's public Data Dashboard. Defaults to the latest 12 available months; each request is limited to 36 months.", - "operationId": "streeteasy-market-inventory", + "description": "Returns one Subway store's forward-looking pickup schedule -- every time slot the store is currently accepting orders for, as RFC3339 UTC instants, earliest first. Slots begin at the store's next orderable time (roughly half an hour out, not immediately) and run through closing, so the list reflects real remaining capacity for today rather than the store's advertised opening hours. Store IDs come from a GET /subway/store or GET /subway/nearby result's store_id field. A store that is closed or past its last slot for the day returns an empty slots array, which is a valid answer rather than an error. interval_minutes reports the spacing between consecutive slots as measured from the response itself.", + "operationId": "subway-available-times", "parameters": [ { - "description": "First month, inclusive, in YYYY-MM format", + "description": "Store ID from a /subway/store or /subway/nearby result's store_id", "in": "query", - "name": "start_month", - "type": "string" + "name": "store_id", + "required": true, + "type": "string", + "x-example": "75376-0" }, { - "description": "Last month, inclusive, in YYYY-MM format; defaults to the latest available month", + "description": "Maximum slots to return (1-200). Defaults to every slot the store offers.", "in": "query", - "name": "end_month", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -487655,7 +503348,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.MarketInventory" + "$ref": "#/definitions/subway.availableTimesResponseDoc" } }, "400": { @@ -487664,6 +503357,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -487680,106 +503379,36 @@ "security": [ { "ApiKeyAuth": [] - } - ], - "summary": "Get StreetEasy monthly market inventory", - "tags": [ - "StreetEasy" - ] - } - }, - "/streeteasy/market-data/series": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a public dashboard metric for every published area. Obtain the complete dataset ID set and its labels/dimensions from streeteasy-market-data-catalog. Defaults to the latest 12 months and limits requests to 36 months.", - "operationId": "streeteasy-market-data-series", - "parameters": [ - { - "description": "StreetEasy dashboard dataset ID", - "enum": [ - "medianAskingPPSF", - "medianAskingPPSFOneBd", - "medianAskingPPSFStudio", - "medianAskingPPSFThreePlusBd", - "medianAskingPPSFTwoBd", - "medianAskingPrice", - "medianAskingPriceCondo", - "medianAskingPriceCoop", - "medianAskingPriceSfr", - "medianAskingRent", - "medianAskingRentOneBd", - "medianAskingRentStudio", - "medianAskingRentThreePlusBd", - "medianAskingRentTwoBd", - "medianDaysMarket", - "medianDaysMarketCondo", - "medianDaysMarketCoop", - "medianRecordedSalesPrice", - "medianRecordedSalesPriceCondo", - "medianRecordedSalesPriceCoop", - "medianRecordedSalesPriceSfr", - "medianRentalDiscount", - "medianRentalDiscountOneBd", - "medianRentalDiscountStudio", - "medianRentalDiscountThreePlusBd", - "medianRentalDiscountTwoBd", - "newInventory", - "newInventoryCondo", - "newInventoryCoop", - "newInventorySfr", - "priceIndex", - "recordedSales", - "recordedSalesCondo", - "recordedSalesCoop", - "recordedSalesSfr", - "rentIndex", - "rentalConcessions", - "rentalInventory", - "rentalInventoryOneBd", - "rentalInventoryStudio", - "rentalInventoryThreePlusBd", - "rentalInventoryTwoBd", - "saleListRatio", - "saleListRatioCondo", - "saleListRatioCoop", - "saleListRatioSfr", - "salesInventory", - "salesInventoryCondo", - "salesInventoryCoop", - "salesInventoryOneBd", - "salesInventorySfr", - "salesInventoryStudio", - "salesInventoryThreePlusBd", - "salesInventoryTwoBd", - "shareOfRentalsDiscounted", - "shareOfRentalsDiscountedOneBd", - "shareOfRentalsDiscountedStudio", - "shareOfRentalsDiscountedThreePlusBd", - "shareOfRentalsDiscountedTwoBd", - "sharePriceCut", - "sharePriceCutCondo", - "sharePriceCutCoop", - "sharePriceCutSfr" - ], + } + ], + "summary": "Get one Subway store's available pickup times", + "tags": [ + "Subway" + ] + } + }, + "/subway/combos": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one Subway store's bundle and combo categories with the price ranges they advertise -- min_bundled_price (cheapest as a bundle) and a_la_carte_price (cheapest bought separately). Unlike GET /subway/menu, which is US-only, this works in other markets: confirmed against US, GB and DE stores. It is NOT an itemised menu -- the upstream route behind it carries categories and prices only, with no individual products, no nutrition panels and no allergen disclosures. Use GET /subway/menu for a full itemised menu where it is available. A store with no bundles configured returns an empty categories array, which is a valid answer rather than an error. Store IDs come from a GET /subway/store or GET /subway/nearby result's store_id field.", + "operationId": "subway-combos", + "parameters": [ + { + "description": "Store ID from a /subway/store or /subway/nearby result's store_id", "in": "query", - "name": "dataset", + "name": "store_id", "required": true, "type": "string", - "x-example": "medianAskingPPSF" - }, - { - "description": "First month, inclusive, in YYYY-MM format", - "in": "query", - "name": "start_month", - "type": "string" + "x-example": "50916-0" }, { - "description": "Last month, inclusive, in YYYY-MM format; defaults to the latest available month", + "description": "Preferred translation culture for display names, e.g. en-US, en-GB, de-DE. Falls back to the category's default name.", "in": "query", - "name": "end_month", - "type": "string" + "name": "culture", + "type": "string", + "x-example": "en-GB" } ], "produces": [ @@ -487789,7 +503418,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.MarketDataSeries" + "$ref": "#/definitions/subway.combosResponseDoc" } }, "400": { @@ -487798,6 +503427,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -487816,27 +503451,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one StreetEasy monthly market metric", + "summary": "Get one Subway store's bundle/combo categories", "tags": [ - "StreetEasy" + "Subway" ] } }, - "/streeteasy/quick-search": { + "/subway/menu": { "get": { "consumes": [ "application/json" ], - "description": "Searches StreetEasy's public quick-search page and returns its rendered neighborhood, building, complex, school, agent, and recorded-sale groups. Recorded-sale entries are a limited anonymous preview when the page requires registration to see the remaining matches.", - "operationId": "streeteasy-quick-search", + "description": "Returns one Subway store's complete menu: every category, every product, and for each purchasable size (Footlong, 6-inch, etc.) its price, full nutrition panel (calories, fat, sodium, protein and more) and allergen disclosures. Store IDs come from a GET /subway/store result's store_id field. This endpoint currently covers US stores only: the menu is not available for non-US stores, which return 404 -- see GET /subway/combos for the bundle/combo categories that are available in other markets. Categories carry is_main_category: true for human-browsable menu sections (Sandwiches, Drinks, Salads, ...) and false for Subway's own internal build/customization groupings, which are included for completeness but are not meant to be shown as menu sections on their own.", + "operationId": "subway-menu", "parameters": [ { - "description": "Free-text StreetEasy quick-search query (1-160 characters)", + "description": "Store ID from a /subway/store result's store_id", "in": "query", - "name": "query", + "name": "store_id", "required": true, "type": "string", - "x-example": "Astoria" + "x-example": "75376-0" } ], "produces": [ @@ -487846,7 +503481,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.QuickSearchResult" + "$ref": "#/definitions/subway.menuResponseDoc" } }, "400": { @@ -487855,6 +503490,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -487873,256 +503514,67 @@ "ApiKeyAuth": [] } ], - "summary": "Search StreetEasy across public result types", + "summary": "Get one Subway store's full menu", "tags": [ - "StreetEasy" + "Subway" ] } }, - "/streeteasy/rentals/search": { + "/subway/nearby": { "get": { "consumes": [ "application/json" ], - "description": "Searches active StreetEasy rentals in one or more areas with the public site's price, room, building, amenity, pet, open-house, tour, transit, and sort filters. Obtain valid area IDs from /streeteasy/areas.", - "operationId": "streeteasy-rentals-search", + "description": "Returns Subway stores nearest first to a coordinate or a free-text address/city/ZIP, with live open/closed status, payment methods, catering link, and feature flags. This is the proximity search GET /subway/sitemap cannot do directly -- the sitemap enumerates the whole world for bulk scraping, this answers \"what is near this point\" with distance and live attributes the sitemap/store locator does not carry. Each store's store_id is the same value GET /subway/menu takes, and can be passed back here as store_id to re-read one store's live attributes directly.", + "operationId": "subway-nearby", "parameters": [ { - "collectionFormat": "multi", - "description": "StreetEasy area ID from /streeteasy/areas; repeat for multiple areas", - "in": "query", - "items": { - "type": "integer" - }, - "name": "area_id", - "required": true, - "type": "array", - "x-example": 271 - }, - { - "default": 1, - "description": "1-based result page", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": 500, - "description": "Results per page, 1-500", - "in": "query", - "name": "per_page", - "type": "integer" - }, - { - "description": "Result order", - "enum": [ - "default", - "newest", - "recently_updated", - "price_desc", - "price_asc", - "largest", - "smallest" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Minimum monthly rent", - "in": "query", - "name": "min_price", - "type": "integer" - }, - { - "description": "Maximum monthly rent", - "in": "query", - "name": "max_price", - "type": "integer" - }, - { - "description": "Minimum bedrooms; zero means studio", - "in": "query", - "name": "min_bedrooms", - "type": "integer" - }, - { - "description": "Maximum bedrooms", - "in": "query", - "name": "max_bedrooms", - "type": "integer" - }, - { - "description": "Minimum bathrooms", - "in": "query", - "name": "min_bathrooms", - "type": "number" - }, - { - "description": "Maximum bathrooms", - "in": "query", - "name": "max_bathrooms", - "type": "number" - }, - { - "description": "Minimum square footage", - "in": "query", - "name": "min_sqft", - "type": "integer" - }, - { - "description": "Maximum square footage", - "in": "query", - "name": "max_sqft", - "type": "integer" - }, - { - "collectionFormat": "multi", - "description": "Building type; repeat for multiple", - "in": "query", - "items": { - "enum": [ - "rental", - "condo", - "co-op", - "house", - "multifamily" - ], - "type": "string" - }, - "name": "building_type", - "type": "array" - }, - { - "collectionFormat": "multi", - "description": "Required amenity; repeat for multiple", + "description": "Search center latitude. Set together with longitude, or set query or store_id instead -- exactly one search mode.", "in": "query", - "items": { - "enum": [ - "washer_dryer", - "dishwasher", - "private_outdoor_space", - "central_air", - "furnished", - "fireplace", - "loft", - "city_view", - "garden_view", - "park_view", - "skyline_view", - "water_view", - "elevator", - "doorman", - "laundry", - "gym", - "parking", - "shared_outdoor_space", - "pool", - "pied_a_terre", - "childrens_playroom", - "smoke_free", - "storage" - ], - "type": "string" - }, - "name": "amenity", - "type": "array" + "name": "latitude", + "type": "number", + "x-example": 34.0549076 }, { - "collectionFormat": "multi", - "description": "Preferred amenity; results may omit these. Repeat for multiple.", + "description": "Search center longitude.", "in": "query", - "items": { - "enum": [ - "washer_dryer", - "dishwasher", - "private_outdoor_space", - "central_air", - "furnished", - "fireplace", - "loft", - "city_view", - "garden_view", - "park_view", - "skyline_view", - "water_view", - "elevator", - "doorman", - "laundry", - "gym", - "parking", - "shared_outdoor_space", - "pool", - "pied_a_terre", - "childrens_playroom", - "smoke_free", - "storage" - ], - "type": "string" - }, - "name": "optional_amenity", - "type": "array" + "name": "longitude", + "type": "number", + "x-example": -118.242643 }, { - "description": "Require listings that allow pets", + "description": "Free-text address, city or ZIP to search near. Alternative to latitude/longitude and store_id.", "in": "query", - "name": "pets_allowed", - "type": "boolean" + "name": "query", + "type": "string", + "x-example": "Los Angeles, CA" }, { - "description": "Require an open house within the next seven days", + "description": "Look up one store directly by its store_id, from GET /subway/store or a prior /subway/nearby result. Alternative to latitude/longitude and query.", "in": "query", - "name": "open_house", - "type": "boolean" + "name": "store_id", + "type": "string", + "x-example": "75376-0" }, { - "description": "Require a 3D tour", + "description": "Maximum stores to return, 1-20 (default 10)", "in": "query", - "name": "tour_3d", - "type": "boolean" + "name": "limit", + "type": "integer", + "x-example": 10 }, { - "description": "Require a video tour", + "description": "Opaque pagination cursor from a previous response's next_offset", "in": "query", - "name": "video_tour", - "type": "boolean" + "name": "offset", + "type": "string" }, { - "collectionFormat": "multi", - "description": "Nearby transit line; repeat for multiple", + "description": "Comma-separated. Restricts results to stores with ALL listed features. Allowed values: HAS_BREAKFAST, IS_REMOTEORDER_ACCEPTED, HAS_HALAL, HAS_DRIVETHROUGH, HAS_CATERING, HAS_CURBSIDE, IS_OPERATING.", "in": "query", - "items": { - "enum": [ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "A", - "C", - "E", - "B", - "D", - "F", - "M", - "G", - "N", - "Q", - "R", - "W", - "J", - "Z", - "L", - "S", - "HBLR", - "PATH" - ], - "type": "string" - }, - "name": "transit_line", - "type": "array" + "name": "features", + "type": "string", + "x-example": "HAS_BREAKFAST,IS_REMOTEORDER_ACCEPTED" } ], "produces": [ @@ -488132,7 +503584,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.RentalSearch" + "$ref": "#/definitions/subway.nearbyResponseDoc" } }, "400": { @@ -488159,386 +503611,40 @@ "ApiKeyAuth": [] } ], - "summary": "Search StreetEasy rental listings", + "summary": "Search Subway stores near a coordinate or address", "tags": [ - "StreetEasy" + "Subway" ] } }, - "/streeteasy/sales/search": { + "/subway/sitemap": { "get": { "consumes": [ "application/json" ], - "description": "Searches public sale listings with location, status, sale type, price, bedroom, bathroom, square-footage, carrying cost, building age, school, ZIP, keyword, building type, amenity, pet, open-house, virtual-tour, transit, and sort filters. Obtain area IDs from /streeteasy/areas. When sale_status is omitted, active, preview, and coming_soon listings are included.", - "operationId": "streeteasy-sales-search", + "description": "Returns one page of Subway's sitemap-declared store index -- 22,700+ URLs across 2 shards at time of writing, covering a country/region/city/street tree worldwide. This is the cheapest way to enumerate Subway locations. Each entry carries its URL, the locator path GET /subway/store takes, and a depth: the deepest entries are store pages, shallower ones are country, region and city directory pages listed in the same sitemap. A page past the end returns an empty list rather than an error, so a caller can walk to exhaustion.", + "operationId": "subway-sitemap", "parameters": [ { - "collectionFormat": "multi", - "description": "StreetEasy area ID from /streeteasy/areas; repeat for multiple areas", - "in": "query", - "items": { - "type": "integer" - }, - "name": "area_id", - "required": true, - "type": "array", - "x-example": 100 - }, - { - "collectionFormat": "multi", - "description": "Sale status; repeat for multiple. Defaults to active, preview, and coming_soon.", - "in": "query", - "items": { - "enum": [ - "active", - "preview", - "coming_soon", - "in_contract", - "sold", - "unavailable" - ], - "type": "string" - }, - "name": "sale_status", - "type": "array" - }, - { - "collectionFormat": "multi", - "description": "Sale type; repeat for multiple.", + "description": "Sitemap shard index (default 0). shard_count in the response says how many exist.", "in": "query", - "items": { - "enum": [ - "sponsor_unit", - "foreclosure", - "resale", - "restricted_sale" - ], - "type": "string" - }, - "name": "sale_type", - "type": "array" + "name": "shard", + "type": "integer", + "x-example": 0 }, { - "default": 1, - "description": "1-based result page", + "description": "1-based page within the shard (default 1)", "in": "query", "name": "page", - "type": "integer" - }, - { - "default": 500, - "description": "Results per page, 1-500", - "in": "query", - "name": "per_page", - "type": "integer" - }, - { - "description": "default, newest, recently_updated, price_desc, price_asc, largest, or smallest", - "enum": [ - "default", - "newest", - "recently_updated", - "price_desc", - "price_asc", - "largest", - "smallest" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Minimum sale price", - "in": "query", - "name": "min_price", - "type": "integer" - }, - { - "description": "Maximum sale price", - "in": "query", - "name": "max_price", - "type": "integer" - }, - { - "description": "Minimum bedrooms; zero means studio", - "in": "query", - "name": "min_bedrooms", - "type": "integer" - }, - { - "description": "Maximum bedrooms", - "in": "query", - "name": "max_bedrooms", - "type": "integer" - }, - { - "description": "Minimum bathrooms", - "in": "query", - "name": "min_bathrooms", - "type": "number" - }, - { - "description": "Maximum bathrooms", - "in": "query", - "name": "max_bathrooms", - "type": "number" - }, - { - "description": "Minimum square footage", - "in": "query", - "name": "min_sqft", - "type": "integer" - }, - { - "description": "Maximum square footage", - "in": "query", - "name": "max_sqft", - "type": "integer" - }, - { - "description": "Minimum monthly maintenance fee", - "in": "query", - "name": "min_maintenance", - "type": "integer" - }, - { - "description": "Maximum monthly maintenance fee", - "in": "query", - "name": "max_maintenance", - "type": "integer" - }, - { - "description": "Minimum monthly property taxes", - "in": "query", - "name": "min_monthly_taxes", - "type": "integer" - }, - { - "description": "Maximum monthly property taxes", - "in": "query", - "name": "max_monthly_taxes", - "type": "integer" - }, - { - "description": "Minimum price per square foot", - "in": "query", - "name": "min_price_per_sqft", - "type": "integer" - }, - { - "description": "Maximum price per square foot", - "in": "query", - "name": "max_price_per_sqft", - "type": "integer" - }, - { - "description": "Include listings with unknown price per square foot", - "in": "query", - "name": "include_unknown_price_per_sqft", - "type": "boolean" - }, - { - "description": "Minimum building year built", - "in": "query", - "name": "min_year_built", - "type": "integer" - }, - { - "description": "Maximum building year built", - "in": "query", - "name": "max_year_built", - "type": "integer" - }, - { - "description": "Set true to select prewar buildings", - "in": "query", - "name": "prewar", - "type": "boolean" - }, - { - "description": "New development filter", - "enum": [ - "pre_construction" - ], - "in": "query", - "name": "development", - "type": "string" - }, - { - "description": "Set true to select income-restricted homes", - "in": "query", - "name": "income_restricted", - "type": "boolean" - }, - { - "collectionFormat": "multi", - "description": "StreetEasy school ID selected by the public search UI; repeat for multiple schools", - "in": "query", - "items": { - "type": "integer" - }, - "name": "school_id", - "type": "array" - }, - { - "description": "Five-digit ZIP code", - "in": "query", - "name": "zip_code", - "type": "string" - }, - { - "description": "Listing-description keyword filter", - "in": "query", - "name": "keywords", - "type": "string" - }, - { - "collectionFormat": "multi", - "description": "Building type", - "in": "query", - "items": { - "enum": [ - "condo", - "co-op", - "house", - "multifamily" - ], - "type": "string" - }, - "name": "building_type", - "type": "array" - }, - { - "collectionFormat": "multi", - "description": "Amenity filter; repeat for multiple", - "in": "query", - "items": { - "enum": [ - "washer_dryer", - "dishwasher", - "private_outdoor_space", - "central_air", - "furnished", - "fireplace", - "loft", - "city_view", - "garden_view", - "park_view", - "skyline_view", - "water_view", - "elevator", - "doorman", - "laundry", - "gym", - "parking", - "shared_outdoor_space", - "pool", - "pied_a_terre", - "childrens_playroom", - "smoke_free", - "storage" - ], - "type": "string" - }, - "name": "amenity", - "type": "array" - }, - { - "collectionFormat": "multi", - "description": "Nice-to-have amenity; results may omit these. Repeat for multiple.", - "in": "query", - "items": { - "enum": [ - "washer_dryer", - "dishwasher", - "private_outdoor_space", - "central_air", - "furnished", - "fireplace", - "loft", - "city_view", - "garden_view", - "park_view", - "skyline_view", - "water_view", - "elevator", - "doorman", - "laundry", - "gym", - "parking", - "shared_outdoor_space", - "pool", - "pied_a_terre", - "childrens_playroom", - "smoke_free", - "storage" - ], - "type": "string" - }, - "name": "optional_amenity", - "type": "array" - }, - { - "description": "Require pets allowed", - "in": "query", - "name": "pets_allowed", - "type": "boolean" - }, - { - "description": "Require open house within the next seven days", - "in": "query", - "name": "open_house", - "type": "boolean" - }, - { - "description": "Require a 3D tour", - "in": "query", - "name": "tour_3d", - "type": "boolean" - }, - { - "description": "Require a video tour", - "in": "query", - "name": "video_tour", - "type": "boolean" + "type": "integer", + "x-example": 1 }, { - "collectionFormat": "multi", - "description": "Nearby transit line; repeat for multiple", + "description": "Entries per page, 1-500 (default 100)", "in": "query", - "items": { - "enum": [ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "A", - "C", - "E", - "B", - "D", - "F", - "M", - "G", - "N", - "Q", - "R", - "W", - "J", - "Z", - "L", - "S", - "HBLR", - "PATH" - ], - "type": "string" - }, - "name": "transit_line", - "type": "array" + "name": "page_size", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -488548,7 +503654,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.SaleSearch" + "$ref": "#/definitions/subway.sitemapResponseDoc" } }, "400": { @@ -488557,6 +503663,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -488575,27 +503687,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search StreetEasy sale listings", + "summary": "Browse Subway's global store-URL index", "tags": [ - "StreetEasy" + "Subway" ] } }, - "/streeteasy/schools/{slug}": { + "/subway/store": { "get": { "consumes": [ "application/json" ], - "description": "Retrieves the public school facts rendered on StreetEasy, including neighborhood, grade labels, district, address, phone, and fax when available. Use the school slug from a public /nyc/school/{slug} link, including the school results returned by streeteasy-quick-search.", - "operationId": "streeteasy-school", + "description": "Returns one Subway store's detail: address, coordinates, phone (display and E.164), opening hours, and the locator's own entity profile -- IANA timezone, Google Place ID and CID for joining to Google Maps data, franchise number, price range, published services and meal types, and explicit online-ordering/catering/drive-through flags. Boolean flags are omitted entirely when the locator does not publish them, so an absent flag is not a false one. open reflects the location's published status (a store flagged closed long-term), which is distinct from whether it is currently within its opening hours. store_id is the value GET /subway/menu and GET /subway/available-times take. Paths come from a GET /subway/sitemap entry.", + "operationId": "subway-store", "parameters": [ { - "description": "StreetEasy school slug", - "in": "path", - "name": "slug", + "description": "Store path from a /subway/sitemap entry", + "in": "query", + "name": "path", "required": true, "type": "string", - "x-example": "q286-queens" + "x-example": "united-states/ny/new-york/1-penn-plaza" } ], "produces": [ @@ -488605,7 +503717,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.SchoolDetails" + "$ref": "#/definitions/subway.storeResponseDoc" } }, "400": { @@ -488638,35 +503750,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get StreetEasy school details", + "summary": "Get one Subway store's detail", "tags": [ - "StreetEasy" + "Subway" ] } }, - "/streeteasy/units/{building_slug}/{unit}": { + "/sun/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Retrieves a public unit's structured listing details from its server-rendered page, including address, asking price, description, amenities, and scheduled open houses.", - "operationId": "streeteasy-unit", + "description": "Returns one The Sun article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag. Subscriber-only or blocked pages return an error instead.", + "operationId": "sun-article", "parameters": [ { - "description": "StreetEasy building slug", - "in": "path", - "name": "building_slug", - "required": true, - "type": "string", - "x-example": "nusun-vernon" - }, - { - "description": "StreetEasy unit segment from /building/{building_slug}/{unit}", - "in": "path", - "name": "unit", + "description": "Canonical The Sun article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "2p" + "x-example": "https://www.thesun.co.uk/news/12345678/example/" } ], "produces": [ @@ -488676,7 +503777,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/streeteasy.UnitDetails" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -488691,12 +503792,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -488709,81 +503804,207 @@ "ApiKeyAuth": [] } ], - "summary": "Get StreetEasy unit details", + "summary": "Get The Sun article content", "tags": [ - "StreetEasy" + "The Sun" ] } }, - "/stubhub/carousel": { + "/sun/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the performer-page alternative, recently viewed, maybe-interested, and trending-event carousel sections. Obtain performer_slug and performer_id from a real StubHub performer URL or another StubHub result.", - "operationId": "stubhub-carousel", + "description": "Returns a Sun author's profile by `url`, a canonical `thesun.co.uk/author//` link: name, job title, bio and recent articles with title, URL, excerpt, category and category URL. `job_title` is often empty because most Sun bylines carry only a name and bio.", + "operationId": "sun-author", "parameters": [ { - "description": "StubHub performer URL slug", + "description": "Canonical The Sun author URL", "in": "query", - "name": "performer_slug", + "name": "url", "required": true, "type": "string", - "x-example": "g-e-m-tickets" + "x-example": "https://www.thesun.co.uk/author/becky-pemberton/" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sunAuthorResponseDoc" + } }, - { - "description": "StubHub performer numeric id", - "in": "query", - "name": "performer_id", - "required": true, - "type": "integer", - "x-example": 1503169 + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Top-level category: 1 (Theater), 2 (Sports), or 3 (Concerts)", + "ApiKeyAuth": [] + } + ], + "summary": "Get a Sun author profile", + "tags": [ + "The Sun" + ] + } + }, + "/sun/headlines": { + "get": { + "description": "Returns the current headlines for one The Sun section. `section` is required and takes one of `news`, `politics`, `royal-family`, `sport`, `showbiz`, `money`, `tech`, `fabulous`, `travel` or `health`. Every item has its title and URL. The `news` section also carries summary, author, publication time and image when the outlet provides them.", + "operationId": "sun-headlines", + "parameters": [ + { + "description": "The Sun section slug", "enum": [ - 1, - 2, - 3 + "news", + "politics", + "royal-family", + "sport", + "showbiz", + "money", + "tech", + "fabulous", + "travel", + "health" ], "in": "query", - "name": "top_level_category_id", + "name": "section", "required": true, - "type": "integer", - "x-example": 1 + "type": "string", + "x-example": "news" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.headlinesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "StubHub category id", - "in": "query", - "name": "category_id", - "required": true, - "type": "integer", - "x-example": 23022 + "ApiKeyAuth": [] + } + ], + "summary": "Get The Sun section headlines", + "tags": [ + "The Sun" + ] + } + }, + "/sun/news": { + "get": { + "description": "Returns the current top stories from The Sun. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", + "operationId": "sun-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "Latitude", + "ApiKeyAuth": [] + } + ], + "summary": "Get The Sun top stories", + "tags": [ + "The Sun" + ] + } + }, + "/sun/sections": { + "get": { + "description": "Lists the The Sun sections that the headlines endpoint accepts, such as `news`, `politics`, `royal-family`, `sport`, `showbiz`, `money`, `tech`, `fabulous`, `travel` and `health`. Each entry has a `slug`, a display `name` and a section `url`.", + "operationId": "sun-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The Sun sections", + "tags": [ + "The Sun" + ] + } + }, + "/swiggy/collections": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the curated dish/cuisine collections Swiggy's own homepage surfaces for a latitude/longitude (e.g. \"Idli\", \"Biryani\", \"Dosa\"). Each collection's id is the value /swiggy/search's collection_id param takes to browse restaurants within it. The response also carries is_serviceable, which says whether Swiggy delivers to the requested coordinates at all: false means the coordinates are outside Swiggy's delivery coverage, so the empty collections list is a coverage answer rather than a location that simply has no curated collections.", + "operationId": "swiggy-collections", + "parameters": [ + { + "description": "Search center latitude", "in": "query", - "name": "lat", + "name": "latitude", "required": true, "type": "number", - "x-example": 22.364 + "x-example": 12.9716 }, { - "description": "Longitude", + "description": "Search center longitude", "in": "query", - "name": "lon", + "name": "longitude", "required": true, "type": "number", - "x-example": 114.109 - }, - { - "default": 10, - "description": "Maximum items per carousel section; defaults to 10", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "max", - "type": "integer" + "x-example": 77.5946 } ], "produces": [ @@ -488793,7 +504014,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.carouselResponseDoc" + "$ref": "#/definitions/swiggy.collectionsResponseDoc" } }, "400": { @@ -488814,49 +504035,43 @@ "ApiKeyAuth": [] } ], - "summary": "List StubHub performer discovery carousels", + "summary": "List Swiggy's curated collections for a location", "tags": [ - "StubHub" + "Swiggy" ] } }, - "/stubhub/categories": { + "/swiggy/restaurant": { "get": { "consumes": [ "application/json" ], - "description": "Lists categories with currently-listed minimum ticket prices for a location and date range. This is a changing location/date-scoped feed, not the complete navigation taxonomy; use stubhub-navigation-categories for the full Theater, Sports, and Concerts tree.", - "operationId": "stubhub-categories", + "description": "Returns one Swiggy restaurant's detail by id: name, city, area, address, postal code, coordinates, phone, cuisines, cost for two, rating and total rating count, delivery time, weekly opening hours with the current open/closed callout, plus the promotions Swiggy currently shows on that restaurant's page (headline discount, conditions, and coupon code when one is needed). Swiggy has no lighter restaurant-detail-only source -- this reads the same upstream as /swiggy/restaurant/menu, just without the menu items.", + "operationId": "swiggy-restaurant", "parameters": [ { - "description": "Latitude, -90 to 90", + "description": "Restaurant id, from /swiggy/search's id field", "in": "query", - "name": "lat", + "name": "restaurant_id", "required": true, - "type": "number", - "x-example": 34.0549076 + "type": "string", + "x-example": "5938" }, { - "description": "Longitude, -180 to 180", + "description": "Caller latitude (required by Swiggy's own menu API)", "in": "query", - "name": "lon", + "name": "latitude", "required": true, "type": "number", - "x-example": -118.242643 - }, - { - "description": "Start of the date range: RFC3339 or a bare date (e.g. 2026-09-15). Defaults to now.", - "in": "query", - "name": "from", - "type": "string", - "x-example": "2026-09-15" + "x-example": 12.9716 }, { - "description": "End of the date range, same accepted formats as from. Defaults to 14 days after from.", + "description": "Caller longitude (required by Swiggy's own menu API)", "in": "query", - "name": "to", - "type": "string", - "x-example": "2026-09-29" + "name": "longitude", + "required": true, + "type": "number", + "x-example": 77.5946 } ], "produces": [ @@ -488866,7 +504081,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.categoriesResponseDoc" + "$ref": "#/definitions/swiggy.restaurantResponseDoc" } }, "400": { @@ -488887,81 +504102,43 @@ "ApiKeyAuth": [] } ], - "summary": "List StubHub's location-scoped category prices", + "summary": "Get one Swiggy restaurant's detail", "tags": [ - "StubHub" + "Swiggy" ] } }, - "/stubhub/category-events": { + "/swiggy/restaurant/menu": { "get": { "consumes": [ "application/json" ], - "description": "Lists paginated events in a single StubHub category (a sport league, team, or a top-level vertical -- use stubhub-categories to discover category ids) filtered by location, radius, and date range. A zero count with an empty events list is a valid no-results response.", - "operationId": "stubhub-category-events", + "description": "Returns one restaurant's full menu grouped into categories, plus its restaurant summary. Every item carries a name, description, category, price, discounted_price when currently discounted, veg/non-veg flag, stock status, an image, and Swiggy's own per-dish rating and review count where it carries one. A category nested under a parent group on the live site (e.g. \"Whopper\" under \"Burgers, Wraps & Tacos\") is flattened to one level: its title is the parent's, with subcategory set to its own name. The response also carries the restaurant's current promotions in offers, the same block /swiggy/restaurant returns.", + "operationId": "swiggy-restaurant-menu", "parameters": [ { - "description": "A category id from stubhub-categories", + "description": "Restaurant id, from /swiggy/search's id field", "in": "query", - "name": "category_id", + "name": "restaurant_id", "required": true, - "type": "integer", - "x-example": 3 + "type": "string", + "x-example": "5938" }, { - "description": "Latitude, -90 to 90", + "description": "Caller latitude (required by Swiggy's own menu API)", "in": "query", - "name": "lat", + "name": "latitude", "required": true, "type": "number", - "x-example": 40.7127753 + "x-example": 12.9716 }, { - "description": "Longitude, -180 to 180", + "description": "Caller longitude (required by Swiggy's own menu API)", "in": "query", - "name": "lon", + "name": "longitude", "required": true, "type": "number", - "x-example": -74.0059728 - }, - { - "description": "Start of the date range: RFC3339 or a bare date (e.g. 2026-09-15). Defaults to now.", - "in": "query", - "name": "from", - "type": "string", - "x-example": "2026-09-15" - }, - { - "description": "End of the date range, same accepted formats as from. Defaults to 14 days after from.", - "in": "query", - "name": "to", - "type": "string", - "x-example": "2026-09-29" - }, - { - "default": 1, - "description": "One-based result page", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 50, - "description": "Search radius in miles from lat/lon", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "radius_miles", - "type": "integer" - }, - { - "default": false, - "description": "Also include parking-pass-only listings alongside regular events", - "in": "query", - "name": "include_parking_passes", - "type": "boolean" + "x-example": 77.5946 } ], "produces": [ @@ -488971,7 +504148,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.categoryEventsResponseDoc" + "$ref": "#/definitions/swiggy.menuResponseDoc" } }, "400": { @@ -488992,81 +504169,101 @@ "ApiKeyAuth": [] } ], - "summary": "List StubHub events in one category near a location", + "summary": "Get one Swiggy restaurant's menu with prices", "tags": [ - "StubHub" + "Swiggy" ] } }, - "/stubhub/explore": { + "/swiggy/search": { "get": { "consumes": [ "application/json" ], - "description": "Discovers events near a location within a date range, optionally bounded by ticket price and by category. A zero count with an empty events list is a valid no-results response.", - "operationId": "stubhub-explore", + "description": "Returns restaurants delivering to a latitude/longitude, optionally filtered by a keyword or browsed within a curated collection. With no query and no collection_id this browses the nearby-restaurant listing; with a query it runs a keyword search across restaurant names, cuisines, and dishes; with a collection_id (from /swiggy/collections) it browses restaurants within that curated collection. query and collection_id are mutually exclusive. Keyword search has two result tabs, selected with tab: dish (the default) returns restaurants that serve a matching dish, each with the matching dishes, their prices, and Swiggy's own per-dish rating where it has one, in a dishes array; restaurant returns restaurants whose own name or cuisine matches, a wider set with no dishes. tab, veg, min_rating and offers are only valid together with query. sort works with either query (relevance, delivery_time, rating) or collection_id (those three plus cost_low_to_high and cost_high_to_low), and is rejected on a plain nearby browse. Each restaurant carries its id (the value the restaurant and menu endpoints take), name, cuisines, cost for two, rating, delivery time, open/closed status, a hero image, and, where one is shown, an external_rating block with the third-party aggregate score, count, and source. Where the result card advertises a promotion it also carries offers, the same title/description/tag shape /swiggy/restaurant returns (a listing card never carries a coupon code, and a card showing both a discount and a separate free-delivery benefit returns them as two entries). is_promoted is present and true only for a result Swiggy itself labels a sponsored placement rather than an organic one. unavailable_message is present only when Swiggy says the restaurant cannot currently be ordered from and carries its own reason; it is not the inverse of is_open, since Swiggy reports a restaurant as open while still refusing orders for the requested location. A plain nearby browse also returns is_serviceable, which says whether Swiggy delivers to the requested coordinates at all: false means the coordinates are outside Swiggy's delivery coverage, so the empty restaurants list is a coverage answer rather than a no-matches answer, while an empty list without the field means no matches in a served area. It is omitted on keyword search and on a collection_id browse, neither of which carries Swiggy's own coverage marker.", + "operationId": "swiggy-search", "parameters": [ { - "description": "Latitude, -90 to 90", + "description": "Search center latitude", "in": "query", - "name": "lat", + "name": "latitude", "required": true, "type": "number", - "x-example": 34.0549076 + "x-example": 12.9716 }, { - "description": "Longitude, -180 to 180", + "description": "Search center longitude", "in": "query", - "name": "lon", + "name": "longitude", "required": true, "type": "number", - "x-example": -118.242643 + "x-example": 77.5946 }, { - "description": "Start of the date range: RFC3339 or a bare date (e.g. 2026-09-15). Defaults to now.", + "description": "Optional keyword to search restaurants and dishes by, at least 2 characters. Mutually exclusive with collection_id.", "in": "query", - "name": "from", + "name": "query", "type": "string", - "x-example": "2026-09-15" + "x-example": "pizza" }, { - "description": "End of the date range, same accepted formats as from. Defaults to 14 days after from.", + "description": "Optional curated collection id from /swiggy/collections's id field. Browses restaurants within that collection instead of the plain nearby listing. Mutually exclusive with query.", "in": "query", - "name": "to", + "name": "collection_id", "type": "string", - "x-example": "2026-09-29" + "x-example": "80440" }, { - "description": "Minimum ticket price filter", + "description": "Optional sort order. With query: relevance, delivery_time, rating. With collection_id: those three plus cost_low_to_high and cost_high_to_low. Not valid on a plain nearby browse.", + "enum": [ + "relevance", + "delivery_time", + "rating", + "cost_low_to_high", + "cost_high_to_low" + ], "in": "query", - "name": "price_min", - "type": "integer" + "name": "sort", + "type": "string", + "x-example": "rating" }, { - "description": "Maximum ticket price filter", + "description": "Opaque pagination cursor from a prior response's next_offset (not meaningful when query is set)", "in": "query", - "name": "price_max", - "type": "integer" + "name": "offset", + "type": "string" }, { - "default": 0, - "description": "Filter to one top-level vertical", + "description": "Which keyword-search result tab to read: dish (default, restaurants serving a matching dish, each with a dishes array) or restaurant (restaurants whose own name/cuisine matches). Only valid together with query.", "enum": [ - 0, - 1, - 2, - 3 + "dish", + "restaurant" ], "in": "query", - "name": "top_level_category_id", - "type": "integer" + "name": "tab", + "type": "string", + "x-example": "restaurant" }, { - "description": "Filter to one category/subcategory id. stubhub-categories discovers ids with a currently-listed event nearby, but only a small subset -- known-good ids: NBA 6453, MLB 6456, NFL 5084, NHL 4871, MLS 5062, Tennis 1012, Golf 1009 (Sports); Pop/Rock 260542, Alternative Music 1059, Classical 1014, R&B 1027, Rap and Hip-Hop Music 1026 (Concerts); Comedy 1015, Musicals 1017, Plays 358959, Family 2294 (Theater); Festival Tickets 1023 (works alone, no top_level_category_id needed)", + "description": "Only return vegetarian results: veg dishes on tab=dish, pure-veg restaurants on tab=restaurant. Only valid together with query.", "in": "query", - "name": "category_id", - "type": "integer", - "x-example": 6453 + "name": "veg", + "type": "boolean", + "x-example": true + }, + { + "description": "Only return restaurants rated at or above this score (0-5). Only valid together with query.", + "in": "query", + "name": "min_rating", + "type": "number", + "x-example": 4 + }, + { + "description": "Only return restaurants currently running an offer. Only valid together with query.", + "in": "query", + "name": "offers", + "type": "boolean", + "x-example": true } ], "produces": [ @@ -489076,7 +504273,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.exploreResponseDoc" + "$ref": "#/definitions/swiggy.searchResponseDoc" } }, "400": { @@ -489097,32 +504294,27 @@ "ApiKeyAuth": [] } ], - "summary": "Discover StubHub events near a location", + "summary": "Search Swiggy restaurants near a location", "tags": [ - "StubHub" + "Swiggy" ] } }, - "/stubhub/navigation-categories": { + "/taco-bell/app-menu": { "get": { "consumes": [ "application/json" ], - "description": "Lists the nested navigation taxonomy for one StubHub top-level category. The upstream accepts exactly category_id 1 (Theater), 2 (Sports), or 3 (Concerts). Use the returned ids and URLs to discover category and subcategory pages.", - "operationId": "stubhub-navigation-categories", + "description": "Returns one Taco Bell US restaurant's complete app-ordering catalog by store number: every category, every individually orderable product, AND every combo (kind \"bundle\") it carries. This is the only endpoint in this family that publishes combos at all -- each one resolved down to its full slot composition (choices[], each with min/max selections and the product codes it defaults to when not customized), not just a name and price. Also returns the store's named ordering windows (dayparts) and, per item, which dayparts it is orderable in. Store numbers come from GET /taco-bell/stores.", + "operationId": "taco-bell-app-menu", "parameters": [ { - "description": "Top-level category: 1=Theater, 2=Sports, 3=Concerts", - "enum": [ - 1, - 2, - 3 - ], + "description": "Taco Bell store number, from /taco-bell/stores", "in": "query", - "name": "category_id", + "name": "store_number", "required": true, - "type": "integer", - "x-example": 1 + "type": "string", + "x-example": "034922" } ], "produces": [ @@ -489132,7 +504324,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.navigationCategoriesResponseDoc" + "$ref": "#/definitions/tacobell.appMenuResponseDoc" } }, "400": { @@ -489141,6 +504333,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -489153,37 +504357,19 @@ "ApiKeyAuth": [] } ], - "summary": "List StubHub's complete top-level navigation tree", + "summary": "Get one Taco Bell restaurant's full app-ordering catalog, combos included", "tags": [ - "StubHub" + "TacoBell" ] } }, - "/stubhub/performer-events": { + "/taco-bell/categories": { "get": { "consumes": [ "application/json" ], - "description": "Lists a performer or team's own upcoming schedule (event name, date, venue, starting price) from their StubHub page. Obtain a real performer_slug+performer_id pair from stubhub-trending's url field (e.g. https://www.stubhub.com/kansas-city-chiefs-tickets/performer/6063 -- slug \"kansas-city-chiefs-tickets\", id 6063). A zero count with an empty events list is a valid no-upcoming-events response.", - "operationId": "stubhub-performer-events", - "parameters": [ - { - "description": "The performer's URL slug, e.g. kansas-city-chiefs-tickets", - "in": "query", - "name": "performer_slug", - "required": true, - "type": "string", - "x-example": "kansas-city-chiefs-tickets" - }, - { - "description": "The performer's numeric id", - "in": "query", - "name": "performer_id", - "required": true, - "type": "integer", - "x-example": 6063 - } - ], + "description": "Returns Taco Bell's US menu categories -- 17 at time of writing, including tacos, burritos, quesadillas, nachos, bowls, breakfast, drinks, snacks-sweets, specialties, party-packs, vegetarian, boxes-and-combos and the value menus. Each entry's slug is the value GET /taco-bell/menu takes. A category flagged hidden_from_menu is one Taco Bell does not surface in its own navigation; it is still fetchable. Takes no parameters.", + "operationId": "taco-bell-categories", "produces": [ "application/json" ], @@ -489191,11 +504377,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.performerEventsResponseDoc" + "$ref": "#/definitions/tacobell.categoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -489212,27 +504398,27 @@ "ApiKeyAuth": [] } ], - "summary": "List a StubHub performer or team's upcoming events", + "summary": "List Taco Bell menu categories", "tags": [ - "StubHub" + "TacoBell" ] } }, - "/stubhub/search": { + "/taco-bell/menu": { "get": { "consumes": [ "application/json" ], - "description": "Searches StubHub's anonymous grouped-search endpoint. Results are returned in StubHub's own performer/grouping/event result groups; the upstream request uses multipart form data and requires no cookies or CSRF token.", - "operationId": "stubhub-search", + "description": "Returns the items in one Taco Bell US menu category, each with its product code, name, price, calorie count, product and food type, image, and flags for whether it is customizable, has a meatless variant, and is currently available in store. Category slugs come from GET /taco-bell/categories, and the endpoint accepts either the bare slug (`tacos`) or the full path form (`/food/tacos`). Taco Bell is one of the few brands publishing both price and calories in the same payload.", + "operationId": "taco-bell-menu", "parameters": [ { - "description": "Search query", + "description": "Category slug from /taco-bell/categories", "in": "query", - "name": "query", + "name": "category", "required": true, "type": "string", - "x-example": "The Weeknd" + "x-example": "tacos" } ], "produces": [ @@ -489242,7 +504428,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.searchResponseDoc" + "$ref": "#/definitions/tacobell.menuResponseDoc" } }, "400": { @@ -489251,39 +504437,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Search StubHub for performers, events, and groupings", - "tags": [ - "StubHub" - ] - } - }, - "/stubhub/suggested-searches": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns StubHub's short, changing list of performers, groupings, and categories currently suggested by its search UI. It takes no query parameters.", - "operationId": "stubhub-suggested-searches", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "429": { + "description": "Too Many Requests", "schema": { - "$ref": "#/definitions/stubhub.suggestedSearchesResponseDoc" + "$ref": "#/definitions/app.Response" } }, "503": { @@ -489298,32 +504461,42 @@ "ApiKeyAuth": [] } ], - "summary": "List StubHub's current search suggestions", + "summary": "List one Taco Bell menu category's items with prices and calories", "tags": [ - "StubHub" + "TacoBell" ] } }, - "/stubhub/trending": { + "/taco-bell/nutrition": { "get": { "consumes": [ "application/json" ], - "description": "Lists the performers/teams StubHub itself is currently featuring on its homepage hero rotation, each with a follower/favorites count and its upcoming event date range. A zero count with an empty performers list is a valid no-results response.", - "operationId": "stubhub-trending", + "description": "Returns the complete nutrition-facts panel for one Taco Bell US menu item -- fats (total, saturated, trans, poly- and monounsaturated), cholesterol, sodium, potassium, carbohydrates, fiber, sugars including added sugars, protein, and the vitamin and mineral figures -- plus serving size and weight and the item's declared allergens. Values are unrounded as published, in the panel's own units: grams for fats, carbohydrates and protein, milligrams for cholesterol, sodium, potassium, calcium, iron and caffeine, and micrograms for vitamin D. This goes well beyond the calorie count on /taco-bell/menu and /taco-bell/product, which is all the menu pages themselves carry. The full component-by-component ingredient statement is available via include_ingredients; it runs to several kilobytes per item, so it is off by default.", + "operationId": "taco-bell-nutrition", "parameters": [ { - "default": 0, - "description": "Filter to one top-level vertical", - "enum": [ - 0, - 1, - 2, - 3 - ], + "description": "Category slug from /taco-bell/categories", "in": "query", - "name": "top_level_category_id", - "type": "integer" + "name": "category", + "required": true, + "type": "string", + "x-example": "burritos" + }, + { + "description": "Product slug, the last segment of a /food/{category}/{product} URL", + "in": "query", + "name": "product", + "required": true, + "type": "string", + "x-example": "burrito-supreme" + }, + { + "description": "Include the full ingredient statement (default false -- it is long)", + "in": "query", + "name": "include_ingredients", + "type": "boolean", + "x-example": false } ], "produces": [ @@ -489333,7 +504506,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.trendingResponseDoc" + "$ref": "#/definitions/tacobell.nutritionResponseDoc" } }, "400": { @@ -489342,6 +504515,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -489354,40 +504539,35 @@ "ApiKeyAuth": [] } ], - "summary": "List StubHub's currently-featured trending performers", + "summary": "Get one Taco Bell menu item's full nutrition panel, allergens and ingredients", "tags": [ - "StubHub" + "TacoBell" ] } }, - "/stubhub/trending-events": { + "/taco-bell/product": { "get": { "consumes": [ "application/json" ], - "description": "Lists a paginated global feed of StubHub's currently-trending individual events (name, date, venue, canonical URL), optionally filtered to one top-level category vertical. Distinct from stubhub-trending, which rotates featured performers/teams rather than individual events. A zero count with an empty events list is a valid no-results response.", - "operationId": "stubhub-trending-events", + "description": "Returns one Taco Bell US menu item in full: product code, name, description, price, rounded and unrounded calorie counts, every published image rendition, and cross-sell/upsell references. The distinguishing part is `customizations` -- the option groups the item accepts (proteins, included ingredients, add-ons, sauces, shells, upgrades, and Supreme/Fresco add and remove sets), each option carrying its own calorie delta and add-on price. Calorie deltas can be negative, since the Fresco style replaces sauces. Slugs come from GET /taco-bell/menu, and both the bare slug and the full path form are accepted.", + "operationId": "taco-bell-product", "parameters": [ { - "default": 0, - "description": "Filter to one top-level vertical", - "enum": [ - 0, - 1, - 2, - 3 - ], + "description": "Category slug from /taco-bell/categories", "in": "query", - "name": "top_level_category_id", - "type": "integer" + "name": "category", + "required": true, + "type": "string", + "x-example": "burritos" }, { - "default": 1, - "description": "One-based result page", + "description": "Product slug, the last segment of a /food/{category}/{product} URL", "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" + "name": "product", + "required": true, + "type": "string", + "x-example": "burrito-supreme" } ], "produces": [ @@ -489397,7 +504577,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.trendingEventsResponseDoc" + "$ref": "#/definitions/tacobell.productResponseDoc" } }, "400": { @@ -489406,6 +504586,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -489418,35 +504610,27 @@ "ApiKeyAuth": [] } ], - "summary": "List StubHub's currently-trending individual events", + "summary": "Get one Taco Bell menu item's full detail, including its customization matrix", "tags": [ - "StubHub" + "TacoBell" ] } }, - "/stubhub/venue-events": { + "/taco-bell/store": { "get": { "consumes": [ "application/json" ], - "description": "Lists a venue's own upcoming event calendar (event name, date, starting price) from its StubHub page. Obtain a real venue_slug+venue_id pair from another endpoint's event url field (e.g. https://www.stubhub.com/geha-field-at-arrowhead-stadium-tickets/venue/4467/ -- slug \"geha-field-at-arrowhead-stadium-tickets\", id 4467). A zero count with an empty events list is a valid no-upcoming-events response.", - "operationId": "stubhub-venue-events", + "description": "Returns one Taco Bell US restaurant by store number: address and coordinates, phone, open status, timezone, delivery and online-ordering state, Taco Bell's per-store capability flags, mobile-pickup status and geofencing radius. Where GET /taco-bell/stores gives only today's window for each nearby restaurant, this returns the full published week, Monday-first, and each day's dayparts. Dayparts matter for ordering: Taco Bell's menu availability is daypart-scoped, so breakfast items and Balance Of Day items are orderable in different windows of the same day. Store numbers come from GET /taco-bell/stores.", + "operationId": "taco-bell-store", "parameters": [ { - "description": "The venue's URL slug, e.g. geha-field-at-arrowhead-stadium-tickets", + "description": "Taco Bell store number, from /taco-bell/stores", "in": "query", - "name": "venue_slug", + "name": "store_number", "required": true, "type": "string", - "x-example": "geha-field-at-arrowhead-stadium-tickets" - }, - { - "description": "The venue's numeric id", - "in": "query", - "name": "venue_id", - "required": true, - "type": "integer", - "x-example": 4467 + "x-example": "040890" } ], "produces": [ @@ -489456,7 +504640,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/stubhub.venueEventsResponseDoc" + "$ref": "#/definitions/tacobell.storeDetailResponseDoc" } }, "400": { @@ -489465,6 +504649,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -489477,24 +504673,27 @@ "ApiKeyAuth": [] } ], - "summary": "List a StubHub venue's upcoming events", + "summary": "Get one Taco Bell restaurant's full record, including the whole week's hours and dayparts", "tags": [ - "StubHub" + "TacoBell" ] } }, - "/stuff/article": { + "/taco-bell/store-menu": { "get": { - "description": "Returns public Stuff article metadata and body paragraphs from a canonical article URL. A story the publisher marks premium is reported as paywalled, or refused with a permission error when no free text is available.", - "operationId": "stuff-article", + "consumes": [ + "application/json" + ], + "description": "Returns one Taco Bell US restaurant's entire menu -- every category and item in one call, each with its price, calories, product and food type, image, and whether it is currently carried and displayed at THIS store. Where GET /taco-bell/menu returns one category's items from the national default catalog, this is store-scoped: some items are absent or hidden at some restaurants, and this is the only endpoint that shows that per store. Also returns the store's current happy-hour discount window, published nowhere else in this family. The response can be cached at the edge for up to 24 hours, so treat it as a recent snapshot of what the store carries rather than a live per-second signal; for a store's serving-time windows (breakfast vs. Balance Of Day, etc.) use GET /taco-bell/store instead. Store numbers come from GET /taco-bell/stores.", + "operationId": "taco-bell-store-menu", "parameters": [ { - "description": "Canonical Stuff article URL", + "description": "Taco Bell store number, from /taco-bell/stores", "in": "query", - "name": "url", + "name": "store_number", "required": true, "type": "string", - "x-example": "https://www.stuff.co.nz/sport/361037655/new-mum-sarah-hirini-eyes-third-olympic-gold-after-confirming-return-rugby" + "x-example": "040890" } ], "produces": [ @@ -489504,7 +504703,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/tacobell.storeMenuResponseDoc" } }, "400": { @@ -489513,14 +504712,14 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -489537,30 +504736,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get Stuff article content", + "summary": "Get one Taco Bell restaurant's full live catalog in a single call", "tags": [ - "Stuff" + "TacoBell" ] } }, - "/stuff/author": { + "/taco-bell/stores": { "get": { - "description": "Returns a Stuff (New Zealand) author's profile, looked up by `slug` (for example `damien-venuto`) or canonical `url`; exactly one is required. The response has the name, `job_title`, `location`, biography, headshot, `email` and recent stories. Fields show only what the profile has; shared team bylines usually carry just a job title. An unknown author returns not found.", - "operationId": "stuff-author", + "consumes": [ + "application/json" + ], + "description": "Returns Taco Bell US restaurants near a latitude/longitude, ordered by distance. Each store carries its store number, full postal address with coordinates, phone, distance, open status, timezone, today's published opening and closing hours, and Taco Bell's own per-store capability flags (breakfast, drive-thru, delivery, mobile ordering, open late, pickup shelves, Live Mas Cafe, online). A coordinate with no Taco Bell nearby returns an empty list rather than an error.", + "operationId": "taco-bell-stores", "parameters": [ { - "description": "Author slug, e.g. damien-venuto", + "description": "Search center latitude", "in": "query", - "name": "slug", - "type": "string", - "x-example": "damien-venuto" + "name": "latitude", + "required": true, + "type": "number", + "x-example": 34.0522 }, { - "description": "Canonical stuff.co.nz/authors/ URL; alternative to slug", + "description": "Search center longitude", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.stuff.co.nz/authors/damien-venuto" + "name": "longitude", + "required": true, + "type": "number", + "x-example": -118.2437 + }, + { + "description": "Stores per page, 1-50 (default 10)", + "in": "query", + "name": "page_size", + "type": "integer", + "x-example": 10 + }, + { + "description": "0-based page index (default 0)", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -489570,7 +504788,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.stuffAuthorResponseDoc" + "$ref": "#/definitions/tacobell.storesResponseDoc" } }, "400": { @@ -489585,6 +504803,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -489597,59 +504821,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Stuff author profile", + "summary": "Find Taco Bell restaurants near a location", "tags": [ - "Stuff" + "TacoBell" ] } }, - "/stuff/headlines": { + "/target/categories": { "get": { - "description": "Returns the latest Stuff (New Zealand) stories for one section. `section` is required and takes one of 31 slugs, including slash-separated regional and sport ones such as `nz-news/auckland` and `sport/rugby`, plus `world-news`, `business`, `politics` and `motoring`. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "stuff-headlines", - "parameters": [ - { - "description": "Stuff section slug", - "enum": [ - "latest-news", - "nz-news", - "nz-news/auckland", - "nz-news/wellington", - "nz-news/canterbury", - "nz-news/north-island", - "nz-news/south-island", - "world-news", - "business", - "money", - "politics", - "perspectives", - "pou-tiaki", - "forever-project", - "sport", - "sport/rugby", - "sport/cricket", - "sport/netball", - "sport/football", - "sport/rugby-league", - "home-property", - "home-property/good-life", - "travel", - "life-and-style", - "wellbeing", - "wellbeing/house-wellness", - "food-drink", - "culture", - "motoring", - "health", - "quizzes" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "latest-news" - } - ], + "description": "Lists Target's top-level category menu in `categories`, plus the grouped shop-all directory in `groups`. Each category has an `id` (the one used by `/target/category-products`), name, canonical URL and, when Target supplies one, an image URL. The response also gives `count` and `group_count`. Takes no parameters.", + "operationId": "target-categories", "produces": [ "application/json" ], @@ -489657,11 +504838,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/target.categoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -489678,16 +504859,66 @@ "ApiKeyAuth": [] } ], - "summary": "Get Stuff section headlines", + "summary": "List all Target categories", "tags": [ - "Stuff" + "Target" ] } }, - "/stuff/news": { + "/target/category-products": { "get": { - "description": "Returns the latest Stuff (New Zealand) top stories from the site-wide feed. Takes no parameters. Each item has its title, URL, summary, publication time, author and image where the feed provides them.", - "operationId": "stuff-news", + "description": "Returns paginated products for any category id from target-categories. Each response also contains every available dynamic filter group and option. Pass selected option ids through filter_ids as a comma-separated list. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.", + "operationId": "target-category-products", + "parameters": [ + { + "description": "Target category id", + "in": "query", + "name": "category_id", + "required": true, + "type": "string", + "x-example": "5q0ga" + }, + { + "default": 1, + "description": "One-based page (1-50)", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": "featured", + "description": "Result order", + "enum": [ + "relevance", + "featured", + "price-low", + "price-high", + "rating", + "bestselling", + "newest" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": 2885, + "description": "Target store id used for pricing", + "in": "query", + "minimum": 1, + "name": "store_id", + "type": "integer" + }, + { + "description": "Comma-separated Target filter option ids", + "in": "query", + "name": "filter_ids", + "type": "string", + "x-example": "5tdv1,fwtfr" + } + ], "produces": [ "application/json" ], @@ -489695,7 +504926,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/target.categoryProductsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -489716,16 +504953,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get Stuff top stories", + "summary": "Browse Target category products", "tags": [ - "Stuff" + "Target" ] } }, - "/stuff/sections": { + "/target/filter-options": { "get": { - "description": "Lists the 31 Stuff sections that `stuff-headlines` accepts, including regional and sport slugs that contain a slash, such as `nz-news/auckland` and `sport/rugby`. Each entry has a `slug`, a display `name` and the section's Atom feed `url`.", - "operationId": "stuff-sections", + "description": "Returns every dynamic filter group and option for either a product query or category. Provide exactly one of q or category_id. Pass currently selected option ids through filter_ids to obtain the remaining context-aware options.", + "operationId": "target-filter-options", + "parameters": [ + { + "description": "Product search query; mutually exclusive with category_id", + "in": "query", + "name": "q", + "type": "string", + "x-example": "coffee" + }, + { + "description": "Target category id; mutually exclusive with q", + "in": "query", + "name": "category_id", + "type": "string", + "x-example": "5q0ga" + }, + { + "default": 2885, + "description": "Target store id used for pricing", + "in": "query", + "minimum": 1, + "name": "store_id", + "type": "integer" + }, + { + "description": "Comma-separated selected Target filter option ids", + "in": "query", + "name": "filter_ids", + "type": "string", + "x-example": "5tdv1,fwtfr" + } + ], "produces": [ "application/json" ], @@ -489733,7 +505001,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/target.filterOptionsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -489742,19 +505028,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get Stuff sections", + "summary": "List Target filter options", "tags": [ - "Stuff" + "Target" ] } }, - "/substack/categories": { + "/target/product": { "get": { "consumes": [ "application/json" ], - "description": "Returns every public Substack category, with the category id required by /substack/category. Ids span two spaces: 32 categories use a numeric id and one uses the string id `podcast`. Both are accepted by /substack/category.", - "operationId": "substack-categories", + "description": "Returns product details for one Target item, including product content, images, price, rating, category, and availability flags for the selected store.", + "operationId": "target-product", + "parameters": [ + { + "description": "Numeric Target item id (TCIN)", + "in": "query", + "name": "tcin", + "required": true, + "type": "string", + "x-example": "12954151" + }, + { + "default": 2885, + "description": "Target store id used for pricing and availability", + "in": "query", + "minimum": 1, + "name": "store_id", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -489762,7 +505066,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.categoriesResponseDoc" + "$ref": "#/definitions/target.productResponseDoc" } }, "400": { @@ -489771,6 +505075,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -489789,44 +505099,40 @@ "ApiKeyAuth": [] } ], - "summary": "List Substack categories", + "summary": "Get a Target product", "tags": [ - "Substack" + "Target" ] } }, - "/substack/category": { + "/target/questions": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of a category's public publication leaderboard. Each row carries the publication's subscriber signals and its full subscription offering (web plans with multi-currency pricing, App Store plans, and per-tier benefits). Subscriber totals are published to roughly three significant figures and are opt-in per writer; paid subscriber figures are only ever buckets. Upstream serves 25 publications per page and accepts pages 0-26, so at most 675 publications are reachable per category and type.", - "operationId": "substack-category", + "description": "Lists customer questions for a Target item given by its numeric `tcin`, each with its text, author, submission time, helpful votes and nested answers. `page` is zero-based and `per_page` runs 1 to 25. The response gives `total_pages` and `count` for paging.", + "operationId": "target-questions", "parameters": [ { - "description": "Category id from /substack/categories. Numeric for 32 categories, or the string podcast.", + "description": "Numeric Target item id", "in": "query", - "name": "category_id", + "name": "tcin", "required": true, "type": "string", - "x-example": "4" + "x-example": "91940750" }, { - "default": "paid", - "description": "Ranking to read", - "enum": [ - "paid", - "free" - ], + "default": 0, + "description": "Zero-based page", "in": "query", - "name": "type", - "type": "string" + "minimum": 0, + "name": "page", + "type": "integer" }, { - "default": 0, - "description": "Zero-based page, 0-26", + "default": 25, + "description": "Questions per page", "in": "query", - "name": "page", + "maximum": 25, + "minimum": 1, + "name": "per_page", "type": "integer" } ], @@ -489837,7 +505143,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.categoryResponseDoc" + "$ref": "#/definitions/target.questionsResponseDoc" } }, "400": { @@ -489846,12 +505152,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -489864,45 +505164,42 @@ "ApiKeyAuth": [] } ], - "summary": "List the publications ranked in one Substack category", + "summary": "List Target product questions and answers", "tags": [ - "Substack" + "Target" ] } }, - "/substack/explore": { + "/target/reviews": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of Substack's Explore surface. Explore is a feed of heterogeneous modules rather than a flat list, so each page returns the modules it contains and every module names its own type. Known module types are `trendingTopicsExplore` (trending topics and suggested searches), `trendingPostsExplore`, `newBestsellersExplore`, `videoSuggestionsExplore`, `categoryLeaderboard`, `comment` (a single Note) and `post` (a single post). Only the collections a module actually carries are populated. Pagination is cursor-based; early pages are curated shelves and later pages are individual Notes and posts.", - "operationId": "substack-explore", + "description": "Lists written reviews for a Target item given by its numeric `tcin`. Each review has its rating, title, text, author, submission time, helpful votes, and verified and syndicated flags. `page` is zero-based and stops at 50; `per_page` runs 1 to 25. The response gives `total` and `total_pages`.", + "operationId": "target-reviews", "parameters": [ { - "default": "explore", - "description": "Explore tab id from the tabs endpoint with surface=explore", + "description": "Numeric Target item id", "in": "query", - "name": "tab", + "name": "tcin", + "required": true, "type": "string", - "x-example": "explore" + "x-example": "91940750" }, { - "default": "base", - "description": "Tab type", - "enum": [ - "base", - "secondary", - "category" - ], + "default": 0, + "description": "Zero-based page", "in": "query", - "name": "type", - "type": "string" + "maximum": 50, + "minimum": 0, + "name": "page", + "type": "integer" }, { - "description": "Opaque cursor from a previous response's next_cursor", + "default": 25, + "description": "Reviews per page", "in": "query", - "name": "cursor", - "type": "string" + "maximum": 25, + "minimum": 1, + "name": "per_page", + "type": "integer" } ], "produces": [ @@ -489912,7 +505209,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.exploreResponseDoc" + "$ref": "#/definitions/target.reviewsResponseDoc" } }, "400": { @@ -489921,12 +505218,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -489939,46 +505230,67 @@ "ApiKeyAuth": [] } ], - "summary": "Browse the public Substack Explore surface", + "summary": "List Target product reviews", "tags": [ - "Substack" + "Target" ] } }, - "/substack/leaderboard": { + "/target/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a category's bestseller leaderboard, pairing each ranked publication with its author. This is a different surface from /substack/category: it exposes the trending ranking (the site's \"Rising\" tab), validates its ranking values rather than silently defaulting, accepts the extra cross-category id `bestseller`, and returns the author alongside the publication. Use a category_id from /substack/categories whose in_leaderboard is true. Upstream serves 25 rows per page and accepts pages 0-25.", - "operationId": "substack-leaderboard", + "description": "Searches Target products and returns products plus every filter group and option available for the current result set. Pass option ids back through filter_ids as a comma-separated list. A zero total with an empty products list is a valid no-results response. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.", + "operationId": "target-search", "parameters": [ { - "description": "Category id from /substack/categories with in_leaderboard true. Numeric, or the string ids podcast or bestseller.", + "description": "Product search query", "in": "query", - "name": "category_id", + "name": "q", "required": true, "type": "string", - "x-example": "96" + "x-example": "coffee" }, { - "default": "trending", - "description": "Ranking to read", + "default": 1, + "description": "One-based page (1-50)", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": "relevance", + "description": "Result order", "enum": [ - "trending", - "paid", - "all" + "relevance", + "featured", + "price-low", + "price-high", + "rating", + "bestselling", + "newest" ], "in": "query", - "name": "type", + "name": "sort", "type": "string" }, { - "default": 0, - "description": "Zero-based page, 0-25", + "default": 2885, + "description": "Target store id used for pricing", "in": "query", - "name": "page", + "minimum": 1, + "name": "store_id", "type": "integer" + }, + { + "description": "Comma-separated Target filter option ids", + "in": "query", + "name": "filter_ids", + "type": "string", + "x-example": "5tdv1,fwtfr" } ], "produces": [ @@ -489988,7 +505300,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.leaderboardResponseDoc" + "$ref": "#/definitions/target.searchResponseDoc" } }, "400": { @@ -490015,27 +505327,42 @@ "ApiKeyAuth": [] } ], - "summary": "List a Substack category's bestseller leaderboard", + "summary": "Search Target products", "tags": [ - "Substack" + "Target" ] } }, - "/substack/note": { + "/target/stores": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one public Note with its author, engagement counts, and the post it links to when it has one. Notes are Substack's short-form social posts. note_id is the numeric id from a Note URL: in `/@handle/note/c-316240438` it is `316240438`.", - "operationId": "substack-note", + "description": "Returns Target's physical stores near a ZIP code, a free-text \"city, state\", or a \"latitude,longitude\" pair, including each store's store_id, status, distance, phone, address, service list, time zone, and two weeks of daily opening hours. Use the returned store_id values with the store_id parameter on target-search, target-category-products, target-filter-options, and target-product.", + "operationId": "target-stores", "parameters": [ { - "description": "Numeric Note id", + "description": "ZIP code, city/state, or latitude,longitude", "in": "query", - "name": "note_id", + "name": "place", "required": true, - "type": "integer", - "x-example": 316240438 + "type": "string", + "x-example": "95014" + }, + { + "default": 20, + "description": "Maximum stores to return (1-20)", + "in": "query", + "maximum": 20, + "minimum": 1, + "name": "limit", + "type": "integer" + }, + { + "default": 100, + "description": "Search radius in miles (1-5000)", + "in": "query", + "maximum": 5000, + "minimum": 1, + "name": "within", + "type": "integer" } ], "produces": [ @@ -490045,7 +505372,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.noteResponseDoc" + "$ref": "#/definitions/target.storesResponseDoc" } }, "400": { @@ -490078,33 +505405,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get one public Substack Note", + "summary": "Find Target stores near a location", "tags": [ - "Substack" + "Target" ] } }, - "/substack/note/replies": { + "/tcgplayer/filters": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of public replies to a Note, each in the same shape as /substack/note. Pagination is cursor-based: pass the previous response's next_cursor back as cursor.", - "operationId": "substack-note-replies", + "description": "Returns the values the tcgplayer-sales filters accept for one TCGplayer product line: the printings (variants such as Normal, Foil, Holofoil or 1st Edition), the six conditions, the languages and the listing types, each with TCGplayer's id. Printings belong to one product line (Pokemon has Reverse Holofoil, Magic has Foil), while languages are shared. Give product_line (a url_name from tcgplayer-product-lines) or id (a TCGplayer product id, which uses that product's line). An unknown product line returns invalid parameters and an unknown product returns not found.", + "operationId": "tcgplayer-filters", "parameters": [ { - "description": "Numeric Note id", + "description": "Product line url_name from tcgplayer-product-lines; give this or id", "in": "query", - "name": "note_id", - "required": true, - "type": "integer", - "x-example": 316240438 + "name": "product_line", + "type": "string", + "x-example": "pokemon" }, { - "description": "Opaque cursor from a previous response's next_cursor", + "description": "TCGplayer product id from tcgplayer-search; give this or product_line", "in": "query", - "name": "cursor", - "type": "string" + "name": "id", + "type": "integer", + "x-example": 684332 } ], "produces": [ @@ -490114,7 +505441,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.noteRepliesResponseDoc" + "$ref": "#/definitions/tcgplayer.filtersResponseDoc" } }, "400": { @@ -490147,33 +505474,91 @@ "ApiKeyAuth": [] } ], - "summary": "List replies to a Substack Note", + "summary": "List the printing, condition and language filters of a TCGplayer product line", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/note/restacks": { + "/tcgplayer/listings": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of the Notes that restacked a given Note, each in the same shape as the single-Note endpoint. A restack may carry its own commentary in `body` or be a bare reshare with an empty body. Pagination is cursor-based.", - "operationId": "substack-note-restacks", + "description": "Returns one page of the current seller listings for a TCGplayer product: seller storefront name, rating and sales volume, condition, printing, language, quantity, price, shipping price and seller location. Filter by condition, printing and language, and sort by price or price with shipping.", + "operationId": "tcgplayer-listings", "parameters": [ { - "description": "Numeric Note id", + "description": "TCGplayer product id from tcgplayer-search", "in": "query", - "name": "note_id", + "name": "id", "required": true, "type": "integer", - "x-example": 316240438 + "x-example": 243172 }, { - "description": "Opaque cursor from a previous response's next_cursor", + "description": "Condition filter", + "enum": [ + "near-mint", + "lightly-played", + "moderately-played", + "heavily-played", + "damaged" + ], "in": "query", - "name": "cursor", - "type": "string" + "name": "condition", + "type": "string", + "x-example": "near-mint" + }, + { + "description": "Exact printing label such as Normal or Foil; see facets.printings", + "in": "query", + "name": "printing", + "type": "string", + "x-example": "Foil" + }, + { + "description": "Exact language label such as English; see facets.languages", + "in": "query", + "name": "language", + "type": "string", + "x-example": "English" + }, + { + "description": "Sort field; omit for TCGplayer's own order", + "enum": [ + "price", + "price-with-shipping" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "price" + }, + { + "description": "Sort direction, needs sort; default asc", + "enum": [ + "asc", + "desc" + ], + "in": "query", + "name": "order", + "type": "string", + "x-example": "asc" + }, + { + "description": "Page size, 1 to 50; defaults to 24", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 5 + }, + { + "description": "Listings to skip; offset plus limit must be 9999 or less", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -490183,7 +505568,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.noteRestacksResponseDoc" + "$ref": "#/definitions/tcgplayer.listingsResponseDoc" } }, "400": { @@ -490216,45 +505601,41 @@ "ApiKeyAuth": [] } ], - "summary": "List the Notes that restacked a Substack Note", + "summary": "List the sellers offering a TCGplayer product", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/notes": { + "/tcgplayer/price-guide": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of the public Notes feed for one tab. tab and type come as a pair from the Notes feed tabs endpoint. Pagination is cursor-based: pass the previous response's next_cursor back as cursor. Post-only rows in the upstream feed are omitted; every returned row is a Note.", - "operationId": "substack-notes", + "description": "Returns TCGplayer's price guide for one set, one row per card, condition and printing: card id, name, collector number, rarity, condition, printing, language, low price, market price and units sold. Page through a whole set (up to 500 rows per call) instead of fetching each card; the set_id comes from tcgplayer-sets.", + "operationId": "tcgplayer-price-guide", "parameters": [ - { - "default": "for-you", - "description": "Feed tab id from the Notes feed tabs endpoint", - "in": "query", - "name": "tab", - "type": "string", - "x-example": "for-you" + { + "description": "Numeric set id from tcgplayer-sets (the id field)", + "in": "query", + "name": "set_id", + "required": true, + "type": "integer", + "x-example": 604 }, { - "default": "base", - "description": "Tab type from the Notes feed tabs endpoint", - "enum": [ - "base", - "secondary", - "category" - ], + "description": "Page size, 1 to 500; defaults to 100", "in": "query", - "name": "type", - "type": "string" + "name": "limit", + "type": "integer", + "x-example": 100 }, { - "description": "Opaque cursor from a previous response's next_cursor", + "description": "Rows to skip; use the previous response's next_offset", "in": "query", - "name": "cursor", - "type": "string" + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -490264,7 +505645,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.notesFeedResponseDoc" + "$ref": "#/definitions/tcgplayer.priceGuideResponseDoc" } }, "400": { @@ -490273,6 +505654,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -490291,30 +505678,40 @@ "ApiKeyAuth": [] } ], - "summary": "Browse the public Substack Notes feed", + "summary": "Get TCGplayer's price guide for a whole set", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/notes/tabs": { + "/tcgplayer/price-history": { "get": { "consumes": [ "application/json" ], - "description": "Returns every selectable tab for one surface. The two surfaces expose different tab sets: `feed` has 34 tabs (the main feed, the bestseller feed, and one per category) and `explore` has 33. Each row's id and type must be passed together to the matching feed endpoint, which rejects a tab whose type does not match.", - "operationId": "substack-notes-tabs", + "description": "Returns a TCGplayer product's price history over a month, quarter, half year or year, per condition, printing and language: market price, quantity sold, transaction count and low/high sale price for each period, plus the average daily sales volume.", + "operationId": "tcgplayer-price-history", "parameters": [ { - "default": "feed", - "description": "Which surface's tabs to list", + "description": "TCGplayer product id from tcgplayer-search", + "in": "query", + "name": "id", + "required": true, + "type": "integer", + "x-example": 42382 + }, + { + "description": "History window; defaults to quarter", "enum": [ - "feed", - "explore" + "month", + "quarter", + "semi-annual", + "annual" ], "in": "query", - "name": "surface", - "type": "string" + "name": "range", + "type": "string", + "x-example": "quarter" } ], "produces": [ @@ -490324,7 +505721,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.notesFeedTabsResponseDoc" + "$ref": "#/definitions/tcgplayer.priceHistoryResponseDoc" } }, "400": { @@ -490351,35 +505748,27 @@ "ApiKeyAuth": [] } ], - "summary": "List the Substack feed tabs", + "summary": "Get a TCGplayer product's price history", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/post": { + "/tcgplayer/product": { "get": { "consumes": [ "application/json" ], - "description": "Returns one public post with the extended metadata the archive listing omits, including word count, every credited byline, and podcast audio details where the post has them. Post bodies are not returned.", - "operationId": "substack-post", + "description": "Returns one TCGplayer product in full: name, product line, set, rarity, card number, card text, attributes, the market, lowest and median prices, listing and seller counts, every purchasable condition/variant/language SKU, and TCGplayer's market and buylist price per printing.", + "operationId": "tcgplayer-product", "parameters": [ { - "description": "Publication subdomain or custom domain", - "in": "query", - "name": "publication", - "required": true, - "type": "string", - "x-example": "semianalysis" - }, - { - "description": "Post slug, the trailing path segment of the post URL", + "description": "TCGplayer product id (the number in tcgplayer.com/product/), from tcgplayer-search", "in": "query", - "name": "slug", + "name": "id", "required": true, - "type": "string", - "x-example": "koreas-trillion-dollar-sovereign" + "type": "integer", + "x-example": 243172 } ], "produces": [ @@ -490389,7 +505778,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.postResponseDoc" + "$ref": "#/definitions/tcgplayer.productResponseDoc" } }, "400": { @@ -490422,35 +505811,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get one public Substack post", + "summary": "Get a TCGplayer product's detail and price points", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/publication": { + "/tcgplayer/product-lines": { "get": { "consumes": [ "application/json" ], - "description": "Returns a publication's public profile and its complete subscription offering: every purchasable web plan with per-currency pricing, the separately priced App Store plans, per-tier benefit copy, and the toggles governing which tiers are sold. Identify the publication by name (a subdomain such as semianalysis, or a custom domain such as www.thefp.com) or by numeric publication_id -- exactly one is required. Prefer publication_id when you have it: it reads a compact document, while resolving by name has to parse the publication's full homepage.", - "operationId": "substack-publication", - "parameters": [ - { - "description": "Publication subdomain or custom domain. Provide this or publication_id.", - "in": "query", - "name": "publication", - "type": "string", - "x-example": "semianalysis" - }, - { - "description": "Numeric publication id. Cheaper than resolving by name. Provide this or publication.", - "in": "query", - "name": "publication_id", - "type": "integer", - "x-example": 6349492 - } - ], + "description": "Lists TCGplayer's product lines (games and product families such as Pokemon, Magic: The Gathering, Yu-Gi-Oh!, One Piece and Lorcana): id, name and the url_name that tcgplayer-search and tcgplayer-sets take as product_line.", + "operationId": "tcgplayer-product-lines", "produces": [ "application/json" ], @@ -490458,7 +505831,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.publicationResponseDoc" + "$ref": "#/definitions/tcgplayer.productLinesResponseDoc" } }, "400": { @@ -490467,12 +505840,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -490491,34 +505858,68 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Substack publication and its subscription offering", + "summary": "List TCGplayer product lines", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/publication/contributors": { + "/tcgplayer/sales": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of the writers credited on a publication, ranked as Substack ranks them. Rows include each writer's handle, profile URL, and bestseller badge tier, so a publication can be fanned out into individual /substack/user lookups. Large publications return several hundred contributors on the first page.", - "operationId": "substack-publication-contributors", + "description": "Returns the five most recent completed sales of a TCGplayer product: condition, printing, language, quantity, sale price, shipping price and order time. Optionally restrict to one condition (near-mint, lightly-played, moderately-played, heavily-played, damaged or unopened), one printing (variant such as Normal, Foil or Reverse Holofoil), one language (such as English or Japanese) and whether the listing had photos. The printing and language values a product accepts come from tcgplayer-filters; an unlisted value returns invalid parameters. A variant or language filter makes one extra call to read the product line's filter values.", + "operationId": "tcgplayer-sales", "parameters": [ { - "description": "Publication subdomain or custom domain", + "description": "TCGplayer product id from tcgplayer-search", "in": "query", - "name": "publication", + "name": "id", "required": true, + "type": "integer", + "x-example": 42382 + }, + { + "description": "Condition filter", + "enum": [ + "near-mint", + "lightly-played", + "moderately-played", + "heavily-played", + "damaged", + "unopened" + ], + "in": "query", + "name": "condition", "type": "string", - "x-example": "www.thefp.com" + "x-example": "near-mint" }, { - "default": 0, - "description": "Zero-based page", + "description": "Printing label of the product's product line, such as Normal, Foil, Holofoil or Reverse Holofoil; see tcgplayer-filters", "in": "query", - "name": "page", - "type": "integer" + "name": "variant", + "type": "string", + "x-example": "Reverse Holofoil" + }, + { + "description": "Language label: English, Chinese (S), Chinese (T), French, German, Italian, Japanese, Korean, Portuguese, Russian or Spanish, limited to the languages of the product's line; see tcgplayer-filters", + "in": "query", + "name": "language", + "type": "string", + "x-example": "Japanese" + }, + { + "description": "Listing type filter; default all", + "enum": [ + "all", + "with-photos", + "without-photos" + ], + "in": "query", + "name": "listing_type", + "type": "string", + "x-example": "all" } ], "produces": [ @@ -490528,7 +505929,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.contributorsResponseDoc" + "$ref": "#/definitions/tcgplayer.salesResponseDoc" } }, "400": { @@ -490561,60 +505962,116 @@ "ApiKeyAuth": [] } ], - "summary": "List a Substack publication's public contributors", + "summary": "Get a TCGplayer product's most recent sales", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/publication/posts": { + "/tcgplayer/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a publication's public post archive with title, subtitle, canonical URL, publish date, engagement counts, and whether each post is paywalled. search filters the publication's own posts full-text; a query with no matches returns an empty list rather than the unfiltered archive.", - "operationId": "substack-publication-posts", + "description": "Searches TCGplayer's catalog of trading-card and collectible products (Pokemon, Magic, Yu-Gi-Oh!, One Piece, Lorcana and about 70 other product lines) and returns one page of matches: product id, name, set, rarity, card number, market, lowest and median prices, listing count, links and filter facets. Filter by product line, set, product type, rarity, card type and price range, and sort by price, listings, sales or name.", + "operationId": "tcgplayer-search", "parameters": [ { - "description": "Publication subdomain or custom domain", + "description": "Search text, up to 100 characters; optional when product_line is set", "in": "query", - "name": "publication", - "required": true, + "name": "q", "type": "string", - "x-example": "semianalysis" + "x-example": "charizard" }, { - "description": "Full-text filter over the publication's own posts", + "description": "Product line url_name from tcgplayer-product-lines, for example pokemon, magic, yugioh", "in": "query", - "name": "search", + "name": "product_line", "type": "string", - "x-example": "nvidia" + "x-example": "pokemon" }, { - "default": "new", - "description": "Archive ordering", + "description": "Set url_name from tcgplayer-sets; needs product_line", + "in": "query", + "name": "set", + "type": "string", + "x-example": "base-set" + }, + { + "description": "Exact product type label such as Cards or Booster Box; see facets.product_types", + "in": "query", + "name": "product_type", + "type": "string", + "x-example": "Cards" + }, + { + "description": "Exact rarity label such as Holo Rare; see facets.rarities", + "in": "query", + "name": "rarity", + "type": "string", + "x-example": "Holo Rare" + }, + { + "description": "Exact card type label such as Pokemon; see facets.card_types", + "in": "query", + "name": "card_type", + "type": "string", + "x-example": "Pokemon" + }, + { + "description": "Minimum market price in US dollars", + "in": "query", + "name": "min_price", + "type": "number", + "x-example": 10 + }, + { + "description": "Maximum market price in US dollars", + "in": "query", + "name": "max_price", + "type": "number", + "x-example": 500 + }, + { + "description": "Sort field; omit for relevance", "enum": [ - "new", - "top", - "community" + "market-price", + "lowest-price", + "lowest-price-with-shipping", + "median-price", + "listings", + "sales", + "product-name" ], "in": "query", "name": "sort", - "type": "string" + "type": "string", + "x-example": "market-price" }, { - "default": 0, - "description": "Zero-based row offset", + "description": "Sort direction, needs sort; default desc (asc for product-name)", + "enum": [ + "asc", + "desc" + ], "in": "query", - "name": "offset", - "type": "integer" + "name": "order", + "type": "string", + "x-example": "desc" }, { - "default": 12, - "description": "Rows per page, 1-50", + "description": "Page size, 1 to 50; defaults to 24", "in": "query", "name": "limit", - "type": "integer" + "type": "integer", + "x-example": 5 + }, + { + "description": "Results to skip; offset plus limit must be 9999 or less", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -490624,7 +506081,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.postsResponseDoc" + "$ref": "#/definitions/tcgplayer.searchResponseDoc" } }, "400": { @@ -490633,12 +506090,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -490657,27 +506108,27 @@ "ApiKeyAuth": [] } ], - "summary": "List a Substack publication's public post archive", + "summary": "Search TCGplayer trading-card products", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/publication/recommendations": { + "/tcgplayer/sets": { "get": { "consumes": [ "application/json" ], - "description": "Returns the publications a given publication recommends to its own readers, as a publication-to-publication graph. Useful for discovering publications beyond the 675-per-category ceiling on /substack/category. publication_id is the numeric id returned by /substack/publication, /substack/category, or /substack/user.", - "operationId": "substack-publication-recommendations", + "description": "Lists the active sets (expansions) of one TCGplayer product line, newest first: name, the url_name that tcgplayer-search takes as set, abbreviation and release date.", + "operationId": "tcgplayer-sets", "parameters": [ { - "description": "Numeric publication id", + "description": "Product line url_name from tcgplayer-product-lines", "in": "query", - "name": "publication_id", + "name": "product_line", "required": true, - "type": "integer", - "x-example": 6349492 + "type": "string", + "x-example": "pokemon" } ], "produces": [ @@ -490687,7 +506138,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.recommendationsResponseDoc" + "$ref": "#/definitions/tcgplayer.setsResponseDoc" } }, "400": { @@ -490720,47 +506171,24 @@ "ApiKeyAuth": [] } ], - "summary": "List the publications one Substack publication recommends", + "summary": "List the sets of a TCGplayer product line", "tags": [ - "Substack" + "TCGplayer" ] } }, - "/substack/search": { + "/techcrunch/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches posts across all of Substack and returns the publications that also matched, unlike /substack/publication/posts which searches within a single publication. Set focus_publication_id to additionally receive that one publication's own matching posts in focused_posts alongside the site-wide results.", - "operationId": "substack-search", + "description": "Returns public TechCrunch article metadata (title, author(s), published/updated dates, dek, section, lead image) and body paragraphs from a canonical article URL.", + "operationId": "techcrunch-article", "parameters": [ { - "description": "Search text", + "description": "Canonical TechCrunch article URL", "in": "query", - "name": "query", + "name": "url", "required": true, "type": "string", - "x-example": "artificial intelligence" - }, - { - "default": 0, - "description": "Zero-based page, 20 posts per page", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Numeric publication id whose own matching posts are returned in focused_posts", - "in": "query", - "name": "focus_publication_id", - "type": "integer", - "x-example": 6349492 - }, - { - "description": "Cap on focused_posts, 1-20. Requires focus_publication_id.", - "in": "query", - "name": "focus_limit", - "type": "integer" + "x-example": "https://techcrunch.com/2026/09/22/discords-age-verification-era-is-upon-us-despite-community-backlash/" } ], "produces": [ @@ -490770,7 +506198,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.searchResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -490779,8 +506207,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -490797,27 +506225,31 @@ "ApiKeyAuth": [] } ], - "summary": "Search posts and publications across Substack", + "summary": "Get TechCrunch article content", "tags": [ - "Substack" + "TechCrunch" ] } }, - "/substack/user": { + "/techcrunch/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one public Substack profile: identity, the publications the writer contributes to, their publicly visible subscriptions, and every subscriber signal Substack publishes. total is opt-in per writer and rounded to roughly three significant figures; when a writer hides it, total_hidden is true and total is 0, which must not be read as zero subscribers. paid_rough, paid_rough_int, and paid_tier are buckets - no exact paid subscriber count is published anywhere. follower_count is exact but counts followers, not subscribers.", - "operationId": "substack-user", + "description": "Returns one TechCrunch staff writer or contributor's public profile: name, job title, headshot, biography, social links, and one page of their recent articles.", + "operationId": "techcrunch-author", "parameters": [ { - "description": "Substack profile handle", + "description": "Canonical techcrunch.com/author/ URL", "in": "query", - "name": "handle", + "name": "url", "required": true, "type": "string", - "x-example": "pragmaticengineer" + "x-example": "https://techcrunch.com/author/amanda-silberling/" + }, + { + "description": "1-based page of recent articles to return; defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -490827,7 +506259,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.userResponseDoc" + "$ref": "#/definitions/publicnews.techCrunchAuthorResponseDoc" } }, "400": { @@ -490842,12 +506274,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -490860,40 +506286,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get a public Substack writer profile", + "summary": "Get a TechCrunch author profile", "tags": [ - "Substack" + "TechCrunch" ] } }, - "/substack/user/activity": { + "/techcrunch/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of a user's public activity: the notes they wrote, posts they published, and items they liked, replied to, or restacked. types is an optional comma-separated filter accepting `note`, `post`, `like`, `replies` and `restack`; omit it for the default mixed feed. Each item's kind is the upstream's own finer-grained label, so filtering on `restack` returns both `comment_restack` and `post_restack` items. Pagination is cursor-based.", - "operationId": "substack-user-activity", + "description": "Returns the latest TechCrunch stories for one category. `section` is required and takes one of 22 slugs such as `artificial-intelligence`, `startups`, `venture`, `security`, `fintech`, `space` or `cryptocurrency`. Each item has its title, URL, summary, publication time and author.", + "operationId": "techcrunch-headlines", "parameters": [ { - "description": "Numeric user id from the user endpoint", + "description": "TechCrunch category slug", + "enum": [ + "apps", + "artificial-intelligence", + "biotech-health", + "climate", + "commerce", + "cryptocurrency", + "enterprise", + "fintech", + "fundraising", + "gadgets", + "gaming", + "government-policy", + "hardware", + "media-entertainment", + "privacy", + "robotics", + "security", + "social", + "space", + "startups", + "transportation", + "venture" + ], "in": "query", - "name": "user_id", + "name": "section", "required": true, - "type": "integer", - "x-example": 49731969 - }, - { - "description": "Comma-separated activity kinds: note, post, like, replies, restack", - "in": "query", - "name": "types", "type": "string", - "x-example": "note,post" - }, - { - "description": "Opaque cursor from a previous response's next_cursor", - "in": "query", - "name": "cursor", - "type": "string" + "x-example": "apps" } ], "produces": [ @@ -490903,7 +506337,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.userActivityResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -490912,11 +506346,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get TechCrunch category headlines", + "tags": [ + "TechCrunch" + ] + } + }, + "/techcrunch/news": { + "get": { + "description": "Returns the latest TechCrunch top stories from its home feed. Takes no parameters. Each item has its title, URL, summary, publication time and author name.", + "operationId": "techcrunch-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -490936,39 +506396,50 @@ "ApiKeyAuth": [] } ], - "summary": "List a Substack user's public activity", + "summary": "Get TechCrunch top stories", "tags": [ - "Substack" + "TechCrunch" ] } }, - "/substack/user/connections": { + "/techcrunch/sections": { "get": { - "consumes": [ + "description": "Lists the 22 TechCrunch categories that `techcrunch-headlines` accepts, taken from the site's primary navigation dropdown. Each entry has a stable `slug`, a display `name` and the category's feed `url`. For example, `artificial-intelligence` is named AI.", + "operationId": "techcrunch-sections", + "produces": [ "application/json" ], - "description": "Returns one of a user's public connection lists. Each entry is a full profile in the same shape as /substack/user, subscriber signals included. user_id is the numeric id returned by /substack/user. The upstream returns a bounded preview of each list rather than the complete membership.", - "operationId": "substack-user-connections", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get TechCrunch categories", + "tags": [ + "TechCrunch" + ] + } + }, + "/techradar/article": { + "get": { + "description": "Returns a TechRadar article by canonical `url` on `techradar.com`: title, description, section, authors, publication and update times, lead image, the body `paragraphs` and a `paywalled` flag.", + "operationId": "techradar-article", "parameters": [ { - "description": "Numeric user id from /substack/user", + "description": "Canonical TechRadar article URL", "in": "query", - "name": "user_id", + "name": "url", "required": true, - "type": "integer", - "x-example": 49731969 - }, - { - "default": "followers", - "description": "Which list to read", - "enum": [ - "followers", - "following", - "subscribers" - ], - "in": "query", - "name": "list", - "type": "string" + "type": "string", + "x-example": "https://www.techradar.com/audio/wireless-headphones/sonos-ace-ultra-review" } ], "produces": [ @@ -490978,7 +506449,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.userConnectionsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -490993,12 +506464,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -491011,31 +506476,34 @@ "ApiKeyAuth": [] } ], - "summary": "List a Substack user's followers, following, or subscribers", + "summary": "Get TechRadar article content", "tags": [ - "Substack" + "TechRadar" ] } }, - "/substack/user/search": { + "/techradar/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches public Substack profiles by name or handle. Each result carries the same subscriber signals as /substack/user, so a search enumerates writers without a second lookup per profile. Returns 20 profiles per page; use has_more rather than assuming a fixed depth, since result counts vary by query.", - "operationId": "substack-user-search", + "description": "Returns a TechRadar author's profile, looked up by `slug` (for example `tom-power`) or canonical `url`, which may end in `/page/`; exactly one is required. `page` (1-based, default 1) overrides any page in `url`. The response has the name, `job_title`, biography, social links, one page of articles and `has_next_page`.", + "operationId": "techradar-author", "parameters": [ { - "description": "Search text matched against profile names and handles", + "description": "Author slug, e.g. tom-power", "in": "query", - "name": "query", - "required": true, + "name": "slug", "type": "string", - "x-example": "pragmatic engineer" + "x-example": "tom-power" }, { - "default": 0, - "description": "Zero-based page", + "description": "Canonical techradar.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.techradar.com/author/tom-power" + }, + { + "default": 1, + "description": "1-based page number; overrides any page number in url", "in": "query", "name": "page", "type": "integer" @@ -491048,7 +506516,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/substack.userSearchResponseDoc" + "$ref": "#/definitions/publicnews.techradarAuthorResponseDoc" } }, "400": { @@ -491057,8 +506525,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -491075,34 +506543,51 @@ "ApiKeyAuth": [] } ], - "summary": "Search public Substack writer profiles", + "summary": "Get a TechRadar author profile", "tags": [ - "Substack" + "TechRadar" ] } }, - "/subway/available-times": { + "/techradar/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Subway store's forward-looking pickup schedule -- every time slot the store is currently accepting orders for, as RFC3339 UTC instants, earliest first. Slots begin at the store's next orderable time (roughly half an hour out, not immediately) and run through closing, so the list reflects real remaining capacity for today rather than the store's advertised opening hours. Store IDs come from a GET /subway/store or GET /subway/nearby result's store_id field. A store that is closed or past its last slot for the day returns an empty slots array, which is a valid answer rather than an error. interval_minutes reports the spacing between consecutive slots as measured from the response itself.", - "operationId": "subway-available-times", + "description": "Returns the latest TechRadar stories for one section hub. `section` is required and takes one of 25 slugs such as `computing`, `phones`, `audio`, `gaming`, `deals`, `reviews`, `news` or `vpn`. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "techradar-headlines", "parameters": [ { - "description": "Store ID from a /subway/store or /subway/nearby result's store_id", + "description": "TechRadar section slug", + "enum": [ + "ai-platforms-assistants", + "audio", + "best", + "cameras", + "computing", + "deals", + "gaming", + "health-fitness", + "home", + "how-to", + "how-to-watch", + "news", + "opinion", + "phones", + "pro", + "reviews", + "seasonal-sales", + "streaming", + "tablets", + "tech", + "tech-events", + "televisions", + "vehicle-tech", + "versus", + "vpn" + ], "in": "query", - "name": "store_id", + "name": "section", "required": true, "type": "string", - "x-example": "75376-0" - }, - { - "description": "Maximum slots to return (1-200). Defaults to every slot the store offers.", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "ai-platforms-assistants" } ], "produces": [ @@ -491112,7 +506597,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/subway.availableTimesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -491121,11 +506606,37 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get TechRadar section headlines", + "tags": [ + "TechRadar" + ] + } + }, + "/techradar/news": { + "get": { + "description": "Returns TechRadar's latest top stories across the site. Takes no parameters, and `techradar-headlines` narrows by section instead. Each item has its title, URL, summary, publication time, author and image.", + "operationId": "techradar-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "429": { "description": "Too Many Requests", @@ -491145,34 +506656,53 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Subway store's available pickup times", + "summary": "Get TechRadar top stories", "tags": [ - "Subway" + "TechRadar" ] } }, - "/subway/combos": { + "/techradar/sections": { + "get": { + "description": "Lists the 25 top-level TechRadar sections that `techradar-headlines` accepts, such as `computing`, `phones`, `best`, `deals` and `how-to`. Each entry has a `slug`, a display `name` and the section page `url`.", + "operationId": "techradar-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get TechRadar sections", + "tags": [ + "TechRadar" + ] + } + }, + "/telegram/bot": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Subway store's bundle and combo categories with the price ranges they advertise -- min_bundled_price (cheapest as a bundle) and a_la_carte_price (cheapest bought separately). Unlike GET /subway/menu, which is US-only, this works in other markets: confirmed against US, GB and DE stores. It is NOT an itemised menu -- the upstream route behind it carries categories and prices only, with no individual products, no nutrition panels and no allergen disclosures. Use GET /subway/menu for a full itemised menu where it is available. A store with no bundles configured returns an empty categories array, which is a valid answer rather than an error. Store IDs come from a GET /subway/store or GET /subway/nearby result's store_id field.", - "operationId": "subway-combos", + "description": "Returns a public Telegram bot's profile from its t.me page: name, verified flag, description, avatar link and, when Telegram shows it, the number of monthly users. username is the bot's public username, with or without a leading @ or a t.me URL prefix. A channel, group, person's account or invite link is reported as such so you can use the right endpoint; an unknown username returns not found. Only public profile text is read.", + "operationId": "telegram-bot", "parameters": [ { - "description": "Store ID from a /subway/store or /subway/nearby result's store_id", + "description": "Bot username, with or without a leading @ or a t.me URL prefix", "in": "query", - "name": "store_id", + "name": "username", "required": true, "type": "string", - "x-example": "50916-0" - }, - { - "description": "Preferred translation culture for display names, e.g. en-US, en-GB, de-DE. Falls back to the category's default name.", - "in": "query", - "name": "culture", - "type": "string", - "x-example": "en-GB" + "x-example": "notcoin_bot" } ], "produces": [ @@ -491182,7 +506712,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/subway.combosResponseDoc" + "$ref": "#/definitions/telegram.botResponseDoc" } }, "400": { @@ -491215,27 +506745,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Subway store's bundle/combo categories", + "summary": "Get a public Telegram bot's profile", "tags": [ - "Subway" + "Telegram" ] } }, - "/subway/menu": { + "/telegram/channel": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Subway store's complete menu: every category, every product, and for each purchasable size (Footlong, 6-inch, etc.) its price, full nutrition panel (calories, fat, sodium, protein and more) and allergen disclosures. Store IDs come from a GET /subway/store result's store_id field. This endpoint currently covers US stores only: the menu is not available for non-US stores, which return 404 -- see GET /subway/combos for the bundle/combo categories that are available in other markets. Categories carry is_main_category: true for human-browsable menu sections (Sandwiches, Drinks, Salads, ...) and false for Subway's own internal build/customization groupings, which are included for completeness but are not meant to be shown as menu sections on their own.", - "operationId": "subway-menu", + "description": "Returns the public profile of a Telegram channel: title, description, verification badge, subscriber count, and the photo, video, file and link counters shown on the channel's public web preview (t.me/s/{username}). username is the channel's public username, with or without a leading @ or a t.me link; private channels, groups, bots, user accounts and invite links are not supported and return an error that says which kind of name was given. subscribers is the exact figure when available; subscribers_approximate is true when only the preview's abbreviated figure (for example 10.3M) could be read. The photo, video, file and link counters are the preview's abbreviated figures and are approximate for large channels. Only public content is read, no media files are returned, and Telegram's terms restrict using platform content to train AI or machine-learning systems, so results must not be used for that purpose.", + "operationId": "telegram-channel", "parameters": [ { - "description": "Store ID from a /subway/store result's store_id", + "description": "Public channel username, with or without @ or a t.me link", "in": "query", - "name": "store_id", + "name": "username", "required": true, "type": "string", - "x-example": "75376-0" + "x-example": "durov" } ], "produces": [ @@ -491245,7 +506775,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/subway.menuResponseDoc" + "$ref": "#/definitions/telegram.channelResponseDoc" } }, "400": { @@ -491278,67 +506808,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Subway store's full menu", + "summary": "Get a public Telegram channel profile", "tags": [ - "Subway" + "Telegram" ] } }, - "/subway/nearby": { + "/telegram/channel-posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns Subway stores nearest first to a coordinate or a free-text address/city/ZIP, with live open/closed status, payment methods, catering link, and feature flags. This is the proximity search GET /subway/sitemap cannot do directly -- the sitemap enumerates the whole world for bulk scraping, this answers \"what is near this point\" with distance and live attributes the sitemap/store locator does not carry. Each store's store_id is the same value GET /subway/menu takes, and can be passed back here as store_id to re-read one store's live attributes directly.", - "operationId": "subway-nearby", + "description": "Returns one page of up to 20 posts from a public Telegram channel's web preview (t.me/s/{username}), newest first. Each post has its id, link, text, links found in the text, publish time, edited flag, view count, author signature, forwarded-from and reply references, photo and video thumbnails, link-preview card, and reaction tallies. Page backwards by passing the previous response's next_before as before; has_more is false and next_before is omitted on the last page. Pass query to search inside the channel instead of browsing; search pages use the same before cursor. A search with no matches returns an empty posts list. Views are the preview's abbreviated figures (for example 32.4K) and are approximate above 1,000. Media entries carry thumbnail references only, never playable file URLs. Polls, documents, voice notes and stickers appear as an unsupported media entry. Private channels, groups, bots, user accounts and channels that disabled their web preview are not supported. Telegram's terms restrict using platform content to train AI or machine-learning systems, so results must not be used for that purpose.", + "operationId": "telegram-channel-posts", "parameters": [ { - "description": "Search center latitude. Set together with longitude, or set query or store_id instead -- exactly one search mode.", - "in": "query", - "name": "latitude", - "type": "number", - "x-example": 34.0549076 - }, - { - "description": "Search center longitude.", - "in": "query", - "name": "longitude", - "type": "number", - "x-example": -118.242643 - }, - { - "description": "Free-text address, city or ZIP to search near. Alternative to latitude/longitude and store_id.", - "in": "query", - "name": "query", - "type": "string", - "x-example": "Los Angeles, CA" - }, - { - "description": "Look up one store directly by its store_id, from GET /subway/store or a prior /subway/nearby result. Alternative to latitude/longitude and query.", + "description": "Public channel username, with or without @ or a t.me link", "in": "query", - "name": "store_id", + "name": "username", + "required": true, "type": "string", - "x-example": "75376-0" + "x-example": "durov" }, { - "description": "Maximum stores to return, 1-20 (default 10)", + "description": "Return only posts with an id lower than this; use the previous response's next_before. Omit for the newest page", "in": "query", - "name": "limit", + "name": "before", "type": "integer", - "x-example": 10 - }, - { - "description": "Opaque pagination cursor from a previous response's next_offset", - "in": "query", - "name": "offset", - "type": "string" + "x-example": 531 }, { - "description": "Comma-separated. Restricts results to stores with ALL listed features. Allowed values: HAS_BREAKFAST, IS_REMOTEORDER_ACCEPTED, HAS_HALAL, HAS_DRIVETHROUGH, HAS_CATERING, HAS_CURBSIDE, IS_OPERATING.", + "description": "Search term to look for inside the channel, up to 128 characters", "in": "query", - "name": "features", + "name": "query", "type": "string", - "x-example": "HAS_BREAKFAST,IS_REMOTEORDER_ACCEPTED" + "x-example": "telegram" } ], "produces": [ @@ -491348,7 +506852,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/subway.nearbyResponseDoc" + "$ref": "#/definitions/telegram.channelPostsResponseDoc" } }, "400": { @@ -491357,6 +506861,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -491375,40 +506885,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Subway stores near a coordinate or address", + "summary": "List posts from a public Telegram channel", "tags": [ - "Subway" + "Telegram" ] } }, - "/subway/sitemap": { + "/telegram/group": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of Subway's sitemap-declared store index -- 22,700+ URLs across 2 shards at time of writing, covering a country/region/city/street tree worldwide. This is the cheapest way to enumerate Subway locations. Each entry carries its URL, the locator path GET /subway/store takes, and a depth: the deepest entries are store pages, shallower ones are country, region and city directory pages listed in the same sitemap. A page past the end returns an empty list rather than an error, so a caller can walk to exhaustion.", - "operationId": "subway-sitemap", + "description": "Returns the public profile of a Telegram group from its public t.me page: title, description, member count and, when Telegram shows it, the number of members online. username is the group's public username, with or without a leading @ or a t.me link. Only the profile is available for groups; their messages are not readable here. Channels (use telegram-channel), bots, user accounts and invite links are not supported and return an error that says which kind of name was given; a username nobody owns returns not found. online is 0 when Telegram shows no online figure. avatar_url is omitted for groups without a profile photo. Only public content is read, and Telegram's terms restrict using platform content to train AI or machine-learning systems, so results must not be used for that purpose.", + "operationId": "telegram-group", "parameters": [ { - "description": "Sitemap shard index (default 0). shard_count in the response says how many exist.", - "in": "query", - "name": "shard", - "type": "integer", - "x-example": 0 - }, - { - "description": "1-based page within the shard (default 1)", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Entries per page, 1-500 (default 100)", + "description": "Public group username, with or without @ or a t.me link", "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 100 + "name": "username", + "required": true, + "type": "string", + "x-example": "python" } ], "produces": [ @@ -491418,7 +506915,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/subway.sitemapResponseDoc" + "$ref": "#/definitions/telegram.groupResponseDoc" } }, "400": { @@ -491451,27 +506948,35 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Subway's global store-URL index", + "summary": "Get a public Telegram group profile", "tags": [ - "Subway" + "Telegram" ] } }, - "/subway/store": { + "/telegram/post": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Subway store's detail: address, coordinates, phone (display and E.164), opening hours, and the locator's own entity profile -- IANA timezone, Google Place ID and CID for joining to Google Maps data, franchise number, price range, published services and meal types, and explicit online-ordering/catering/drive-through flags. Boolean flags are omitted entirely when the locator does not publish them, so an absent flag is not a false one. open reflects the location's published status (a store flagged closed long-term), which is distinct from whether it is currently within its opening hours. store_id is the value GET /subway/menu and GET /subway/available-times take. Paths come from a GET /subway/sitemap entry.", - "operationId": "subway-store", + "description": "Returns a single post from a public Telegram channel by username and post id, as Telegram's public embed widget shows it: text, links, publish time, edited flag, views, author signature, forwarded-from and reply references, photo and video thumbnails, link-preview card, and reaction tallies. The post id is the number at the end of a post link (t.me/durov/531 has id 531) or the id field of telegram-channel-posts. A post that does not exist, was deleted, or belongs to a channel that is not public returns not found. Telegram's terms restrict using platform content to train AI or machine-learning systems, so results must not be used for that purpose.", + "operationId": "telegram-post", "parameters": [ { - "description": "Store path from a /subway/sitemap entry", + "description": "Public channel username, with or without @ or a t.me link", "in": "query", - "name": "path", + "name": "username", "required": true, "type": "string", - "x-example": "united-states/ny/new-york/1-penn-plaza" + "x-example": "durov" + }, + { + "description": "Post id, from a post link or telegram-channel-posts' own posts[].id field", + "in": "query", + "name": "id", + "required": true, + "type": "integer", + "x-example": 531 } ], "produces": [ @@ -491481,7 +506986,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/subway.storeResponseDoc" + "$ref": "#/definitions/telegram.postResponseDoc" } }, "400": { @@ -491514,24 +507019,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Subway store's detail", + "summary": "Get one public Telegram channel post", "tags": [ - "Subway" + "Telegram" ] } }, - "/sun/article": { + "/telegraph/article": { "get": { - "description": "Returns one The Sun article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag. Subscriber-only or blocked pages return an error instead.", - "operationId": "sun-article", + "description": "Returns one The Telegraph article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag. Access is intermittent, and subscriber-only or blocked pages return an error.", + "operationId": "telegraph-article", "parameters": [ { - "description": "Canonical The Sun article URL", + "description": "Canonical The Telegraph article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.thesun.co.uk/news/12345678/example/" + "x-example": "https://www.telegraph.co.uk/world-news/example/" } ], "produces": [ @@ -491568,24 +507073,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sun article content", + "summary": "Get The Telegraph article content", "tags": [ - "The Sun" + "The Telegraph" ] } }, - "/sun/author": { + "/telegraph/author": { "get": { - "description": "Returns a Sun author's profile by `url`, a canonical `thesun.co.uk/author//` link: name, job title, bio and recent articles with title, URL, excerpt, category and category URL. `job_title` is often empty because most Sun bylines carry only a name and bio.", - "operationId": "sun-author", + "description": "Returns a Telegraph author's profile by `url`, a canonical `telegraph.co.uk/authors////` link: name, job title, bio and recent articles with title, URL, excerpt and ISO-8601 `published_at`. `job_title` can be empty for contributors without a masthead credit.", + "operationId": "telegraph-author", "parameters": [ { - "description": "Canonical The Sun author URL", + "description": "Canonical Telegraph author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.thesun.co.uk/author/becky-pemberton/" + "x-example": "https://www.telegraph.co.uk/authors/c/ck-co/con-coughlin/" } ], "produces": [ @@ -491595,7 +507100,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sunAuthorResponseDoc" + "$ref": "#/definitions/publicnews.telegraphAuthorResponseDoc" } }, "400": { @@ -491622,36 +507127,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Sun author profile", + "summary": "Get a Telegraph author profile", "tags": [ - "The Sun" + "The Telegraph" ] } }, - "/sun/headlines": { + "/telegraph/headlines": { "get": { - "description": "Returns the current headlines for one The Sun section. `section` is required and takes one of `news`, `politics`, `royal-family`, `sport`, `showbiz`, `money`, `tech`, `fabulous`, `travel` or `health`. Every item has its title and URL. The `news` section also carries summary, author, publication time and image when the outlet provides them.", - "operationId": "sun-headlines", + "description": "Returns the current headlines for one The Telegraph section. `section` is required and takes one of `uk-news`, `world-news`, `politics`, `business`, `finance`, `technology`, `sport`, `culture`, `travel`, `lifestyle`, `health`, `science` or `opinion`. Each item has its title and URL.", + "operationId": "telegraph-headlines", "parameters": [ { - "description": "The Sun section slug", + "description": "The Telegraph section slug", "enum": [ - "news", + "uk-news", + "world-news", "politics", - "royal-family", + "business", + "finance", + "technology", "sport", - "showbiz", - "money", - "tech", - "fabulous", + "culture", "travel", - "health" + "lifestyle", + "health", + "science", + "opinion" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "news" + "x-example": "uk-news" } ], "produces": [ @@ -491682,16 +507190,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sun section headlines", + "summary": "Get The Telegraph section headlines", "tags": [ - "The Sun" + "The Telegraph" ] } }, - "/sun/news": { + "/telegraph/news": { "get": { - "description": "Returns the current top stories from The Sun. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", - "operationId": "sun-news", + "description": "Returns the current top stories from The Telegraph. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. It can return an error when The Telegraph declines the request.", + "operationId": "telegraph-news", "produces": [ "application/json" ], @@ -491714,16 +507222,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sun top stories", + "summary": "Get The Telegraph top stories", "tags": [ - "The Sun" + "The Telegraph" ] } }, - "/sun/sections": { + "/telegraph/sections": { "get": { - "description": "Lists the The Sun sections that the headlines endpoint accepts, such as `news`, `politics`, `royal-family`, `sport`, `showbiz`, `money`, `tech`, `fabulous`, `travel` and `health`. Each entry has a `slug`, a display `name` and a section `url`.", - "operationId": "sun-sections", + "description": "Lists the The Telegraph sections that the headlines endpoint accepts, such as `uk-news`, `world-news`, `politics`, `finance`, `culture` and `opinion`. Each entry has a `slug`, a display `name` and a section `url`.", + "operationId": "telegraph-sections", "produces": [ "application/json" ], @@ -491740,35 +507248,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Sun sections", + "summary": "Get The Telegraph sections", "tags": [ - "The Sun" + "The Telegraph" ] } }, - "/swiggy/collections": { + "/tes/jobs/detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns the curated dish/cuisine collections Swiggy's own homepage surfaces for a latitude/longitude (e.g. \"Idli\", \"Biryani\", \"Dosa\"). Each collection's id is the value /swiggy/search's collection_id param takes to browse restaurants within it. The response also carries is_serviceable, which says whether Swiggy delivers to the requested coordinates at all: false means the coordinates are outside Swiggy's delivery coverage, so the empty collections list is a coverage answer rather than a location that simply has no curated collections.", - "operationId": "swiggy-collections", + "description": "Returns detail for one job posting by its numeric id (the id field returned by tes-job-search): employer, location, salary, contract terms/types, dates, and application contact/URL, plus a short excerpt of the listing description rather than the full long-form HTML copy.", + "operationId": "tes-job-detail", "parameters": [ { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 12.9716 - }, - { - "description": "Search center longitude", + "description": "Tes job id", "in": "query", - "name": "longitude", + "name": "id", "required": true, - "type": "number", - "x-example": 77.5946 + "type": "string", + "x-example": "2340998" } ], "produces": [ @@ -491778,7 +507278,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/swiggy.collectionsResponseDoc" + "$ref": "#/definitions/tes.jobDetailResponseDoc" } }, "400": { @@ -491787,69 +507287,14 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List Swiggy's curated collections for a location", - "tags": [ - "Swiggy" - ] - } - }, - "/swiggy/restaurant": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Swiggy restaurant's detail by id: name, city, area, address, postal code, coordinates, phone, cuisines, cost for two, rating and total rating count, delivery time, weekly opening hours with the current open/closed callout, plus the promotions Swiggy currently shows on that restaurant's page (headline discount, conditions, and coupon code when one is needed). Swiggy has no lighter restaurant-detail-only source -- this reads the same upstream as /swiggy/restaurant/menu, just without the menu items.", - "operationId": "swiggy-restaurant", - "parameters": [ - { - "description": "Restaurant id, from /swiggy/search's id field", - "in": "query", - "name": "restaurant_id", - "required": true, - "type": "string", - "x-example": "5938" - }, - { - "description": "Caller latitude (required by Swiggy's own menu API)", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 12.9716 - }, - { - "description": "Caller longitude (required by Swiggy's own menu API)", - "in": "query", - "name": "longitude", - "required": true, - "type": "number", - "x-example": 77.5946 - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/swiggy.restaurantResponseDoc" - } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -491866,43 +507311,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Swiggy restaurant's detail", + "summary": "Get a Tes teaching job", "tags": [ - "Swiggy" + "Tes" ] } }, - "/swiggy/restaurant/menu": { + "/tes/jobs/employer": { "get": { "consumes": [ "application/json" ], - "description": "Returns one restaurant's full menu grouped into categories, plus its restaurant summary. Every item carries a name, description, category, price, discounted_price when currently discounted, veg/non-veg flag, stock status, an image, and Swiggy's own per-dish rating and review count where it carries one. A category nested under a parent group on the live site (e.g. \"Whopper\" under \"Burgers, Wraps & Tacos\") is flattened to one level: its title is the parent's, with subcategory set to its own name. The response also carries the restaurant's current promotions in offers, the same block /swiggy/restaurant returns.", - "operationId": "swiggy-restaurant-menu", + "description": "Returns detail for one jobs employer profile by its numeric id (the trailing id in tes-job-detail's employer_url field, e.g. .../jobs/employer/epsom-college-1039424 -- the 1039424): name, location, school type/phase/funding status/gender/age range, an about description, its postal address, and every currently-open position listed on the employer's own profile page (id, title, url -- call tes-job-detail with each id for the full posting).", + "operationId": "tes-job-employer", "parameters": [ { - "description": "Restaurant id, from /swiggy/search's id field", + "description": "Tes employer id", "in": "query", - "name": "restaurant_id", + "name": "id", "required": true, "type": "string", - "x-example": "5938" - }, - { - "description": "Caller latitude (required by Swiggy's own menu API)", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 12.9716 - }, - { - "description": "Caller longitude (required by Swiggy's own menu API)", - "in": "query", - "name": "longitude", - "required": true, - "type": "number", - "x-example": 77.5946 + "x-example": "1039424" } ], "produces": [ @@ -491912,7 +507341,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/swiggy.menuResponseDoc" + "$ref": "#/definitions/tes.employerDetailResponseDoc" } }, "400": { @@ -491921,6 +507350,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -491933,101 +507374,136 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Swiggy restaurant's menu with prices", + "summary": "Get a Tes jobs employer profile", "tags": [ - "Swiggy" + "Tes" ] } }, - "/swiggy/search": { + "/tes/jobs/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns restaurants delivering to a latitude/longitude, optionally filtered by a keyword or browsed within a curated collection. With no query and no collection_id this browses the nearby-restaurant listing; with a query it runs a keyword search across restaurant names, cuisines, and dishes; with a collection_id (from /swiggy/collections) it browses restaurants within that curated collection. query and collection_id are mutually exclusive. Keyword search has two result tabs, selected with tab: dish (the default) returns restaurants that serve a matching dish, each with the matching dishes, their prices, and Swiggy's own per-dish rating where it has one, in a dishes array; restaurant returns restaurants whose own name or cuisine matches, a wider set with no dishes. tab, veg, min_rating and offers are only valid together with query. sort works with either query (relevance, delivery_time, rating) or collection_id (those three plus cost_low_to_high and cost_high_to_low), and is rejected on a plain nearby browse. Each restaurant carries its id (the value the restaurant and menu endpoints take), name, cuisines, cost for two, rating, delivery time, open/closed status, a hero image, and, where one is shown, an external_rating block with the third-party aggregate score, count, and source. Where the result card advertises a promotion it also carries offers, the same title/description/tag shape /swiggy/restaurant returns (a listing card never carries a coupon code, and a card showing both a discount and a separate free-delivery benefit returns them as two entries). is_promoted is present and true only for a result Swiggy itself labels a sponsored placement rather than an organic one. unavailable_message is present only when Swiggy says the restaurant cannot currently be ordered from and carries its own reason; it is not the inverse of is_open, since Swiggy reports a restaurant as open while still refusing orders for the requested location. A plain nearby browse also returns is_serviceable, which says whether Swiggy delivers to the requested coordinates at all: false means the coordinates are outside Swiggy's delivery coverage, so the empty restaurants list is a coverage answer rather than a no-matches answer, while an empty list without the field means no matches in a served area. It is omitted on keyword search and on a collection_id browse, neither of which carries Swiggy's own coverage marker.", - "operationId": "swiggy-search", + "description": "Searches Tes's (tes.com) teaching-jobs board. Returns listing facts (title, employer, location, salary, contract terms/types) plus a short excerpt of the listing description, not the full long-form job-description copy, and the same live faceted-search breakdown (position/subject/workplace category trees with counts, plus contract type/term counts) the real search page renders as its filter sidebar. location is a free-text place name (a UK town/city, an international city, or a bare country name) resolved to coordinates; omit for Tes's own default market, \"United Kingdom\". radius_miles selects the search radius around location. contract_type and contract_term are validated against Tes's own small, closed label sets. position, subject, and workplace are comma-separated filters -- Tes's own category labels are numerous and can change, so read a prior response's own facets.positions[].value (and facets.positions[].children[].value)/facets.subjects[].value/facets.workplaces[].children[].value for the live, current set rather than guessing. salary_min filters to jobs with an advertised salary at or above that amount (in the searched market's local currency); Tes's own filter panel offers only a minimum, no maximum.", + "operationId": "tes-job-search", "parameters": [ { - "description": "Search center latitude", + "description": "Job title or keyword", "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 12.9716 + "name": "keywords", + "type": "string", + "x-example": "maths teacher" }, { - "description": "Search center longitude", + "default": "United Kingdom", + "description": "Free-text place name resolved via Tes's own location autocomplete", "in": "query", - "name": "longitude", - "required": true, - "type": "number", - "x-example": 77.5946 + "name": "location", + "type": "string", + "x-example": "Manchester" }, { - "description": "Optional keyword to search restaurants and dishes by, at least 2 characters. Mutually exclusive with collection_id.", + "default": 30, + "description": "Search radius around location, in miles", + "enum": [ + 3, + 5, + 10, + 15, + 20, + 30, + 50, + 70, + 100, + 500 + ], "in": "query", - "name": "query", - "type": "string", - "x-example": "pizza" + "name": "radius_miles", + "type": "integer" }, { - "description": "Optional curated collection id from /swiggy/collections's id field. Browses restaurants within that collection instead of the plain nearby listing. Mutually exclusive with query.", + "default": 1, + "description": "One-based page", "in": "query", - "name": "collection_id", - "type": "string", - "x-example": "80440" + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" }, { - "description": "Optional sort order. With query: relevance, delivery_time, rating. With collection_id: those three plus cost_low_to_high and cost_high_to_low. Not valid on a plain nearby browse.", + "default": 20, + "description": "Results per page", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "page_size", + "type": "integer" + }, + { + "default": "relevance", + "description": "Sort order", "enum": [ "relevance", - "delivery_time", - "rating", - "cost_low_to_high", - "cost_high_to_low" + "newest", + "distance" ], "in": "query", - "name": "sort", - "type": "string", - "x-example": "rating" + "name": "sort", + "type": "string" }, { - "description": "Opaque pagination cursor from a prior response's next_offset (not meaningful when query is set)", + "description": "Contract type", + "enum": [ + "Full Time", + "Part Time" + ], "in": "query", - "name": "offset", + "name": "contract_type", "type": "string" }, { - "description": "Which keyword-search result tab to read: dish (default, restaurants serving a matching dish, each with a dishes array) or restaurant (restaurants whose own name/cuisine matches). Only valid together with query.", + "description": "Contract term", "enum": [ - "dish", - "restaurant" + "Permanent", + "Fixed Term", + "Casual", + "Maternity Cover", + "Temporary", + "Supply" ], "in": "query", - "name": "tab", + "name": "contract_term", + "type": "string" + }, + { + "description": "Comma-separated position category label(s) -- see the endpoint markdown", + "in": "query", + "name": "position", "type": "string", - "x-example": "restaurant" + "x-example": "Teaching and Lecturing" }, { - "description": "Only return vegetarian results: veg dishes on tab=dish, pure-veg restaurants on tab=restaurant. Only valid together with query.", + "description": "Comma-separated subject label(s) -- see the endpoint markdown", "in": "query", - "name": "veg", - "type": "boolean", - "x-example": true + "name": "subject", + "type": "string", + "x-example": "Mathematics" }, { - "description": "Only return restaurants rated at or above this score (0-5). Only valid together with query.", + "description": "Comma-separated workplace/organisation-type label(s) -- see the endpoint markdown", "in": "query", - "name": "min_rating", - "type": "number", - "x-example": 4 + "name": "workplace", + "type": "string", + "x-example": "Secondary" }, { - "description": "Only return restaurants currently running an offer. Only valid together with query.", + "description": "Minimum advertised salary, in the searched market's local currency", "in": "query", - "name": "offers", - "type": "boolean", - "x-example": true + "minimum": 0, + "name": "salary_min", + "type": "integer", + "x-example": 28000 } ], "produces": [ @@ -492037,7 +507513,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/swiggy.searchResponseDoc" + "$ref": "#/definitions/tes.jobSearchResponseDoc" } }, "400": { @@ -492046,6 +507522,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -492058,27 +507540,43 @@ "ApiKeyAuth": [] } ], - "summary": "Search Swiggy restaurants near a location", + "summary": "Search Tes teaching jobs", "tags": [ - "Swiggy" + "Tes" ] } }, - "/taco-bell/app-menu": { + "/tes/resources/detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Taco Bell US restaurant's complete app-ordering catalog by store number: every category, every individually orderable product, AND every combo (kind \"bundle\") it carries. This is the only endpoint in this family that publishes combos at all -- each one resolved down to its full slot composition (choices[], each with min/max selections and the product codes it defaults to when not customized), not just a name and price. Also returns the store's named ordering windows (dayparts) and, per item, which dayparts it is orderable in. Store numbers come from GET /taco-bell/stores.", - "operationId": "taco-bell-app-menu", + "description": "Returns detail for one teaching resource by its numeric id (the id field returned by tes-resource-search). Descriptive facts (title, subject, age range, resource type, author, price, rating, licence label), a per-file attachment list (file type, size, and a preview thumbnail -- metadata only), and the most recent page of reviews are returned -- not the downloadable resource file itself.", + "operationId": "tes-resource-detail", "parameters": [ { - "description": "Taco Bell store number, from /taco-bell/stores", + "description": "Tes resource id", "in": "query", - "name": "store_number", + "name": "id", "required": true, "type": "string", - "x-example": "034922" + "x-example": "13463100" + }, + { + "default": "GB", + "description": "Storefront market for pricing/currency", + "enum": [ + "GB", + "US", + "AU", + "IE", + "CA", + "NZ", + "UN" + ], + "in": "query", + "name": "country", + "type": "string" } ], "produces": [ @@ -492088,7 +507586,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.appMenuResponseDoc" + "$ref": "#/definitions/tes.resourceDetailResponseDoc" } }, "400": { @@ -492121,19 +507619,107 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Taco Bell restaurant's full app-ordering catalog, combos included", + "summary": "Get a Tes teaching resource", "tags": [ - "TacoBell" + "Tes" ] } }, - "/taco-bell/categories": { + "/tes/resources/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Taco Bell's US menu categories -- 17 at time of writing, including tacos, burritos, quesadillas, nachos, bowls, breakfast, drinks, snacks-sweets, specialties, party-packs, vegetarian, boxes-and-combos and the value menus. Each entry's slug is the value GET /taco-bell/menu takes. A category flagged hidden_from_menu is one Taco Bell does not surface in its own navigation; it is still fetchable. Takes no parameters.", - "operationId": "taco-bell-categories", + "description": "Searches Tes's (tes.com) teaching-resources marketplace. Returns listing facts (title, author, price, rating, downloads) -- not full listing descriptions. query is optional: omit it (alone, or combined with key_stage/subject/on_sale) for pure filter-driven or fully unfiltered browsing. sort mirrors the real search page's own Sort by dropdown; key_stage and subject mirror its left-hand Refine by filters (both closed, validated enums taken from Tes's own facet taxonomy, and always resolved against Tes's own single GB-taxonomy regardless of country). country controls result currency/localisation only (confirmed live for all seven values); it does not change which key_stage/subject values are valid.", + "operationId": "tes-resource-search", + "parameters": [ + { + "description": "Search keywords -- omit for filter-driven or unfiltered browsing", + "in": "query", + "name": "query", + "type": "string", + "x-example": "phonics" + }, + { + "default": "GB", + "description": "Storefront market", + "enum": [ + "GB", + "US", + "AU", + "IE", + "CA", + "NZ", + "UN" + ], + "in": "query", + "name": "country", + "type": "string" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 20, + "description": "Results per page", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "page_size", + "type": "integer" + }, + { + "default": "relevance", + "description": "Sort order", + "enum": [ + "relevance", + "newest", + "highest_rated", + "lowest_price" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "Filter by age range", + "enum": [ + "3-5", + "5-7", + "7-11", + "11-14", + "14-16", + "16+", + "age_not_applicable" + ], + "in": "query", + "name": "key_stage", + "type": "string" + }, + { + "description": "Filter by subject -- one of Tes's own top-level subject facet labels; see the endpoint markdown for the full list (two of the 29 values contain a comma, which is why this parameter is not expressed as a Swagger Enums() list)", + "enum": [ + "" + ], + "in": "query", + "name": "subject", + "type": "string", + "x-example": "English" + }, + { + "default": false, + "description": "Filter to discounted resources only", + "in": "query", + "name": "on_sale", + "type": "boolean" + } + ], "produces": [ "application/json" ], @@ -492141,7 +507727,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.categoriesResponseDoc" + "$ref": "#/definitions/tes.resourceSearchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -492162,27 +507754,43 @@ "ApiKeyAuth": [] } ], - "summary": "List Taco Bell menu categories", + "summary": "Search Tes teaching resources", "tags": [ - "TacoBell" + "Tes" ] } }, - "/taco-bell/menu": { + "/tes/resources/shop": { "get": { "consumes": [ "application/json" ], - "description": "Returns the items in one Taco Bell US menu category, each with its product code, name, price, calorie count, product and food type, image, and flags for whether it is customizable, has a meatless variant, and is currently available in store. Category slugs come from GET /taco-bell/categories, and the endpoint accepts either the bare slug (`tacos`) or the full path form (`/food/tacos`). Taco Bell is one of the few brands publishing both price and calories in the same payload.", - "operationId": "taco-bell-menu", + "description": "Returns detail for one teaching-resources author/seller shop by its username (from tes-resource-search/tes-resource-detail's author field, or the trailing path segment of author_url): display name, average rating, upload/view/download counts, a bio, and a page of that author's resource listing (id, title, price, thumbnail -- call tes-resource-detail with each id for subject/age-range/resource-type/rating/description). subject narrows the listing to one of the subject tabs shown on the shop's own page; these vary per author and are not a curated enum.", + "operationId": "tes-resource-shop", "parameters": [ { - "description": "Category slug from /taco-bell/categories", + "description": "Tes author username", "in": "query", - "name": "category", + "name": "username", "required": true, "type": "string", - "x-example": "tacos" + "x-example": "jenpower16" + }, + { + "description": "Subject tab to filter the listing to -- see the shop's own page for the current set", + "in": "query", + "name": "subject", + "type": "string", + "x-example": "Whole school" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" } ], "produces": [ @@ -492192,7 +507800,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.menuResponseDoc" + "$ref": "#/definitions/tes.resourceShopResponseDoc" } }, "400": { @@ -492225,42 +507833,45 @@ "ApiKeyAuth": [] } ], - "summary": "List one Taco Bell menu category's items with prices and calories", + "summary": "Get a Tes teaching-resources author shop", "tags": [ - "TacoBell" + "Tes" ] } }, - "/taco-bell/nutrition": { + "/tes/schools/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the complete nutrition-facts panel for one Taco Bell US menu item -- fats (total, saturated, trans, poly- and monounsaturated), cholesterol, sodium, potassium, carbohydrates, fiber, sugars including added sugars, protein, and the vitamin and mineral figures -- plus serving size and weight and the item's declared allergens. Values are unrounded as published, in the panel's own units: grams for fats, carbohydrates and protein, milligrams for cholesterol, sodium, potassium, calcium, iron and caffeine, and micrograms for vitamin D. This goes well beyond the calorie count on /taco-bell/menu and /taco-bell/product, which is all the menu pages themselves carry. The full component-by-component ingredient statement is available via include_ingredients; it runs to several kilobytes per item, so it is off by default.", - "operationId": "taco-bell-nutrition", + "description": "Searches Tes's (tes.com) public Schools Directory by school name or location. Returns listing facts (name, logo, a short description, address) for each matching school/employer. Each result's id is the same employer id tes-job-employer accepts, so a caller can go straight from a name/location search to a full employer profile (school type/phase/funding status/gender/age range, and its currently-open positions) without first needing a job posting to discover the id.", + "operationId": "tes-school-search", "parameters": [ { - "description": "Category slug from /taco-bell/categories", + "description": "School name or location", "in": "query", - "name": "category", + "name": "query", "required": true, "type": "string", - "x-example": "burritos" + "x-example": "Epsom" }, { - "description": "Product slug, the last segment of a /food/{category}/{product} URL", + "default": 1, + "description": "One-based page", "in": "query", - "name": "product", - "required": true, - "type": "string", - "x-example": "burrito-supreme" + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" }, { - "description": "Include the full ingredient statement (default false -- it is long)", + "default": 20, + "description": "Results per page", "in": "query", - "name": "include_ingredients", - "type": "boolean", - "x-example": false + "maximum": 50, + "minimum": 1, + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -492270,7 +507881,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.nutritionResponseDoc" + "$ref": "#/definitions/tes.schoolSearchResponseDoc" } }, "400": { @@ -492279,12 +507890,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -492303,35 +507908,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Taco Bell menu item's full nutrition panel, allergens and ingredients", + "summary": "Search the Tes Schools Directory", "tags": [ - "TacoBell" + "Tes" ] } }, - "/taco-bell/product": { + "/tesla-jobs/job": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Taco Bell US menu item in full: product code, name, description, price, rounded and unrounded calorie counts, every published image rendition, and cross-sell/upsell references. The distinguishing part is `customizations` -- the option groups the item accepts (proteins, included ingredients, add-ons, sauces, shells, upgrades, and Supreme/Fresco add and remove sets), each option carrying its own calorie delta and add-on price. Calorie deltas can be negative, since the Fresco style replaces sauces. Slugs come from GET /taco-bell/menu, and both the bare slug and the full path form are accepted.", - "operationId": "taco-bell-product", + "description": "Returns one Tesla Careers posting by its numeric job id (the `id` field returned by the list endpoint).", + "operationId": "tesla-jobs-job", "parameters": [ { - "description": "Category slug from /taco-bell/categories", - "in": "query", - "name": "category", - "required": true, - "type": "string", - "x-example": "burritos" - }, - { - "description": "Product slug, the last segment of a /food/{category}/{product} URL", + "description": "Tesla job id", "in": "query", - "name": "product", + "name": "id", "required": true, "type": "string", - "x-example": "burrito-supreme" + "x-example": "224501" } ], "produces": [ @@ -492341,7 +507938,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.productResponseDoc" + "$ref": "#/definitions/teslajobs.jobResponseDoc" } }, "400": { @@ -492374,27 +507971,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Taco Bell menu item's full detail, including its customization matrix", + "summary": "Tesla Jobs single posting", "tags": [ - "TacoBell" + "Tesla Jobs" ] } }, - "/taco-bell/store": { + "/tesla-jobs/list": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Taco Bell US restaurant by store number: address and coordinates, phone, open status, timezone, delivery and online-ordering state, Taco Bell's per-store capability flags, mobile-pickup status and geofencing radius. Where GET /taco-bell/stores gives only today's window for each nearby restaurant, this returns the full published week, Monday-first, and each day's dayparts. Dayparts matter for ordering: Taco Bell's menu availability is daypart-scoped, so breakfast items and Balance Of Day items are orderable in different windows of the same day. Store numbers come from GET /taco-bell/stores.", - "operationId": "taco-bell-store", + "description": "Searches Tesla's public careers site (tesla.com/careers) via its own careers-state JSON endpoint. Tesla's own endpoint always returns its entire global job dataset regardless of query parameters; this filters and paginates that snapshot server-side. Listings carry identity/department/location metadata only — call the job endpoint for the full description, responsibilities, and requirements.", + "operationId": "tesla-jobs-list", "parameters": [ { - "description": "Taco Bell store number, from /taco-bell/stores", + "description": "Filter by title or department, case-insensitive substring match", "in": "query", - "name": "store_number", - "required": true, + "name": "query", "type": "string", - "x-example": "040890" + "x-example": "software engineer" + }, + { + "description": "Filter by location, case-insensitive substring match", + "in": "query", + "name": "location", + "type": "string", + "x-example": "Palo Alto" + }, + { + "description": "Page number, 1-based", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Results per page, up to 100", + "in": "query", + "name": "page_size", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -492404,7 +508021,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.storeDetailResponseDoc" + "$ref": "#/definitions/teslajobs.listResponseDoc" } }, "400": { @@ -492413,12 +508030,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -492437,27 +508048,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Taco Bell restaurant's full record, including the whole week's hours and dayparts", + "summary": "Tesla Jobs listing", "tags": [ - "TacoBell" + "Tesla Jobs" ] } }, - "/taco-bell/store-menu": { + "/theage/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Taco Bell US restaurant's entire menu -- every category and item in one call, each with its price, calories, product and food type, image, and whether it is currently carried and displayed at THIS store. Where GET /taco-bell/menu returns one category's items from the national default catalog, this is store-scoped: some items are absent or hidden at some restaurants, and this is the only endpoint that shows that per store. Also returns the store's current happy-hour discount window, published nowhere else in this family. The response can be cached at the edge for up to 24 hours, so treat it as a recent snapshot of what the store carries rather than a live per-second signal; for a store's serving-time windows (breakfast vs. Balance Of Day, etc.) use GET /taco-bell/store instead. Store numbers come from GET /taco-bell/stores.", - "operationId": "taco-bell-store-menu", + "description": "Returns one The Age article's public metadata and the body paragraphs an anonymous visitor's page request is served, from a canonical article URL. The Age runs a metered subscription paywall; the response reports it with is_accessible_for_free (the page's own declaration), paywalled (the page marks the story as subscriber content), and is_truncated (the page served a shortened preview, or no body at all, instead of the full story). Paywalls are never bypassed and body text is never fabricated. Video-only pages are rejected with a 400.", + "operationId": "theage-article", "parameters": [ { - "description": "Taco Bell store number, from /taco-bell/stores", + "description": "Canonical The Age article URL", "in": "query", - "name": "store_number", + "name": "url", "required": true, "type": "string", - "x-example": "040890" + "x-example": "https://www.theage.com.au/politics/federal/albanese-once-criticised-rivals-for-abusing-this-power-just-look-at-him-now-20260925-p60zxu.html" } ], "produces": [ @@ -492467,7 +508075,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.storeMenuResponseDoc" + "$ref": "#/definitions/publicnews.theageArticleResponseDoc" } }, "400": { @@ -492482,12 +508090,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -492500,49 +508102,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get one Taco Bell restaurant's full live catalog in a single call", + "summary": "Get The Age article content", "tags": [ - "TacoBell" + "The Age" ] } }, - "/taco-bell/stores": { + "/theage/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Taco Bell US restaurants near a latitude/longitude, ordered by distance. Each store carries its store number, full postal address with coordinates, phone, distance, open status, timezone, today's published opening and closing hours, and Taco Bell's own per-store capability flags (breakfast, drive-thru, delivery, mobile ordering, open late, pickup shelves, Live Mas Cafe, online). A coordinate with no Taco Bell nearby returns an empty list rather than an error.", - "operationId": "taco-bell-stores", + "description": "Returns an Age journalist's public profile -- name, short biography, headshot, contact email and social links where published -- plus their recent stories, from a canonical https://www.theage.com.au/by/- URL.", + "operationId": "theage-author", "parameters": [ { - "description": "Search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 34.0522 - }, - { - "description": "Search center longitude", + "description": "Canonical The Age journalist URL", "in": "query", - "name": "longitude", + "name": "url", "required": true, - "type": "number", - "x-example": -118.2437 - }, - { - "description": "Stores per page, 1-50 (default 10)", - "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 10 - }, - { - "description": "0-based page index (default 0)", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 0 + "type": "string", + "x-example": "https://www.theage.com.au/by/chip-le-grand-p4yvib" } ], "produces": [ @@ -492552,7 +508129,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tacobell.storesResponseDoc" + "$ref": "#/definitions/publicnews.theageAuthorResponseDoc" } }, "400": { @@ -492567,12 +508144,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -492585,16 +508156,124 @@ "ApiKeyAuth": [] } ], - "summary": "Find Taco Bell restaurants near a location", + "summary": "Get an Age journalist profile", "tags": [ - "TacoBell" + "The Age" ] } }, - "/target/categories": { + "/theage/headlines": { "get": { - "description": "Lists Target's top-level category menu in `categories`, plus the grouped shop-all directory in `groups`. Each category has an `id` (the one used by `/target/category-products`), name, canonical URL and, when Target supplies one, an image URL. The response also gives `count` and `group_count`. Takes no parameters.", - "operationId": "target-categories", + "description": "Returns the current stories for one The Age section: title, canonical URL, summary, author, publication time, and image where the section lists them. section must be one of the slugs returned by /theage/sections; any other value is rejected with a 400 before The Age is contacted.", + "operationId": "theage-headlines", + "parameters": [ + { + "description": "Section slug from /theage/sections", + "enum": [ + "melbourne-news", + "national/victoria", + "politics", + "politics/federal", + "politics/victoria", + "politics/nsw", + "politics/queensland", + "politics/western-australia", + "business", + "business/companies", + "business/markets", + "business/bullsnbears", + "business/the-economy", + "business/banking-and-finance", + "business/small-business", + "business/workplace", + "world", + "world/north-america", + "world/europe", + "world/asia", + "world/middle-east", + "world/south-america", + "world/africa", + "national", + "national/nsw", + "national/queensland", + "national/western-australia", + "opinion", + "property", + "property/news", + "property/living", + "sport", + "sport/afl", + "sport/cricket", + "sport/soccer", + "sport/racing", + "sport/tennis", + "sport/nrl", + "sport/rugby-union", + "sport/netball", + "sport/basketball", + "sport/motorsport", + "sport/cycling", + "sport/golf", + "sport/nfl", + "sport/athletics", + "sport/swimming", + "sport/boxing", + "goodfood", + "goodfood/melbourne-eating-out", + "goodfood/recipes", + "goodfood/tips-and-advice", + "goodfood/drinks", + "culture", + "culture/movies", + "culture/tv-and-radio", + "culture/music", + "culture/celebrity", + "culture/books", + "culture/comedy", + "culture/dance", + "culture/musicals", + "culture/opera", + "culture/theatre", + "culture/art-and-design", + "culture/live-reviews", + "lifestyle", + "lifestyle/health-and-wellness", + "lifestyle/fashion", + "lifestyle/life-and-relationships", + "lifestyle/beauty", + "traveller", + "traveller/inspiration/destination-guides", + "traveller/inspiration", + "traveller/reviews-and-advice", + "traveller/travel-news", + "good-weekend", + "sunday-life", + "money", + "money/super-and-retirement", + "money/investing", + "money/banking", + "money/borrowing", + "money/saving", + "money/tax", + "money/planning-and-budgeting", + "education", + "healthcare", + "environment", + "environment/conservation", + "environment/climate-change", + "environment/sustainability", + "environment/weather", + "technology", + "technology/video-games", + "australia-higher-education" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "politics/federal" + } + ], "produces": [ "application/json" ], @@ -492602,11 +508281,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/target.categoriesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -492623,66 +508302,16 @@ "ApiKeyAuth": [] } ], - "summary": "List all Target categories", + "summary": "Get The Age section headlines", "tags": [ - "Target" + "The Age" ] } }, - "/target/category-products": { + "/theage/news": { "get": { - "description": "Returns paginated products for any category id from target-categories. Each response also contains every available dynamic filter group and option. Pass selected option ids through filter_ids as a comma-separated list. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.", - "operationId": "target-category-products", - "parameters": [ - { - "description": "Target category id", - "in": "query", - "name": "category_id", - "required": true, - "type": "string", - "x-example": "5q0ga" - }, - { - "default": 1, - "description": "One-based page (1-50)", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": "featured", - "description": "Result order", - "enum": [ - "relevance", - "featured", - "price-low", - "price-high", - "rating", - "bestselling", - "newest" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": 2885, - "description": "Target store id used for pricing", - "in": "query", - "minimum": 1, - "name": "store_id", - "type": "integer" - }, - { - "description": "Comma-separated Target filter option ids", - "in": "query", - "name": "filter_ids", - "type": "string", - "x-example": "5tdv1,fwtfr" - } - ], + "description": "Returns The Age's current \"Latest News\" public RSS feed: each story's title, canonical URL, summary, author, publication time, and lead image.", + "operationId": "theage-news", "produces": [ "application/json" ], @@ -492690,13 +508319,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/target.categoryProductsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -492717,47 +508340,16 @@ "ApiKeyAuth": [] } ], - "summary": "Browse Target category products", + "summary": "Get The Age top stories", "tags": [ - "Target" + "The Age" ] } }, - "/target/filter-options": { + "/theage/sections": { "get": { - "description": "Returns every dynamic filter group and option for either a product query or category. Provide exactly one of q or category_id. Pass currently selected option ids through filter_ids to obtain the remaining context-aware options.", - "operationId": "target-filter-options", - "parameters": [ - { - "description": "Product search query; mutually exclusive with category_id", - "in": "query", - "name": "q", - "type": "string", - "x-example": "coffee" - }, - { - "description": "Target category id; mutually exclusive with q", - "in": "query", - "name": "category_id", - "type": "string", - "x-example": "5q0ga" - }, - { - "default": 2885, - "description": "Target store id used for pricing", - "in": "query", - "minimum": 1, - "name": "store_id", - "type": "integer" - }, - { - "description": "Comma-separated selected Target filter option ids", - "in": "query", - "name": "filter_ids", - "type": "string", - "x-example": "5tdv1,fwtfr" - } - ], + "description": "Lists every The Age section accepted by /theage/headlines (96 sections from the site's own section menu), each with its slug, display name, and public section-front URL.", + "operationId": "theage-sections", "produces": [ "application/json" ], @@ -492765,25 +508357,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/target.filterOptionsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -492792,35 +508366,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Target filter options", + "summary": "Get The Age sections", "tags": [ - "Target" + "The Age" ] } }, - "/target/product": { + "/theatlantic/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns product details for one Target item, including product content, images, price, rating, category, and availability flags for the selected store.", - "operationId": "target-product", + "description": "Returns one public Atlantic article's metadata and body paragraphs from a canonical article URL. `metered` reflects the site's own soft-paywall flag for that article; the body returned here is the same one the site's own page serves to an anonymous visitor and is never truncated because of it. An article whose page genuinely withholds its body is reported as a restricted-access error instead of a hollow response.", + "operationId": "theatlantic-article", "parameters": [ { - "description": "Numeric Target item id (TCIN)", + "description": "Canonical The Atlantic article URL", "in": "query", - "name": "tcin", + "name": "url", "required": true, "type": "string", - "x-example": "12954151" - }, - { - "default": 2885, - "description": "Target store id used for pricing and availability", - "in": "query", - "minimum": 1, - "name": "store_id", - "type": "integer" + "x-example": "https://www.theatlantic.com/politics/2026/09/example-slug/688738/" } ], "produces": [ @@ -492830,7 +508393,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/target.productResponseDoc" + "$ref": "#/definitions/theatlantic.articleResponseDoc" } }, "400": { @@ -492839,6 +508402,12 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { @@ -492863,41 +508432,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Target product", + "summary": "Get an Atlantic article's content", "tags": [ - "Target" + "The Atlantic" ] } }, - "/target/questions": { + "/theatlantic/author": { "get": { - "description": "Lists customer questions for a Target item given by its numeric `tcin`, each with its text, author, submission time, helpful votes and nested answers. `page` is zero-based and `per_page` runs 1 to 25. The response gives `total_pages` and `count` for paging.", - "operationId": "target-questions", + "description": "Returns one Atlantic staff author's public profile -- name, headshot, and biography -- plus their recent articles, from a canonical author URL.", + "operationId": "theatlantic-author", "parameters": [ { - "description": "Numeric Target item id", + "description": "Canonical theatlantic.com/author// URL", "in": "query", - "name": "tcin", + "name": "url", "required": true, "type": "string", - "x-example": "91940750" - }, - { - "default": 0, - "description": "Zero-based page", - "in": "query", - "minimum": 0, - "name": "page", - "type": "integer" - }, - { - "default": 25, - "description": "Questions per page", - "in": "query", - "maximum": 25, - "minimum": 1, - "name": "per_page", - "type": "integer" + "x-example": "https://www.theatlantic.com/author/example-author/" } ], "produces": [ @@ -492907,7 +508459,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/target.questionsResponseDoc" + "$ref": "#/definitions/theatlantic.authorResponseDoc" } }, "400": { @@ -492916,68 +508468,14 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "List Target product questions and answers", - "tags": [ - "Target" - ] - } - }, - "/target/reviews": { - "get": { - "description": "Lists written reviews for a Target item given by its numeric `tcin`. Each review has its rating, title, text, author, submission time, helpful votes, and verified and syndicated flags. `page` is zero-based and stops at 50; `per_page` runs 1 to 25. The response gives `total` and `total_pages`.", - "operationId": "target-reviews", - "parameters": [ - { - "description": "Numeric Target item id", - "in": "query", - "name": "tcin", - "required": true, - "type": "string", - "x-example": "91940750" - }, - { - "default": 0, - "description": "Zero-based page", - "in": "query", - "maximum": 50, - "minimum": 0, - "name": "page", - "type": "integer" - }, - { - "default": 25, - "description": "Reviews per page", - "in": "query", - "maximum": 25, - "minimum": 1, - "name": "per_page", - "type": "integer" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/target.reviewsResponseDoc" - } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -492994,67 +508492,39 @@ "ApiKeyAuth": [] } ], - "summary": "List Target product reviews", + "summary": "Get an Atlantic staff author profile", "tags": [ - "Target" + "The Atlantic" ] } }, - "/target/search": { + "/theatlantic/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Target products and returns products plus every filter group and option available for the current result set. Pass option ids back through filter_ids as a comma-separated list. A zero total with an empty products list is a valid no-results response. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.", - "operationId": "target-search", + "description": "Returns the current front-page article cards for one Atlantic section: each story's title, canonical URL, description, byline, publication time, and lead image. Section must be a slug returned by /theatlantic/sections.", + "operationId": "theatlantic-headlines", "parameters": [ { - "description": "Product search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "coffee" - }, - { - "default": 1, - "description": "One-based page (1-50)", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": "relevance", - "description": "Result order", + "description": "Section slug from /theatlantic/sections", "enum": [ - "relevance", - "featured", - "price-low", - "price-high", - "rating", - "bestselling", - "newest" + "ideas", + "politics", + "economy", + "international", + "national-security", + "technology", + "science", + "health", + "education", + "culture", + "family", + "books", + "photography" ], "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": 2885, - "description": "Target store id used for pricing", - "in": "query", - "minimum": 1, - "name": "store_id", - "type": "integer" - }, - { - "description": "Comma-separated Target filter option ids", - "in": "query", - "name": "filter_ids", + "name": "section", + "required": true, "type": "string", - "x-example": "5tdv1,fwtfr" + "x-example": "politics" } ], "produces": [ @@ -493064,7 +508534,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/target.searchResponseDoc" + "$ref": "#/definitions/theatlantic.headlinesResponseDoc" } }, "400": { @@ -493073,6 +508543,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -493091,44 +508567,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search Target products", + "summary": "Get the latest stories in an Atlantic section", "tags": [ - "Target" + "The Atlantic" ] } }, - "/target/stores": { + "/theatlantic/sections": { "get": { - "description": "Returns Target's physical stores near a ZIP code, a free-text \"city, state\", or a \"latitude,longitude\" pair, including each store's store_id, status, distance, phone, address, service list, time zone, and two weeks of daily opening hours. Use the returned store_id values with the store_id parameter on target-search, target-category-products, target-filter-options, and target-product.", - "operationId": "target-stores", - "parameters": [ - { - "description": "ZIP code, city/state, or latitude,longitude", - "in": "query", - "name": "place", - "required": true, - "type": "string", - "x-example": "95014" - }, - { - "default": 20, - "description": "Maximum stores to return (1-20)", - "in": "query", - "maximum": 20, - "minimum": 1, - "name": "limit", - "type": "integer" - }, - { - "default": 100, - "description": "Search radius in miles (1-5000)", - "in": "query", - "maximum": 5000, - "minimum": 1, - "name": "within", - "type": "integer" - } - ], + "description": "Lists every top-level Atlantic section accepted by /theatlantic/headlines, with its slug, display name, and landing-page URL. Values: `ideas`, `politics`, `economy`, `international`, `national-security`, `technology`, `science`, `health`, `education`, `culture`, `family`, `books`, `photography`.", + "operationId": "theatlantic-sections", "produces": [ "application/json" ], @@ -493136,19 +508584,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/target.storesResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/theatlantic.sectionsResponseDoc" } }, "429": { @@ -493169,24 +508605,24 @@ "ApiKeyAuth": [] } ], - "summary": "Find Target stores near a location", + "summary": "List The Atlantic sections", "tags": [ - "Target" + "The Atlantic" ] } }, - "/techcrunch/article": { + "/theblaze/article": { "get": { - "description": "Returns public TechCrunch article metadata (title, author(s), published/updated dates, dek, section, lead image) and body paragraphs from a canonical article URL.", - "operationId": "techcrunch-article", + "description": "Returns one TheBlaze (Blaze Media) article by `url`, a canonical HTTPS editorial or show-story link on `theblaze.com`; non-editorial paths and off-site URLs are rejected. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", + "operationId": "theblaze-article", "parameters": [ { - "description": "Canonical TechCrunch article URL", + "description": "Canonical theblaze.com article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://techcrunch.com/2026/09/22/discords-age-verification-era-is-upon-us-despite-community-backlash/" + "x-example": "https://www.theblaze.com/news/niaid-backed-an-experiment-aersolizing-lethal-ebola-then-fauci-panicked-about-what-it-exposed-about-vaccination" } ], "produces": [ @@ -493223,31 +508659,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get TechCrunch article content", + "summary": "Get a Blaze Media article", "tags": [ - "TechCrunch" + "TheBlaze" ] } }, - "/techcrunch/author": { + "/theblaze/author": { "get": { - "description": "Returns one TechCrunch staff writer or contributor's public profile: name, job title, headshot, biography, social links, and one page of their recent articles.", - "operationId": "techcrunch-author", + "description": "Returns a public /u/ profile and up to 30 recent article feed items. Provide exactly one of slug or canonical profile URL.", + "operationId": "theblaze-author", "parameters": [ { - "description": "Canonical techcrunch.com/author/ URL", + "description": "TheBlaze author username", "in": "query", - "name": "url", - "required": true, + "name": "slug", "type": "string", - "x-example": "https://techcrunch.com/author/amanda-silberling/" + "x-example": "josephmackinnon" }, { - "description": "1-based page of recent articles to return; defaults to 1", + "description": "Canonical HTTPS theblaze.com/u/ profile URL", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "url", + "type": "string", + "x-example": "https://www.theblaze.com/u/josephmackinnon" } ], "produces": [ @@ -493257,7 +508692,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.techCrunchAuthorResponseDoc" + "$ref": "#/definitions/publicnews.theBlazeAuthorResponseDoc" } }, "400": { @@ -493284,48 +508719,70 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TechCrunch author profile", + "summary": "Get a Blaze Media contributor profile", "tags": [ - "TechCrunch" + "TheBlaze" ] } }, - "/techcrunch/headlines": { + "/theblaze/headlines": { "get": { - "description": "Returns the latest TechCrunch stories for one category. `section` is required and takes one of 22 slugs such as `artificial-intelligence`, `startups`, `venture`, `security`, `fintech`, `space` or `cryptocurrency`. Each item has its title, URL, summary, publication time and author.", - "operationId": "techcrunch-headlines", - "parameters": [ - { - "description": "TechCrunch category slug", - "enum": [ - "apps", - "artificial-intelligence", - "biotech-health", - "climate", - "commerce", - "cryptocurrency", - "enterprise", - "fintech", - "fundraising", - "gadgets", - "gaming", - "government-policy", - "hardware", - "media-entertainment", - "privacy", - "robotics", - "security", - "social", - "space", - "startups", - "transportation", - "venture" + "description": "Returns up to 30 recent stories from one TheBlaze (Blaze Media) section. `section` is required, case-sensitive and must match exactly, for example `news`, `columns/opinion`, `lifestyle/men`, `tech` or a show such as `shows/relatable`. Other values are rejected. Items have a title and URL, plus summary, author, publication time and image when the outlet provides them.", + "operationId": "theblaze-headlines", + "parameters": [ + { + "description": "Exact Blaze Media section slug", + "enum": [ + "news", + "columns", + "columns/opinion", + "columns/analysis", + "tech", + "lifestyle", + "lifestyle/men", + "lifestyle/women", + "lifestyle/provisions", + "fearless", + "exclusive", + "original", + "politics", + "your-opinion", + "shows", + "shows/back-to-the-people", + "shows/blaze-news-tonight", + "shows/blaze-originals", + "shows/blazetv-specials", + "shows/come-take-it-with-sara-gonzales", + "shows/conservative-review-with-daniel-horowitz", + "shows/dusty-bluffs", + "shows/fearless-with-jason-whitlock", + "shows/glenn-tv", + "shows/kibbe-on-liberty", + "shows/live-free-with-josh-howerton", + "shows/making-the-argument-with-nick-freitas", + "shows/pat-gray-unleashed", + "shows/relatable", + "shows/rufo-lomez", + "shows/sara-gonzales-unfiltered", + "shows/steve-deace-show", + "shows/strange-encounters", + "shows/stu-and-dave-do-america", + "shows/the-auron-macintyre-show", + "shows/the-coverup", + "shows/glenn-beck-podcast", + "shows/the-glenn-beck-program", + "shows/the-john-doyle-show", + "shows/the-liz-wheeler-show", + "shows/the-rick-burgess-show", + "shows/zero-hour", + "contributors", + "jan-6-truth" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "apps" + "x-example": "news" } ], "produces": [ @@ -493356,16 +508813,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get TechCrunch category headlines", + "summary": "Get Blaze Media section headlines", "tags": [ - "TechCrunch" + "TheBlaze" ] } }, - "/techcrunch/news": { + "/theblaze/news": { "get": { - "description": "Returns the latest TechCrunch top stories from its home feed. Takes no parameters. Each item has its title, URL, summary, publication time and author name.", - "operationId": "techcrunch-news", + "description": "Returns the latest site-wide stories from TheBlaze (Blaze Media), up to 30 items, covering news and opinion. Each item has a headline, canonical URL, publication time, byline, summary and image URL when published. It takes no parameters.", + "operationId": "theblaze-news", "produces": [ "application/json" ], @@ -493376,12 +508833,6 @@ "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -493394,16 +508845,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get TechCrunch top stories", + "summary": "Get Blaze Media top stories", "tags": [ - "TechCrunch" + "TheBlaze" ] } }, - "/techcrunch/sections": { + "/theblaze/sections": { "get": { - "description": "Lists the 22 TechCrunch categories that `techcrunch-headlines` accepts, taken from the site's primary navigation dropdown. Each entry has a stable `slug`, a display `name` and the category's feed `url`. For example, `artificial-intelligence` is named AI.", - "operationId": "techcrunch-sections", + "description": "Returns all verified article-bearing editorial and show sections accepted by the headlines endpoint. The contributors collection is included; the off-site Profile feed is excluded.", + "operationId": "theblaze-sections", "produces": [ "application/json" ], @@ -493413,6 +508864,12 @@ "schema": { "$ref": "#/definitions/publicnews.sectionsResponseDoc" } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } } }, "security": [ @@ -493420,24 +508877,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get TechCrunch categories", + "summary": "List Blaze Media sections", "tags": [ - "TechCrunch" + "TheBlaze" ] } }, - "/techradar/article": { + "/thebodyshop/collections": { "get": { - "description": "Returns a TechRadar article by canonical `url` on `techradar.com`: title, description, section, authors, publication and update times, lead image, the body `paragraphs` and a `paywalled` flag.", - "operationId": "techradar-article", + "consumes": [ + "application/json" + ], + "description": "Returns collections from The Body Shop (https://www.thebodyshop.com). The storefront URL is fixed. Valid empty result pages return `200` with an empty collections array.", + "operationId": "thebodyshop-collections", "parameters": [ { - "description": "Canonical TechRadar article URL", + "description": "1-based page, defaults to 1", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.techradar.com/audio/wireless-headphones/sonos-ace-ultra-review" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum collections, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -493447,7 +508913,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" } }, "400": { @@ -493456,8 +508922,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -493474,37 +508940,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get TechRadar article content", + "summary": "List The Body Shop collections", "tags": [ - "TechRadar" + "The Body Shop" ] } }, - "/techradar/author": { + "/thebodyshop/collections/{handle}/products": { "get": { - "description": "Returns a TechRadar author's profile, looked up by `slug` (for example `tom-power`) or canonical `url`, which may end in `/page/`; exactly one is required. `page` (1-based, default 1) overrides any page in `url`. The response has the name, `job_title`, biography, social links, one page of articles and `has_next_page`.", - "operationId": "techradar-author", + "consumes": [ + "application/json" + ], + "description": "Returns products from one The Body Shop (https://www.thebodyshop.com) collection. The storefront URL is fixed; `handle` is the collection's URL slug.", + "operationId": "thebodyshop-collection-products", "parameters": [ { - "description": "Author slug, e.g. tom-power", - "in": "query", - "name": "slug", + "description": "Collection handle", + "in": "path", + "name": "handle", + "required": true, "type": "string", - "x-example": "tom-power" + "x-example": "collection-handle" }, { - "description": "Canonical techradar.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "description": "1-based page, defaults to 1", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.techradar.com/author/tom-power" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "default": 1, - "description": "1-based page number; overrides any page number in url", + "description": "Maximum products, defaults to 50 and supports up to 250", "in": "query", - "name": "page", - "type": "integer" + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -493514,7 +508984,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.techradarAuthorResponseDoc" + "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" } }, "400": { @@ -493529,6 +508999,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -493541,51 +509017,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TechRadar author profile", + "summary": "List The Body Shop collection products", "tags": [ - "TechRadar" + "The Body Shop" ] } }, - "/techradar/headlines": { + "/thebodyshop/pages": { "get": { - "description": "Returns the latest TechRadar stories for one section hub. `section` is required and takes one of 25 slugs such as `computing`, `phones`, `audio`, `gaming`, `deals`, `reviews`, `news` or `vpn`. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "techradar-headlines", + "consumes": [ + "application/json" + ], + "description": "Lists The Body Shop static pages, 50 per request by default (`limit` up to 250), with `page` starting at 1. Each page has its handle, title, URL, plain-text content and timestamps. An empty result is a normal 200. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", + "operationId": "thebodyshop-pages", "parameters": [ { - "description": "TechRadar section slug", - "enum": [ - "ai-platforms-assistants", - "audio", - "best", - "cameras", - "computing", - "deals", - "gaming", - "health-fitness", - "home", - "how-to", - "how-to-watch", - "news", - "opinion", - "phones", - "pro", - "reviews", - "seasonal-sales", - "streaming", - "tablets", - "tech", - "tech-events", - "televisions", - "vehicle-tech", - "versus", - "vpn" - ], + "description": "1-based page, defaults to 1", "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "ai-platforms-assistants" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum static pages, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -493595,7 +509053,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopifybrands.pagesResponseDoc" } }, "400": { @@ -493604,6 +509062,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -493616,16 +509080,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get TechRadar section headlines", + "summary": "List The Body Shop static pages", "tags": [ - "TechRadar" + "The Body Shop" ] } }, - "/techradar/news": { + "/thebodyshop/pages/{handle}": { "get": { - "description": "Returns TechRadar's latest top stories across the site. Takes no parameters, and `techradar-headlines` narrows by section instead. Each item has its title, URL, summary, publication time, author and image.", - "operationId": "techradar-news", + "consumes": [ + "application/json" + ], + "description": "Returns one The Body Shop static page by its `handle`: id, title, URL, plain-text `content` and the created, published and updated timestamps. Page text is cleaned, not raw HTML. An unknown handle returns 404. When the reduced form is served, `transport_mode` is `ssr_embedded` and `id` is omitted.", + "operationId": "thebodyshop-page", + "parameters": [ + { + "description": "Page handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "page-handle" + } + ], "produces": [ "application/json" ], @@ -493633,7 +509110,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/shopifybrands.pageResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -493654,50 +509143,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get TechRadar top stories", + "summary": "Get a The Body Shop static page", "tags": [ - "TechRadar" + "The Body Shop" ] } }, - "/techradar/sections": { + "/thebodyshop/products": { "get": { - "description": "Lists the 25 top-level TechRadar sections that `techradar-headlines` accepts, such as `computing`, `phones`, `best`, `deals` and `how-to`. Each entry has a `slug`, a display `name` and the section page `url`.", - "operationId": "techradar-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get TechRadar sections", - "tags": [ - "TechRadar" - ] - } - }, - "/telegraph/article": { - "get": { - "description": "Returns one The Telegraph article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag. Access is intermittent, and subscriber-only or blocked pages return an error.", - "operationId": "telegraph-article", + "description": "Returns products from The Body Shop's (https://www.thebodyshop.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", + "operationId": "thebodyshop-products", "parameters": [ { - "description": "Canonical The Telegraph article URL", + "description": "1-based page, defaults to 1", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.telegraph.co.uk/world-news/example/" + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Maximum products, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -493707,7 +509179,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/shopifybrands.productsResponseDoc" } }, "400": { @@ -493716,8 +509188,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -493734,24 +509206,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Telegraph article content", + "summary": "List The Body Shop products", "tags": [ - "The Telegraph" + "The Body Shop" ] } }, - "/telegraph/author": { + "/thebodyshop/products/{handle}": { "get": { - "description": "Returns a Telegraph author's profile by `url`, a canonical `telegraph.co.uk/authors////` link: name, job title, bio and recent articles with title, URL, excerpt and ISO-8601 `published_at`. `job_title` can be empty for contributors without a masthead credit.", - "operationId": "telegraph-author", + "consumes": [ + "application/json" + ], + "description": "Returns product detail for one The Body Shop (https://www.thebodyshop.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", + "operationId": "thebodyshop-product", "parameters": [ { - "description": "Canonical Telegraph author URL", - "in": "query", - "name": "url", + "description": "Product handle", + "in": "path", + "name": "handle", "required": true, "type": "string", - "x-example": "https://www.telegraph.co.uk/authors/c/ck-co/con-coughlin/" + "x-example": "product-handle" } ], "produces": [ @@ -493761,7 +509236,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.telegraphAuthorResponseDoc" + "$ref": "#/definitions/shopifybrands.productResponseDoc" } }, "400": { @@ -493776,6 +509251,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -493788,39 +509269,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Telegraph author profile", + "summary": "Get a The Body Shop product", "tags": [ - "The Telegraph" + "The Body Shop" ] } }, - "/telegraph/headlines": { + "/thebodyshop/products/{handle}/recommendations": { "get": { - "description": "Returns the current headlines for one The Telegraph section. `section` is required and takes one of `uk-news`, `world-news`, `politics`, `business`, `finance`, `technology`, `sport`, `culture`, `travel`, `lifestyle`, `health`, `science` or `opinion`. Each item has its title and URL.", - "operationId": "telegraph-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns recommended products for one The Body Shop (https://www.thebodyshop.com) product handle. The storefront URL is fixed server-side.", + "operationId": "thebodyshop-product-recommendations", "parameters": [ { - "description": "The Telegraph section slug", + "description": "Product handle", + "in": "path", + "name": "handle", + "required": true, + "type": "string", + "x-example": "product-handle" + }, + { + "description": "Maximum products, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + }, + { + "description": "Recommendation intent. Allowed values: related, complementary", "enum": [ - "uk-news", - "world-news", - "politics", - "business", - "finance", - "technology", - "sport", - "culture", - "travel", - "lifestyle", - "health", - "science", - "opinion" + "related", + "complementary" ], "in": "query", - "name": "section", - "required": true, + "name": "intent", "type": "string", - "x-example": "uk-news" + "x-example": "related" } ], "produces": [ @@ -493830,7 +509317,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" } }, "400": { @@ -493839,6 +509326,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -493851,16 +509350,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Telegraph section headlines", + "summary": "List The Body Shop product recommendations", "tags": [ - "The Telegraph" + "The Body Shop" ] } }, - "/telegraph/news": { + "/thebodyshop/search/suggest": { "get": { - "description": "Returns the current top stories from The Telegraph. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. It can return an error when The Telegraph declines the request.", - "operationId": "telegraph-news", + "consumes": [ + "application/json" + ], + "description": "Returns products, collections, and query suggestions from The Body Shop's (https://www.thebodyshop.com) predictive search. The storefront URL is fixed server-side.", + "operationId": "thebodyshop-search-suggest", + "parameters": [ + { + "description": "Search query", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "wool" + }, + { + "description": "Comma-separated suggestion types. Allowed values: product, collection, query", + "in": "query", + "name": "types", + "type": "string", + "x-example": "product,collection,query" + }, + { + "description": "Maximum results per type, defaults to 10 and supports up to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 + } + ], "produces": [ "application/json" ], @@ -493868,7 +509394,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -493883,16 +509421,44 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Telegraph top stories", + "summary": "Get The Body Shop search suggestions", "tags": [ - "The Telegraph" + "The Body Shop" ] } }, - "/telegraph/sections": { + "/thebodyshop/sitemap/urls": { "get": { - "description": "Lists the The Telegraph sections that the headlines endpoint accepts, such as `uk-news`, `world-news`, `politics`, `finance`, `culture` and `opinion`. Each entry has a `slug`, a display `name` and a section `url`.", - "operationId": "telegraph-sections", + "consumes": [ + "application/json" + ], + "description": "Returns capped URL entries from The Body Shop's (https://www.thebodyshop.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", + "operationId": "thebodyshop-sitemap-urls", + "parameters": [ + { + "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", + "enum": [ + "all", + "products", + "collections", + "pages", + "blogs", + "agentic_discovery", + "other" + ], + "in": "query", + "name": "type", + "type": "string", + "x-example": "products" + }, + { + "description": "Maximum URL entries, defaults to 50 and supports up to 250", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + } + ], "produces": [ "application/json" ], @@ -493900,7 +509466,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -493909,29 +509493,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Telegraph sections", + "summary": "List The Body Shop sitemap URLs", "tags": [ - "The Telegraph" + "The Body Shop" ] } }, - "/tes/jobs/detail": { + "/thebodyshop/sitemaps": { "get": { "consumes": [ "application/json" ], - "description": "Returns detail for one job posting by its numeric id (the id field returned by tes-job-search): employer, location, salary, contract terms/types, dates, and application contact/URL, plus a short excerpt of the listing description rather than the full long-form HTML copy.", - "operationId": "tes-job-detail", - "parameters": [ - { - "description": "Tes job id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "2340998" - } - ], + "description": "Returns child sitemap URLs from The Body Shop's (https://www.thebodyshop.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", + "operationId": "thebodyshop-sitemaps", "produces": [ "application/json" ], @@ -493939,7 +509513,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tes.jobDetailResponseDoc" + "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" } }, "400": { @@ -493948,12 +509522,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -493972,29 +509540,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Tes teaching job", + "summary": "List The Body Shop sitemaps", "tags": [ - "Tes" + "The Body Shop" ] } }, - "/tes/jobs/employer": { + "/thebodyshop/store": { "get": { "consumes": [ "application/json" ], - "description": "Returns detail for one jobs employer profile by its numeric id (the trailing id in tes-job-detail's employer_url field, e.g. .../jobs/employer/epsom-college-1039424 -- the 1039424): name, location, school type/phase/funding status/gender/age range, an about description, its postal address, and every currently-open position listed on the employer's own profile page (id, title, url -- call tes-job-detail with each id for the full posting).", - "operationId": "tes-job-employer", - "parameters": [ - { - "description": "Tes employer id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "1039424" - } - ], + "description": "Returns storefront metadata for The Body Shop (https://www.thebodyshop.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", + "operationId": "thebodyshop-store", "produces": [ "application/json" ], @@ -494002,7 +509560,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tes.employerDetailResponseDoc" + "$ref": "#/definitions/shopifybrands.storeResponseDoc" } }, "400": { @@ -494011,12 +509569,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -494035,136 +509587,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Tes jobs employer profile", + "summary": "Get The Body Shop store metadata", "tags": [ - "Tes" + "The Body Shop" ] } }, - "/tes/jobs/search": { + "/thedailybeast/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Tes's (tes.com) teaching-jobs board. Returns listing facts (title, employer, location, salary, contract terms/types) plus a short excerpt of the listing description, not the full long-form job-description copy, and the same live faceted-search breakdown (position/subject/workplace category trees with counts, plus contract type/term counts) the real search page renders as its filter sidebar. location is a free-text place name (a UK town/city, an international city, or a bare country name) resolved to coordinates; omit for Tes's own default market, \"United Kingdom\". radius_miles selects the search radius around location. contract_type and contract_term are validated against Tes's own small, closed label sets. position, subject, and workplace are comma-separated filters -- Tes's own category labels are numerous and can change, so read a prior response's own facets.positions[].value (and facets.positions[].children[].value)/facets.subjects[].value/facets.workplaces[].children[].value for the live, current set rather than guessing. salary_min filters to jobs with an advertised salary at or above that amount (in the searched market's local currency); Tes's own filter panel offers only a minimum, no maximum.", - "operationId": "tes-job-search", + "description": "Returns one The Daily Beast article by its canonical `url`, either a root-level slug or one under a single content vertical such as `obsessed`. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag. Digest or index pages are not articles and return an error.", + "operationId": "thedailybeast-article", "parameters": [ { - "description": "Job title or keyword", - "in": "query", - "name": "keywords", - "type": "string", - "x-example": "maths teacher" - }, - { - "default": "United Kingdom", - "description": "Free-text place name resolved via Tes's own location autocomplete", - "in": "query", - "name": "location", - "type": "string", - "x-example": "Manchester" - }, - { - "default": 30, - "description": "Search radius around location, in miles", - "enum": [ - 3, - 5, - 10, - 15, - 20, - 30, - 50, - 70, - 100, - 500 - ], - "in": "query", - "name": "radius_miles", - "type": "integer" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 20, - "description": "Results per page", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "page_size", - "type": "integer" - }, - { - "default": "relevance", - "description": "Sort order", - "enum": [ - "relevance", - "newest", - "distance" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Contract type", - "enum": [ - "Full Time", - "Part Time" - ], - "in": "query", - "name": "contract_type", - "type": "string" - }, - { - "description": "Contract term", - "enum": [ - "Permanent", - "Fixed Term", - "Casual", - "Maternity Cover", - "Temporary", - "Supply" - ], - "in": "query", - "name": "contract_term", - "type": "string" - }, - { - "description": "Comma-separated position category label(s) -- see the endpoint markdown", - "in": "query", - "name": "position", - "type": "string", - "x-example": "Teaching and Lecturing" - }, - { - "description": "Comma-separated subject label(s) -- see the endpoint markdown", - "in": "query", - "name": "subject", - "type": "string", - "x-example": "Mathematics" - }, - { - "description": "Comma-separated workplace/organisation-type label(s) -- see the endpoint markdown", + "description": "Canonical The Daily Beast article URL", "in": "query", - "name": "workplace", + "name": "url", + "required": true, "type": "string", - "x-example": "Secondary" - }, - { - "description": "Minimum advertised salary, in the searched market's local currency", - "in": "query", - "minimum": 0, - "name": "salary_min", - "type": "integer", - "x-example": 28000 + "x-example": "https://www.thedailybeast.com/murdoch-paper-predicts-trumps-panicked-plan-will-backfire/" } ], "produces": [ @@ -494174,7 +509614,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tes.jobSearchResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -494183,8 +509623,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -494201,43 +509641,24 @@ "ApiKeyAuth": [] } ], - "summary": "Search Tes teaching jobs", + "summary": "Get The Daily Beast article content", "tags": [ - "Tes" + "The Daily Beast" ] } }, - "/tes/resources/detail": { + "/thedailybeast/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns detail for one teaching resource by its numeric id (the id field returned by tes-resource-search). Descriptive facts (title, subject, age range, resource type, author, price, rating, licence label), a per-file attachment list (file type, size, and a preview thumbnail -- metadata only), and the most recent page of reviews are returned -- not the downloadable resource file itself.", - "operationId": "tes-resource-detail", + "description": "Returns one The Daily Beast reporter's public profile: name, job title, biography, headshot, social link, and their recent articles, from a canonical author URL.", + "operationId": "thedailybeast-author", "parameters": [ { - "description": "Tes resource id", + "description": "Canonical thedailybeast.com/author/ URL", "in": "query", - "name": "id", + "name": "url", "required": true, "type": "string", - "x-example": "13463100" - }, - { - "default": "GB", - "description": "Storefront market for pricing/currency", - "enum": [ - "GB", - "US", - "AU", - "IE", - "CA", - "NZ", - "UN" - ], - "in": "query", - "name": "country", - "type": "string" + "x-example": "https://www.thedailybeast.com/author/isabel-van-brugen/" } ], "produces": [ @@ -494247,7 +509668,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tes.resourceDetailResponseDoc" + "$ref": "#/definitions/publicnews.dailyBeastAuthorResponseDoc" } }, "400": { @@ -494262,12 +509683,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -494280,105 +509695,103 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Tes teaching resource", + "summary": "Get a The Daily Beast author profile", "tags": [ - "Tes" + "The Daily Beast" ] } }, - "/tes/resources/search": { + "/thedailybeast/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Tes's (tes.com) teaching-resources marketplace. Returns listing facts (title, author, price, rating, downloads) -- not full listing descriptions. query is optional: omit it (alone, or combined with key_stage/subject/on_sale) for pure filter-driven or fully unfiltered browsing. sort mirrors the real search page's own Sort by dropdown; key_stage and subject mirror its left-hand Refine by filters (both closed, validated enums taken from Tes's own facet taxonomy, and always resolved against Tes's own single GB-taxonomy regardless of country). country controls result currency/localisation only (confirmed live for all seven values); it does not change which key_stage/subject values are valid.", - "operationId": "tes-resource-search", + "description": "Returns the current headlines of one The Daily Beast section. `section` is required and takes a slug such as `politics`, `politics/opinion`, `obsessed/reviews`, `scouted/home` or `world/china`. Each item can carry its title, URL, summary, author, publication time, lead image and `type`, and the response echoes the `section`.", + "operationId": "thedailybeast-headlines", "parameters": [ { - "description": "Search keywords -- omit for filter-driven or unfiltered browsing", - "in": "query", - "name": "query", - "type": "string", - "x-example": "phonics" - }, - { - "default": "GB", - "description": "Storefront market", - "enum": [ - "GB", - "US", - "AU", - "IE", - "CA", - "NZ", - "UN" - ], - "in": "query", - "name": "country", - "type": "string" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 20, - "description": "Results per page", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "page_size", - "type": "integer" - }, - { - "default": "relevance", - "description": "Sort order", - "enum": [ - "relevance", - "newest", - "highest_rated", - "lowest_price" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "description": "Filter by age range", - "enum": [ - "3-5", - "5-7", - "7-11", - "11-14", - "14-16", - "16+", - "age_not_applicable" - ], - "in": "query", - "name": "key_stage", - "type": "string" - }, - { - "description": "Filter by subject -- one of Tes's own top-level subject facet labels; see the endpoint markdown for the full list (two of the 29 values contain a comma, which is why this parameter is not expressed as a Swagger Enums() list)", + "description": "The Daily Beast section slug", "enum": [ - "" + "lifestyle", + "lifestyle/body", + "lifestyle/face", + "lifestyle/wellness", + "lifestyle/hair", + "lifestyle/style", + "travel", + "entertainment", + "entertainment/music", + "entertainment/tv", + "entertainment/movies", + "entertainment/comedy", + "entertainment/awards-shows", + "archive", + "media", + "tech", + "arts-and-culture", + "arts-and-culture/theater", + "arts-and-culture/royalist", + "arts-and-culture/fashion", + "arts-and-culture/books", + "innovation", + "innovation/science", + "obsessed", + "obsessed/shop", + "obsessed/hot-takes", + "obsessed/reviews", + "obsessed/recaps", + "obsessed/what-to-watch", + "obsessed/trailers", + "obsessed/interviews", + "obsessed/industry", + "obsessed/celebrity", + "obsessed/media", + "obsessed/media/shows", + "obsessed/media/movies", + "obsessed/media/music", + "obsessed/media/books", + "obsessed/rating", + "obsessed/rating/see", + "obsessed/rating/skip", + "obsessed/the-last-laugh", + "obsessed/obsessed-podcast", + "obsessed/obsessed-newsletter", + "politics", + "politics/biden-world", + "politics/congress", + "politics/elections", + "politics/national-security", + "politics/opinion", + "politics/trumpland", + "politics/pay-dirt", + "politics/trail-mix", + "politics/the-new-abnormal", + "scouted", + "scouted/fitness", + "scouted/wellness", + "scouted/beauty", + "scouted/bedroom", + "scouted/clothing", + "scouted/face-masks", + "scouted/home", + "scouted/kitchen", + "scouted/outdoors", + "scouted/technology", + "scouted/new-kids-on-the-block", + "scouted/the-case-for", + "scouted/thisthat", + "us-news", + "us-news/crime-and-justice", + "us-news/identities", + "us-news/sports", + "world", + "world/china", + "world/middle-east", + "world/europe", + "world/russia" ], "in": "query", - "name": "subject", + "name": "section", + "required": true, "type": "string", - "x-example": "English" - }, - { - "default": false, - "description": "Filter to discounted resources only", - "in": "query", - "name": "on_sale", - "type": "boolean" + "x-example": "lifestyle" } ], "produces": [ @@ -494388,7 +509801,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tes.resourceSearchResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -494397,11 +509810,37 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The Daily Beast section headlines", + "tags": [ + "The Daily Beast" + ] + } + }, + "/thedailybeast/news": { + "get": { + "description": "Returns the current top stories from The Daily Beast. It takes no parameters. Each item has its title, URL, summary, publication time, author and lead image, so it is a quick front-page view; use the headlines endpoint with a `section` slug for one category.", + "operationId": "thedailybeast-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "503": { "description": "Service Unavailable", @@ -494415,43 +509854,50 @@ "ApiKeyAuth": [] } ], - "summary": "Search Tes teaching resources", + "summary": "Get The Daily Beast top stories", "tags": [ - "Tes" + "The Daily Beast" ] } }, - "/tes/resources/shop": { + "/thedailybeast/sections": { "get": { - "consumes": [ + "description": "Lists the sections of The Daily Beast that the headlines endpoint accepts, both top-level categories such as `politics` and `world` and child sub-sections such as `politics/opinion` and `world/middle-east`. Each entry has a `slug`, a display `name` and the section `url`.", + "operationId": "thedailybeast-sections", + "produces": [ "application/json" ], - "description": "Returns detail for one teaching-resources author/seller shop by its username (from tes-resource-search/tes-resource-detail's author field, or the trailing path segment of author_url): display name, average rating, upload/view/download counts, a bio, and a page of that author's resource listing (id, title, price, thumbnail -- call tes-resource-detail with each id for subject/age-range/resource-type/rating/description). subject narrows the listing to one of the subject tabs shown on the shop's own page; these vary per author and are not a curated enum.", - "operationId": "tes-resource-shop", - "parameters": [ - { - "description": "Tes author username", - "in": "query", - "name": "username", - "required": true, - "type": "string", - "x-example": "jenpower16" - }, + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ { - "description": "Subject tab to filter the listing to -- see the shop's own page for the current set", - "in": "query", - "name": "subject", - "type": "string", - "x-example": "Whole school" - }, + "ApiKeyAuth": [] + } + ], + "summary": "Get The Daily Beast sections", + "tags": [ + "The Daily Beast" + ] + } + }, + "/thehill/article": { + "get": { + "description": "Returns one The Hill article by `url`, which must be a canonical HTTPS `thehill.com` article link containing a numeric article id. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag.", + "operationId": "thehill-article", + "parameters": [ { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", - "type": "integer" + "description": "Canonical The Hill article URL", + "in": "query", + "name": "url", + "required": true, + "type": "string", + "x-example": "https://thehill.com/policy/1234567-example/" } ], "produces": [ @@ -494461,7 +509907,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tes.resourceShopResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -494476,12 +509922,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -494494,45 +509934,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Tes teaching-resources author shop", + "summary": "Get The Hill article content", "tags": [ - "Tes" + "The Hill" ] } }, - "/tes/schools/search": { + "/thehill/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Tes's (tes.com) public Schools Directory by school name or location. Returns listing facts (name, logo, a short description, address) for each matching school/employer. Each result's id is the same employer id tes-job-employer accepts, so a caller can go straight from a name/location search to a full employer profile (school type/phase/funding status/gender/age range, and its currently-open positions) without first needing a job posting to discover the id.", - "operationId": "tes-school-search", + "description": "Returns a The Hill author's profile by `url`, a canonical `thehill.com/author//` link: name, job title, bio, image URL and recent articles with title, URL, category and category URL. `job_title` and `image_url` may be missing, and each article's `published_at` is relative text such as `10 hours ago`, not a timestamp.", + "operationId": "thehill-author", "parameters": [ { - "description": "School name or location", + "description": "Canonical The Hill author URL", "in": "query", - "name": "query", + "name": "url", "required": true, "type": "string", - "x-example": "Epsom" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 20, - "description": "Results per page", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "page_size", - "type": "integer" + "x-example": "https://thehill.com/author/alexander-bolton/" } ], "produces": [ @@ -494542,7 +509961,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tes.schoolSearchResponseDoc" + "$ref": "#/definitions/publicnews.theHillAuthorResponseDoc" } }, "400": { @@ -494551,8 +509970,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -494569,27 +509988,45 @@ "ApiKeyAuth": [] } ], - "summary": "Search the Tes Schools Directory", + "summary": "Get a The Hill author profile", "tags": [ - "Tes" + "The Hill" ] } }, - "/tesla-jobs/job": { + "/thehill/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Tesla Careers posting by its numeric job id (the `id` field returned by the list endpoint).", - "operationId": "tesla-jobs-job", + "description": "Returns the current headlines for one The Hill section. `section` is required and takes one of 19 slugs, including `home`, `policy`, `business`, `senate`, `national-security` and `technology`. Each item has its title and URL, plus summary, author, publication time and image when the outlet provides them, and the response echoes the `section`.", + "operationId": "thehill-headlines", "parameters": [ { - "description": "Tesla job id", + "description": "The Hill RSS section slug", + "enum": [ + "home", + "homenews", + "policy", + "business", + "opinion", + "healthcare", + "campaign", + "national-security", + "senate", + "house", + "administration", + "regulation", + "media", + "defense", + "technology", + "transportation", + "international", + "economy", + "policy-healthcare" + ], "in": "query", - "name": "id", + "name": "section", "required": true, "type": "string", - "x-example": "224501" + "x-example": "home" } ], "produces": [ @@ -494599,7 +510036,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/teslajobs.jobResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -494608,18 +510045,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -494632,49 +510057,16 @@ "ApiKeyAuth": [] } ], - "summary": "Tesla Jobs single posting", + "summary": "Get The Hill section headlines", "tags": [ - "Tesla Jobs" + "The Hill" ] } }, - "/tesla-jobs/list": { + "/thehill/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Tesla's public careers site (tesla.com/careers) via its own careers-state JSON endpoint. Tesla's own endpoint always returns its entire global job dataset regardless of query parameters; this filters and paginates that snapshot server-side. Listings carry identity/department/location metadata only — call the job endpoint for the full description, responsibilities, and requirements.", - "operationId": "tesla-jobs-list", - "parameters": [ - { - "description": "Filter by title or department, case-insensitive substring match", - "in": "query", - "name": "query", - "type": "string", - "x-example": "software engineer" - }, - { - "description": "Filter by location, case-insensitive substring match", - "in": "query", - "name": "location", - "type": "string", - "x-example": "Palo Alto" - }, - { - "description": "Page number, 1-based", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Results per page, up to 100", - "in": "query", - "name": "page_size", - "type": "integer", - "x-example": 20 - } - ], + "description": "Returns the current top stories from The Hill. It takes no parameters. Each item has its title, URL and, where the outlet gives them, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section instead.", + "operationId": "thehill-news", "produces": [ "application/json" ], @@ -494682,13 +510074,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/teslajobs.listResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -494709,24 +510095,50 @@ "ApiKeyAuth": [] } ], - "summary": "Tesla Jobs listing", + "summary": "Get The Hill top stories", "tags": [ - "Tesla Jobs" + "The Hill" ] } }, - "/theage/article": { + "/thehill/sections": { "get": { - "description": "Returns one The Age article's public metadata and the body paragraphs an anonymous visitor's page request is served, from a canonical article URL. The Age runs a metered subscription paywall; the response reports it with is_accessible_for_free (the page's own declaration), paywalled (the page marks the story as subscriber content), and is_truncated (the page served a shortened preview, or no body at all, instead of the full story). Paywalls are never bypassed and body text is never fabricated. Video-only pages are rejected with a 400.", - "operationId": "theage-article", + "description": "Lists the 19 The Hill section slugs that the headlines endpoint accepts, such as `home`, `policy`, `senate`, `defense` and `technology`. Each entry has the section `slug`, its display `name` and its `url`.", + "operationId": "thehill-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get The Hill RSS sections", + "tags": [ + "The Hill" + ] + } + }, + "/thehindu/article": { + "get": { + "description": "Returns public The Hindu article metadata and body paragraphs from a canonical article URL. A story The Hindu marks subscriber-only returns a permission error instead of a body.", + "operationId": "thehindu-article", "parameters": [ { - "description": "Canonical The Age article URL", + "description": "Canonical The Hindu article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.theage.com.au/politics/federal/albanese-once-criticised-rivals-for-abusing-this-power-just-look-at-him-now-20260925-p60zxu.html" + "x-example": "https://www.thehindu.com/news/national/kerala/example-article-slug/article71505134.ece" } ], "produces": [ @@ -494736,7 +510148,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.theageArticleResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -494745,6 +510157,12 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { @@ -494763,24 +510181,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Age article content", + "summary": "Get The Hindu article content", "tags": [ - "The Age" + "The Hindu" ] } }, - "/theage/author": { + "/thehindu/author": { "get": { - "description": "Returns an Age journalist's public profile -- name, short biography, headshot, contact email and social links where published -- plus their recent stories, from a canonical https://www.theage.com.au/by/- URL.", - "operationId": "theage-author", + "description": "Returns a The Hindu author's byline metadata, biography, contact/social links, and their most recent articles from a canonical author URL.", + "operationId": "thehindu-author", "parameters": [ { - "description": "Canonical The Age journalist URL", + "description": "Canonical The Hindu author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.theage.com.au/by/chip-le-grand-p4yvib" + "x-example": "https://www.thehindu.com/profile/author/devdutt-pattanaik-3563/" } ], "produces": [ @@ -494790,7 +510208,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.theageAuthorResponseDoc" + "$ref": "#/definitions/publicnews.theHinduAuthorResponseDoc" } }, "400": { @@ -494817,122 +510235,94 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Age journalist profile", + "summary": "Get a The Hindu author profile", "tags": [ - "The Age" + "The Hindu" ] } }, - "/theage/headlines": { + "/thehindu/headlines": { "get": { - "description": "Returns the current stories for one The Age section: title, canonical URL, summary, author, publication time, and image where the section lists them. section must be one of the slugs returned by /theage/sections; any other value is rejected with a 400 before The Age is contacted.", - "operationId": "theage-headlines", + "description": "Returns the current headlines for one The Hindu section. `section` is required and takes a slug such as `news-national`, `opinion-editorial`, `business-markets`, `sport-cricket` or `sci-tech-health`. Items carry the title, URL, summary, author, publication time and image, and the response echoes the `section`.", + "operationId": "thehindu-headlines", "parameters": [ { - "description": "Section slug from /theage/sections", + "description": "The Hindu section slug", "enum": [ - "melbourne-news", - "national/victoria", - "politics", - "politics/federal", - "politics/victoria", - "politics/nsw", - "politics/queensland", - "politics/western-australia", - "business", - "business/companies", - "business/markets", - "business/bullsnbears", - "business/the-economy", - "business/banking-and-finance", - "business/small-business", - "business/workplace", - "world", - "world/north-america", - "world/europe", - "world/asia", - "world/middle-east", - "world/south-america", - "world/africa", - "national", - "national/nsw", - "national/queensland", - "national/western-australia", + "news", + "news-national", + "news-international", + "news-states", + "news-cities", "opinion", - "property", - "property/news", - "property/living", + "opinion-editorial", + "opinion-cartoon", + "opinion-columns", + "opinion-op-ed", + "opinion-interview", + "opinion-lead", + "opinion-letters", + "opinion-open-page", + "business", + "business-agri-business", + "business-economy", + "business-industry", + "business-markets", + "business-budget", "sport", - "sport/afl", - "sport/cricket", - "sport/soccer", - "sport/racing", - "sport/tennis", - "sport/nrl", - "sport/rugby-union", - "sport/netball", - "sport/basketball", - "sport/motorsport", - "sport/cycling", - "sport/golf", - "sport/nfl", - "sport/athletics", - "sport/swimming", - "sport/boxing", - "goodfood", - "goodfood/melbourne-eating-out", - "goodfood/recipes", - "goodfood/tips-and-advice", - "goodfood/drinks", - "culture", - "culture/movies", - "culture/tv-and-radio", - "culture/music", - "culture/celebrity", - "culture/books", - "culture/comedy", - "culture/dance", - "culture/musicals", - "culture/opera", - "culture/theatre", - "culture/art-and-design", - "culture/live-reviews", - "lifestyle", - "lifestyle/health-and-wellness", - "lifestyle/fashion", - "lifestyle/life-and-relationships", - "lifestyle/beauty", - "traveller", - "traveller/inspiration/destination-guides", - "traveller/inspiration", - "traveller/reviews-and-advice", - "traveller/travel-news", - "good-weekend", - "sunday-life", - "money", - "money/super-and-retirement", - "money/investing", - "money/banking", - "money/borrowing", - "money/saving", - "money/tax", - "money/planning-and-budgeting", + "sport-cricket", + "sport-football", + "sport-hockey", + "sport-tennis", + "sport-athletics", + "sport-motorsport", + "sport-races", + "sport-other-sports", + "entertainment", + "entertainment-art", + "entertainment-dance", + "entertainment-movies", + "entertainment-music", + "entertainment-reviews", + "entertainment-theatre", + "data", + "sci-tech-health", + "sci-tech-science", + "sci-tech-technology", + "sci-tech-technology-gadgets", + "sci-tech-technology-internet", + "sci-tech-energy-and-environment", + "sci-tech-agriculture", "education", - "healthcare", - "environment", - "environment/conservation", - "environment/climate-change", - "environment/sustainability", - "environment/weather", - "technology", - "technology/video-games", - "australia-higher-education" + "education-careers", + "education-colleges", + "education-schools", + "life-and-style", + "life-and-style-fashion", + "life-and-style-fitness", + "life-and-style-homes-and-gardens", + "life-and-style-luxury", + "life-and-style-motoring", + "life-and-style-travel", + "society", + "society-faith", + "society-history-and-culture", + "books", + "books-books-authors", + "books-books-reviews", + "children", + "food", + "food-dining", + "food-features", + "food-guides", + "food-recipes", + "real-estate" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "politics/federal" + "x-example": "news" } ], "produces": [ @@ -494963,16 +510353,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Age section headlines", + "summary": "Get The Hindu section headlines", "tags": [ - "The Age" + "The Hindu" ] } }, - "/theage/news": { + "/thehindu/news": { "get": { - "description": "Returns The Age's current \"Latest News\" public RSS feed: each story's title, canonical URL, summary, author, publication time, and lead image.", - "operationId": "theage-news", + "description": "Returns the current stories from The Hindu's Latest News listing. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. For a single desk such as cricket or business, use the headlines endpoint.", + "operationId": "thehindu-news", "produces": [ "application/json" ], @@ -495001,16 +510391,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Age top stories", + "summary": "Get The Hindu top stories", "tags": [ - "The Age" + "The Hindu" ] } }, - "/theage/sections": { + "/thehindu/sections": { "get": { - "description": "Lists every The Age section accepted by /theage/headlines (96 sections from the site's own section menu), each with its slug, display name, and public section-front URL.", - "operationId": "theage-sections", + "description": "Lists the The Hindu section slugs that the headlines endpoint accepts, covering news, opinion, business, sport, entertainment, sci-tech, education, life and style, society, books and food, for example `news-national`, `sport-cricket` and `food-recipes`. Each entry has a `slug`, `name` and `url`.", + "operationId": "thehindu-sections", "produces": [ "application/json" ], @@ -495027,24 +510417,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Age sections", + "summary": "Get The Hindu sections", "tags": [ - "The Age" + "The Hindu" ] } }, - "/theatlantic/article": { + "/thejournal/article": { "get": { - "description": "Returns one public Atlantic article's metadata and body paragraphs from a canonical article URL. `metered` reflects the site's own soft-paywall flag for that article; the body returned here is the same one the site's own page serves to an anonymous visitor and is never truncated because of it. An article whose page genuinely withholds its body is reported as a restricted-access error instead of a hollow response.", - "operationId": "theatlantic-article", + "description": "Returns public TheJournal.ie article metadata and body paragraphs from a canonical article URL. Stories are served in full to anonymous readers, so paywalled is never set.", + "operationId": "thejournal-article", "parameters": [ { - "description": "Canonical The Atlantic article URL", + "description": "Canonical TheJournal.ie article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.theatlantic.com/politics/2026/09/example-slug/688738/" + "x-example": "https://www.thejournal.ie/amazon-refunds-200-cheques-7170610-Sep2026/" } ], "produces": [ @@ -495054,7 +510444,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/theatlantic.articleResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -495063,24 +510453,12 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -495093,24 +510471,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Atlantic article's content", + "summary": "Get TheJournal.ie article content", "tags": [ - "The Atlantic" + "TheJournal.ie" ] } }, - "/theatlantic/author": { + "/thejournal/author": { "get": { - "description": "Returns one Atlantic staff author's public profile -- name, headshot, and biography -- plus their recent articles, from a canonical author URL.", - "operationId": "theatlantic-author", + "description": "Returns one TheJournal.ie author's public archive page: name, numeric author id, and the most recent articles the first page lists.", + "operationId": "thejournal-author", "parameters": [ { - "description": "Canonical theatlantic.com/author// URL", + "description": "Author slug, e.g. ottoline-spearman", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "ottoline-spearman" + }, + { + "description": "Canonical thejournal.ie/author// URL, optionally with the numeric author id; alternative to slug", "in": "query", "name": "url", - "required": true, "type": "string", - "x-example": "https://www.theatlantic.com/author/example-author/" + "x-example": "https://www.thejournal.ie/author/ottoline-spearman/9329/" } ], "produces": [ @@ -495120,7 +510504,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/theatlantic.authorResponseDoc" + "$ref": "#/definitions/publicnews.theJournalAuthorResponseDoc" } }, "400": { @@ -495135,12 +510519,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -495153,39 +510531,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Atlantic staff author profile", + "summary": "Get a TheJournal.ie author page", "tags": [ - "The Atlantic" + "TheJournal.ie" ] } }, - "/theatlantic/headlines": { + "/thejournal/headlines": { "get": { - "description": "Returns the current front-page article cards for one Atlantic section: each story's title, canonical URL, description, byline, publication time, and lead image. Section must be a slug returned by /theatlantic/sections.", - "operationId": "theatlantic-headlines", + "description": "Returns current headlines from one public TheJournal.ie section listing page, with the story type label, summary and image when the page shows them.", + "operationId": "thejournal-headlines", "parameters": [ { - "description": "Section slug from /theatlantic/sections", + "description": "TheJournal.ie section slug", "enum": [ - "ideas", + "irish", "politics", - "economy", "international", - "national-security", - "technology", + "business", + "tech", "science", - "health", - "education", - "culture", - "family", - "books", - "photography" + "environment", + "voices", + "investigates", + "factcheck", + "explainer", + "gaeilge", + "sport", + "money-diaries", + "quiz", + "climate-change", + "housing", + "cost-of-living", + "road-safety", + "courts", + "ukraine", + "gaza" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "politics" + "x-example": "irish" } ], "produces": [ @@ -495195,7 +510582,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/theatlantic.headlinesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -495204,18 +510591,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -495228,16 +510603,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get the latest stories in an Atlantic section", + "summary": "Get TheJournal.ie section headlines", "tags": [ - "The Atlantic" + "TheJournal.ie" ] } }, - "/theatlantic/sections": { + "/thejournal/news": { "get": { - "description": "Lists every top-level Atlantic section accepted by /theatlantic/headlines, with its slug, display name, and landing-page URL. Values: `ideas`, `politics`, `economy`, `international`, `national-security`, `technology`, `science`, `health`, `education`, `culture`, `family`, `books`, `photography`.", - "operationId": "theatlantic-sections", + "description": "Returns the latest TheJournal.ie stories across all sections. Each item has a title, canonical URL, short summary, publication time (RFC 3339, UTC) and lead image. Items carry no author byline; the article endpoint supplies it. It takes no parameters.", + "operationId": "thejournal-news", "produces": [ "application/json" ], @@ -495245,13 +510620,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/theatlantic.sectionsResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "503": { @@ -495266,24 +510635,50 @@ "ApiKeyAuth": [] } ], - "summary": "List The Atlantic sections", + "summary": "Get TheJournal.ie top stories", "tags": [ - "The Atlantic" + "TheJournal.ie" ] } }, - "/theblaze/article": { + "/thejournal/sections": { "get": { - "description": "Returns one TheBlaze (Blaze Media) article by `url`, a canonical HTTPS editorial or show-story link on `theblaze.com`; non-editorial paths and off-site URLs are rejected. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", - "operationId": "theblaze-article", + "description": "Lists the 22 TheJournal.ie sections that the headlines endpoint accepts, verified 2026-09-25: nine category pages such as `irish`, `politics` and `business`, plus topic pages such as `housing`, `courts`, `ukraine` and `gaza`. Each entry has a `slug`, `name` and listing page `url`. Topic pages outside the site navigation are not served.", + "operationId": "thejournal-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get TheJournal.ie sections", + "tags": [ + "TheJournal.ie" + ] + } + }, + "/thenextweb/article": { + "get": { + "description": "Returns one The Next Web article by `url`, which must be a canonical HTTPS `thenextweb.com/news/` link; off-site URLs and non-article paths are rejected. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", + "operationId": "thenextweb-article", "parameters": [ { - "description": "Canonical theblaze.com article URL", + "description": "Canonical thenextweb.com article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.theblaze.com/news/niaid-backed-an-experiment-aersolizing-lethal-ebola-then-fauci-panicked-about-what-it-exposed-about-vaccination" + "x-example": "https://thenextweb.com/news/netflix-wonka-golden-ticket-ai-gene-wilder-voice" } ], "produces": [ @@ -495320,30 +510715,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Blaze Media article", + "summary": "Get The Next Web article content", "tags": [ - "TheBlaze" + "The Next Web" ] } }, - "/theblaze/author": { + "/thenextweb/author": { "get": { - "description": "Returns a public /u/ profile and up to 30 recent article feed items. Provide exactly one of slug or canonical profile URL.", - "operationId": "theblaze-author", + "description": "Returns a The Next Web author's name, image URL and the story cards on their archive page. Give `slug` or a canonical `thenextweb.com/author/` `url`; `slug` is required when `url` is omitted. Each article has a title, URL, summary, author, image, `type` and publication time.", + "operationId": "thenextweb-author", "parameters": [ { - "description": "TheBlaze author username", + "description": "Author slug from the public author sitemap or an article byline", "in": "query", "name": "slug", "type": "string", - "x-example": "josephmackinnon" + "x-example": "darius-popa" }, { - "description": "Canonical HTTPS theblaze.com/u/ profile URL", + "description": "Canonical thenextweb.com/author/ URL; alternative to slug", "in": "query", "name": "url", "type": "string", - "x-example": "https://www.theblaze.com/u/josephmackinnon" + "x-example": "https://thenextweb.com/author/darius-popa" } ], "produces": [ @@ -495353,7 +510748,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.theBlazeAuthorResponseDoc" + "$ref": "#/definitions/publicnews.thenextwebAuthorResponseDoc" } }, "400": { @@ -495380,70 +510775,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Blaze Media contributor profile", + "summary": "Get a The Next Web author profile", "tags": [ - "TheBlaze" + "The Next Web" ] } }, - "/theblaze/headlines": { + "/thenextweb/headlines": { "get": { - "description": "Returns up to 30 recent stories from one TheBlaze (Blaze Media) section. `section` is required, case-sensitive and must match exactly, for example `news`, `columns/opinion`, `lifestyle/men`, `tech` or a show such as `shows/relatable`. Other values are rejected. Items have a title and URL, plus summary, author, publication time and image when the outlet provides them.", - "operationId": "theblaze-headlines", + "description": "Returns the story cards of one The Next Web editorial section. `section` is required and must be one of `deep-tech`, `sustainability`, `ecosystems`, `data-security`, `fintech-ecommerce`, `future-of-work`, `startups-technology`, `investors-funding`, `government-policy` or `corporates-innovation`; other values return a 400.", + "operationId": "thenextweb-headlines", "parameters": [ { - "description": "Exact Blaze Media section slug", + "description": "Editorial section slug returned by thenextweb_sections", "enum": [ - "news", - "columns", - "columns/opinion", - "columns/analysis", - "tech", - "lifestyle", - "lifestyle/men", - "lifestyle/women", - "lifestyle/provisions", - "fearless", - "exclusive", - "original", - "politics", - "your-opinion", - "shows", - "shows/back-to-the-people", - "shows/blaze-news-tonight", - "shows/blaze-originals", - "shows/blazetv-specials", - "shows/come-take-it-with-sara-gonzales", - "shows/conservative-review-with-daniel-horowitz", - "shows/dusty-bluffs", - "shows/fearless-with-jason-whitlock", - "shows/glenn-tv", - "shows/kibbe-on-liberty", - "shows/live-free-with-josh-howerton", - "shows/making-the-argument-with-nick-freitas", - "shows/pat-gray-unleashed", - "shows/relatable", - "shows/rufo-lomez", - "shows/sara-gonzales-unfiltered", - "shows/steve-deace-show", - "shows/strange-encounters", - "shows/stu-and-dave-do-america", - "shows/the-auron-macintyre-show", - "shows/the-coverup", - "shows/glenn-beck-podcast", - "shows/the-glenn-beck-program", - "shows/the-john-doyle-show", - "shows/the-liz-wheeler-show", - "shows/the-rick-burgess-show", - "shows/zero-hour", - "contributors", - "jan-6-truth" + "deep-tech", + "sustainability", + "ecosystems", + "data-security", + "fintech-ecommerce", + "future-of-work", + "startups-technology", + "investors-funding", + "government-policy", + "corporates-innovation" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "news" + "x-example": "deep-tech" } ], "produces": [ @@ -495474,16 +510835,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Blaze Media section headlines", + "summary": "Get The Next Web section headlines", "tags": [ - "TheBlaze" + "The Next Web" ] } }, - "/theblaze/news": { + "/thenextweb/news": { "get": { - "description": "Returns the latest site-wide stories from TheBlaze (Blaze Media), up to 30 items, covering news and opinion. Each item has a headline, canonical URL, publication time, byline, summary and image URL when published. It takes no parameters.", - "operationId": "theblaze-news", + "description": "Returns the current top stories from The Next Web. It takes no parameters. Each item has the publisher's title, canonical URL, summary, publication time and author, plus the image URL when one is present.", + "operationId": "thenextweb-news", "produces": [ "application/json" ], @@ -495494,6 +510855,12 @@ "$ref": "#/definitions/publicnews.newsResponseDoc" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -495506,16 +510873,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Blaze Media top stories", + "summary": "Get The Next Web top stories", "tags": [ - "TheBlaze" + "The Next Web" ] } }, - "/theblaze/sections": { + "/thenextweb/sections": { "get": { - "description": "Returns all verified article-bearing editorial and show sections accepted by the headlines endpoint. The contributors collection is included; the off-site Profile feed is excluded.", - "operationId": "theblaze-sections", + "description": "Returns the ten editorial sections in The Next Web's current homepage navigation. Topic/tag archives, media, events and promotional categories are excluded.", + "operationId": "thenextweb-sections", "produces": [ "application/json" ], @@ -495525,12 +510892,6 @@ "schema": { "$ref": "#/definitions/publicnews.sectionsResponseDoc" } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -495538,33 +510899,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Blaze Media sections", + "summary": "Get The Next Web sections", "tags": [ - "TheBlaze" + "The Next Web" ] } }, - "/thebodyshop/collections": { + "/therealreal/autocomplete": { "get": { "consumes": [ "application/json" ], - "description": "Returns collections from The Body Shop (https://www.thebodyshop.com). The storefront URL is fixed. Valid empty result pages return `200` with an empty collections array.", - "operationId": "thebodyshop-collections", + "description": "Returns The RealReal's own search-box typeahead suggestions for a partial query.", + "operationId": "therealreal-autocomplete", "parameters": [ { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum collections, defaults to 50 and supports up to 250", + "description": "Partial free-text query to get search-box suggestions for", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "term", + "required": true, + "type": "string", + "x-example": "gucci" } ], "produces": [ @@ -495574,7 +510929,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionsResponseDoc" + "$ref": "#/definitions/therealreal.autocompleteResponseDoc" } }, "400": { @@ -495583,8 +510938,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -495601,43 +510956,19 @@ "ApiKeyAuth": [] } ], - "summary": "List The Body Shop collections", + "summary": "Get The RealReal search-box suggestions", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/collections/{handle}/products": { + "/therealreal/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from one The Body Shop (https://www.thebodyshop.com) collection. The storefront URL is fixed; `handle` is the collection's URL slug.", - "operationId": "thebodyshop-collection-products", - "parameters": [ - { - "description": "Collection handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "collection-handle" - }, - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - } - ], + "description": "Returns The RealReal's full category (taxon) browse taxonomy: every department, category, and subcategory, nested, with each entry's id (usable directly against search's category_id), permalink (usable directly against the category endpoint's path), and live matching item count. This is reference data that changes rarely, so responses are cached.", + "operationId": "therealreal-categories", "produces": [ "application/json" ], @@ -495645,23 +510976,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.collectionProductsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/therealreal.categoriesResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -495678,33 +510997,45 @@ "ApiKeyAuth": [] } ], - "summary": "List The Body Shop collection products", + "summary": "Get The RealReal category browse taxonomy", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/pages": { + "/therealreal/category": { "get": { "consumes": [ "application/json" ], - "description": "Lists The Body Shop static pages, 50 per request by default (`limit` up to 250), with `page` starting at 1. Each page has its handle, title, URL, plain-text content and timestamps. An empty result is a normal 200. When `transport_mode` is `ssr_embedded`, items carry only `handle`, `url` and `updated_at`.", - "operationId": "thebodyshop-pages", + "description": "Returns a page of The RealReal listings browsed by category (taxon) permalink path, e.g. women/handbags. Pass a previous response's next_after back as after to fetch the next page.", + "operationId": "therealreal-category", "parameters": [ { - "description": "1-based page, defaults to 1", + "description": "Category permalink path, from the categories endpoint's permalink field", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "path", + "required": true, + "type": "string", + "x-example": "women/handbags" }, { - "description": "Maximum static pages, defaults to 50 and supports up to 250", + "description": "Only return items currently marked down from their original price", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "on_sale", + "type": "boolean" + }, + { + "description": "Only return items currently available to purchase (excludes sold and waitlisted items)", + "in": "query", + "name": "available", + "type": "boolean" + }, + { + "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -495714,7 +511045,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pagesResponseDoc" + "$ref": "#/definitions/therealreal.searchResponseDoc" } }, "400": { @@ -495723,8 +511054,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -495741,27 +511078,33 @@ "ApiKeyAuth": [] } ], - "summary": "List The Body Shop static pages", + "summary": "Browse The RealReal listings by category", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/pages/{handle}": { + "/therealreal/collection": { "get": { "consumes": [ "application/json" ], - "description": "Returns one The Body Shop static page by its `handle`: id, title, URL, plain-text `content` and the created, published and updated timestamps. Page text is cleaned, not raw HTML. An unknown handle returns 404. When the reduced form is served, `transport_mode` is `ssr_embedded` and `id` is omitted.", - "operationId": "thebodyshop-page", + "description": "Returns a page of The RealReal listings browsed by curated collection slug, e.g. on-sale-now -- sale campaigns, editor's picks, and similar merchandising collections distinct from category/designer browsing. Pass a previous response's next_after back as after to fetch the next page.", + "operationId": "therealreal-collection", "parameters": [ { - "description": "Page handle", - "in": "path", - "name": "handle", + "description": "Collection slug, from the collections endpoint's slug field", + "in": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "page-handle" + "x-example": "on-sale-now" + }, + { + "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -495771,7 +511114,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.pageResponseDoc" + "$ref": "#/definitions/therealreal.searchResponseDoc" } }, "400": { @@ -495786,8 +511129,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -495804,35 +511147,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Body Shop static page", + "summary": "Browse The RealReal listings by curated collection", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/products": { + "/therealreal/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns products from The Body Shop's (https://www.thebodyshop.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.", - "operationId": "thebodyshop-products", - "parameters": [ - { - "description": "1-based page, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Maximum products, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - } - ], + "description": "Returns The RealReal's full published set of curated editorial and sale-campaign collection slugs (e.g. on-sale-now, hermes-birkin-bag), each usable directly against the collection endpoint's own slug field. This is reference data that changes rarely, so responses are cached.", + "operationId": "therealreal-collections", "produces": [ "application/json" ], @@ -495840,17 +511167,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/therealreal.collectionsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -495867,29 +511188,19 @@ "ApiKeyAuth": [] } ], - "summary": "List The Body Shop products", + "summary": "Get The RealReal curated collection slugs", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/products/{handle}": { + "/therealreal/conditions": { "get": { "consumes": [ "application/json" ], - "description": "Returns product detail for one The Body Shop (https://www.thebodyshop.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.", - "operationId": "thebodyshop-product", - "parameters": [ - { - "description": "Product handle", - "in": "path", - "name": "handle", - "required": true, - "type": "string", - "x-example": "product-handle" - } - ], + "description": "Returns The RealReal's full authentication condition-grading scale: the closed 6-tier set (Pristine, Excellent, Very Good, Good, Fair, As Is) it defines, each with an id (usable directly against search's condition_id) and live matching item count. This is reference data that changes rarely, so responses are cached.", + "operationId": "therealreal-conditions", "produces": [ "application/json" ], @@ -495897,23 +511208,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/therealreal.conditionsResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -495930,45 +511229,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Body Shop product", + "summary": "Get The RealReal condition-grading value space", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/products/{handle}/recommendations": { + "/therealreal/designer": { "get": { "consumes": [ "application/json" ], - "description": "Returns recommended products for one The Body Shop (https://www.thebodyshop.com) product handle. The storefront URL is fixed server-side.", - "operationId": "thebodyshop-product-recommendations", + "description": "Returns a page of The RealReal listings browsed by designer slug, e.g. gucci. Pass a previous response's next_after back as after to fetch the next page.", + "operationId": "therealreal-designer", "parameters": [ { - "description": "Product handle", - "in": "path", - "name": "handle", + "description": "Designer slug, from the designers endpoint's slug field", + "in": "query", + "name": "slug", "required": true, "type": "string", - "x-example": "product-handle" + "x-example": "gucci" }, { - "description": "Maximum products, defaults to 10 and supports up to 20", + "description": "Only return items currently marked down from their original price", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "on_sale", + "type": "boolean" }, { - "description": "Recommendation intent. Allowed values: related, complementary", - "enum": [ - "related", - "complementary" - ], + "description": "Only return items currently available to purchase (excludes sold and waitlisted items)", "in": "query", - "name": "intent", - "type": "string", - "x-example": "related" + "name": "available", + "type": "boolean" + }, + { + "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", + "in": "query", + "name": "after", + "type": "string" } ], "produces": [ @@ -495978,7 +511277,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.productRecommendationsResponseDoc" + "$ref": "#/definitions/therealreal.searchResponseDoc" } }, "400": { @@ -495993,8 +511292,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -496011,41 +511310,26 @@ "ApiKeyAuth": [] } ], - "summary": "List The Body Shop product recommendations", + "summary": "Browse The RealReal listings by designer", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/search/suggest": { + "/therealreal/designers": { "get": { "consumes": [ "application/json" ], - "description": "Returns products, collections, and query suggestions from The Body Shop's (https://www.thebodyshop.com) predictive search. The storefront URL is fixed server-side.", - "operationId": "thebodyshop-search-suggest", - "parameters": [ - { - "description": "Search query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "wool" - }, - { - "description": "Comma-separated suggestion types. Allowed values: product, collection, query", - "in": "query", - "name": "types", - "type": "string", - "x-example": "product,collection,query" - }, + "description": "Returns every designer The RealReal recognizes in one department (not just designers with currently active listings), each with an id (usable directly against search's designer_id) and slug (usable directly against the designer endpoint). The directory is segmented by department -- pass category to select one; the response's categories field lists every accepted value. This is reference data that changes rarely, so responses are cached.", + "operationId": "therealreal-designers", + "parameters": [ { - "description": "Maximum results per type, defaults to 10 and supports up to 20", + "description": "Designer-directory department. One of: women, men, fine-jewelry, watches, art, home, kids. Defaults to women", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "name": "category", + "type": "string", + "x-example": "women" } ], "produces": [ @@ -496055,7 +511339,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.searchSuggestResponseDoc" + "$ref": "#/definitions/therealreal.designersResponseDoc" } }, "400": { @@ -496064,8 +511348,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -496082,42 +511366,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Body Shop search suggestions", + "summary": "Get The RealReal designer directory", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/sitemap/urls": { + "/therealreal/listing": { "get": { "consumes": [ "application/json" ], - "description": "Returns capped URL entries from The Body Shop's (https://www.thebodyshop.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.", - "operationId": "thebodyshop-sitemap-urls", + "description": "Returns a single The RealReal listing: description, condition detail, category context, and measurements, plus the shared summary fields (name, designer, condition, price, images). Looked up by the listing's full product URL, as returned in a search/category/designer response's url field.", + "operationId": "therealreal-listing", "parameters": [ { - "description": "Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other", - "enum": [ - "all", - "products", - "collections", - "pages", - "blogs", - "agentic_discovery", - "other" - ], + "description": "Full product URL, as returned in a search/category/designer response's url field", "in": "query", - "name": "type", + "name": "url", + "required": true, "type": "string", - "x-example": "products" - }, - { - "description": "Maximum URL entries, defaults to 50 and supports up to 250", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "x-example": "https://www.therealreal.com/products/women/handbags/crossbody-bags/chanel-denim-pearl-crush-wallet-on-chain-wdqhu" } ], "produces": [ @@ -496127,7 +511396,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapURLsResponseDoc" + "$ref": "#/definitions/therealreal.listingResponseDoc" } }, "400": { @@ -496136,8 +511405,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -496154,19 +511429,82 @@ "ApiKeyAuth": [] } ], - "summary": "List The Body Shop sitemap URLs", + "summary": "Get a The RealReal listing detail", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/sitemaps": { + "/therealreal/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns child sitemap URLs from The Body Shop's (https://www.thebodyshop.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.", - "operationId": "thebodyshop-sitemaps", + "description": "Searches The RealReal's authenticated luxury resale catalog by keyword, optionally combined with category, designer, condition-grade, and price-range filters, returning listing summaries (name, designer, condition, price, images) plus the total matching count and an opaque pagination cursor. Pass a previous response's next_after back as after to fetch the next page.", + "operationId": "therealreal-search", + "parameters": [ + { + "description": "Free-text keyword search", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "gucci bag" + }, + { + "description": "Category (taxon) id, from the categories endpoint's id field", + "in": "query", + "name": "category_id", + "type": "string", + "x-example": "493" + }, + { + "description": "Designer id, from the designers endpoint's id field", + "in": "query", + "name": "designer_id", + "type": "string", + "x-example": "127" + }, + { + "description": "Condition grade id, from the conditions endpoint's id field", + "in": "query", + "name": "condition_id", + "type": "string", + "x-example": "20" + }, + { + "description": "Minimum price in USD", + "in": "query", + "name": "price_from", + "type": "number", + "x-example": 100 + }, + { + "description": "Maximum price in USD", + "in": "query", + "name": "price_to", + "type": "number", + "x-example": 1000 + }, + { + "description": "Only return items currently marked down from their original price", + "in": "query", + "name": "on_sale", + "type": "boolean" + }, + { + "description": "Only return items currently available to purchase (excludes sold and waitlisted items)", + "in": "query", + "name": "available", + "type": "boolean" + }, + { + "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", + "in": "query", + "name": "after", + "type": "string" + } + ], "produces": [ "application/json" ], @@ -496174,7 +511512,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.sitemapIndexResponseDoc" + "$ref": "#/definitions/therealreal.searchResponseDoc" } }, "400": { @@ -496183,8 +511521,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -496201,19 +511539,29 @@ "ApiKeyAuth": [] } ], - "summary": "List The Body Shop sitemaps", + "summary": "Search The RealReal luxury consignment listings", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thebodyshop/store": { + "/therealreal/similar": { "get": { "consumes": [ "application/json" ], - "description": "Returns storefront metadata for The Body Shop (https://www.thebodyshop.com). The storefront URL is fixed server-side, so no `url` parameter is accepted.", - "operationId": "thebodyshop-store", + "description": "Returns The RealReal's own \"Similar Items\" visual-similarity recommendations for one product, looked up by the product's numeric id (from any other The RealReal endpoint's listing response id field).", + "operationId": "therealreal-similar", + "parameters": [ + { + "description": "The RealReal numeric product id, from a search/category/designer/listing/collection response's id field", + "in": "query", + "name": "product_id", + "required": true, + "type": "string", + "x-example": "54388578" + } + ], "produces": [ "application/json" ], @@ -496221,7 +511569,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/shopifybrands.storeResponseDoc" + "$ref": "#/definitions/therealreal.similarResponseDoc" } }, "400": { @@ -496230,8 +511578,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -496248,24 +511596,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Body Shop store metadata", + "summary": "Get The RealReal similar-item recommendations", "tags": [ - "The Body Shop" + "The RealReal" ] } }, - "/thedailybeast/article": { + "/thestarmy/article": { "get": { - "description": "Returns one The Daily Beast article by its canonical `url`, either a root-level slug or one under a single content vertical such as `obsessed`. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag. Digest or index pages are not articles and return an error.", - "operationId": "thedailybeast-article", + "description": "Returns public The Star (Malaysia) story metadata and body paragraphs from a canonical story URL. Metered and premium stories return only the public teaser paragraphs the server shows anonymous readers, flagged with paywalled; a story with no readable teaser returns a permission error.", + "operationId": "thestarmy-article", "parameters": [ { - "description": "Canonical The Daily Beast article URL", + "description": "Canonical The Star (Malaysia) story URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.thedailybeast.com/murdoch-paper-predicts-trumps-panicked-plan-will-backfire/" + "x-example": "https://www.thestar.com.my/news/nation/2026/09/25/ros-freeze-could-rattle-pn-prep" } ], "produces": [ @@ -496284,6 +511632,12 @@ "$ref": "#/definitions/app.Response" } }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "404": { "description": "Not Found", "schema": { @@ -496302,24 +511656,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Daily Beast article content", + "summary": "Get The Star (Malaysia) article content", "tags": [ - "The Daily Beast" + "The Star Malaysia" ] } }, - "/thedailybeast/author": { + "/thestarmy/author": { "get": { - "description": "Returns one The Daily Beast reporter's public profile: name, job title, biography, headshot, social link, and their recent articles, from a canonical author URL.", - "operationId": "thedailybeast-author", + "description": "Returns one The Star (Malaysia) byline's public author page: display name, the public byline email, and their most recent stories.", + "operationId": "thestarmy-author", "parameters": [ { - "description": "Canonical thedailybeast.com/author/ URL", + "description": "Byline name, matched case-insensitively, e.g. Ivan Loh", + "in": "query", + "name": "name", + "type": "string", + "x-example": "Ivan Loh" + }, + { + "description": "Canonical thestar.com.my/authors?q= URL; alternative to name", "in": "query", "name": "url", - "required": true, "type": "string", - "x-example": "https://www.thedailybeast.com/author/isabel-van-brugen/" + "x-example": "https://www.thestar.com.my/authors?q=IVAN+LOH" } ], "produces": [ @@ -496329,7 +511689,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.dailyBeastAuthorResponseDoc" + "$ref": "#/definitions/publicnews.thestarmyAuthorResponseDoc" } }, "400": { @@ -496356,103 +511716,120 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Daily Beast author profile", + "summary": "Get a The Star (Malaysia) author page", "tags": [ - "The Daily Beast" + "The Star Malaysia" ] } }, - "/thedailybeast/headlines": { + "/thestarmy/headlines": { "get": { - "description": "Returns the current headlines of one The Daily Beast section. `section` is required and takes a slug such as `politics`, `politics/opinion`, `obsessed/reviews`, `scouted/home` or `world/china`. Each item can carry its title, URL, summary, author, publication time, lead image and `type`, and the response echoes the `section`.", - "operationId": "thedailybeast-headlines", + "description": "Returns the current stories of one The Star (Malaysia) section page, usually 10 and up to 100 on column-style sections. `section` is required, for example `news-nation`, `latest-business`, `sport-badminton` or `latest-food`. Items have a title and URL, and when the page shows them a `type`, summary, byline, image and publication time. Older stories are not paginated.", + "operationId": "thestarmy-headlines", "parameters": [ { - "description": "The Daily Beast section slug", + "description": "The Star (Malaysia) section slug", "enum": [ + "news-latest", + "latest-nation", + "latest-business", + "latest-education", + "latest-aseanplus", + "latest-sport", + "latest-metro", + "latest-tech", + "latest-world", + "latest-lifestyle", + "latest-food", + "news-nation", + "news-world", + "news-environment", + "news-in-other-media", + "news-true-or-not", + "news-focus", + "aseanplus-aseanplus-news", + "business-insight", + "business-smebiz", + "business-premium", + "sport-athletics", + "sport-hockey", + "sport-football", + "sport-golf", + "sport-badminton", + "sport-tennis", + "sport-motorsport", + "sport-other-sport", + "sport-say-what", + "sport-archery", + "sport-basketball", + "sport-bowling", + "sport-boxing", + "sport-cricket", + "sport-cycling", + "sport-diving", + "sport-gymnastics", + "sport-others", + "sport-rugby", + "sport-shooting", + "sport-squash", + "sport-swimming", + "sport-wrestling", + "metro-metro-news", + "metro-community-sports", + "metro-views", "lifestyle", - "lifestyle/body", - "lifestyle/face", - "lifestyle/wellness", - "lifestyle/hair", - "lifestyle/style", - "travel", - "entertainment", - "entertainment/music", - "entertainment/tv", - "entertainment/movies", - "entertainment/comedy", - "entertainment/awards-shows", - "archive", - "media", - "tech", - "arts-and-culture", - "arts-and-culture/theater", - "arts-and-culture/royalist", - "arts-and-culture/fashion", - "arts-and-culture/books", - "innovation", - "innovation/science", - "obsessed", - "obsessed/shop", - "obsessed/hot-takes", - "obsessed/reviews", - "obsessed/recaps", - "obsessed/what-to-watch", - "obsessed/trailers", - "obsessed/interviews", - "obsessed/industry", - "obsessed/celebrity", - "obsessed/media", - "obsessed/media/shows", - "obsessed/media/movies", - "obsessed/media/music", - "obsessed/media/books", - "obsessed/rating", - "obsessed/rating/see", - "obsessed/rating/skip", - "obsessed/the-last-laugh", - "obsessed/obsessed-podcast", - "obsessed/obsessed-newsletter", - "politics", - "politics/biden-world", - "politics/congress", - "politics/elections", - "politics/national-security", - "politics/opinion", - "politics/trumpland", - "politics/pay-dirt", - "politics/trail-mix", - "politics/the-new-abnormal", - "scouted", - "scouted/fitness", - "scouted/wellness", - "scouted/beauty", - "scouted/bedroom", - "scouted/clothing", - "scouted/face-masks", - "scouted/home", - "scouted/kitchen", - "scouted/outdoors", - "scouted/technology", - "scouted/new-kids-on-the-block", - "scouted/the-case-for", - "scouted/thisthat", - "us-news", - "us-news/crime-and-justice", - "us-news/identities", - "us-news/sports", - "world", - "world/china", - "world/middle-east", - "world/europe", - "world/russia" + "lifestyle-entertainment-and-style", + "lifestyle-people-and-living", + "lifestyle-health-and-family", + "lifestyle-travel-and-culture", + "lifestyle-viewpoints", + "lifestyle-entertainment", + "lifestyle-living", + "lifestyle-style", + "lifestyle-people", + "lifestyle-health", + "lifestyle-family", + "lifestyle-travel", + "lifestyle-culture", + "lifestyle-design", + "lifestyle-science", + "lifestyle-wellness", + "lifestyle-fitness", + "lifestyle-mind", + "lifestyle-nutrition", + "lifestyle-animals", + "lifestyle-children", + "lifestyle-seniors", + "lifestyle-beauty", + "lifestyle-fashion", + "lifestyle-malaysia", + "lifestyle-global", + "lifestyle-asia-oceania", + "lifestyle-americas", + "lifestyle-europe", + "lifestyle-africa", + "lifestyle-arts", + "lifestyle-books", + "lifestyle-climate", + "lifestyle-movie-review", + "lifestyle-music-review", + "lifestyle-book-review", + "food", + "food-food-for-thought", + "food-food-news", + "food-eating-out", + "tech-tech-news", + "tech-tech-thoughts", + "education-news", + "opinion-columnists", + "opinion-letters", + "starpicks" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "lifestyle" + "x-example": "news-latest" } ], "produces": [ @@ -496483,16 +511860,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Daily Beast section headlines", + "summary": "Get The Star (Malaysia) section headlines", "tags": [ - "The Daily Beast" + "The Star Malaysia" ] } }, - "/thedailybeast/news": { + "/thestarmy/news": { "get": { - "description": "Returns the current top stories from The Daily Beast. It takes no parameters. Each item has its title, URL, summary, publication time, author and lead image, so it is a quick front-page view; use the headlines endpoint with a `section` slug for one category.", - "operationId": "thedailybeast-news", + "description": "Returns the current top stories on The Star (Malaysia) home page. It takes no parameters. Each item has a title and canonical URL, plus a short section label in `type`, a summary and a byline when the page shows them. `published_at` is omitted here; the section headlines endpoint carries it.", + "operationId": "thestarmy-news", "produces": [ "application/json" ], @@ -496515,16 +511892,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Daily Beast top stories", + "summary": "Get The Star (Malaysia) top stories", "tags": [ - "The Daily Beast" + "The Star Malaysia" ] } }, - "/thedailybeast/sections": { + "/thestarmy/sections": { "get": { - "description": "Lists the sections of The Daily Beast that the headlines endpoint accepts, both top-level categories such as `politics` and `world` and child sub-sections such as `politics/opinion` and `world/middle-east`. Each entry has a `slug`, a display `name` and the section `url`.", - "operationId": "thedailybeast-sections", + "description": "Lists the 94 The Star (Malaysia) sections that returned at least one story to an anonymous reader when checked on 2026-09-25, and that the headlines endpoint accepts. Examples are `news-latest`, `latest-nation`, `business-smebiz` and `sport-football`. Each entry has a `slug`, a `name` and the section page `url`.", + "operationId": "thestarmy-sections", "produces": [ "application/json" ], @@ -496541,24 +511918,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Daily Beast sections", + "summary": "Get The Star (Malaysia) sections", "tags": [ - "The Daily Beast" + "The Star Malaysia" ] } }, - "/thehill/article": { + "/theverge/article": { "get": { - "description": "Returns one The Hill article by `url`, which must be a canonical HTTPS `thehill.com` article link containing a numeric article id. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag.", - "operationId": "thehill-article", + "description": "Returns one The Verge article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag. Subscriber-only or blocked pages return an error instead.", + "operationId": "theverge-article", "parameters": [ { - "description": "Canonical The Hill article URL", + "description": "Canonical The Verge article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://thehill.com/policy/1234567-example/" + "x-example": "https://www.theverge.com/news/998317/bungie-destiny-2-unvaulted-raids-campaigns-destinations" } ], "produces": [ @@ -496595,24 +511972,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hill article content", + "summary": "Get The Verge article content", "tags": [ - "The Hill" + "The Verge" ] } }, - "/thehill/author": { + "/theverge/author": { "get": { - "description": "Returns a The Hill author's profile by `url`, a canonical `thehill.com/author//` link: name, job title, bio, image URL and recent articles with title, URL, category and category URL. `job_title` and `image_url` may be missing, and each article's `published_at` is relative text such as `10 hours ago`, not a timestamp.", - "operationId": "thehill-author", + "description": "Returns a The Verge author's profile by `url`, a canonical `theverge.com/authors/` link: name, job title such as Senior Reporter, bio and recent articles. Each article has a title, URL, excerpt, ISO-8601 `published_at` and `category`, the post's primary Verge vertical such as Tech.", + "operationId": "theverge-author", "parameters": [ { - "description": "Canonical The Hill author URL", + "description": "Canonical The Verge author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://thehill.com/author/alexander-bolton/" + "x-example": "https://www.theverge.com/authors/jay-peters" } ], "produces": [ @@ -496622,7 +511999,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.theHillAuthorResponseDoc" + "$ref": "#/definitions/publicnews.thevergeAuthorResponseDoc" } }, "400": { @@ -496649,45 +512026,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Hill author profile", + "summary": "Get a The Verge author profile", "tags": [ - "The Hill" + "The Verge" ] } }, - "/thehill/headlines": { + "/theverge/headlines": { "get": { - "description": "Returns the current headlines for one The Hill section. `section` is required and takes one of 19 slugs, including `home`, `policy`, `business`, `senate`, `national-security` and `technology`. Each item has its title and URL, plus summary, author, publication time and image when the outlet provides them, and the response echoes the `section`.", - "operationId": "thehill-headlines", + "description": "Returns the current headlines for one The Verge section. `section` is required and takes one of `tech`, `reviews`, `science`, `entertainment`, `ai`, `policy`, `gaming`, `mobile`, `apps` or `features`. Each item has its title, URL, summary, author and publication time.", + "operationId": "theverge-headlines", "parameters": [ { - "description": "The Hill RSS section slug", + "description": "The Verge section slug", "enum": [ - "home", - "homenews", + "tech", + "reviews", + "science", + "entertainment", + "ai", "policy", - "business", - "opinion", - "healthcare", - "campaign", - "national-security", - "senate", - "house", - "administration", - "regulation", - "media", - "defense", - "technology", - "transportation", - "international", - "economy", - "policy-healthcare" + "gaming", + "mobile", + "apps", + "features" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "home" + "x-example": "tech" } ], "produces": [ @@ -496718,16 +512086,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hill section headlines", + "summary": "Get The Verge section headlines", "tags": [ - "The Hill" + "The Verge" ] } }, - "/thehill/news": { + "/theverge/news": { "get": { - "description": "Returns the current top stories from The Hill. It takes no parameters. Each item has its title, URL and, where the outlet gives them, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section instead.", - "operationId": "thehill-news", + "description": "Returns the current top stories from The Verge. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", + "operationId": "theverge-news", "produces": [ "application/json" ], @@ -496738,12 +512106,6 @@ "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -496756,16 +512118,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hill top stories", + "summary": "Get The Verge top stories", "tags": [ - "The Hill" + "The Verge" ] } }, - "/thehill/sections": { + "/theverge/sections": { "get": { - "description": "Lists the 19 The Hill section slugs that the headlines endpoint accepts, such as `home`, `policy`, `senate`, `defense` and `technology`. Each entry has the section `slug`, its display `name` and its `url`.", - "operationId": "thehill-sections", + "description": "Lists the The Verge sections that the headlines endpoint accepts: `tech`, `reviews`, `science`, `entertainment`, `ai`, `policy`, `gaming`, `mobile`, `apps` and `features`. Each entry has a `slug`, a display `name` and a section `url`.", + "operationId": "theverge-sections", "produces": [ "application/json" ], @@ -496782,24 +512144,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hill RSS sections", + "summary": "Get The Verge sections", "tags": [ - "The Hill" + "The Verge" ] } }, - "/thehindu/article": { + "/thisismoney/article": { "get": { - "description": "Returns public The Hindu article metadata and body paragraphs from a canonical article URL. A story The Hindu marks subscriber-only returns a permission error instead of a body.", - "operationId": "thehindu-article", + "description": "Returns one This Is Money article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag. Pages that are subscriber-only or blocked return an error.", + "operationId": "thisismoney-article", "parameters": [ { - "description": "Canonical The Hindu article URL", + "description": "Canonical This Is Money article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.thehindu.com/news/national/kerala/example-article-slug/article71505134.ece" + "x-example": "https://www.thisismoney.co.uk/money/markets/article-123/example.html" } ], "produces": [ @@ -496818,12 +512180,6 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "404": { "description": "Not Found", "schema": { @@ -496842,24 +512198,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hindu article content", + "summary": "Get This Is Money article content", "tags": [ - "The Hindu" + "This Is Money" ] } }, - "/thehindu/author": { + "/thisismoney/author": { "get": { - "description": "Returns a The Hindu author's byline metadata, biography, contact/social links, and their most recent articles from a canonical author URL.", - "operationId": "thehindu-author", + "description": "Returns a This Is Money author's profile by `url`, a canonical `thisismoney.co.uk/profile-/.html` link: name, job title, bio, coverage topic tags such as Money or Bills, and recent articles with title, URL, excerpt and ISO-8601 `published_at`. `job_title` and `coverage` can be empty.", + "operationId": "thisismoney-author", "parameters": [ { - "description": "Canonical The Hindu author URL", + "description": "Canonical This Is Money author URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.thehindu.com/profile/author/devdutt-pattanaik-3563/" + "x-example": "https://www.thisismoney.co.uk/profile-2242/toby-walne.html" } ], "produces": [ @@ -496869,7 +512225,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.theHinduAuthorResponseDoc" + "$ref": "#/definitions/publicnews.thisIsMoneyAuthorResponseDoc" } }, "400": { @@ -496896,94 +512252,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Hindu author profile", + "summary": "Get a This Is Money author profile", "tags": [ - "The Hindu" + "This Is Money" ] } }, - "/thehindu/headlines": { + "/thisismoney/headlines": { "get": { - "description": "Returns the current headlines for one The Hindu section. `section` is required and takes a slug such as `news-national`, `opinion-editorial`, `business-markets`, `sport-cricket` or `sci-tech-health`. Items carry the title, URL, summary, author, publication time and image, and the response echoes the `section`.", - "operationId": "thehindu-headlines", + "description": "Returns the current headlines for one This Is Money section. `section` is required and takes one of `money`, `markets`, `investing`, `savings`, `pensions`, `mortgages`, `property`, `cars`, `travel` or `consumer`. Each item has its title and URL, plus summary, author, publication time and image when the outlet provides them.", + "operationId": "thisismoney-headlines", "parameters": [ { - "description": "The Hindu section slug", + "description": "This Is Money section slug", "enum": [ - "news", - "news-national", - "news-international", - "news-states", - "news-cities", - "opinion", - "opinion-editorial", - "opinion-cartoon", - "opinion-columns", - "opinion-op-ed", - "opinion-interview", - "opinion-lead", - "opinion-letters", - "opinion-open-page", - "business", - "business-agri-business", - "business-economy", - "business-industry", - "business-markets", - "business-budget", - "sport", - "sport-cricket", - "sport-football", - "sport-hockey", - "sport-tennis", - "sport-athletics", - "sport-motorsport", - "sport-races", - "sport-other-sports", - "entertainment", - "entertainment-art", - "entertainment-dance", - "entertainment-movies", - "entertainment-music", - "entertainment-reviews", - "entertainment-theatre", - "data", - "sci-tech-health", - "sci-tech-science", - "sci-tech-technology", - "sci-tech-technology-gadgets", - "sci-tech-technology-internet", - "sci-tech-energy-and-environment", - "sci-tech-agriculture", - "education", - "education-careers", - "education-colleges", - "education-schools", - "life-and-style", - "life-and-style-fashion", - "life-and-style-fitness", - "life-and-style-homes-and-gardens", - "life-and-style-luxury", - "life-and-style-motoring", - "life-and-style-travel", - "society", - "society-faith", - "society-history-and-culture", - "books", - "books-books-authors", - "books-books-reviews", - "children", - "food", - "food-dining", - "food-features", - "food-guides", - "food-recipes", - "real-estate" + "money", + "markets", + "investing", + "savings", + "pensions", + "mortgages", + "property", + "cars", + "travel", + "consumer" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "news" + "x-example": "money" } ], "produces": [ @@ -497014,16 +512312,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hindu section headlines", + "summary": "Get This Is Money section headlines", "tags": [ - "The Hindu" + "This Is Money" ] } }, - "/thehindu/news": { + "/thisismoney/news": { "get": { - "description": "Returns the current stories from The Hindu's Latest News listing. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. For a single desk such as cricket or business, use the headlines endpoint.", - "operationId": "thehindu-news", + "description": "Returns the current top stories from This Is Money. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", + "operationId": "thisismoney-news", "produces": [ "application/json" ], @@ -497034,12 +512332,6 @@ "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -497052,16 +512344,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hindu top stories", + "summary": "Get This Is Money top stories", "tags": [ - "The Hindu" + "This Is Money" ] } }, - "/thehindu/sections": { + "/thisismoney/sections": { "get": { - "description": "Lists the The Hindu section slugs that the headlines endpoint accepts, covering news, opinion, business, sport, entertainment, sci-tech, education, life and style, society, books and food, for example `news-national`, `sport-cricket` and `food-recipes`. Each entry has a `slug`, `name` and `url`.", - "operationId": "thehindu-sections", + "description": "Lists the This Is Money sections that the headlines endpoint accepts, such as `money`, `markets`, `savings`, `pensions`, `mortgages`, `property` and `cars`. Each entry has a `slug`, a display `name` and a section `url`.", + "operationId": "thisismoney-sections", "produces": [ "application/json" ], @@ -497078,24 +512370,32 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Hindu sections", + "summary": "Get This Is Money sections", "tags": [ - "The Hindu" + "This Is Money" ] } }, - "/thejournal/article": { + "/threads/post/{username}/{code}": { "get": { - "description": "Returns public TheJournal.ie article metadata and body paragraphs from a canonical article URL. Stories are served in full to anonymous readers, so paywalled is never set.", - "operationId": "thejournal-article", + "description": "Returns one public Threads post by `username` (with or without a leading `@`) and the post `code` from its URL. The response has the post text, canonical URL, preview image URL, and the author's id, name and username. Replies and logged-in fields are not included. An unavailable post returns 404.", + "operationId": "threads-post", "parameters": [ { - "description": "Canonical TheJournal.ie article URL", - "in": "query", - "name": "url", + "description": "Threads username", + "in": "path", + "name": "username", "required": true, "type": "string", - "x-example": "https://www.thejournal.ie/amazon-refunds-200-cheques-7170610-Sep2026/" + "x-example": "zuck" + }, + { + "description": "Threads post code", + "in": "path", + "name": "code", + "required": true, + "type": "string", + "x-example": "DakyAavlKLZ" } ], "produces": [ @@ -497103,25 +512403,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped post payload", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/threads.postResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid username or post code", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Post not found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497132,30 +512432,32 @@ "ApiKeyAuth": [] } ], - "summary": "Get TheJournal.ie article content", + "summary": "Retrieve a public Threads post", "tags": [ - "TheJournal.ie" + "Threads" ] } }, - "/thejournal/author": { + "/threads/post/{username}/{code}/replies": { "get": { - "description": "Returns one TheJournal.ie author's public archive page: name, numeric author id, and the most recent articles the first page lists.", - "operationId": "thejournal-author", + "description": "Returns the public replies currently exposed to logged-out visitors. The response identifies when Threads reports additional replies but withholds a usable continuation cursor.", + "operationId": "threads-post-replies", "parameters": [ { - "description": "Author slug, e.g. ottoline-spearman", - "in": "query", - "name": "slug", + "description": "Threads username", + "in": "path", + "name": "username", + "required": true, "type": "string", - "x-example": "ottoline-spearman" + "x-example": "zuck" }, { - "description": "Canonical thejournal.ie/author// URL, optionally with the numeric author id; alternative to slug", - "in": "query", - "name": "url", + "description": "Threads post code", + "in": "path", + "name": "code", + "required": true, "type": "string", - "x-example": "https://www.thejournal.ie/author/ottoline-spearman/9329/" + "x-example": "DakyAavlKLZ" } ], "produces": [ @@ -497163,25 +512465,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped replies payload", "schema": { - "$ref": "#/definitions/publicnews.theJournalAuthorResponseDoc" + "$ref": "#/definitions/threads.repliesResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid username or post code", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Post not found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497192,48 +512494,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TheJournal.ie author page", + "summary": "Retrieve public replies to a Threads post", "tags": [ - "TheJournal.ie" + "Threads" ] } }, - "/thejournal/headlines": { + "/threads/profile/{username}": { "get": { - "description": "Returns current headlines from one public TheJournal.ie section listing page, with the story type label, summary and image when the page shows them.", - "operationId": "thejournal-headlines", + "description": "Returns a public Threads profile by `username` (with or without a leading `@`): name, profile URL, biography, avatar URL, `followers_count` and `threads_count`. Counts are derived from the compact figures shown on the profile page. An unavailable profile returns 404.", + "operationId": "threads-profile", "parameters": [ { - "description": "TheJournal.ie section slug", - "enum": [ - "irish", - "politics", - "international", - "business", - "tech", - "science", - "environment", - "voices", - "investigates", - "factcheck", - "explainer", - "gaeilge", - "sport", - "money-diaries", - "quiz", - "climate-change", - "housing", - "cost-of-living", - "road-safety", - "courts", - "ukraine", - "gaza" - ], - "in": "query", - "name": "section", + "description": "Threads username", + "in": "path", + "name": "username", "required": true, "type": "string", - "x-example": "irish" + "x-example": "zuck" } ], "produces": [ @@ -497241,19 +512519,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped profile payload", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/threads.profileResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid username", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Profile not found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497264,28 +512548,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get TheJournal.ie section headlines", + "summary": "Retrieve a public Threads profile", "tags": [ - "TheJournal.ie" + "Threads" ] } }, - "/thejournal/news": { + "/threads/profile/{username}/media": { "get": { - "description": "Returns the latest TheJournal.ie stories across all sections. Each item has a title, canonical URL, short summary, publication time (RFC 3339, UTC) and lead image. Items carry no author byline; the article endpoint supplies it. It takes no parameters.", - "operationId": "thejournal-news", + "description": "Returns the first public page shown on a profile's Media tab. Items include image and video URLs, including carousel attachments, plus post and topic metadata. The logged-out page exposes no continuation cursor or media-type filter; `pagination_limited` reports when additional results are gated by login or lack a supported cursor.", + "operationId": "threads-profile-media", + "parameters": [ + { + "description": "Threads username", + "in": "path", + "name": "username", + "required": true, + "type": "string", + "x-example": "zuck" + } + ], "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Wrapped profile media payload", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/threads.profileMediaResponseDoc" + } + }, + "400": { + "description": "Invalid username", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Profile not found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497296,24 +512602,58 @@ "ApiKeyAuth": [] } ], - "summary": "Get TheJournal.ie top stories", + "summary": "Retrieve public media posts from a Threads profile", "tags": [ - "TheJournal.ie" + "Threads" ] } }, - "/thejournal/sections": { + "/threads/profile/{username}/posts": { "get": { - "description": "Lists the 22 TheJournal.ie sections that the headlines endpoint accepts, verified 2026-09-25: nine category pages such as `irish`, `politics` and `business`, plus topic pages such as `housing`, `courts`, `ukraine` and `gaza`. Each entry has a `slug`, `name` and listing page `url`. Topic pages outside the site navigation are not served.", - "operationId": "thejournal-sections", + "description": "Lists public posts from the profile's Threads tab by `username`. Each item has its code, URL, text, creation time, image and video URLs, like, reply, repost and quote counts, reply flag and author. When `has_more` is true, pass `next_cursor` unchanged as `cursor` to fetch the next page; `pagination_limited` is true if Threads withholds a usable cursor.", + "operationId": "threads-profile-posts", + "parameters": [ + { + "description": "Threads username", + "in": "path", + "name": "username", + "required": true, + "type": "string", + "x-example": "zuck" + }, + { + "description": "Opaque cursor returned by the previous response", + "in": "query", + "name": "cursor", + "type": "string" + } + ], "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Wrapped profile posts payload", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/threads.profilePostsResponseDoc" + } + }, + "400": { + "description": "Invalid username or cursor", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Profile not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Upstream error or parser drift", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -497322,24 +512662,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get TheJournal.ie sections", + "summary": "Retrieve public posts from a Threads profile", "tags": [ - "TheJournal.ie" + "Threads" ] } }, - "/thenextweb/article": { + "/threads/profile/{username}/replies": { "get": { - "description": "Returns one The Next Web article by `url`, which must be a canonical HTTPS `thenextweb.com/news/` link; off-site URLs and non-article paths are rejected. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", - "operationId": "thenextweb-article", + "description": "Returns the first public page shown on a profile's Replies tab. Each item preserves its actual author and public reply metadata. The logged-out page has no continuation cursor; `pagination_limited` is true when Threads reports more items without a cursor or shows a login wall for additional items.", + "operationId": "threads-profile-replies", "parameters": [ { - "description": "Canonical thenextweb.com article URL", - "in": "query", - "name": "url", + "description": "Threads username", + "in": "path", + "name": "username", "required": true, "type": "string", - "x-example": "https://thenextweb.com/news/netflix-wonka-golden-ticket-ai-gene-wilder-voice" + "x-example": "zuck" } ], "produces": [ @@ -497347,25 +512687,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped profile replies payload", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/threads.profileRepliesResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid username", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Profile not found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497376,30 +512716,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Next Web article content", + "summary": "Retrieve public items from a Threads profile's Replies tab", "tags": [ - "The Next Web" + "Threads" ] } }, - "/thenextweb/author": { + "/threads/profile/{username}/reposts": { "get": { - "description": "Returns a The Next Web author's name, image URL and the story cards on their archive page. Give `slug` or a canonical `thenextweb.com/author/` `url`; `slug` is required when `url` is omitted. Each article has a title, URL, summary, author, image, `type` and publication time.", - "operationId": "thenextweb-author", + "description": "Returns the first public page shown on a profile's Reposts tab. Each item preserves the original post author and metadata. `pagination_limited` is true when Threads gates more items behind login or reports more items without a supported cursor.", + "operationId": "threads-profile-reposts", "parameters": [ { - "description": "Author slug from the public author sitemap or an article byline", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "darius-popa" - }, - { - "description": "Canonical thenextweb.com/author/ URL; alternative to slug", - "in": "query", - "name": "url", + "description": "Threads username", + "in": "path", + "name": "username", + "required": true, "type": "string", - "x-example": "https://thenextweb.com/author/darius-popa" + "x-example": "zuck" } ], "produces": [ @@ -497407,25 +512741,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped profile reposts payload", "schema": { - "$ref": "#/definitions/publicnews.thenextwebAuthorResponseDoc" + "$ref": "#/definitions/threads.profileRepostsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid username", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Profile not found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497436,36 +512770,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Next Web author profile", + "summary": "Retrieve public posts reposted by a Threads profile", "tags": [ - "The Next Web" + "Threads" ] } }, - "/thenextweb/headlines": { + "/threads/profile/{username}/topics": { "get": { - "description": "Returns the story cards of one The Next Web editorial section. `section` is required and must be one of `deep-tech`, `sustainability`, `ecosystems`, `data-security`, `fintech-ecommerce`, `future-of-work`, `startups-technology`, `investors-funding`, `government-policy` or `corporates-innovation`; other values return a 400.", - "operationId": "thenextweb-headlines", + "description": "Returns every topic tag listed on a public profile, including the numeric tag id and canonical `name` to pass as `q` to `/threads/search/topics`. Community topics include their community metadata.", + "operationId": "threads-profile-topics", "parameters": [ { - "description": "Editorial section slug returned by thenextweb_sections", - "enum": [ - "deep-tech", - "sustainability", - "ecosystems", - "data-security", - "fintech-ecommerce", - "future-of-work", - "startups-technology", - "investors-funding", - "government-policy", - "corporates-innovation" - ], - "in": "query", - "name": "section", + "description": "Threads username", + "in": "path", + "name": "username", "required": true, "type": "string", - "x-example": "deep-tech" + "x-example": "zuck" } ], "produces": [ @@ -497473,19 +512795,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Wrapped profile topics payload", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/threads.profileTopicsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid username", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Profile not found", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497496,34 +512824,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Next Web section headlines", + "summary": "Discover public topic tags on a Threads profile", "tags": [ - "The Next Web" + "Threads" ] } }, - "/thenextweb/news": { + "/threads/search": { "get": { - "description": "Returns the current top stories from The Next Web. It takes no parameters. Each item has the publisher's title, canonical URL, summary, publication time and author, plus the image URL when one is present.", - "operationId": "thenextweb-news", + "description": "Returns the public first page of Threads search results for a query. `sort` supports `top` and `recent`; `pagination_limited` marks the logged-out login wall because search has no continuation cursor. Author and date filters in Threads require login and are not exposed here.", + "operationId": "threads-search", + "parameters": [ + { + "description": "Search query (1-100 characters)", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "openai" + }, + { + "description": "Result order; defaults to top", + "enum": [ + "top", + "recent" + ], + "in": "query", + "name": "sort", + "type": "string" + } + ], "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Wrapped search payload", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/threads.searchResponseDoc" } - }, - "429": { - "description": "Too Many Requests", + }, + "400": { + "description": "Invalid query or sort", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Upstream error or parser drift", "schema": { "$ref": "#/definitions/app.Response" } @@ -497534,24 +512882,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Next Web top stories", + "summary": "Search public Threads posts", "tags": [ - "The Next Web" + "Threads" ] } }, - "/thenextweb/sections": { + "/threads/search/topics": { "get": { - "description": "Returns the ten editorial sections in The Next Web's current homepage navigation. Topic/tag archives, media, events and promotional categories are excluded.", - "operationId": "thenextweb-sections", + "description": "Returns the public first page of posts for a topic tag. Discover the required `tag_id` and its canonical query `name` from `/threads/profile/{username}/topics` or a post's `topic` metadata. Topic results have no logged-out continuation cursor; `pagination_limited` marks the login wall for more results.", + "operationId": "threads-topic-search", + "parameters": [ + { + "description": "Canonical topic query from a profile topic's `name` or a post topic's `search_query`", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "aithreads" + }, + { + "description": "Numeric Threads topic tag id", + "in": "query", + "name": "tag_id", + "required": true, + "type": "string", + "x-example": "18399895213044171" + } + ], "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Wrapped topic search payload", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/threads.topicSearchResponseDoc" + } + }, + "400": { + "description": "Invalid query or topic id", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Upstream error or parser drift", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -497560,27 +512938,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Next Web sections", + "summary": "Search posts for a public Threads topic tag", "tags": [ - "The Next Web" + "Threads" ] } }, - "/therealreal/autocomplete": { + "/ticketmaster/attraction": { "get": { "consumes": [ "application/json" ], - "description": "Returns The RealReal's own search-box typeahead suggestions for a partial query.", - "operationId": "therealreal-autocomplete", + "description": "Returns one Ticketmaster attraction (artist, team or other event entity) by numeric `id`: name, synopsis, image, URL, classification (segment, genre, sub-genre) and `has_artist_video`. Past performance `setlists` and `setlist_source_url` appear only when available. An unknown attraction returns 404.", + "operationId": "ticketmaster-attraction", "parameters": [ { - "description": "Partial free-text query to get search-box suggestions for", + "description": "Numeric Ticketmaster attraction id", "in": "query", - "name": "term", + "name": "id", "required": true, "type": "string", - "x-example": "gucci" + "x-example": "1688071" } ], "produces": [ @@ -497590,7 +512968,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.autocompleteResponseDoc" + "$ref": "#/definitions/ticketmaster.attractionResponseDoc" } }, "400": { @@ -497599,8 +512977,14 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -497617,19 +513001,49 @@ "ApiKeyAuth": [] } ], - "summary": "Get The RealReal search-box suggestions", + "summary": "Get a Ticketmaster attraction", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/categories": { + "/ticketmaster/attraction-events": { "get": { "consumes": [ "application/json" ], - "description": "Returns The RealReal's full category (taxon) browse taxonomy: every department, category, and subcategory, nested, with each entry's id (usable directly against search's category_id), permalink (usable directly against the category endpoint's path), and live matching item count. This is reference data that changes rarely, so responses are cached.", - "operationId": "therealreal-categories", + "description": "Lists upcoming Ticketmaster events for the attraction with numeric `id`. `page` is zero-based, 0 to 49, default 0; `sort` is `relevance` or `date` (default). Each event has title, start time, time zone, venue, attractions, presales, seat map and status flags such as `sold_out` and `cancelled`. The response gives `total`.", + "operationId": "ticketmaster-attraction-events", + "parameters": [ + { + "description": "Numeric Ticketmaster attraction id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "1688071" + }, + { + "default": 0, + "description": "Zero-based page (0-49)", + "in": "query", + "maximum": 49, + "minimum": 0, + "name": "page", + "type": "integer" + }, + { + "default": "date", + "description": "Result order", + "enum": [ + "relevance", + "date" + ], + "in": "query", + "name": "sort", + "type": "string" + } + ], "produces": [ "application/json" ], @@ -497637,11 +513051,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.categoriesResponseDoc" + "$ref": "#/definitions/ticketmaster.eventsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -497658,45 +513078,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The RealReal category browse taxonomy", + "summary": "List an attraction's Ticketmaster events", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/category": { + "/ticketmaster/attraction-related": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of The RealReal listings browsed by category (taxon) permalink path, e.g. women/handbags. Pass a previous response's next_after back as after to fetch the next page.", - "operationId": "therealreal-category", + "description": "Returns the \"Fans Also Viewed\" attractions shown on one attraction's own page. An attraction with no recommendation data returns a valid empty list.", + "operationId": "ticketmaster-attraction-related", "parameters": [ { - "description": "Category permalink path, from the categories endpoint's permalink field", + "description": "Numeric Ticketmaster attraction id", "in": "query", - "name": "path", + "name": "id", "required": true, "type": "string", - "x-example": "women/handbags" - }, - { - "description": "Only return items currently marked down from their original price", - "in": "query", - "name": "on_sale", - "type": "boolean" - }, - { - "description": "Only return items currently available to purchase (excludes sold and waitlisted items)", - "in": "query", - "name": "available", - "type": "boolean" - }, - { - "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", - "in": "query", - "name": "after", - "type": "string" + "x-example": "1688071" } ], "produces": [ @@ -497706,7 +513108,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.searchResponseDoc" + "$ref": "#/definitions/ticketmaster.attractionRelatedResponseDoc" } }, "400": { @@ -497721,8 +513123,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -497739,33 +513141,45 @@ "ApiKeyAuth": [] } ], - "summary": "Browse The RealReal listings by category", + "summary": "List a Ticketmaster attraction's related attractions", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/collection": { + "/ticketmaster/attraction-reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of The RealReal listings browsed by curated collection slug, e.g. on-sale-now -- sale campaigns, editor's picks, and similar merchandising collections distinct from category/designer browsing. Pass a previous response's next_after back as after to fetch the next page.", - "operationId": "therealreal-collection", + "description": "Lists fan reviews for the Ticketmaster attraction with numeric `id`, with its `average_rating`, `best_rating`, `total` and Ticketmaster's own `ai_review_summary`. Each review has a rating, title, text, nickname, city, venue and date. `offset` runs 0 to 9995 (default 0); `limit` runs 10 to 50 (default 10).", + "operationId": "ticketmaster-attraction-reviews", "parameters": [ { - "description": "Collection slug, from the collections endpoint's slug field", + "description": "Numeric Ticketmaster attraction id", "in": "query", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "on-sale-now" + "x-example": "1688071" }, { - "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", + "default": 0, + "description": "Result offset (0-9995)", "in": "query", - "name": "after", - "type": "string" + "maximum": 9995, + "minimum": 0, + "name": "offset", + "type": "integer" + }, + { + "default": 10, + "description": "Reviews per page (10-50)", + "in": "query", + "maximum": 50, + "minimum": 10, + "name": "limit", + "type": "integer" } ], "produces": [ @@ -497775,7 +513189,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.searchResponseDoc" + "$ref": "#/definitions/ticketmaster.attractionReviewsResponseDoc" } }, "400": { @@ -497790,8 +513204,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -497808,19 +513222,49 @@ "ApiKeyAuth": [] } ], - "summary": "Browse The RealReal listings by curated collection", + "summary": "List a Ticketmaster attraction's fan reviews", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/collections": { + "/ticketmaster/discover-categories": { "get": { - "consumes": [ - "application/json" + "description": "Lists every current Concerts, Sports, Arts & Theater, and Family category with pagination. Section accepts `all`, `concerts`, `sports`, `arts-theater`, and `family`.", + "operationId": "ticketmaster-discover-categories", + "parameters": [ + { + "default": "all", + "description": "Discover section", + "enum": [ + "all", + "concerts", + "sports", + "arts-theater", + "family" + ], + "in": "query", + "name": "section", + "type": "string" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 50, + "description": "Categories per page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "per_page", + "type": "integer" + } ], - "description": "Returns The RealReal's full published set of curated editorial and sale-campaign collection slugs (e.g. on-sale-now, hermes-birkin-bag), each usable directly against the collection endpoint's own slug field. This is reference data that changes rarely, so responses are cached.", - "operationId": "therealreal-collections", "produces": [ "application/json" ], @@ -497828,11 +513272,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.collectionsResponseDoc" + "$ref": "#/definitions/ticketmaster.categoriesResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -497849,19 +513293,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get The RealReal curated collection slugs", + "summary": "List Ticketmaster discover categories", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/conditions": { + "/ticketmaster/discover-category-events": { "get": { - "consumes": [ - "application/json" + "description": "Lists events in a Ticketmaster discover category, identified by `category_id` from `ticketmaster-discover-categories`. `page` is zero-based, 0 to 49. Each event has title, start time, time zone, venue, attractions, presales, seat map and status flags such as `sold_out` and `cancelled`. The response gives `total` and `count`.", + "operationId": "ticketmaster-discover-category-events", + "parameters": [ + { + "description": "Ticketmaster discover category id", + "in": "query", + "name": "category_id", + "required": true, + "type": "string", + "x-example": "KnvZfZ7vAeA" + }, + { + "default": 0, + "description": "Zero-based page", + "in": "query", + "maximum": 49, + "minimum": 0, + "name": "page", + "type": "integer" + } ], - "description": "Returns The RealReal's full authentication condition-grading scale: the closed 6-tier set (Pristine, Excellent, Very Good, Good, Fair, As Is) it defines, each with an id (usable directly against search's condition_id) and live matching item count. This is reference data that changes rarely, so responses are cached.", - "operationId": "therealreal-conditions", "produces": [ "application/json" ], @@ -497869,11 +513329,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.conditionsResponseDoc" + "$ref": "#/definitions/ticketmaster.eventsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -497890,45 +513350,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get The RealReal condition-grading value space", + "summary": "List events in a Ticketmaster discover category", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/designer": { + "/ticketmaster/discover-cities": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a page of The RealReal listings browsed by designer slug, e.g. gucci. Pass a previous response's next_after back as after to fetch the next page.", - "operationId": "therealreal-designer", + "description": "Lists Ticketmaster's discover city destinations for a `country` (two-letter code, default `US`). Each city has a `slug`, name, canonical URL, locale and image. `page` starts at 1 and `per_page` runs 1 to 100. The response gives `total`. Pass a city `slug` to `ticketmaster-discover-city-events`.", + "operationId": "ticketmaster-discover-cities", "parameters": [ { - "description": "Designer slug, from the designers endpoint's slug field", - "in": "query", - "name": "slug", - "required": true, - "type": "string", - "x-example": "gucci" - }, - { - "description": "Only return items currently marked down from their original price", + "default": "US", + "description": "Two-letter country code", "in": "query", - "name": "on_sale", - "type": "boolean" + "name": "country", + "type": "string" }, { - "description": "Only return items currently available to purchase (excludes sold and waitlisted items)", + "default": 1, + "description": "One-based page", "in": "query", - "name": "available", - "type": "boolean" + "minimum": 1, + "name": "page", + "type": "integer" }, { - "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", + "default": 50, + "description": "Cities per page", "in": "query", - "name": "after", - "type": "string" + "maximum": 100, + "minimum": 1, + "name": "per_page", + "type": "integer" } ], "produces": [ @@ -497938,7 +513393,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.searchResponseDoc" + "$ref": "#/definitions/ticketmaster.citiesResponseDoc" } }, "400": { @@ -497947,18 +513402,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -497971,26 +513414,40 @@ "ApiKeyAuth": [] } ], - "summary": "Browse The RealReal listings by designer", + "summary": "List Ticketmaster discover cities", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/designers": { + "/ticketmaster/discover-city-events": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns every designer The RealReal recognizes in one department (not just designers with currently active listings), each with an id (usable directly against search's designer_id) and slug (usable directly against the designer endpoint). The directory is segmented by department -- pass category to select one; the response's categories field lists every accepted value. This is reference data that changes rarely, so responses are cached.", - "operationId": "therealreal-designers", + "description": "Lists events for a Ticketmaster discover city, identified by `city` (a slug from `ticketmaster-discover-cities`) and `country` (two-letter code matching the city, default `US`). It covers all municipalities grouped under that destination. `page` is zero-based, 0 to 49. Each event has title, start time, venue, attractions and status flags.", + "operationId": "ticketmaster-discover-city-events", "parameters": [ { - "description": "Designer-directory department. One of: women, men, fine-jewelry, watches, art, home, kids. Defaults to women", + "description": "Ticketmaster discover city slug", "in": "query", - "name": "category", + "name": "city", + "required": true, "type": "string", - "x-example": "women" + "x-example": "new-york-city" + }, + { + "default": "US", + "description": "Two-letter country code matching the selected city", + "in": "query", + "name": "country", + "type": "string" + }, + { + "default": 0, + "description": "Zero-based page", + "in": "query", + "maximum": 49, + "minimum": 0, + "name": "page", + "type": "integer" } ], "produces": [ @@ -498000,7 +513457,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.designersResponseDoc" + "$ref": "#/definitions/ticketmaster.eventsResponseDoc" } }, "400": { @@ -498009,8 +513466,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -498027,27 +513484,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The RealReal designer directory", + "summary": "List events in a Ticketmaster discover city", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/listing": { + "/ticketmaster/event": { "get": { "consumes": [ "application/json" ], - "description": "Returns a single The RealReal listing: description, condition detail, category context, and measurements, plus the shared summary fields (name, designer, condition, price, images). Looked up by the listing's full product URL, as returned in a search/category/designer response's url field.", - "operationId": "therealreal-listing", + "description": "Returns one Ticketmaster event by `id`: title, description, start time, time zone, currency, venue, attractions, classification, presales, on-sale time, seat map URL, and flags for sold out, cancelled, postponed, rescheduled and virtual. An unknown event returns 404; a concluded or removed event returns 410.", + "operationId": "ticketmaster-event", "parameters": [ { - "description": "Full product URL, as returned in a search/category/designer response's url field", + "description": "Ticketmaster event id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.therealreal.com/products/women/handbags/crossbody-bags/chanel-denim-pearl-crush-wallet-on-chain-wdqhu" + "x-example": "04006319DDEA2CD5" } ], "produces": [ @@ -498057,7 +513514,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.listingResponseDoc" + "$ref": "#/definitions/ticketmaster.eventResponseDoc" } }, "400": { @@ -498072,8 +513529,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -498090,79 +513547,46 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The RealReal listing detail", + "summary": "Get a Ticketmaster event", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/search": { + "/ticketmaster/search-events": { "get": { "consumes": [ "application/json" ], - "description": "Searches The RealReal's authenticated luxury resale catalog by keyword, optionally combined with category, designer, condition-grade, and price-range filters, returning listing summaries (name, designer, condition, price, images) plus the total matching count and an opaque pagination cursor. Pass a previous response's next_after back as after to fetch the next page.", - "operationId": "therealreal-search", + "description": "Searches Ticketmaster events by artist, event, team, or venue. A zero total with an empty events list is a valid no-results response. The sort enum accepts `relevance` and `date`.", + "operationId": "ticketmaster-search-events", "parameters": [ { - "description": "Free-text keyword search", + "description": "Artist, event, team, or venue query", "in": "query", - "name": "query", + "name": "q", "required": true, "type": "string", - "x-example": "gucci bag" - }, - { - "description": "Category (taxon) id, from the categories endpoint's id field", - "in": "query", - "name": "category_id", - "type": "string", - "x-example": "493" - }, - { - "description": "Designer id, from the designers endpoint's id field", - "in": "query", - "name": "designer_id", - "type": "string", - "x-example": "127" - }, - { - "description": "Condition grade id, from the conditions endpoint's id field", - "in": "query", - "name": "condition_id", - "type": "string", - "x-example": "20" - }, - { - "description": "Minimum price in USD", - "in": "query", - "name": "price_from", - "type": "number", - "x-example": 100 - }, - { - "description": "Maximum price in USD", - "in": "query", - "name": "price_to", - "type": "number", - "x-example": 1000 - }, - { - "description": "Only return items currently marked down from their original price", - "in": "query", - "name": "on_sale", - "type": "boolean" + "x-example": "ariana grande" }, { - "description": "Only return items currently available to purchase (excludes sold and waitlisted items)", + "default": 0, + "description": "Zero-based page (0-49)", "in": "query", - "name": "available", - "type": "boolean" + "maximum": 49, + "minimum": 0, + "name": "page", + "type": "integer" }, { - "description": "Opaque pagination cursor from a previous response's next_after. Omit for the first page", + "default": "relevance", + "description": "Result order", + "enum": [ + "relevance", + "date" + ], "in": "query", - "name": "after", + "name": "sort", "type": "string" } ], @@ -498173,7 +513597,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.searchResponseDoc" + "$ref": "#/definitions/ticketmaster.eventsResponseDoc" } }, "400": { @@ -498182,8 +513606,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -498200,27 +513624,24 @@ "ApiKeyAuth": [] } ], - "summary": "Search The RealReal luxury consignment listings", + "summary": "Search Ticketmaster events", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/therealreal/similar": { + "/ticketmaster/suggest": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns The RealReal's own \"Similar Items\" visual-similarity recommendations for one product, looked up by the product's numeric id (from any other The RealReal endpoint's listing response id field).", - "operationId": "therealreal-similar", + "description": "Returns autocomplete suggestions for a partial artist, event, team or venue name in `q`. Each suggestion has a title, `type`, category, URL, image and, when available, an `event_count`. The response also gives the echoed `query` and the `count` of suggestions.", + "operationId": "ticketmaster-suggest", "parameters": [ { - "description": "The RealReal numeric product id, from a search/category/designer/listing/collection response's id field", + "description": "Partial artist, event, team, or venue query", "in": "query", - "name": "product_id", + "name": "q", "required": true, "type": "string", - "x-example": "54388578" + "x-example": "arian" } ], "produces": [ @@ -498230,7 +513651,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/therealreal.similarResponseDoc" + "$ref": "#/definitions/ticketmaster.suggestionsResponseDoc" } }, "400": { @@ -498239,12 +513660,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -498257,26 +513672,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get The RealReal similar-item recommendations", + "summary": "Suggest Ticketmaster artists, events, and venues", "tags": [ - "The RealReal" + "Ticketmaster" ] } }, - "/thestarmy/article": { + "/ticketmaster/trending-attractions": { "get": { - "description": "Returns public The Star (Malaysia) story metadata and body paragraphs from a canonical story URL. Metered and premium stories return only the public teaser paragraphs the server shows anonymous readers, flagged with paywalled; a story with no readable teaser returns a permission error.", - "operationId": "thestarmy-article", - "parameters": [ - { - "description": "Canonical The Star (Malaysia) story URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.thestar.com.my/news/nation/2026/09/25/ros-freeze-could-rattle-pn-prep" - } + "consumes": [ + "application/json" ], + "description": "Returns a ranked list of currently-trending attractions across every segment (music, sports, arts and theater, family), not scoped to one category or city.", + "operationId": "ticketmaster-trending-attractions", "produces": [ "application/json" ], @@ -498284,23 +513692,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/ticketmaster.trendingAttractionsResponseDoc" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -498317,30 +513713,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Star (Malaysia) article content", + "summary": "List trending Ticketmaster attractions", "tags": [ - "The Star Malaysia" + "Ticketmaster" ] } }, - "/thestarmy/author": { + "/ticketmaster/venue": { "get": { - "description": "Returns one The Star (Malaysia) byline's public author page: display name, the public byline email, and their most recent stories.", - "operationId": "thestarmy-author", + "consumes": [ + "application/json" + ], + "description": "Returns one Ticketmaster venue by numeric `id`: name, address, city, state, country, postal code, coordinates, time zone, image, URL and visitor information as name and text entries. `seat_maps` and `city_categories` are omitted when none exist. An unknown venue returns 404.", + "operationId": "ticketmaster-venue", "parameters": [ { - "description": "Byline name, matched case-insensitively, e.g. Ivan Loh", - "in": "query", - "name": "name", - "type": "string", - "x-example": "Ivan Loh" - }, - { - "description": "Canonical thestar.com.my/authors?q= URL; alternative to name", + "description": "Numeric Ticketmaster venue id", "in": "query", - "name": "url", + "name": "id", + "required": true, "type": "string", - "x-example": "https://www.thestar.com.my/authors?q=IVAN+LOH" + "x-example": "32882" } ], "produces": [ @@ -498350,7 +513743,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.thestarmyAuthorResponseDoc" + "$ref": "#/definitions/ticketmaster.venueResponseDoc" } }, "400": { @@ -498365,6 +513758,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -498377,120 +513776,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Star (Malaysia) author page", + "summary": "Get a Ticketmaster venue", "tags": [ - "The Star Malaysia" + "Ticketmaster" ] } }, - "/thestarmy/headlines": { + "/ticketmaster/venue-enhanced-details": { "get": { - "description": "Returns the current stories of one The Star (Malaysia) section page, usually 10 and up to 100 on column-style sections. `section` is required, for example `news-nation`, `latest-business`, `sport-badminton` or `latest-food`. Items have a title and URL, and when the page shows them a `type`, summary, byline, image and publication time. Older stories are not paginated.", - "operationId": "thestarmy-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns header branding imagery and external links (the venue's own site, resident teams) for major venues. Smaller venues without enhanced content return 404.", + "operationId": "ticketmaster-venue-enhanced-details", "parameters": [ { - "description": "The Star (Malaysia) section slug", - "enum": [ - "news-latest", - "latest-nation", - "latest-business", - "latest-education", - "latest-aseanplus", - "latest-sport", - "latest-metro", - "latest-tech", - "latest-world", - "latest-lifestyle", - "latest-food", - "news-nation", - "news-world", - "news-environment", - "news-in-other-media", - "news-true-or-not", - "news-focus", - "aseanplus-aseanplus-news", - "business-insight", - "business-smebiz", - "business-premium", - "sport-athletics", - "sport-hockey", - "sport-football", - "sport-golf", - "sport-badminton", - "sport-tennis", - "sport-motorsport", - "sport-other-sport", - "sport-say-what", - "sport-archery", - "sport-basketball", - "sport-bowling", - "sport-boxing", - "sport-cricket", - "sport-cycling", - "sport-diving", - "sport-gymnastics", - "sport-others", - "sport-rugby", - "sport-shooting", - "sport-squash", - "sport-swimming", - "sport-wrestling", - "metro-metro-news", - "metro-community-sports", - "metro-views", - "lifestyle", - "lifestyle-entertainment-and-style", - "lifestyle-people-and-living", - "lifestyle-health-and-family", - "lifestyle-travel-and-culture", - "lifestyle-viewpoints", - "lifestyle-entertainment", - "lifestyle-living", - "lifestyle-style", - "lifestyle-people", - "lifestyle-health", - "lifestyle-family", - "lifestyle-travel", - "lifestyle-culture", - "lifestyle-design", - "lifestyle-science", - "lifestyle-wellness", - "lifestyle-fitness", - "lifestyle-mind", - "lifestyle-nutrition", - "lifestyle-animals", - "lifestyle-children", - "lifestyle-seniors", - "lifestyle-beauty", - "lifestyle-fashion", - "lifestyle-malaysia", - "lifestyle-global", - "lifestyle-asia-oceania", - "lifestyle-americas", - "lifestyle-europe", - "lifestyle-africa", - "lifestyle-arts", - "lifestyle-books", - "lifestyle-climate", - "lifestyle-movie-review", - "lifestyle-music-review", - "lifestyle-book-review", - "food", - "food-food-for-thought", - "food-food-news", - "food-eating-out", - "tech-tech-news", - "tech-tech-thoughts", - "education-news", - "opinion-columnists", - "opinion-letters", - "starpicks" - ], + "description": "Numeric Ticketmaster venue id", "in": "query", - "name": "section", + "name": "id", "required": true, "type": "string", - "x-example": "news-latest" + "x-example": "32882" } ], "produces": [ @@ -498500,7 +513806,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/ticketmaster.venueEnhancedDetailsResponseDoc" } }, "400": { @@ -498509,36 +513815,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get The Star (Malaysia) section headlines", - "tags": [ - "The Star Malaysia" - ] - } - }, - "/thestarmy/news": { - "get": { - "description": "Returns the current top stories on The Star (Malaysia) home page. It takes no parameters. Each item has a title and canonical URL, plus a short section label in `type`, a summary and a byline when the page shows them. `published_at` is omitted here; the section headlines endpoint carries it.", - "operationId": "thestarmy-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "429": { + "description": "Too Many Requests", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/app.Response" } }, "503": { @@ -498553,50 +513839,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Star (Malaysia) top stories", + "summary": "Get a Ticketmaster venue's enhanced branding details", "tags": [ - "The Star Malaysia" + "Ticketmaster" ] } }, - "/thestarmy/sections": { + "/ticketmaster/venue-events": { "get": { - "description": "Lists the 94 The Star (Malaysia) sections that returned at least one story to an anonymous reader when checked on 2026-09-25, and that the headlines endpoint accepts. Examples are `news-latest`, `latest-nation`, `business-smebiz` and `sport-football`. Each entry has a `slug`, a `name` and the section page `url`.", - "operationId": "thestarmy-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get The Star (Malaysia) sections", - "tags": [ - "The Star Malaysia" - ] - } - }, - "/theverge/article": { - "get": { - "description": "Returns one The Verge article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag. Subscriber-only or blocked pages return an error instead.", - "operationId": "theverge-article", + "description": "Lists upcoming Ticketmaster events at the venue with numeric `id`. `page` is zero-based, 0 to 49, default 0; `sort` is `relevance` or `date` (default). Each event has title, start time, time zone, attractions, presales, seat map and status flags such as `sold_out` and `cancelled`. The response gives `total`.", + "operationId": "ticketmaster-venue-events", "parameters": [ { - "description": "Canonical The Verge article URL", + "description": "Numeric Ticketmaster venue id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.theverge.com/news/998317/bungie-destiny-2-unvaulted-raids-campaigns-destinations" + "x-example": "32882" + }, + { + "default": 0, + "description": "Zero-based page (0-49)", + "in": "query", + "maximum": 49, + "minimum": 0, + "name": "page", + "type": "integer" + }, + { + "default": "date", + "description": "Result order", + "enum": [ + "relevance", + "date" + ], + "in": "query", + "name": "sort", + "type": "string" } ], "produces": [ @@ -498606,7 +513889,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/ticketmaster.eventsResponseDoc" } }, "400": { @@ -498615,8 +513898,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -498633,24 +513916,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Verge article content", + "summary": "List a venue's Ticketmaster events", "tags": [ - "The Verge" + "Ticketmaster" ] } }, - "/theverge/author": { + "/ticketweb/event": { "get": { - "description": "Returns a The Verge author's profile by `url`, a canonical `theverge.com/authors/` link: name, job title such as Senior Reporter, bio and recent articles. Each article has a title, URL, excerpt, ISO-8601 `published_at` and `category`, the post's primary Verge vertical such as Tech.", - "operationId": "theverge-author", + "consumes": [ + "application/json" + ], + "description": "Returns details for one TicketWeb event: venue, dates, age restriction, delivery methods, and per-tier ticket pricing (base price, fee breakdown, and total) when tickets are on sale. `has_tickets` is false and `sections` is empty for a free/RSVP event with no paid tickets, a sold-out event, or an access-code-gated event -- TicketWeb's own data does not reliably distinguish these three cases at this level, so the response reports the shared observable state (no purchasable sections) rather than guessing which applies.", + "operationId": "ticketweb-event", "parameters": [ { - "description": "Canonical The Verge author URL", + "description": "Numeric TicketWeb event id", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.theverge.com/authors/jay-peters" + "x-example": "14241184" } ], "produces": [ @@ -498660,7 +513946,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.thevergeAuthorResponseDoc" + "$ref": "#/definitions/ticketweb.eventResponseDoc" } }, "400": { @@ -498687,36 +513973,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get a The Verge author profile", + "summary": "Get a TicketWeb event", "tags": [ - "The Verge" + "TicketWeb" ] } }, - "/theverge/headlines": { + "/ticketweb/search": { "get": { - "description": "Returns the current headlines for one The Verge section. `section` is required and takes one of `tech`, `reviews`, `science`, `entertainment`, `ai`, `policy`, `gaming`, `mobile`, `apps` or `features`. Each item has its title, URL, summary, author and publication time.", - "operationId": "theverge-headlines", + "consumes": [ + "application/json" + ], + "description": "Searches TicketWeb events by artist, event, or venue. A zero count with an empty events list is a valid no-results response. availability is one of `in_stock`, `sold_out`, `unknown` per event.", + "operationId": "ticketweb-search", "parameters": [ { - "description": "The Verge section slug", - "enum": [ - "tech", - "reviews", - "science", - "entertainment", - "ai", - "policy", - "gaming", - "mobile", - "apps", - "features" - ], + "description": "Artist, event, or venue query", "in": "query", - "name": "section", + "name": "q", "required": true, "type": "string", - "x-example": "tech" + "x-example": "comedy" + }, + { + "default": 1, + "description": "One-based result page, 1-50", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "page", + "type": "integer" } ], "produces": [ @@ -498726,7 +514012,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/ticketweb.searchResponseDoc" } }, "400": { @@ -498747,16 +514033,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Verge section headlines", + "summary": "Search TicketWeb events", "tags": [ - "The Verge" + "TicketWeb" ] } }, - "/theverge/news": { + "/ticketweb/venue": { "get": { - "description": "Returns the current top stories from The Verge. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", - "operationId": "theverge-news", + "consumes": [ + "application/json" + ], + "description": "Returns one TicketWeb venue's detail (name, address) plus one page of its upcoming events. A zero count with an empty events list on page 1 is a valid \"no upcoming events\" response.", + "operationId": "ticketweb-venue", + "parameters": [ + { + "description": "Numeric TicketWeb venue id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "15005" + }, + { + "default": 1, + "description": "One-based page of upcoming events, 1-50", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "page", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -498764,7 +514072,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/ticketweb.venueResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -498779,16 +514099,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Verge top stories", + "summary": "Get a TicketWeb venue", "tags": [ - "The Verge" + "TicketWeb" ] } }, - "/theverge/sections": { + "/tiffany/categories": { "get": { - "description": "Lists the The Verge sections that the headlines endpoint accepts: `tech`, `reviews`, `science`, `entertainment`, `ai`, `policy`, `gaming`, `mobile`, `apps` and `features`. Each entry has a `slug`, a display `name` and a section `url`.", - "operationId": "theverge-sections", + "consumes": [ + "application/json" + ], + "description": "Lists every category id Tiffany & Co.'s own product catalog accepts, each with a human-readable label, a kind (category for a real navigable department/subcategory, curated_shop for a curated gift/merchandising shelf), and a live product count. Each id is exactly what tiffany-category's own category parameter accepts -- resolves the category-discovery gap that parameter would otherwise leave as \"find one from a storefront URL\".", + "operationId": "tiffany-categories", "produces": [ "application/json" ], @@ -498796,7 +514119,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/tiffany.categoriesResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -498805,24 +514140,100 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Verge sections", + "summary": "List Tiffany & Co. categories", "tags": [ - "The Verge" + "Tiffany & Co." ] } }, - "/thisismoney/article": { + "/tiffany/category": { "get": { - "description": "Returns one This Is Money article by `url`, a canonical HTTPS article link. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag. Pages that are subscriber-only or blocked return an error.", - "operationId": "thisismoney-article", + "consumes": [ + "application/json" + ], + "description": "Returns one page of a Tiffany & Co. category/browse listing. category is a category id from tiffany-categories's own id field (e.g. ecommerce_us_jewelry_necklaces_and_pendants). sort selects recommended (default), price_asc, price_desc, or newest. material, gemstone, color, product_type, gender, and designer are optional single-value filters -- see tiffany-filters for the live covered value space for each. A hub-level or emptied-out category id, or a filter combination with no matches, returns a well-formed empty result rather than an error.", + "operationId": "tiffany-category", "parameters": [ { - "description": "Canonical This Is Money article URL", + "description": "Category id -- see tiffany-categories", + "in": "query", + "name": "category", + "required": true, + "type": "string", + "x-example": "ecommerce_us_jewelry_necklaces_and_pendants" + }, + { + "default": "recommended", + "description": "Sort order", + "enum": [ + "recommended", + "price_asc", + "price_desc", + "newest" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 24, + "description": "Results per page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "per_page", + "type": "integer" + }, + { + "description": "Material filter -- see tiffany-filters", + "in": "query", + "name": "material", + "type": "string", + "x-example": "Platinum" + }, + { + "description": "Gemstone filter -- see tiffany-filters", + "in": "query", + "name": "gemstone", + "type": "string", + "x-example": "Diamond" + }, + { + "description": "Color filter -- see tiffany-filters", + "in": "query", + "name": "color", + "type": "string", + "x-example": "Yellow Gold" + }, + { + "description": "Product type filter -- see tiffany-filters", "in": "query", - "name": "url", - "required": true, + "name": "product_type", "type": "string", - "x-example": "https://www.thisismoney.co.uk/money/markets/article-123/example.html" + "x-example": "Ring" + }, + { + "description": "Gender filter -- see tiffany-filters", + "in": "query", + "name": "gender", + "type": "string", + "x-example": "WOMENS" + }, + { + "description": "Designer/collection filter -- see tiffany-filters", + "in": "query", + "name": "designer", + "type": "string", + "x-example": "Elsa Peretti®" } ], "produces": [ @@ -498832,7 +514243,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/tiffany.categoryResponseDoc" } }, "400": { @@ -498841,8 +514252,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -498859,24 +514270,45 @@ "ApiKeyAuth": [] } ], - "summary": "Get This Is Money article content", + "summary": "Browse a Tiffany & Co. category", "tags": [ - "This Is Money" + "Tiffany & Co." ] } }, - "/thisismoney/author": { + "/tiffany/content-search": { "get": { - "description": "Returns a This Is Money author's profile by `url`, a canonical `thisismoney.co.uk/profile-/.html` link: name, job title, bio, coverage topic tags such as Money or Bills, and recent articles with title, URL, excerpt and ISO-8601 `published_at`. `job_title` and `coverage` can be empty.", - "operationId": "thisismoney-author", + "consumes": [ + "application/json" + ], + "description": "Searches Tiffany & Co.'s own editorial pages -- style guides, gift guides, and other \"World of Tiffany\" articles -- by free-text keyword. Not product data: no price, stock, or item id fields. A genuine non-matching keyword returns a well-formed empty result (zero total_results).", + "operationId": "tiffany-content-search", "parameters": [ { - "description": "Canonical This Is Money author URL", + "description": "Search keyword", "in": "query", - "name": "url", + "name": "keyword", "required": true, "type": "string", - "x-example": "https://www.thisismoney.co.uk/profile-2242/toby-walne.html" + "x-example": "engagement ring guide" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 10, + "description": "Results per page", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "per_page", + "type": "integer" } ], "produces": [ @@ -498886,7 +514318,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.thisIsMoneyAuthorResponseDoc" + "$ref": "#/definitions/tiffany.contentSearchResponseDoc" } }, "400": { @@ -498895,8 +514327,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -498913,38 +514345,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a This Is Money author profile", + "summary": "Search Tiffany & Co. editorial content", "tags": [ - "This Is Money" + "Tiffany & Co." ] } }, - "/thisismoney/headlines": { + "/tiffany/filters": { "get": { - "description": "Returns the current headlines for one This Is Money section. `section` is required and takes one of `money`, `markets`, `investing`, `savings`, `pensions`, `mortgages`, `property`, `cars`, `travel` or `consumer`. Each item has its title and URL, plus summary, author, publication time and image when the outlet provides them.", - "operationId": "thisismoney-headlines", - "parameters": [ - { - "description": "This Is Money section slug", - "enum": [ - "money", - "markets", - "investing", - "savings", - "pensions", - "mortgages", - "property", - "cars", - "travel", - "consumer" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "money" - } + "consumes": [ + "application/json" ], + "description": "Lists every value tiffany-search's and tiffany-category's material, gemstone, color, product_type, gender, and designer filter parameters accept, each with a live product count -- resolves the discovery gap those parameters would otherwise leave as \"find one on the live site's own filter sidebar\".", + "operationId": "tiffany-filters", "produces": [ "application/json" ], @@ -498952,11 +514365,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/tiffany.filtersResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -498973,16 +514386,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get This Is Money section headlines", + "summary": "List Tiffany & Co. search/category filter values", "tags": [ - "This Is Money" + "Tiffany & Co." ] } }, - "/thisismoney/news": { + "/tiffany/product": { "get": { - "description": "Returns the current top stories from This Is Money. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", - "operationId": "thisismoney-news", + "consumes": [ + "application/json" + ], + "description": "Returns full product detail for one item: name, description, brand, collection, designer, material, gemstone, USD price, live stock status, category tree, every color/style variation, and images. product_id is Tiffany & Co.'s own item id, as returned by tiffany-search's or tiffany-category's own products[].id field.", + "operationId": "tiffany-product", + "parameters": [ + { + "description": "Item id, from a search or category result's id field", + "in": "query", + "name": "product_id", + "required": true, + "type": "string", + "x-example": "60957398" + } + ], "produces": [ "application/json" ], @@ -498990,7 +514416,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/tiffany.productResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -499005,58 +514449,100 @@ "ApiKeyAuth": [] } ], - "summary": "Get This Is Money top stories", + "summary": "Get a Tiffany & Co. product", "tags": [ - "This Is Money" + "Tiffany & Co." ] } }, - "/thisismoney/sections": { + "/tiffany/search": { "get": { - "description": "Lists the This Is Money sections that the headlines endpoint accepts, such as `money`, `markets`, `savings`, `pensions`, `mortgages`, `property` and `cars`. Each entry has a `slug`, a display `name` and a section `url`.", - "operationId": "thisismoney-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get This Is Money sections", - "tags": [ - "This Is Money" - ] - } - }, - "/threads/post/{username}/{code}": { - "get": { - "description": "Returns one public Threads post by `username` (with or without a leading `@`) and the post `code` from its URL. The response has the post text, canonical URL, preview image URL, and the author's id, name and username. Replies and logged-in fields are not included. An unavailable post returns 404.", - "operationId": "threads-post", + "description": "Searches Tiffany & Co.'s product catalog by free-text keyword. Returns product summaries with USD pricing, live stock status, material, gemstone, collection, and designer. sort selects recommended (default), price_asc, price_desc, or newest. material, gemstone, color, product_type, gender, and designer are optional single-value filters -- see tiffany-filters for the live covered value space for each. A genuine non-matching keyword, or a filter combination with no matches, returns a well-formed empty result (zero total_products).", + "operationId": "tiffany-search", "parameters": [ { - "description": "Threads username", - "in": "path", - "name": "username", + "description": "Search keyword", + "in": "query", + "name": "keyword", "required": true, "type": "string", - "x-example": "zuck" + "x-example": "necklace" }, { - "description": "Threads post code", - "in": "path", - "name": "code", - "required": true, + "default": "recommended", + "description": "Sort order", + "enum": [ + "recommended", + "price_asc", + "price_desc", + "newest" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": 1, + "description": "One-based page", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "page", + "type": "integer" + }, + { + "default": 24, + "description": "Results per page", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "per_page", + "type": "integer" + }, + { + "description": "Material filter -- see tiffany-filters", + "in": "query", + "name": "material", "type": "string", - "x-example": "DakyAavlKLZ" + "x-example": "Platinum" + }, + { + "description": "Gemstone filter -- see tiffany-filters", + "in": "query", + "name": "gemstone", + "type": "string", + "x-example": "Diamond" + }, + { + "description": "Color filter -- see tiffany-filters", + "in": "query", + "name": "color", + "type": "string", + "x-example": "Yellow Gold" + }, + { + "description": "Product type filter -- see tiffany-filters", + "in": "query", + "name": "product_type", + "type": "string", + "x-example": "Ring" + }, + { + "description": "Gender filter -- see tiffany-filters", + "in": "query", + "name": "gender", + "type": "string", + "x-example": "WOMENS" + }, + { + "description": "Designer/collection filter -- see tiffany-filters", + "in": "query", + "name": "designer", + "type": "string", + "x-example": "Elsa Peretti®" } ], "produces": [ @@ -499064,25 +514550,25 @@ ], "responses": { "200": { - "description": "Wrapped post payload", + "description": "OK", "schema": { - "$ref": "#/definitions/threads.postResponseDoc" + "$ref": "#/definitions/tiffany.searchResponseDoc" } }, "400": { - "description": "Invalid username or post code", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Post not found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error or parser drift", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -499093,32 +514579,53 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve a public Threads post", + "summary": "Search Tiffany & Co. products", "tags": [ - "Threads" + "Tiffany & Co." ] } }, - "/threads/post/{username}/{code}/replies": { + "/tiffany/stores": { "get": { - "description": "Returns the public replies currently exposed to logged-out visitors. The response identifies when Threads reports additional replies but withholds a usable continuation cursor.", - "operationId": "threads-post-replies", + "consumes": [ + "application/json" + ], + "description": "Finds Tiffany & Co. physical stores, boutiques, and cafes near a coordinate, ordered by distance. Each result includes address, phone, opening hours, in-store services and specialities, and live open/closed status.", + "operationId": "tiffany-stores", "parameters": [ { - "description": "Threads username", - "in": "path", - "name": "username", + "description": "Latitude, -90 to 90", + "in": "query", + "name": "latitude", "required": true, - "type": "string", - "x-example": "zuck" + "type": "number", + "x-example": 40.7128 }, { - "description": "Threads post code", - "in": "path", - "name": "code", + "description": "Longitude, -180 to 180", + "in": "query", + "name": "longitude", "required": true, - "type": "string", - "x-example": "DakyAavlKLZ" + "type": "number", + "x-example": -74.006 + }, + { + "default": 50, + "description": "Search radius in miles", + "in": "query", + "maximum": 500, + "minimum": 1, + "name": "radius", + "type": "number" + }, + { + "default": 10, + "description": "Maximum stores to return", + "in": "query", + "maximum": 50, + "minimum": 1, + "name": "limit", + "type": "integer" } ], "produces": [ @@ -499126,25 +514633,25 @@ ], "responses": { "200": { - "description": "Wrapped replies payload", + "description": "OK", "schema": { - "$ref": "#/definitions/threads.repliesResponseDoc" + "$ref": "#/definitions/tiffany.storesResponseDoc" } }, "400": { - "description": "Invalid username or post code", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Post not found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error or parser drift", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -499155,24 +514662,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve public replies to a Threads post", + "summary": "Find Tiffany & Co. store locations", "tags": [ - "Threads" + "Tiffany & Co." ] } }, - "/threads/profile/{username}": { + "/tiffany/suggest": { "get": { - "description": "Returns a public Threads profile by `username` (with or without a leading `@`): name, profile URL, biography, avatar URL, `followers_count` and `threads_count`. Counts are derived from the compact figures shown on the profile page. An unavailable profile returns 404.", - "operationId": "threads-profile", + "consumes": [ + "application/json" + ], + "description": "Returns Tiffany & Co.'s own search-box suggestions (typeahead) for a partial query -- a flat list of suggested search phrases, each with its own live total result count on the product catalog. Not product data.", + "operationId": "tiffany-suggest", "parameters": [ { - "description": "Threads username", - "in": "path", - "name": "username", + "description": "Partial search query", + "in": "query", + "name": "query", "required": true, "type": "string", - "x-example": "zuck" + "x-example": "ring" } ], "produces": [ @@ -499180,25 +514690,25 @@ ], "responses": { "200": { - "description": "Wrapped profile payload", + "description": "OK", "schema": { - "$ref": "#/definitions/threads.profileResponseDoc" + "$ref": "#/definitions/tiffany.suggestResponseDoc" } }, "400": { - "description": "Invalid username", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Profile not found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error or parser drift", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -499209,50 +514719,43 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve a public Threads profile", + "summary": "Get Tiffany & Co. search-box suggestions", "tags": [ - "Threads" + "Tiffany & Co." ] } }, - "/threads/profile/{username}/media": { + "/tiktok/category": { "get": { - "description": "Returns the first public page shown on a profile's Media tab. Items include image and video URLs, including carousel attachments, plus post and topic metadata. The logged-out page exposes no continuation cursor or media-type filter; `pagination_limited` reports when additional results are gated by login or lack a supported cursor.", - "operationId": "threads-profile-media", - "parameters": [ - { - "description": "Threads username", - "in": "path", - "name": "username", - "required": true, - "type": "string", - "x-example": "zuck" - } + "consumes": [ + "application/json" ], + "description": "Returns the content categories shown on TikTok's Explore page. Each entry has the category name and its numeric type code. Takes no parameters.", + "operationId": "tiktok-category", "produces": [ "application/json" ], "responses": { "200": { - "description": "Wrapped profile media payload", - "schema": { - "$ref": "#/definitions/threads.profileMediaResponseDoc" - } - }, - "400": { - "description": "Invalid username", + "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/tiktok.categoryResponseDoc" } }, - "404": { - "description": "Profile not found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Upstream error or parser drift", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499263,30 +514766,34 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve public media posts from a Threads profile", + "summary": "List TikTok explore categories", "tags": [ - "Threads" + "TikTok" ] } }, - "/threads/profile/{username}/posts": { + "/tiktok/comments": { "get": { - "description": "Lists public posts from the profile's Threads tab by `username`. Each item has its code, URL, text, creation time, image and video URLs, like, reply, repost and quote counts, reply flag and author. When `has_more` is true, pass `next_cursor` unchanged as `cursor` to fetch the next page; `pagination_limited` is true if Threads withholds a usable cursor.", - "operationId": "threads-profile-posts", + "consumes": [ + "application/json" + ], + "description": "Returns the top-level comments on a TikTok video, by the video id from its URL (`aweme_id`). Results are paged by cursor: pass the `cursor` from one response to get the next page, and read `has_more` to see whether more remain. The response also carries the total comment count.", + "operationId": "tiktok-video-comments", "parameters": [ { - "description": "Threads username", - "in": "path", - "name": "username", + "description": "TikTok video id from the video URL", + "in": "query", + "name": "aweme_id", "required": true, "type": "string", - "x-example": "zuck" + "x-example": "7304809083817774382" }, { - "description": "Opaque cursor returned by the previous response", + "default": 0, + "description": "Pagination cursor", "in": "query", "name": "cursor", - "type": "string" + "type": "integer" } ], "produces": [ @@ -499294,25 +514801,31 @@ ], "responses": { "200": { - "description": "Wrapped profile posts payload", + "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/threads.profilePostsResponseDoc" + "$ref": "#/definitions/tiktok.commentsResponseDoc" } }, "400": { - "description": "Invalid username or cursor", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Profile not found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Upstream error or parser drift", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499323,50 +514836,43 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve public posts from a Threads profile", + "summary": "Retrieve TikTok video comments", "tags": [ - "Threads" + "TikTok" ] } }, - "/threads/profile/{username}/replies": { + "/tiktok/creative-center/filters": { "get": { - "description": "Returns the first public page shown on a profile's Replies tab. Each item preserves its actual author and public reply metadata. The logged-out page has no continuation cursor; `pagination_limited` is true when Threads reports more items without a cursor or shows a login wall for additional items.", - "operationId": "threads-profile-replies", - "parameters": [ - { - "description": "Threads username", - "in": "path", - "name": "username", - "required": true, - "type": "string", - "x-example": "zuck" - } + "consumes": [ + "application/json" ], + "description": "Returns the complete filter taxonomy for the Creative Center trend endpoints: the countries each trend tab reports, the industry ids and video content tags the filters accept, the supported lookback periods, and the video sort metrics. Use it to discover valid values for the hashtags endpoint's country_code, period, and industry_id parameters and the videos endpoint's country_code, period, sort_by, and content_label_ids parameters. This endpoint performs no upstream request and has no parameters.", + "operationId": "tiktok-creative-center-filters", "produces": [ "application/json" ], "responses": { "200": { - "description": "Wrapped profile replies payload", - "schema": { - "$ref": "#/definitions/threads.profileRepliesResponseDoc" - } - }, - "400": { - "description": "Invalid username", + "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/creativecenter.filtersResponseDoc" } }, - "404": { - "description": "Profile not found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Upstream error or parser drift", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499377,24 +514883,67 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve public items from a Threads profile's Replies tab", + "summary": "Retrieve TikTok Creative Center filter taxonomy", "tags": [ - "Threads" + "TikTok", + "TikTok Creative Center" ] } }, - "/threads/profile/{username}/reposts": { + "/tiktok/creative-center/hashtags": { "get": { - "description": "Returns the first public page shown on a profile's Reposts tab. Each item preserves the original post author and metadata. `pagination_limited` is true when Threads gates more items behind login or reports more items without a supported cursor.", - "operationId": "threads-profile-reposts", + "consumes": [ + "application/json" + ], + "description": "Returns TikTok Creative Center's ranked trending hashtags for a country, period, and optional industry. TikTok gates this endpoint's full result set behind a logged-in TikTok One account: an anonymous request always receives at most 3 hashtags per filter combination regardless of country, period, or industry, so selecting an industry returns that industry's own ranked top three. See the filters endpoint for the complete country, period, and industry value lists.", + "operationId": "tiktok-creative-center-hashtags", "parameters": [ { - "description": "Threads username", - "in": "path", - "name": "username", + "description": "ISO-2 country code", + "in": "query", + "name": "country_code", "required": true, "type": "string", - "x-example": "zuck" + "x-example": "US" + }, + { + "default": 7, + "description": "Lookback window in days", + "enum": [ + 7, + 30, + 90 + ], + "in": "query", + "name": "period", + "type": "integer" + }, + { + "description": "Creative Center industry id to restrict the ranking to", + "enum": [ + "10000000000", + "11000000000", + "12000000000", + "13000000000", + "14000000000", + "15000000000", + "17000000000", + "18000000000", + "19000000000", + "21000000000", + "22000000000", + "23000000000", + "24000000000", + "25000000000", + "26000000000", + "27000000000", + "28000000000", + "29000000000" + ], + "in": "query", + "name": "industry_id", + "type": "string", + "x-example": "22000000000" } ], "produces": [ @@ -499402,25 +514951,37 @@ ], "responses": { "200": { - "description": "Wrapped profile reposts payload", + "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/threads.profileRepostsResponseDoc" + "$ref": "#/definitions/creativecenter.trendingHashtagsResponseDoc" } }, "400": { - "description": "Invalid username", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Profile not found", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error or parser drift", + "description": "Upstream failure", "schema": { "$ref": "#/definitions/app.Response" } @@ -499431,24 +514992,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve public posts reposted by a Threads profile", + "summary": "Retrieve TikTok Creative Center trending hashtags", "tags": [ - "Threads" + "TikTok", + "TikTok Creative Center" ] } }, - "/threads/profile/{username}/topics": { + "/tiktok/creative-center/top-content": { "get": { - "description": "Returns every topic tag listed on a public profile, including the numeric tag id and canonical `name` to pass as `q` to `/threads/search/topics`. Community topics include their community metadata.", - "operationId": "threads-profile-topics", + "consumes": [ + "application/json" + ], + "description": "Returns TikTok Creative Center's current Top Content set: four top-performing branded videos, each with the video object (anonymous MP4 and cover URLs), engagement metrics, the author profile and follower count, and (by default) the video's top comments plus keyword mention counts derived from them. The set is a daily snapshot and there is no pagination or historical query; the four titles rotate when the snapshot changes. Set include_comments=false for a smaller response with only video, author, and metrics.", + "operationId": "tiktok-creative-center-top-content", "parameters": [ { - "description": "Threads username", - "in": "path", - "name": "username", - "required": true, - "type": "string", - "x-example": "zuck" + "default": true, + "description": "Include each object's top comments and comment-keyword counts", + "in": "query", + "name": "include_comments", + "type": "boolean" } ], "produces": [ @@ -499456,25 +515020,37 @@ ], "responses": { "200": { - "description": "Wrapped profile topics payload", + "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/threads.profileTopicsResponseDoc" + "$ref": "#/definitions/creativecenter.topContentResponseDoc" } }, "400": { - "description": "Invalid username", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Profile not found", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error or parser drift", + "description": "Upstream failure", "schema": { "$ref": "#/definitions/app.Response" } @@ -499485,34 +515061,83 @@ "ApiKeyAuth": [] } ], - "summary": "Discover public topic tags on a Threads profile", + "summary": "Retrieve TikTok Creative Center top content", "tags": [ - "Threads" + "TikTok", + "TikTok Creative Center" ] } }, - "/threads/search": { + "/tiktok/creative-center/videos": { "get": { - "description": "Returns the public first page of Threads search results for a query. `sort` supports `top` and `recent`; `pagination_limited` marks the logged-out login wall because search has no continuation cursor. Author and date filters in Threads require login and are not exposed here.", - "operationId": "threads-search", + "consumes": [ + "application/json" + ], + "description": "Returns TikTok Creative Center's ranked trending videos for a country, period, sort order, and optional content tags. TikTok reports the true result-set size (see total_count/page_count in the response) but gates access to it behind a logged-in TikTok One account: an anonymous request always receives page 1 (4 videos) regardless of sort order or period. Country coverage is uneven: only US, JP, ID, VN, and TH have a regional edge host that returns populated results; other countries return an empty videos array (a genuine no-data response, not an error). See the filters endpoint for the complete country, period, sort, and content tag value lists.", + "operationId": "tiktok-creative-center-videos", "parameters": [ { - "description": "Search query (1-100 characters)", + "description": "ISO-2 country code", "in": "query", - "name": "q", + "name": "country_code", "required": true, "type": "string", - "x-example": "openai" + "x-example": "US" }, { - "description": "Result order; defaults to top", + "default": 7, + "description": "Lookback window in days", "enum": [ - "top", - "recent" + 7, + 30 ], "in": "query", - "name": "sort", + "name": "period", + "type": "integer" + }, + { + "default": "views", + "description": "Sort order", + "enum": [ + "views", + "engagement", + "six_second_views" + ], + "in": "query", + "name": "sort_by", "type": "string" + }, + { + "description": "Deprecated: single content tag id; use content_label_ids instead", + "in": "query", + "name": "content_label_id", + "type": "string", + "x-example": "11015" + }, + { + "collectionFormat": "multi", + "description": "Content tag ids to filter by, repeatable; matches videos carrying any selected tag", + "in": "query", + "items": { + "enum": [ + "11002", + "11003", + "11010", + "11013", + "11015" + ], + "type": "string" + }, + "name": "content_label_ids", + "type": "array", + "x-example": "11003,11015" + }, + { + "default": false, + "description": "Restrict to organic (non-paid) videos only", + "in": "query", + "name": "organic_only", + "type": "boolean" } ], "produces": [ @@ -499520,75 +515145,37 @@ ], "responses": { "200": { - "description": "Wrapped search payload", + "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/threads.searchResponseDoc" + "$ref": "#/definitions/creativecenter.trendingVideosResponseDoc" } }, "400": { - "description": "Invalid query or sort", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Upstream error or parser drift", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Search public Threads posts", - "tags": [ - "Threads" - ] - } - }, - "/threads/search/topics": { - "get": { - "description": "Returns the public first page of posts for a topic tag. Discover the required `tag_id` and its canonical query `name` from `/threads/profile/{username}/topics` or a post's `topic` metadata. Topic results have no logged-out continuation cursor; `pagination_limited` marks the login wall for more results.", - "operationId": "threads-topic-search", - "parameters": [ - { - "description": "Canonical topic query from a profile topic's `name` or a post topic's `search_query`", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "aithreads" - }, - { - "description": "Numeric Threads topic tag id", - "in": "query", - "name": "tag_id", - "required": true, - "type": "string", - "x-example": "18399895213044171" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "Wrapped topic search payload", - "schema": { - "$ref": "#/definitions/threads.topicSearchResponseDoc" - } }, - "400": { - "description": "Invalid query or topic id", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Upstream error or parser drift", + "description": "Upstream failure", "schema": { "$ref": "#/definitions/app.Response" } @@ -499599,27 +515186,28 @@ "ApiKeyAuth": [] } ], - "summary": "Search posts for a public Threads topic tag", + "summary": "Retrieve TikTok Creative Center trending videos", "tags": [ - "Threads" + "TikTok", + "TikTok Creative Center" ] } }, - "/ticketmaster/attraction": { + "/tiktok/explore/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Ticketmaster attraction (artist, team or other event entity) by numeric `id`: name, synopsis, image, URL, classification (segment, genre, sub-genre) and `has_artist_video`. Past performance `setlists` and `setlist_source_url` appear only when available. An unknown attraction returns 404.", - "operationId": "ticketmaster-attraction", + "description": "Returns the TikTok explore feed for a category, given its category type `id` from the category endpoint. The response has `itemList` with the videos, `hasMore` and a `cursor`. A feed that comes back empty is reported as an upstream error, not as an empty list.", + "operationId": "tiktok-explore", "parameters": [ { - "description": "Numeric Ticketmaster attraction id", - "in": "query", + "description": "Category type id returned by the category endpoint", + "in": "path", "name": "id", "required": true, - "type": "string", - "x-example": "1688071" + "type": "integer", + "x-example": 120 } ], "produces": [ @@ -499628,30 +515216,30 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/ticketmaster.attractionResponseDoc" + "$ref": "#/definitions/tiktok.exploreResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499662,47 +515250,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Ticketmaster attraction", + "summary": "Retrieve the TikTok explore feed for a category", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/attraction-events": { + "/tiktok/hashtag/{name}": { "get": { "consumes": [ "application/json" ], - "description": "Lists upcoming Ticketmaster events for the attraction with numeric `id`. `page` is zero-based, 0 to 49, default 0; `sort` is `relevance` or `date` (default). Each event has title, start time, time zone, venue, attractions, presales, seat map and status flags such as `sold_out` and `cancelled`. The response gives `total`.", - "operationId": "ticketmaster-attraction-events", + "description": "Returns the details of a TikTok hashtag page by `name`, for example `christmas`. The response carries `challengeInfo` with the hashtag's metadata, such as cover images, and `shareMeta` with the share title and description. The hashtag id found here feeds `tiktok-challenge-list`.", + "operationId": "tiktok-challenge", "parameters": [ { - "description": "Numeric Ticketmaster attraction id", - "in": "query", - "name": "id", + "description": "Hashtag name (e.g., 'christmas')", + "in": "path", + "name": "name", "required": true, "type": "string", - "x-example": "1688071" - }, - { - "default": 0, - "description": "Zero-based page (0-49)", - "in": "query", - "maximum": 49, - "minimum": 0, - "name": "page", - "type": "integer" - }, - { - "default": "date", - "description": "Result order", - "enum": [ - "relevance", - "date" - ], - "in": "query", - "name": "sort", - "type": "string" + "x-example": "christmas" } ], "produces": [ @@ -499711,24 +515279,36 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/ticketmaster.eventsResponseDoc" + "$ref": "#/definitions/tiktok.challengeResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Hashtag does not exist", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499739,27 +515319,34 @@ "ApiKeyAuth": [] } ], - "summary": "List an attraction's Ticketmaster events", + "summary": "Retrieve TikTok hashtag details", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/attraction-related": { + "/tiktok/hashtags": { "get": { "consumes": [ "application/json" ], - "description": "Returns the \"Fans Also Viewed\" attractions shown on one attraction's own page. An attraction with no recommendation data returns a valid empty list.", - "operationId": "ticketmaster-attraction-related", + "description": "Lists the videos posted under a TikTok hashtag, identified by the hashtag `id` from the hashtag detail endpoint. `cursor` defaults to 0. The response has `itemList`, `hasMore` and a `cursor`; pass that cursor back to fetch the next page.", + "operationId": "tiktok-challenge-list", "parameters": [ { - "description": "Numeric Ticketmaster attraction id", + "description": "Hashtag id returned by the hashtag detail endpoint", "in": "query", "name": "id", "required": true, "type": "string", - "x-example": "1688071" + "x-example": "3242" + }, + { + "default": 0, + "description": "Pagination cursor", + "in": "query", + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -499768,30 +515355,30 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/ticketmaster.attractionRelatedResponseDoc" + "$ref": "#/definitions/tiktok.challengeListResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499802,47 +515389,19 @@ "ApiKeyAuth": [] } ], - "summary": "List a Ticketmaster attraction's related attractions", + "summary": "Retrieve TikTok hashtag posts", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/attraction-reviews": { + "/tiktok/mobile/anchor/list": { "get": { "consumes": [ "application/json" ], - "description": "Lists fan reviews for the Ticketmaster attraction with numeric `id`, with its `average_rating`, `best_rating`, `total` and Ticketmaster's own `ai_review_summary`. Each review has a rating, title, text, nickname, city, venue and date. `offset` runs 0 to 9995 (default 0); `limit` runs 10 to 50 (default 10).", - "operationId": "ticketmaster-attraction-reviews", - "parameters": [ - { - "description": "Numeric Ticketmaster attraction id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "1688071" - }, - { - "default": 0, - "description": "Result offset (0-9995)", - "in": "query", - "maximum": 9995, - "minimum": 0, - "name": "offset", - "type": "integer" - }, - { - "default": 10, - "description": "Reviews per page (10-50)", - "in": "query", - "maximum": 50, - "minimum": 10, - "name": "limit", - "type": "integer" - } - ], + "description": "Returns the anchor catalogue TikTok exposes for attaching a tag, product or place to a video. Entry shapes vary by anchor type, so each entry is returned as raw JSON rather than coerced into one schema.", + "operationId": "tiktok-mobile-anchor-list", "produces": [ "application/json" ], @@ -499850,29 +515409,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.attractionReviewsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/tiktokmobile.anchorListResponseDoc" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499883,47 +515430,27 @@ "ApiKeyAuth": [] } ], - "summary": "List a Ticketmaster attraction's fan reviews", + "summary": "Anchor catalogue used by the video composer", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/discover-categories": { + "/tiktok/mobile/collection/detail": { "get": { - "description": "Lists every current Concerts, Sports, Arts & Theater, and Family category with pagination. Section accepts `all`, `concerts`, `sports`, `arts-theater`, and `family`.", - "operationId": "ticketmaster-discover-categories", - "parameters": [ - { - "default": "all", - "description": "Discover section", - "enum": [ - "all", - "concerts", - "sports", - "arts-theater", - "family" - ], - "in": "query", - "name": "section", - "type": "string" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" - }, + "consumes": [ + "application/json" + ], + "description": "Returns one collection's record unmodified in `item_archive`: name, cover images, creator (`uid`, `creator_name`), status and `statistic.total`. `collection_id` is the `item_archive_id` from the collection list endpoint; web playlist (`mix`) ids are a different namespace and are rejected upstream with a permission error. Requires the device-backed signing service and returns a generic service-unavailable error without it.", + "operationId": "tiktok-mobile-collection-detail", + "parameters": [ { - "default": 50, - "description": "Categories per page", + "description": "Collection id (`item_archive_id` from the collection list)", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "per_page", - "type": "integer" + "name": "collection_id", + "required": true, + "type": "string", + "x-example": "7394627756635573022" } ], "produces": [ @@ -499933,17 +515460,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.categoriesResponseDoc" + "$ref": "#/definitions/tiktokmobile.collectionDetailResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input or unknown collection", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -499954,32 +515487,40 @@ "ApiKeyAuth": [] } ], - "summary": "List Ticketmaster discover categories", + "summary": "Get TikTok collection detail on the mobile API", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/discover-category-events": { + "/tiktok/mobile/collection/list": { "get": { - "description": "Lists events in a Ticketmaster discover category, identified by `category_id` from `ticketmaster-discover-categories`. `page` is zero-based, 0 to 49. Each event has title, start time, time zone, venue, attractions, presales, seat map and status flags such as `sold_out` and `cancelled`. The response gives `total` and `count`.", - "operationId": "ticketmaster-discover-category-events", + "consumes": [ + "application/json" + ], + "description": "Lists a creator's public collections (the profile's Collections tab) unmodified in `item_archive_detail_list`: each row carries the collection `id`, `name`, cover images and `statistic.total` video count. Use the returned `id` with the collection detail and collection videos endpoints. Requires the numeric `user_id` (a sec_user_id alone is rejected upstream). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", + "operationId": "tiktok-mobile-collection-list", "parameters": [ { - "description": "Ticketmaster discover category id", + "description": "Creator's numeric user id", "in": "query", - "name": "category_id", + "name": "user_id", "required": true, "type": "string", - "x-example": "KnvZfZ7vAeA" + "x-example": "107955" }, { "default": 0, - "description": "Zero-based page", + "description": "Pagination cursor (server token)", "in": "query", - "maximum": 49, - "minimum": 0, - "name": "page", + "name": "cursor", + "type": "integer" + }, + { + "default": 10, + "description": "Collections per page (max 30)", + "in": "query", + "name": "count", "type": "integer" } ], @@ -499990,17 +515531,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.eventsResponseDoc" + "$ref": "#/definitions/tiktokmobile.collectionListResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500011,39 +515558,40 @@ "ApiKeyAuth": [] } ], - "summary": "List events in a Ticketmaster discover category", + "summary": "List TikTok collections on the mobile API", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/discover-cities": { + "/tiktok/mobile/collection/videos": { "get": { - "description": "Lists Ticketmaster's discover city destinations for a `country` (two-letter code, default `US`). Each city has a `slug`, name, canonical URL, locale and image. `page` starts at 1 and `per_page` runs 1 to 100. The response gives `total`. Pass a city `slug` to `ticketmaster-discover-city-events`.", - "operationId": "ticketmaster-discover-cities", + "consumes": [ + "application/json" + ], + "description": "Pages one collection's videos in the creator's order, returning `items` (full video objects) unmodified with `min_cursor`, `max_cursor` and `has_more`. Pass `max_cursor` back as `cursor` while `has_more` is true. The server caps a page at about 30 rows, so `count` is a request hint. Requires the device-backed signing service and returns a generic service-unavailable error without it.", + "operationId": "tiktok-mobile-collection-videos", "parameters": [ { - "default": "US", - "description": "Two-letter country code", + "description": "Collection id (`item_archive_id` from the collection list)", "in": "query", - "name": "country", - "type": "string" + "name": "collection_id", + "required": true, + "type": "string", + "x-example": "7394627756635573022" }, { - "default": 1, - "description": "One-based page", + "default": 0, + "description": "Paging cursor; use the previous page's max_cursor", "in": "query", - "minimum": 1, - "name": "page", + "name": "cursor", "type": "integer" }, { - "default": 50, - "description": "Cities per page", + "default": 10, + "description": "Videos per page (max 30; the server serves about 30)", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "per_page", + "name": "count", "type": "integer" } ], @@ -500054,17 +515602,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.citiesResponseDoc" + "$ref": "#/definitions/tiktokmobile.collectionVideosResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input or unknown collection", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500075,39 +515629,48 @@ "ApiKeyAuth": [] } ], - "summary": "List Ticketmaster discover cities", + "summary": "Get videos in a TikTok collection on the mobile API", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/discover-city-events": { + "/tiktok/mobile/comment/replies": { "get": { - "description": "Lists events for a Ticketmaster discover city, identified by `city` (a slug from `ticketmaster-discover-cities`) and `country` (two-letter code matching the city, default `US`). It covers all municipalities grouped under that destination. `page` is zero-based, 0 to 49. Each event has title, start time, venue, attractions and status flags.", - "operationId": "ticketmaster-discover-city-events", + "consumes": [ + "application/json" + ], + "description": "Returns the replies to one comment as the mobile app returns them, with `cursor`, `has_more` and `total`. The measured call sends both the video id and the comment id; this route answers even in windows where the top-level comment list is degraded.", + "operationId": "tiktok-mobile-comment-replies", "parameters": [ { - "description": "Ticketmaster discover city slug", + "description": "Video id the comment belongs to", "in": "query", - "name": "city", + "name": "aweme_id", "required": true, "type": "string", - "x-example": "new-york-city" + "x-example": "7680168962218511636" }, { - "default": "US", - "description": "Two-letter country code matching the selected city", + "description": "Comment id to list replies for", "in": "query", - "name": "country", - "type": "string" + "name": "comment_id", + "required": true, + "type": "string", + "x-example": "7680523330713240340" }, { "default": 0, - "description": "Zero-based page", + "description": "Pagination cursor", "in": "query", - "maximum": 49, - "minimum": 0, - "name": "page", + "name": "cursor", + "type": "integer" + }, + { + "default": 20, + "description": "Replies per page (max 50)", + "in": "query", + "name": "count", "type": "integer" } ], @@ -500118,23 +515681,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.eventsResponseDoc" + "$ref": "#/definitions/tiktokmobile.commentRepliesResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500145,27 +515708,41 @@ "ApiKeyAuth": [] } ], - "summary": "List events in a Ticketmaster discover city", + "summary": "Retrieve replies to a TikTok comment", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/event": { + "/tiktok/mobile/comments": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Ticketmaster event by `id`: title, description, start time, time zone, currency, venue, attractions, classification, presales, on-sale time, seat map URL, and flags for sold out, cancelled, postponed, rescheduled and virtual. An unknown event returns 404; a concluded or removed event returns 410.", - "operationId": "ticketmaster-event", + "description": "Returns the top-level comments of one video as the mobile app returns them: each comment has its full `user` projection, `text`, `digg_count` and `reply_comment_total`, plus `cursor`, `has_more` and `total`. This route needs a signed-in app session and throttles independently of the replies route. A page with no comments (including an empty body) is returned as an empty result, because that is the documented degraded shape in a throttle window.", + "operationId": "tiktok-mobile-comments", "parameters": [ { - "description": "Ticketmaster event id", + "description": "Video id to list comments for", "in": "query", - "name": "id", + "name": "aweme_id", "required": true, "type": "string", - "x-example": "04006319DDEA2CD5" + "x-example": "7681236055831416084" + }, + { + "default": 0, + "description": "Pagination cursor", + "in": "query", + "name": "cursor", + "type": "integer" + }, + { + "default": 20, + "description": "Comments per page (max 50)", + "in": "query", + "name": "count", + "type": "integer" } ], "produces": [ @@ -500175,29 +515752,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.eventResponseDoc" + "$ref": "#/definitions/tiktokmobile.commentsResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500208,47 +515779,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Ticketmaster event", + "summary": "Retrieve comments for a TikTok video", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/search-events": { + "/tiktok/mobile/feed": { "get": { "consumes": [ "application/json" ], - "description": "Searches Ticketmaster events by artist, event, team, or venue. A zero total with an empty events list is a valid no-results response. The sort enum accepts `relevance` and `date`.", - "operationId": "ticketmaster-search-events", + "description": "Returns one page of videos from TikTok's mobile For You feed, signed with well-formed mobile signature headers (no device or account needed). Each item carries `aweme_id`, `create_time`, `author_id`, `share_url` and the verified statistics block (`play_count`, `digg_count`, `comment_count`, `share_count`, `collect_count`, `download_count`, `forward_count`, `lose_count`, `lose_comment_count`, `whatsapp_share_count`, `repost_count`). A zero `count` uses the app's default page size; `count` is capped at 50.", + "operationId": "tiktok-mobile-feed", "parameters": [ - { - "description": "Artist, event, team, or venue query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "ariana grande" - }, { "default": 0, - "description": "Zero-based page (0-49)", + "description": "Videos to request (0 = app default, max 50)", "in": "query", - "maximum": 49, - "minimum": 0, - "name": "page", + "name": "count", "type": "integer" }, { - "default": "relevance", - "description": "Result order", - "enum": [ - "relevance", - "date" - ], + "default": 0, + "description": "Pagination cursor", "in": "query", - "name": "sort", - "type": "string" + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -500257,24 +515814,30 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/ticketmaster.eventsResponseDoc" + "$ref": "#/definitions/tiktokmobile.feedResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500285,24 +515848,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search Ticketmaster events", + "summary": "Retrieve the TikTok mobile For You feed", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/suggest": { + "/tiktok/mobile/feed/offline": { "get": { - "description": "Returns autocomplete suggestions for a partial artist, event, team or venue name in `q`. Each suggestion has a title, `type`, category, URL, image and, when available, an `event_count`. The response also gives the echoed `query` and the `count` of suggestions.", - "operationId": "ticketmaster-suggest", + "consumes": [ + "application/json" + ], + "description": "Calls the app's cached-pull feed route - `GET /tiktok/feed/offline/v2` - which answers protobuf, and returns a schema-free decode: field numbers become keys, printable length-delimited fields become strings and nested messages become objects, plus a flat list of every string leaf (`strings`), which is the fastest way to mine video ids and captions. Field numbering is inferred because TikTok publishes no schema for this message. This is the cached/offline pull variant, not the primary `POST /aweme/v2/feed/` feed already exposed as `/tiktok/mobile/feed/post`. The route is signature-validated, so it needs device-backed request signing to be configured for the deployment and fails with an error when it is not.", + "operationId": "tiktok-mobile-feed-offline", "parameters": [ { - "description": "Partial artist, event, team, or venue query", + "description": "Pull type forwarded to the app route (measured 0 and 11; default 11)", "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "arian" + "name": "pull_type", + "type": "integer", + "x-example": 11 + }, + { + "description": "Page size, bounded at 50 (upstream default when omitted)", + "in": "query", + "name": "count", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -500312,17 +515884,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.suggestionsResponseDoc" + "$ref": "#/definitions/tiktokmobile.offlineFeedResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500333,19 +515911,19 @@ "ApiKeyAuth": [] } ], - "summary": "Suggest Ticketmaster artists, events, and venues", + "summary": "Fetch the app's cached-pull offline feed (protobuf) decoded without a schema", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/trending-attractions": { + "/tiktok/mobile/feed/post": { "get": { "consumes": [ "application/json" ], - "description": "Returns a ranked list of currently-trending attractions across every segment (music, sports, arts and theater, family), not scoped to one category or city.", - "operationId": "ticketmaster-trending-attractions", + "description": "Calls the app's primary feed route - `POST /aweme/v2/feed/`, which the Android client sends with a protobuf request body and answers with protobuf - and returns a schema-free decode: field numbers become keys, length-delimited fields become strings when printable, nested messages when they parse and base64 otherwise, plus a flat list of every string leaf. Field numbering is inferred because TikTok publishes no schema for this message; use the JSON `GET /tiktok/mobile/feed` route when you need the stable structured contract.", + "operationId": "tiktok-mobile-feed-post", "produces": [ "application/json" ], @@ -500353,17 +515931,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.trendingAttractionsResponseDoc" + "$ref": "#/definitions/tiktokmobile.feedPostResponseDoc" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500374,27 +515952,27 @@ "ApiKeyAuth": [] } ], - "summary": "List trending Ticketmaster attractions", + "summary": "Fetch the app's primary feed call (POST, protobuf) decoded without a schema", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/venue": { + "/tiktok/mobile/hashtag": { "get": { "consumes": [ "application/json" ], - "description": "Returns one Ticketmaster venue by numeric `id`: name, address, city, state, country, postal code, coordinates, time zone, image, URL and visitor information as name and text entries. `seat_maps` and `city_categories` are omitted when none exist. An unknown venue returns 404.", - "operationId": "ticketmaster-venue", + "description": "Returns one hashtag's detail by name: `challenge_info` (cid, hashtag_name, desc, ...) and `stats` (view and video counts), exactly as the mobile API returns them. Hashtags are addressed by name; an internal id is rejected upstream.", + "operationId": "tiktok-mobile-hashtag", "parameters": [ { - "description": "Numeric Ticketmaster venue id", + "description": "Hashtag name without the leading #", "in": "query", - "name": "id", + "name": "name", "required": true, "type": "string", - "x-example": "32882" + "x-example": "readingvlog" } ], "produces": [ @@ -500404,29 +515982,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.venueResponseDoc" + "$ref": "#/definitions/tiktokmobile.hashtagInfoResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Hashtag not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500437,27 +516015,52 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Ticketmaster venue", + "summary": "Retrieve a TikTok hashtag", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/venue-enhanced-details": { + "/tiktok/mobile/hashtag/posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns header branding imagery and external links (the venue's own site, resident teams) for major venues. Smaller venues without enhanced content return 404.", - "operationId": "ticketmaster-venue-enhanced-details", + "description": "Lists videos for one hashtag name as the mobile app returns them (`aweme_list` with author, music and statistics), plus `cursor` and `has_more`. `sort=fresh` is the newest list and works from any measured egress; `sort=popular` is the hot list and only answers from a US egress.", + "operationId": "tiktok-mobile-hashtag-posts", "parameters": [ { - "description": "Numeric Ticketmaster venue id", + "description": "Hashtag name without the leading #", "in": "query", - "name": "id", + "name": "name", "required": true, "type": "string", - "x-example": "32882" + "x-example": "readingvlog" + }, + { + "default": "fresh", + "description": "Listing: fresh (newest) or popular (hot)", + "enum": [ + "fresh", + "popular" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": 20, + "description": "Videos per page (max 50)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Pagination cursor", + "in": "query", + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -500467,29 +516070,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.venueEnhancedDetailsResponseDoc" + "$ref": "#/definitions/tiktokmobile.hashtagPostsResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500500,47 +516097,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Ticketmaster venue's enhanced branding details", + "summary": "Retrieve videos for a TikTok hashtag", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketmaster/venue-events": { + "/tiktok/mobile/hashtags": { "get": { "consumes": [ "application/json" ], - "description": "Lists upcoming Ticketmaster events at the venue with numeric `id`. `page` is zero-based, 0 to 49, default 0; `sort` is `relevance` or `date` (default). Each event has title, start time, time zone, attractions, presales, seat map and status flags such as `sold_out` and `cancelled`. The response gives `total`.", - "operationId": "ticketmaster-venue-events", + "description": "Searches hashtags by keyword and returns the matching hashtag objects unmodified, with `cursor` and `has_more` for paging.", + "operationId": "tiktok-mobile-hashtags", "parameters": [ { - "description": "Numeric Ticketmaster venue id", + "description": "Keyword to search hashtags for", "in": "query", - "name": "id", + "name": "keyword", "required": true, "type": "string", - "x-example": "32882" + "x-example": "reading" }, { - "default": 0, - "description": "Zero-based page (0-49)", + "default": 20, + "description": "Results per page (max 50)", "in": "query", - "maximum": 49, - "minimum": 0, - "name": "page", + "name": "count", "type": "integer" }, { - "default": "date", - "description": "Result order", - "enum": [ - "relevance", - "date" - ], + "default": 0, + "description": "Pagination cursor", "in": "query", - "name": "sort", - "type": "string" + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -500550,23 +516141,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketmaster.eventsResponseDoc" + "$ref": "#/definitions/tiktokmobile.hashtagSearchResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500577,29 +516168,19 @@ "ApiKeyAuth": [] } ], - "summary": "List a venue's Ticketmaster events", + "summary": "Search TikTok hashtags", "tags": [ - "Ticketmaster" + "TikTok" ] } }, - "/ticketweb/event": { + "/tiktok/mobile/live/effects": { "get": { "consumes": [ "application/json" ], - "description": "Returns details for one TicketWeb event: venue, dates, age restriction, delivery methods, and per-tier ticket pricing (base price, fee breakdown, and total) when tickets are on sale. `has_tickets` is false and `sections` is empty for a free/RSVP event with no paid tickets, a sold-out event, or an access-code-gated event -- TicketWeb's own data does not reliably distinguish these three cases at this level, so the response reports the shared observable state (no purchasable sections) rather than guessing which applies.", - "operationId": "ticketweb-event", - "parameters": [ - { - "description": "Numeric TicketWeb event id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "14241184" - } - ], + "description": "Returns the complete LIVE effects/sticker asset catalogue in one call: `data.assets` (2,032 assets, each with `id`, `name`, `describe`, `resource_url`, `resource_uri`, `md5`, `size`, `resource_type`, `download_type`, `model_requirements`, `sticker_asset_variant` and `video_resource_list`). There are no request parameters and no paging, and the body is large because the catalogue is complete.", + "operationId": "tiktok-mobile-live-effects", "produces": [ "application/json" ], @@ -500607,23 +516188,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketweb.eventResponseDoc" + "$ref": "#/definitions/tiktokmobile.liveEffectsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500634,38 +516215,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TicketWeb event", + "summary": "Retrieve TikTok LIVE effects", "tags": [ - "TicketWeb" + "TikTok" ] } }, - "/ticketweb/search": { + "/tiktok/mobile/live/gifts": { "get": { "consumes": [ "application/json" ], - "description": "Searches TicketWeb events by artist, event, or venue. A zero count with an empty events list is a valid no-results response. availability is one of `in_stock`, `sold_out`, `unknown` per event.", - "operationId": "ticketweb-search", - "parameters": [ - { - "description": "Artist, event, or venue query", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "comedy" - }, - { - "default": 1, - "description": "One-based result page, 1-50", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "page", - "type": "integer" - } - ], + "description": "Returns the complete LIVE gift catalogue in one call: `data.gifts` (771 gift objects with `diamond_count`, `describe`, `duration`, `gift_resources`, `gift_skins`, `batch_gift_info` and `combo`) plus the gift config and resource maps (`gift_configs`, `gifts_info`, `doodle_templates`, `gift_name_group_map`, `gift_resource_group_map`). There are no request parameters and no paging: the response is a single complete catalogue.", + "operationId": "tiktok-mobile-live-gifts", "produces": [ "application/json" ], @@ -500673,17 +516235,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketweb.searchResponseDoc" + "$ref": "#/definitions/tiktokmobile.liveGiftsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500694,38 +516262,19 @@ "ApiKeyAuth": [] } ], - "summary": "Search TicketWeb events", + "summary": "Retrieve TikTok LIVE gifts", "tags": [ - "TicketWeb" + "TikTok" ] } }, - "/ticketweb/venue": { + "/tiktok/mobile/live/hashtags": { "get": { "consumes": [ "application/json" ], - "description": "Returns one TicketWeb venue's detail (name, address) plus one page of its upcoming events. A zero count with an empty events list on page 1 is a valid \"no upcoming events\" response.", - "operationId": "ticketweb-venue", - "parameters": [ - { - "description": "Numeric TicketWeb venue id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "15005" - }, - { - "default": 1, - "description": "One-based page of upcoming events, 1-50", - "in": "query", - "maximum": 50, - "minimum": 1, - "name": "page", - "type": "integer" - } - ], + "description": "Returns the reference set the app's \"go LIVE\" flow uses to tag a stream: the general LIVE hashtags (`hashtags`, measured 18 entries of `{id, image, namespace, title}`, where `id` 0 is the \"None\" tag), the live-studio/live-voice/third-party hashtag subsets (`live_studio_hashtags` 16, `live_voice_hashtags` 16, `third_party_hashtags` 9), the single `game_hashtag`, and a 1,500-entry game catalogue (`game_tag_list`, `game_tag_count`) where every entry carries the same 12 keys: `id`, `short_name`, `show_name`, `full_name`, `bundle_id`, `package_name`, `game_category` (`[{game_type, title}]` with PC games/Mobile games/Console games/Others), `hashtag_id`, `hashtag_list`, `gar`, `landscape` (0/1/2) and `is_new_game`. The upstream is `/webcast/room/hashtag/list/` on the webcast edge host (no origin header); the measured body is 539,361 B and byte-identical on both working webcast hosts, `language`/`count` do not change it, and there is no cursor/has_more, so it is a one-shot reference dump. Measured 2026-10-22 with the pure-Go (device-free) signer, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-live-hashtags", "produces": [ "application/json" ], @@ -500733,23 +516282,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ticketweb.venueResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/tiktokmobile.liveHashtagCatalogResponseDoc" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500760,19 +516303,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TicketWeb venue", + "summary": "LIVE category/game reference catalogue (hashtags, live-studio/voice/third-party tags, game tags)", "tags": [ - "TicketWeb" + "TikTok" ] } }, - "/tiffany/categories": { + "/tiktok/mobile/live/room": { "get": { "consumes": [ "application/json" ], - "description": "Lists every category id Tiffany & Co.'s own product catalog accepts, each with a human-readable label, a kind (category for a real navigable department/subcategory, curated_shop for a curated gift/merchandising shelf), and a live product count. Each id is exactly what tiffany-category's own category parameter accepts -- resolves the category-discovery gap that parameter would otherwise leave as \"find one from a storefront URL\".", - "operationId": "tiffany-categories", + "description": "Returns one LIVE room's detail, keyed by `room_id` — the numeric id that `/api/v1/tiktok/mobile/live/search` returns under `data[].lives.author.room_id`. The upstream is `/webcast/room/info/` on the webcast edge host (no origin header), captured from the running 47.4.3 app's LIVE surface and reproduced against the live gateway. The response projects the fields callers key on — `title`, `status` (2 = live), `user_count` (concurrent viewers), `create_time`, `owner` (user id, nickname, avatar), `stats` (cumulative `enter_count`/`total_user`, `watch_user_count`, `like_count`, `comment_count`, `share_count`, `follow_count`, `replay_viewers`), `stream` (playable `flv_pull_url` per resolution plus `default_resolution`/`candidate_resolution` and the HLS/RTMP URLs) and `cover` — and keeps the upstream room object unmodified in `data` (it has ~500 keys, so a partial struct would drop fields). Measured 2026-10-22 with the pure-Go (device-free) signer: one room returned 193-198 KB with 1,595-1,600 concurrent viewers, 27,916 cumulative viewers, 27,096 enters and FLV URLs for FULL_HD1/HD1/SD1/SD2. `anchor_id` is deliberately NOT forwarded: it was measured to suppress the audience-only `stats.total_user` (27,916 -> 0 on the same room). A missing, non-numeric or unknown room id answers the webcast envelope's status 10011 and is surfaced as a 400; a finished room (status 30003) is a 400 too. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-live-room", + "parameters": [ + { + "description": "Numeric LIVE room id from /api/v1/tiktok/mobile/live/search (data[].lives.author.room_id)", + "in": "query", + "name": "room_id", + "required": true, + "type": "string", + "x-example": "7699174209096059678" + } + ], "produces": [ "application/json" ], @@ -500780,17 +516333,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.categoriesResponseDoc" + "$ref": "#/definitions/tiktokmobile.liveRoomInfoResponseDoc" + } + }, + "400": { + "description": "Invalid input, an unknown/not-live room, or a finished room", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500801,100 +516360,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Tiffany & Co. categories", + "summary": "LIVE room detail: status, viewers, owner, stream URLs, cover", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiffany/category": { + "/tiktok/mobile/live/room-by-user": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a Tiffany & Co. category/browse listing. category is a category id from tiffany-categories's own id field (e.g. ecommerce_us_jewelry_necklaces_and_pendants). sort selects recommended (default), price_asc, price_desc, or newest. material, gemstone, color, product_type, gender, and designer are optional single-value filters -- see tiffany-filters for the live covered value space for each. A hub-level or emptied-out category id, or a filter combination with no matches, returns a well-formed empty result rather than an error.", - "operationId": "tiffany-category", + "description": "Returns the LIVE room a TikTok user is currently streaming, keyed by `user_id`. The upstream is `/webcast/room/info_by_user/` on the webcast edge host (no origin header) and returns the same room payload as `/api/v1/tiktok/mobile/live/room` (title, status, concurrent viewers, owner, cumulative stats, per-resolution FLV URLs, cover and the ~500-key room object in `data`), except that the caller addresses a user and the room id is filled from the payload (both `user_id` and `room_id` are echoed). Measured 2026-10-22 with the pure-Go (device-free) signer: `user_id=6707748031095751686` answered 184,575 B (195,220 B on the second webcast host); `anchor_id` alone answers a 57-byte empty payload, so `user_id` is the address. A user with no live room answers status 30003 \"room has finished\" and is surfaced as a 400; a non-numeric user id is a 400 (status 10011); a bare call answers a 57-byte empty success envelope, which is why this endpoint requires `user_id`. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-live-room-by-user", "parameters": [ { - "description": "Category id -- see tiffany-categories", + "description": "Numeric TikTok user id (e.g. the owner id from a profile, video author or live search row)", "in": "query", - "name": "category", + "name": "user_id", "required": true, "type": "string", - "x-example": "ecommerce_us_jewelry_necklaces_and_pendants" - }, - { - "default": "recommended", - "description": "Sort order", - "enum": [ - "recommended", - "price_asc", - "price_desc", - "newest" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 24, - "description": "Results per page", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "per_page", - "type": "integer" - }, - { - "description": "Material filter -- see tiffany-filters", - "in": "query", - "name": "material", - "type": "string", - "x-example": "Platinum" - }, - { - "description": "Gemstone filter -- see tiffany-filters", - "in": "query", - "name": "gemstone", - "type": "string", - "x-example": "Diamond" - }, - { - "description": "Color filter -- see tiffany-filters", - "in": "query", - "name": "color", - "type": "string", - "x-example": "Yellow Gold" - }, - { - "description": "Product type filter -- see tiffany-filters", - "in": "query", - "name": "product_type", - "type": "string", - "x-example": "Ring" - }, - { - "description": "Gender filter -- see tiffany-filters", - "in": "query", - "name": "gender", - "type": "string", - "x-example": "WOMENS" - }, - { - "description": "Designer/collection filter -- see tiffany-filters", - "in": "query", - "name": "designer", - "type": "string", - "x-example": "Elsa Peretti®" + "x-example": "6707748031095751686" } ], "produces": [ @@ -500904,23 +516390,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.categoryResponseDoc" + "$ref": "#/definitions/tiktokmobile.liveRoomInfoResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input, or the user has no live room right now", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -500931,19 +516417,19 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Tiffany & Co. category", + "summary": "LIVE room by user: the room a user is currently streaming", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiffany/content-search": { + "/tiktok/mobile/live/search": { "get": { "consumes": [ "application/json" ], - "description": "Searches Tiffany & Co.'s own editorial pages -- style guides, gift guides, and other \"World of Tiffany\" articles -- by free-text keyword. Not product data: no price, stock, or item id fields. A genuine non-matching keyword returns a well-formed empty result (zero total_results).", - "operationId": "tiffany-content-search", + "description": "Searches the mobile app's LIVE surface by keyword: `data` of `{type, anchor}` entries with `feedback_type` set to `live`, plus `cursor` and `has_more`. `keyword` is required; without it the gateway answers a valid but empty envelope. This is the API's first LIVE endpoint.", + "operationId": "tiktok-mobile-live-search", "parameters": [ { "description": "Search keyword", @@ -500951,24 +516437,13 @@ "name": "keyword", "required": true, "type": "string", - "x-example": "engagement ring guide" - }, - { - "default": 1, - "description": "One-based page", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page", - "type": "integer" + "x-example": "lofi" }, { - "default": 10, - "description": "Results per page", + "default": 0, + "description": "Results to request (0 = app default, max 50)", "in": "query", - "maximum": 50, - "minimum": 1, - "name": "per_page", + "name": "count", "type": "integer" } ], @@ -500979,23 +516454,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.contentSearchResponseDoc" + "$ref": "#/definitions/tiktokmobile.liveSearchResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -501006,19 +516481,19 @@ "ApiKeyAuth": [] } ], - "summary": "Search Tiffany & Co. editorial content", + "summary": "Search TikTok LIVE streams", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiffany/filters": { + "/tiktok/mobile/live/tabs": { "get": { "consumes": [ "application/json" ], - "description": "Lists every value tiffany-search's and tiffany-category's material, gemstone, color, product_type, gender, and designer filter parameters accept, each with a live product count -- resolves the discovery gap those parameters would otherwise leave as \"find one on the live site's own filter sidebar\".", - "operationId": "tiffany-filters", + "description": "Returns the app's LIVE tab catalogue: `data[]` holds one entry per tab with the tab's `id`, `name`, `style`, `enable`/`event` flags and the exact `url`/`inter_url` feed template the client calls for that tab. The measured tab 1 (\"live\") points at `/webcast/feed/?content_type=0&style=2&channel_id=21&sub_channel_id=0&tab_id=1&type=live&sub_type=live&req_type=0&cate_id=0` on `webcast.tiktokv.com`. This closes the route round 553 could not find a host for; it is served by the webcast edge hosts (non-webcast hosts answer 403) and is one of the few LIVE routes that answers device-free: measured with the pure-Go placeholder signer as well as the real device signer, so it does not need the device-backed signing service.", + "operationId": "tiktok-mobile-live-tabs", "produces": [ "application/json" ], @@ -501026,17 +516501,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.filtersResponseDoc" + "$ref": "#/definitions/tiktokmobile.liveTabsResponseDoc" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -501047,27 +516522,26 @@ "ApiKeyAuth": [] } ], - "summary": "List Tiffany & Co. search/category filter values", + "summary": "Fetch the LIVE tab catalogue", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiffany/product": { + "/tiktok/mobile/music/beats": { "get": { "consumes": [ "application/json" ], - "description": "Returns full product detail for one item: name, description, brand, collection, designer, material, gemstone, USD price, live stock status, category tree, every color/style variation, and images. product_id is Tiffany & Co.'s own item id, as returned by tiffany-search's or tiffany-category's own products[].id field.", - "operationId": "tiffany-product", + "description": "Returns the mobile app's beats/songs chart unmodified: `music_list` of the same full sound objects the pick chart returns (`id_str`, `title`, `user_count`, `album`, `artists`, `cover_*`), ordered as the app's beats list. The measured envelope carries no paging fields.", + "operationId": "tiktok-mobile-music-beats", "parameters": [ { - "description": "Item id, from a search or category result's id field", + "default": 0, + "description": "Accepted for compatibility; not measured to change the page (max 50)", "in": "query", - "name": "product_id", - "required": true, - "type": "string", - "x-example": "60957398" + "name": "count", + "type": "integer" } ], "produces": [ @@ -501077,29 +516551,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.productResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicBeatsSongsResponseDoc" } }, "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -501110,100 +516578,57 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Tiffany & Co. product", + "summary": "Retrieve TikTok music beats", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiffany/search": { + "/tiktok/mobile/music/chart": { "get": { "consumes": [ "application/json" ], - "description": "Searches Tiffany & Co.'s product catalog by free-text keyword. Returns product summaries with USD pricing, live stock status, material, gemstone, collection, and designer. sort selects recommended (default), price_asc, price_desc, or newest. material, gemstone, color, product_type, gender, and designer are optional single-value filters -- see tiffany-filters for the live covered value space for each. A genuine non-matching keyword, or a filter combination with no matches, returns a well-formed empty result (zero total_products).", - "operationId": "tiffany-search", + "description": "Returns one page of the app's regional sound chart: `chart_info` (chart id and update time), `cover_image_url` and a ranked `music_list` whose rows are a `music_info` sound object plus a `trend` entry; page with the returned `cursor` while `has_more` is true. `chart_region` selects the regional chart and accepts only `AE`, `BR`, `CA`, `DE`, `EG`, `FR`, `JP`, `KR`, `LB`, `MX`, `NG`, `SA`, `TR`, `US` and `ZA` (any other value returns an invalid-parameters error; omitting it returns the default chart, which equals `US`). `AE`, `EG`, `LB` and `SA` share one chart, as do `NG` and `ZA`. This is distinct from `music/pick`, which returns the creation panel's pick list with banners. Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", + "operationId": "tiktok-mobile-music-chart", "parameters": [ { - "description": "Search keyword", - "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "necklace" - }, - { - "default": "recommended", - "description": "Sort order", + "description": "Region of the chart: AE, BR, CA, DE, EG, FR, JP, KR, LB, MX, NG, SA, TR, US or ZA; omit for the default chart (same as US)", "enum": [ - "recommended", - "price_asc", - "price_desc", - "newest" + "AE", + "BR", + "CA", + "DE", + "EG", + "FR", + "JP", + "KR", + "LB", + "MX", + "NG", + "SA", + "TR", + "US", + "ZA" ], "in": "query", - "name": "sort", - "type": "string" + "name": "chart_region", + "type": "string", + "x-example": "US" }, { - "default": 1, - "description": "One-based page", + "default": 0, + "description": "Paging token from the previous response", "in": "query", - "maximum": 500, - "minimum": 1, - "name": "page", + "name": "cursor", "type": "integer" }, { - "default": 24, - "description": "Results per page", + "default": 10, + "description": "Rows per page (max 50)", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "per_page", + "name": "count", "type": "integer" - }, - { - "description": "Material filter -- see tiffany-filters", - "in": "query", - "name": "material", - "type": "string", - "x-example": "Platinum" - }, - { - "description": "Gemstone filter -- see tiffany-filters", - "in": "query", - "name": "gemstone", - "type": "string", - "x-example": "Diamond" - }, - { - "description": "Color filter -- see tiffany-filters", - "in": "query", - "name": "color", - "type": "string", - "x-example": "Yellow Gold" - }, - { - "description": "Product type filter -- see tiffany-filters", - "in": "query", - "name": "product_type", - "type": "string", - "x-example": "Ring" - }, - { - "description": "Gender filter -- see tiffany-filters", - "in": "query", - "name": "gender", - "type": "string", - "x-example": "WOMENS" - }, - { - "description": "Designer/collection filter -- see tiffany-filters", - "in": "query", - "name": "designer", - "type": "string", - "x-example": "Elsa Peretti®" } ], "produces": [ @@ -501213,23 +516638,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.searchResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicChartResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -501240,53 +516665,74 @@ "ApiKeyAuth": [] } ], - "summary": "Search Tiffany & Co. products", + "summary": "List a regional TikTok sound chart", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiffany/stores": { + "/tiktok/mobile/music/choices": { "get": { "consumes": [ "application/json" ], - "description": "Finds Tiffany & Co. physical stores, boutiques, and cafes near a coordinate, ordered by distance. Each result includes address, phone, opening hours, in-store services and specialities, and live open/closed status.", - "operationId": "tiffany-stores", - "parameters": [ - { - "description": "Latitude, -90 to 90", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 40.7128 + "description": "Returns the app's \"music choices\" list: the recommended sounds it offers on the video-creation page. The upstream is `/aweme/v1/music/choices/`; each `music_list` entry is the same full sound object the chart routes return (title, album, artists, covers, play URL, duration, ...). Measured 2026-10-21 with the pure-Go (device-free) signer: 56,078 B / 6 full sound objects on one call and 7 on later calls (the same six at the front), and the payload carries NO paging fields (no cursor/has_more), so this is a one-shot recommendation list. The measured `item_id`, `music_id`, `count` and `scene` parameters did not deterministically change the list — the recommendations rotate — so none is exposed. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-music-choices", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/tiktokmobile.musicChoicesResponseDoc" + } }, - { - "description": "Longitude, -180 to 180", - "in": "query", - "name": "longitude", - "required": true, - "type": "number", - "x-example": -74.006 + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "default": 50, - "description": "Search radius in miles", + "ApiKeyAuth": [] + } + ], + "summary": "Recommended sounds for video creation", + "tags": [ + "TikTok" + ] + } + }, + "/tiktok/mobile/music/collection-list": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns the app's music-collection LIST (`mc_list` of collection objects with covers), the browse list of curated music collections. This is a different route from `/api/v1/tiktok/mobile/music/collections`, which is the collection FEED (`mcf_list`, with each entry's music inline). The upstream is `/aweme/v1/music/collection/`. Unlike the feed, this route PAGES for real: `count` is honoured (measured 1 -> 1 item with `cursor: 1, has_more: 1`; 5 -> 5 items with `cursor: 5`; 10/100 -> all 8 collections) and `cursor` advances (measured `count=5&cursor=5` -> the remaining 3 with `has_more: 0`). A negative count answers upstream status 5, which is rejected locally. Measured 2026-10-21 with the pure-Go (device-free) signer: 8 collections total. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-music-collection-list", + "parameters": [ + { + "description": "Page size: honoured (1-50 measured, capped by the collection set)", "in": "query", - "maximum": 500, - "minimum": 1, - "name": "radius", - "type": "number" + "name": "count", + "type": "integer", + "x-example": 5 }, { - "default": 10, - "description": "Maximum stores to return", + "description": "Next-page token from the previous response (0 = first page)", "in": "query", - "maximum": 50, - "minimum": 1, - "name": "limit", - "type": "integer" + "name": "cursor", + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -501296,23 +516742,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.storesResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicCollectionListResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -501323,27 +516769,33 @@ "ApiKeyAuth": [] } ], - "summary": "Find Tiffany & Co. store locations", + "summary": "Music collection list (paged browse)", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiffany/suggest": { + "/tiktok/mobile/music/collections": { "get": { "consumes": [ "application/json" ], - "description": "Returns Tiffany & Co.'s own search-box suggestions (typeahead) for a partial query -- a flat list of suggested search phrases, each with its own live total result count on the product catalog. Not product data.", - "operationId": "tiffany-suggest", + "description": "Returns the mobile app's sound-collection feed unmodified: `mcf_list`, where each entry is `{collection, music_list}` (the measured default page holds 8 entries), plus `cursor` and `has_more`. This route is first-page only: the returned `cursor` is not a reusable page token, so callers should not page with it.", + "operationId": "tiktok-mobile-music-collections", "parameters": [ { - "description": "Partial search query", + "default": 0, + "description": "Collections to request (0 = app default, max 50)", "in": "query", - "name": "query", - "required": true, - "type": "string", - "x-example": "ring" + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Accepted for shape compatibility only; not a verified page token", + "in": "query", + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -501353,23 +516805,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiffany.suggestResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicCollectionFeedResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -501380,33 +516832,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tiffany & Co. search-box suggestions", + "summary": "Retrieve TikTok music collections", "tags": [ - "Tiffany & Co." + "TikTok" ] } }, - "/tiktok/category": { + "/tiktok/mobile/music/detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns the content categories shown on TikTok's Explore page. Each entry has the category name and its numeric type code. Takes no parameters.", - "operationId": "tiktok-category", + "description": "Returns one sound's page: `music_info` (id, title, author, `user_count`, duration, cover renditions, bound challenge and the other sound fields), its chart rank, similar sounds, recommendation blocks and the behind-the-song flag. `music_id` is required. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", + "operationId": "tiktok-mobile-music-detail", + "parameters": [ + { + "description": "Sound id", + "in": "query", + "name": "music_id", + "required": true, + "type": "string", + "x-example": "7329791746055080709" + } + ], "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.categoryResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicDetailResponseDoc" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -501427,27 +516889,26 @@ "ApiKeyAuth": [] } ], - "summary": "List TikTok explore categories", + "summary": "Retrieve one TikTok sound", "tags": [ "TikTok" ] } }, - "/tiktok/comments": { + "/tiktok/mobile/music/pick": { "get": { "consumes": [ "application/json" ], - "description": "Returns the top-level comments on a TikTok video, by the video id from its URL (`aweme_id`). Results are paged by cursor: pass the `cursor` from one response to get the next page, and read `has_more` to see whether more remain. The response also carries the total comment count.", - "operationId": "tiktok-video-comments", + "description": "Returns the mobile app's sound pick/chart list: `music_list` of full sound objects (id, title, author, user_count, duration, ...) plus the chart list `mc_list` and `radio_cursor`.", + "operationId": "tiktok-mobile-music-pick", "parameters": [ { - "description": "TikTok video id from the video URL", + "default": 20, + "description": "Sounds per page (max 50)", "in": "query", - "name": "aweme_id", - "required": true, - "type": "string", - "x-example": "7304809083817774382" + "name": "count", + "type": "integer" }, { "default": 0, @@ -501463,14 +516924,8 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.commentsResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicPickResponseDoc" } }, "400": { @@ -501497,33 +516952,68 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok video comments", + "summary": "Retrieve TikTok sound chart picks", "tags": [ "TikTok" ] } }, - "/tiktok/creative-center/filters": { + "/tiktok/mobile/music/posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns the complete filter taxonomy for the Creative Center trend endpoints: the countries each trend tab reports, the industry ids and video content tags the filters accept, the supported lookback periods, and the video sort metrics. Use it to discover valid values for the hashtags endpoint's country_code, period, and industry_id parameters and the videos endpoint's country_code, period, sort_by, and content_label_ids parameters. This endpoint performs no upstream request and has no parameters.", - "operationId": "tiktok-creative-center-filters", + "description": "Lists the videos that use one sound, as the mobile app returns them: `aweme_list` of full video objects (with `author`, `statistics` and `added_sound_music_info`), plus `cursor` and `has_more`. `music_id` is required. `count` is accepted but ignored upstream - the server returns its own default page, so page with `cursor`.", + "operationId": "tiktok-mobile-music-posts", + "parameters": [ + { + "description": "Sound (music) id", + "in": "query", + "name": "music_id", + "required": true, + "type": "string", + "x-example": "6799585653702019073" + }, + { + "default": "fresh", + "description": "Listing: fresh (newest, default) or popular (app canonical music.posts list; requires the device-backed signer)", + "enum": [ + "fresh", + "popular" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "default": 0, + "description": "Accepted for compatibility; the server ignores it (max 50)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Pagination cursor", + "in": "query", + "name": "cursor", + "type": "integer" + } + ], "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/creativecenter.filtersResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicFreshAwemeResponseDoc" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -501544,67 +517034,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Creative Center filter taxonomy", + "summary": "Retrieve videos for a TikTok sound", "tags": [ - "TikTok", - "TikTok Creative Center" + "TikTok" ] } }, - "/tiktok/creative-center/hashtags": { + "/tiktok/mobile/music/related": { "get": { "consumes": [ "application/json" ], - "description": "Returns TikTok Creative Center's ranked trending hashtags for a country, period, and optional industry. TikTok gates this endpoint's full result set behind a logged-in TikTok One account: an anonymous request always receives at most 3 hashtags per filter combination regardless of country, period, or industry, so selecting an industry returns that industry's own ranked top three. See the filters endpoint for the complete country, period, and industry value lists.", - "operationId": "tiktok-creative-center-hashtags", + "description": "Returns sounds related to one video: `music_list` of full sound objects, `recall_info_list` explaining why each was recalled, `similar_song_ids`, plus `cursor` and `has_more`.", + "operationId": "tiktok-mobile-music-related", "parameters": [ { - "description": "ISO-2 country code", + "description": "Video id to find related sounds for", "in": "query", - "name": "country_code", + "name": "aweme_id", "required": true, "type": "string", - "x-example": "US" + "x-example": "7681236055831416084" }, { - "default": 7, - "description": "Lookback window in days", - "enum": [ - 7, - 30, - 90 - ], + "default": 20, + "description": "Sounds per page (max 50)", "in": "query", - "name": "period", + "name": "count", "type": "integer" }, { - "description": "Creative Center industry id to restrict the ranking to", - "enum": [ - "10000000000", - "11000000000", - "12000000000", - "13000000000", - "14000000000", - "15000000000", - "17000000000", - "18000000000", - "19000000000", - "21000000000", - "22000000000", - "23000000000", - "24000000000", - "25000000000", - "26000000000", - "27000000000", - "28000000000", - "29000000000" - ], + "default": 0, + "description": "Pagination cursor", "in": "query", - "name": "industry_id", - "type": "string", - "x-example": "22000000000" + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -501613,14 +517077,8 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/creativecenter.trendingHashtagsResponseDoc" + "$ref": "#/definitions/tiktokmobile.musicRelatedResponseDoc" } }, "400": { @@ -501640,12 +517098,6 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "503": { - "description": "Upstream failure", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -501653,27 +517105,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Creative Center trending hashtags", + "summary": "Retrieve sounds related to a TikTok video", "tags": [ - "TikTok", - "TikTok Creative Center" + "TikTok" ] } }, - "/tiktok/creative-center/top-content": { + "/tiktok/mobile/music/trending": { "get": { "consumes": [ "application/json" ], - "description": "Returns TikTok Creative Center's current Top Content set: four top-performing branded videos, each with the video object (anonymous MP4 and cover URLs), engagement metrics, the author profile and follower count, and (by default) the video's top comments plus keyword mention counts derived from them. The set is a daily snapshot and there is no pagination or historical query; the four titles rotate when the snapshot changes. Set include_comments=false for a smaller response with only video, author, and metrics.", - "operationId": "tiktok-creative-center-top-content", + "description": "Returns the mobile app's trending sound chart: `music_list` of full sound objects (`id_str`, `title`, `user_count`, `album`, `artists`, `cover_large`/`cover_medium`/`cover_thumb`, `binded_challenge_id`, `collect_stat`, `audition_duration`) unmodified, plus `cursor` and `has_more` for paging. This is the chart behind `music.trending`.", + "operationId": "tiktok-mobile-music-trending", "parameters": [ { - "default": true, - "description": "Include each object's top comments and comment-keyword counts", + "default": 20, + "description": "Sounds per page (max 50)", "in": "query", - "name": "include_comments", - "type": "boolean" + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Pagination cursor", + "in": "query", + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -501682,14 +517140,8 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/creativecenter.topContentResponseDoc" + "$ref": "#/definitions/tiktokmobile.hotMusicResponseDoc" } }, "400": { @@ -501709,12 +517161,6 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "503": { - "description": "Upstream failure", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -501722,83 +517168,34 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Creative Center top content", + "summary": "Retrieve TikTok trending sounds", "tags": [ - "TikTok", - "TikTok Creative Center" + "TikTok" ] } }, - "/tiktok/creative-center/videos": { + "/tiktok/mobile/mv/videos": { "get": { "consumes": [ "application/json" ], - "description": "Returns TikTok Creative Center's ranked trending videos for a country, period, sort order, and optional content tags. TikTok reports the true result-set size (see total_count/page_count in the response) but gates access to it behind a logged-in TikTok One account: an anonymous request always receives page 1 (4 videos) regardless of sort order or period. Country coverage is uneven: only US, JP, ID, VN, and TH have a regional edge host that returns populated results; other countries return an empty videos array (a genuine no-data response, not an error). See the filters endpoint for the complete country, period, sort, and content tag value lists.", - "operationId": "tiktok-creative-center-videos", + "description": "Returns one page of an MV channel feed, the app's music-video (\"MV\") tab. The upstream is `/aweme/v1/mv/aweme/`; `mv_id` is a small numeric CHANNEL index, NOT a video id — measured ids 0-10 each returned a 15-video page of full aweme objects (1.05-1.24 MB), while 100 returned a valid empty page and a real aweme id returned an empty list. The server's page size is 15 and `count` was measured IGNORED (`count=5` and `count=10` both returned 15 items), so `count` is not exposed; page with `cursor`. The returned `cursor` is a reusable next-page token (measured page 1 `cursor: 18, has_more: 1`; `cursor=18` returned a fresh page with `cursor: 38, has_more: 1`). The envelope's `top_awemes` (pinned entries), `original_aweme_id`, `page_extra` and `extra`/`log_pb` are kept as measured. Measured 2026-10-22 with the pure-Go (device-free) signer, so it does not need the device-backed signer. A missing or non-numeric `mv_id` is a 400; an unknown numeric channel is a valid empty page.", + "operationId": "tiktok-mobile-mv-videos", "parameters": [ { - "description": "ISO-2 country code", + "description": "MV channel index (small integer; measured 0-10 populated, 100 empty)", "in": "query", - "name": "country_code", + "name": "mv_id", "required": true, "type": "string", - "x-example": "US" - }, - { - "default": 7, - "description": "Lookback window in days", - "enum": [ - 7, - 30 - ], - "in": "query", - "name": "period", - "type": "integer" - }, - { - "default": "views", - "description": "Sort order", - "enum": [ - "views", - "engagement", - "six_second_views" - ], - "in": "query", - "name": "sort_by", - "type": "string" - }, - { - "description": "Deprecated: single content tag id; use content_label_ids instead", - "in": "query", - "name": "content_label_id", - "type": "string", - "x-example": "11015" - }, - { - "collectionFormat": "multi", - "description": "Content tag ids to filter by, repeatable; matches videos carrying any selected tag", - "in": "query", - "items": { - "enum": [ - "11002", - "11003", - "11010", - "11013", - "11015" - ], - "type": "string" - }, - "name": "content_label_ids", - "type": "array", - "x-example": "11003,11015" + "x-example": "1" }, { - "default": false, - "description": "Restrict to organic (non-paid) videos only", + "description": "Next-page token from the previous response (0 = first page)", "in": "query", - "name": "organic_only", - "type": "boolean" + "name": "cursor", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -501807,14 +517204,8 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/creativecenter.trendingVideosResponseDoc" + "$ref": "#/definitions/tiktokmobile.mvFeedResponseDoc" } }, "400": { @@ -501834,12 +517225,6 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "503": { - "description": "Upstream failure", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -501847,28 +517232,62 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Creative Center trending videos", + "summary": "MV channel feed: the app's music-video tab, paged", "tags": [ - "TikTok", - "TikTok Creative Center" + "TikTok" ] } }, - "/tiktok/explore/{id}": { + "/tiktok/mobile/place/detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns the TikTok explore feed for a category, given its category type `id` from the category endpoint. The response has `itemList` with the videos, `hasMore` and a `cursor`. A feed that comes back empty is reported as an upstream error, not as an empty list.", - "operationId": "tiktok-explore", + "description": "Returns one place detail page, keyed by the `poi_id` that the place search endpoint returns. The upstream is TikTok's server-driven UI (`/tiktok/poi/slash/v1`) frame stream, assembled here into the component map of the place-detail screen: `food_head_info` (place name, formatted address, category, phone, coordinates, opening hours, rating/score with mention count, price range, tags and photo album), `poi_top_videos` (top videos strip), `poi_limited_post` (posts about the place: full video items plus `aweme_cursor`/`has_more_aweme`), `poi_review` (review preview with `has_more`) and `ai_summary` when the place has one. `nodes` is opaque and complete, `frames` keeps the raw ordered frames, and the typed counters (`top_video_count`, `post_count`, `post_cursor`, `has_more_posts`, `review_count`, `has_more_reviews`) are convenience projections. The measured page-size controls are forwarded with the app's defaults but the server applies its own bounds. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-place-detail", "parameters": [ { - "description": "Category type id returned by the category endpoint", - "in": "path", - "name": "id", + "description": "Place id from the place search endpoint", + "in": "query", + "name": "poi_id", "required": true, + "type": "string", + "x-example": "42203861086875992" + }, + { + "description": "Review preview size forwarded upstream (default 20, bounded at 50)", + "in": "query", + "name": "review_count", "type": "integer", - "x-example": 120 + "x-example": 20 + }, + { + "description": "Review cursor forwarded upstream (default 0)", + "in": "query", + "name": "review_cursor", + "type": "integer", + "x-example": 0 + }, + { + "description": "Posts page size forwarded upstream (default 9, bounded at 50)", + "in": "query", + "name": "merged_count", + "type": "integer", + "x-example": 9 + }, + { + "description": "Top-videos cursor forwarded upstream (default 0)", + "in": "query", + "name": "video_cursor", + "type": "integer", + "x-example": 0 + }, + { + "description": "Forwarded analytics origin (default search_places)", + "in": "query", + "name": "enter_from", + "type": "string", + "x-example": "search_places" } ], "produces": [ @@ -501877,14 +517296,8 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.exploreResponseDoc" + "$ref": "#/definitions/tiktokmobile.placeDetailResponseDoc" } }, "400": { @@ -501911,27 +517324,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve the TikTok explore feed for a category", + "summary": "Place (POI) detail from the mobile app's Places surface", "tags": [ "TikTok" ] } }, - "/tiktok/hashtag/{name}": { + "/tiktok/mobile/place/info": { "get": { "consumes": [ "application/json" ], - "description": "Returns the details of a TikTok hashtag page by `name`, for example `christmas`. The response carries `challengeInfo` with the hashtag's metadata, such as cover images, and `shareMeta` with the share title and description. The hashtag id found here feeds `tiktok-challenge-list`.", - "operationId": "tiktok-challenge", + "description": "Returns one place's compact record, keyed by the `poi_id` that the place search endpoint returns. The upstream is TikTok's POI read (`/tiktok/poi/get/v1`), the record behind a place card: `name`, `address`, `category`, `average_price`, `latitude`/`longitude`, `city_code`/`region_code`, `review_score` with `review_count`/`no_rating`, `video_count`, `favorite_count`, `opening_hours`/`opening_status`, `cover`, `share_url`/`share_desc` and `parent_poi`, plus the upstream POI object unmodified in `place` so a richer field is never lost. This is the cheap lookup to use instead of the ~1 MB slash detail page when only the place record is needed. A nonexistent id answers 400 (the upstream business status 3009009 \"poi not exist\" is a caller error, not an outage). Measured 2026-10-21 with the pure-Go (device-free) signer: 4,594 B for a coffee shop (score 4.7 / 2 reviews, price \"$\", hours \"8:00 AM – 5:00 PM\", 11 videos), 4,623 B for a second location (score 4.8 / 13 reviews). The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-place-info", "parameters": [ { - "description": "Hashtag name (e.g., 'christmas')", - "in": "path", - "name": "name", + "description": "Place id from the place search endpoint", + "in": "query", + "name": "poi_id", "required": true, "type": "string", - "x-example": "christmas" + "x-example": "42203861086875992" } ], "produces": [ @@ -501940,24 +517353,12 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.challengeResponseDoc" + "$ref": "#/definitions/tiktokmobile.placeInfoResponseDoc" } }, "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Hashtag does not exist", + "description": "Invalid input, or the place id does not exist", "schema": { "$ref": "#/definitions/app.Response" } @@ -501980,34 +517381,47 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok hashtag details", + "summary": "Compact place (POI) record: address, coordinates, rating, hours, counters", "tags": [ "TikTok" ] } }, - "/tiktok/hashtags": { + "/tiktok/mobile/place/media": { "get": { "consumes": [ "application/json" ], - "description": "Lists the videos posted under a TikTok hashtag, identified by the hashtag `id` from the hashtag detail endpoint. `cursor` defaults to 0. The response has `itemList`, `hasMore` and a `cursor`; pass that cursor back to fetch the next page.", - "operationId": "tiktok-challenge-list", + "description": "Returns one page of a place's mixed video/photo grid unmodified in `item_list`: each row carries an `aweme` video object or a photo entry plus `media_type`/`item_type`, an `aweme_cover`, topic tags and a crop cover. `next_cursor` is the opaque paging token to pass back as `cursor` (send the returned `data_version` with it; the endpoint defaults it to `v1`). `size` is the app's page hint (default 6, max 30; the server caps larger values). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", + "operationId": "tiktok-mobile-place-media", "parameters": [ { - "description": "Hashtag id returned by the hashtag detail endpoint", + "description": "Place id from the place search/detail endpoints", "in": "query", - "name": "id", + "name": "poi_id", "required": true, "type": "string", - "x-example": "3242" + "x-example": "42203861086875992" }, { - "default": 0, - "description": "Pagination cursor", + "description": "Opaque next_cursor token from the previous response", "in": "query", "name": "cursor", + "type": "string" + }, + { + "default": 6, + "description": "Rows per page hint (max 30)", + "in": "query", + "name": "size", "type": "integer" + }, + { + "description": "Paging data version carried with cursor (defaults to v1)", + "in": "query", + "name": "data_version", + "type": "string", + "x-example": "v1" } ], "produces": [ @@ -502016,14 +517430,8 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.challengeListResponseDoc" + "$ref": "#/definitions/tiktokmobile.placeMediaResponseDoc" } }, "400": { @@ -502050,19 +517458,29 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok hashtag posts", + "summary": "List a TikTok place's mixed media", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/anchor/list": { + "/tiktok/mobile/place/photos": { "get": { "consumes": [ "application/json" ], - "description": "Returns the anchor catalogue TikTok exposes for attaching a tag, product or place to a video. Entry shapes vary by anchor type, so each entry is returned as raw JSON rather than coerced into one schema.", - "operationId": "tiktok-mobile-anchor-list", + "description": "Returns one place's photo album, keyed by the `poi_id` that the place search endpoint returns. The upstream is `/tiktok/poi/picture_album/v1`: `categories` holds each album tab (`name`, `pic_tab_typecode`, `pictures` of bare image URL lists and `pictures_v2`, the same photos with `author` attribution, `pic_id`, `source` and origin/compressed URL info), `photo_count` sums the categories' pictures, and `title` is the app's own header. Measured 2026-10-21 with the pure-Go (device-free) signer: one place answered 5,368 B, title \"Gallery (3)\", 1 category with 3 photos whose `pictures_v2` entries name the Google-places contributor; another answered 24,196 B with more photos. The album is one-shot: `count` and `pic_tab_typecode` were measured and did not change the page. A nonexistent id answers 500 (the upstream answers status 4 \"Server is currently unavailable\" on this route, unlike the poi-not-exist code the other place routes use). The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-place-photos", + "parameters": [ + { + "description": "Place id from the place search endpoint", + "in": "query", + "name": "poi_id", + "required": true, + "type": "string", + "x-example": "42203861086875992" + } + ], "produces": [ "application/json" ], @@ -502070,7 +517488,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.anchorListResponseDoc" + "$ref": "#/definitions/tiktokmobile.placePhotosResponseDoc" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -502080,7 +517504,7 @@ } }, "500": { - "description": "Internal server error", + "description": "Internal server error, including a place id that does not resolve", "schema": { "$ref": "#/definitions/app.Response" } @@ -502091,27 +517515,52 @@ "ApiKeyAuth": [] } ], - "summary": "Anchor catalogue used by the video composer", + "summary": "Place photo album with per-photo attribution", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/collection/detail": { + "/tiktok/mobile/place/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns one collection's record unmodified in `item_archive`: name, cover images, creator (`uid`, `creator_name`), status and `statistic.total`. `collection_id` is the `item_archive_id` from the collection list endpoint; web playlist (`mix`) ids are a different namespace and are rejected upstream with a permission error. Requires the device-backed signing service and returns a generic service-unavailable error without it.", - "operationId": "tiktok-mobile-collection-detail", + "description": "Returns one page of a place's reviews (`reviews`, full review objects: author, content, rating, tags, `server_param`) together with the score summary (`review_summary`: score and score range), the review tags (`review_tags`) and the paging token (`cursor`/`has_more`). The route uses the review-landing tab scene (`scene=7`) that the app's own review interface sends; without that scene the upstream rejects the request with `status_code 5`, which is why this family was previously unusable. `poi_id` is the place id from the place search/detail endpoints. Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", + "operationId": "tiktok-mobile-place-reviews", "parameters": [ { - "description": "Collection id (`item_archive_id` from the collection list)", + "description": "Place id from the place search/detail endpoints", "in": "query", - "name": "collection_id", + "name": "poi_id", "required": true, "type": "string", - "x-example": "7394627756635573022" + "x-example": "42203861086875992" + }, + { + "default": 0, + "description": "Paging token from the previous response", + "in": "query", + "name": "cursor", + "type": "integer" + }, + { + "default": 20, + "description": "Reviews per page (max 30)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": 1, + "description": "Sort order: 1 = default, 2 = recent", + "enum": [ + 1, + 2 + ], + "in": "query", + "name": "sort_type", + "type": "integer" } ], "produces": [ @@ -502121,11 +517570,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.collectionDetailResponseDoc" + "$ref": "#/definitions/tiktokmobile.placeReviewsResponseDoc" } }, "400": { - "description": "Invalid input or unknown collection", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } @@ -502148,41 +517597,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get TikTok collection detail on the mobile API", + "summary": "List a TikTok place's reviews", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/collection/list": { + "/tiktok/mobile/place/videos": { "get": { "consumes": [ "application/json" ], - "description": "Lists a creator's public collections (the profile's Collections tab) unmodified in `item_archive_detail_list`: each row carries the collection `id`, `name`, cover images and `statistic.total` video count. Use the returned `id` with the collection detail and collection videos endpoints. Requires the numeric `user_id` (a sec_user_id alone is rejected upstream). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", - "operationId": "tiktok-mobile-collection-list", + "description": "Returns one page of the videos posted at a place, keyed by the `poi_id` that the place search endpoint returns. The upstream is `/tiktok/poi/video/list/v1`: `aweme_list` holds the app's full video objects (id, description, author, statistics, media URLs, music, anchors, ...) and `item_count` is this page's size. Page with `cursor`: the returned `cursor` is a reusable next-page token (measured page 1 `cursor: 20` with `has_more: 1`, page 2 `cursor: 40`), never with arithmetic on `count`. `count` is a page-size hint, not a strict size: 1/2/5 returned exactly that many items on the first page, a later page returned 8 for count=5, and 10/20/50 were all server-capped at 17. Measured 2026-10-21 with the pure-Go (device-free) signer: 11 videos (940-944 KB) on one place, 17 videos (1.4 MB) on another. The route exposes no sort control: `sort_type` and `order` were measured and did not change the page or its order. The upstream throttles bursts, so paced clients are expected. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-place-videos", "parameters": [ { - "description": "Creator's numeric user id", + "description": "Place id from the place search endpoint", "in": "query", - "name": "user_id", + "name": "poi_id", "required": true, "type": "string", - "x-example": "107955" + "x-example": "42203861086875992" }, { - "default": 0, - "description": "Pagination cursor (server token)", + "description": "Page-size hint: 1-50 measured, server caps larger pages (default is the app default)", "in": "query", - "name": "cursor", - "type": "integer" + "name": "count", + "type": "integer", + "x-example": 10 }, { - "default": 10, - "description": "Collections per page (max 30)", + "description": "Next-page token from the previous response (0 = first page)", "in": "query", - "name": "count", - "type": "integer" + "name": "cursor", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -502192,11 +517641,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.collectionListResponseDoc" + "$ref": "#/definitions/tiktokmobile.placeVideosResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Invalid input, or the place id does not exist", "schema": { "$ref": "#/definitions/app.Response" } @@ -502219,41 +517668,40 @@ "ApiKeyAuth": [] } ], - "summary": "List TikTok collections on the mobile API", + "summary": "Videos posted at one place (paged)", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/collection/videos": { + "/tiktok/mobile/playlist/detail": { "get": { "consumes": [ "application/json" ], - "description": "Pages one collection's videos in the creator's order, returning `items` (full video objects) unmodified with `min_cursor`, `max_cursor` and `has_more`. Pass `max_cursor` back as `cursor` while `has_more` is true. The server caps a page at about 30 rows, so `count` is a request hint. Requires the device-backed signing service and returns a generic service-unavailable error without it.", - "operationId": "tiktok-mobile-collection-videos", + "description": "Returns one playlist's record unmodified in `mix`: `mix_id`, `name`, `mix_type`, `creator_name`, `author`, `share_info`, `statistic.total` and `status`, plus `is_collect`. `mix_id` is the web playlist id namespace; the owner identity selector (`user_id` or `sec_user_id`) is required as well (the mobile route rejects `mix_id` alone with `status_code 5`). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", + "operationId": "tiktok-mobile-playlist-detail", "parameters": [ { - "description": "Collection id (`item_archive_id` from the collection list)", + "description": "Playlist id (web playlist id namespace)", "in": "query", - "name": "collection_id", + "name": "mix_id", "required": true, "type": "string", - "x-example": "7394627756635573022" + "x-example": "7681171537575824159" }, { - "default": 0, - "description": "Paging cursor; use the previous page's max_cursor", + "description": "Playlist owner's numeric user id (one of user_id / sec_user_id is required)", "in": "query", - "name": "cursor", - "type": "integer" + "name": "user_id", + "type": "string", + "x-example": "107955" }, { - "default": 10, - "description": "Videos per page (max 30; the server serves about 30)", + "description": "Playlist owner's sec_user_id (one of user_id / sec_user_id is required)", "in": "query", - "name": "count", - "type": "integer" + "name": "sec_user_id", + "type": "string" } ], "produces": [ @@ -502263,11 +517711,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.collectionVideosResponseDoc" + "$ref": "#/definitions/tiktokmobile.playlistDetailResponseDoc" } }, "400": { - "description": "Invalid input or unknown collection", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } @@ -502290,49 +517738,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get videos in a TikTok collection on the mobile API", + "summary": "Retrieve one TikTok playlist", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/comment/replies": { + "/tiktok/mobile/playlist/list": { "get": { "consumes": [ "application/json" ], - "description": "Returns the replies to one comment as the mobile app returns them, with `cursor`, `has_more` and `total`. The measured call sends both the video id and the comment id; this route answers even in windows where the top-level comment list is degraded.", - "operationId": "tiktok-mobile-comment-replies", + "description": "Lists the public playlists (\"mixes\") of one creator unmodified in `mix_list`: each row carries the playlist `mix_id` (the same id the web playlist URL uses), `name`, `mix_type`, `creator_name`, `statistic.total` and `last_add_video_timestamp`. Feed `mix_id` to the playlist detail endpoint. Requires one identity selector (`user_id` or `sec_user_id`). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", + "operationId": "tiktok-mobile-playlist-list", "parameters": [ { - "description": "Video id the comment belongs to", + "description": "Creator's numeric user id (one of user_id / sec_user_id is required)", "in": "query", - "name": "aweme_id", - "required": true, + "name": "user_id", "type": "string", - "x-example": "7680168962218511636" + "x-example": "107955" }, { - "description": "Comment id to list replies for", + "description": "Creator's sec_user_id (one of user_id / sec_user_id is required)", "in": "query", - "name": "comment_id", - "required": true, - "type": "string", - "x-example": "7680523330713240340" + "name": "sec_user_id", + "type": "string" }, { "default": 0, - "description": "Pagination cursor", + "description": "Paging token from the previous response", "in": "query", "name": "cursor", "type": "integer" - }, - { - "default": 20, - "description": "Replies per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" } ], "produces": [ @@ -502342,7 +517780,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.commentRepliesResponseDoc" + "$ref": "#/definitions/tiktokmobile.playlistListResponseDoc" } }, "400": { @@ -502369,38 +517807,38 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve replies to a TikTok comment", + "summary": "List a creator's TikTok playlists", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/comments": { + "/tiktok/mobile/playlist/videos": { "get": { "consumes": [ "application/json" ], - "description": "Returns the top-level comments of one video as the mobile app returns them: each comment has its full `user` projection, `text`, `digg_count` and `reply_comment_total`, plus `cursor`, `has_more` and `total`. This route needs a signed-in app session and throttles independently of the replies route. A page with no comments (including an empty body) is returned as an empty result, because that is the documented degraded shape in a throttle window.", - "operationId": "tiktok-mobile-comments", + "description": "Lists one page of a playlist's videos unmodified in `item_list`: each entry is the full video object the app renders (author, statistics, music, cover renditions, description). `mix_id` is the playlist id from the playlist list/detail endpoints; pass the returned `cursor` back while `has_more` is true. This endpoint is served from the public web twin (`www.tiktok.com/api/mix/item_list/`) because the mobile item route is not usable, so it is device-free: no signing service or cookie is required.", + "operationId": "tiktok-mobile-playlist-videos", "parameters": [ { - "description": "Video id to list comments for", + "description": "Playlist id (web playlist id namespace)", "in": "query", - "name": "aweme_id", + "name": "mix_id", "required": true, "type": "string", - "x-example": "7681236055831416084" + "x-example": "7681171537575824159" }, { "default": 0, - "description": "Pagination cursor", + "description": "Paging token from the previous response", "in": "query", "name": "cursor", "type": "integer" }, { - "default": 20, - "description": "Comments per page (max 50)", + "default": 10, + "description": "Videos per page (max 30)", "in": "query", "name": "count", "type": "integer" @@ -502413,7 +517851,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.commentsResponseDoc" + "$ref": "#/definitions/tiktokmobile.playlistVideosResponseDoc" } }, "400": { @@ -502440,33 +517878,47 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve comments for a TikTok video", + "summary": "List a playlist's videos", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/feed": { + "/tiktok/mobile/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of videos from TikTok's mobile For You feed, signed with well-formed mobile signature headers (no device or account needed). Each item carries `aweme_id`, `create_time`, `author_id`, `share_url` and the verified statistics block (`play_count`, `digg_count`, `comment_count`, `share_count`, `collect_count`, `download_count`, `forward_count`, `lose_count`, `lose_comment_count`, `whatsapp_share_count`, `repost_count`). A zero `count` uses the app's default page size; `count` is capped at 50.", - "operationId": "tiktok-mobile-feed", + "description": "Keyword search returning the mobile API result documents unmodified: each entry has `aweme_info` (a full video object with statistics), `card_profile` and search metadata, plus `cursor` and `has_more`. Keep `count` small (20 already exceeds one megabyte of upstream JSON). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", + "operationId": "tiktok-mobile-search", "parameters": [ { - "default": 0, - "description": "Videos to request (0 = app default, max 50)", + "description": "Search keyword", + "in": "query", + "name": "keyword", + "required": true, + "type": "string", + "x-example": "lofi" + }, + { + "default": 5, + "description": "Results per page (max 20)", "in": "query", "name": "count", "type": "integer" }, { "default": 0, - "description": "Pagination cursor", + "description": "Result offset; pass search_id with a non-zero offset", "in": "query", - "name": "cursor", + "name": "offset", "type": "integer" + }, + { + "description": "search_id returned by a previous page of the same search", + "in": "query", + "name": "search_id", + "type": "string" } ], "produces": [ @@ -502475,14 +517927,8 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktokmobile.feedResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchGeneralResponseDoc" } }, "400": { @@ -502509,33 +517955,48 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve the TikTok mobile For You feed", + "summary": "Search TikTok videos on the mobile API", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/feed/offline": { + "/tiktok/mobile/search/effects": { "get": { "consumes": [ "application/json" ], - "description": "Calls the app's cached-pull feed route - `GET /tiktok/feed/offline/v2` - which answers protobuf, and returns a schema-free decode: field numbers become keys, printable length-delimited fields become strings and nested messages become objects, plus a flat list of every string leaf (`strings`), which is the fastest way to mine video ids and captions. Field numbering is inferred because TikTok publishes no schema for this message. This is the cached/offline pull variant, not the primary `POST /aweme/v2/feed/` feed already exposed as `/tiktok/mobile/feed/post`. The route is signature-validated, so it needs device-backed request signing to be configured for the deployment and fails with an error when it is not.", - "operationId": "tiktok-mobile-feed-offline", + "description": "Searches TikTok's effect catalogue by `keyword`, returning the app's full effect objects (`name`, `hint`, `icon_url`, `file_url`, `effect_id`, `types`, `tags`, `parent`/`children`, `effect_type`, `music`, `source`, `designer_id`, `schema`). The upstream is `/aweme/v1/search/effect/`; the page is unfolded to the top level (`effects`, `cursor`, `has_more`, `search_id`, `use_hot`, plus `bind_effects`/`collection` on some queries). Paging is real but needs BOTH halves of the token: pass the previous response's `cursor` and `search_id` together (measured: page 1 `cursor: 100`, page 2 with `cursor=100&search_id=...` returned the final effect with `has_more: false`; a cursor without its `search_id` returns an empty page, which the service rejects as a 400). `count` and `offset` were measured as no-ops. Measured 2026-10-21 with the pure-Go (device-free) signer: `keyword=green screen` -> 6 effects (11,831 B) + 1 on page 2, `green` -> 2, `字幕` -> 4; a keyword with no matches is a valid empty page. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-search-effects", "parameters": [ { - "description": "Pull type forwarded to the app route (measured 0 and 11; default 11)", + "description": "Effect name or text, e.g. green screen", "in": "query", - "name": "pull_type", - "type": "integer", - "x-example": 11 + "name": "keyword", + "required": true, + "type": "string", + "x-example": "green screen" }, { - "description": "Page size, bounded at 50 (upstream default when omitted)", + "description": "Accepted for shape parity; the server was measured to ignore it", "in": "query", "name": "count", "type": "integer", - "x-example": 10 + "x-example": 20 + }, + { + "description": "Next-page token from the previous response (0 = first page)", + "in": "query", + "name": "cursor", + "type": "integer", + "x-example": 100 + }, + { + "description": "Search-session token from the previous response; required together with cursor", + "in": "query", + "name": "search_id", + "type": "string", + "x-example": "20261021173221C8185FF1D4A1062AD97C" } ], "produces": [ @@ -502545,11 +518006,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.offlineFeedResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchEffectsResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Invalid input, including a cursor sent without its search_id", "schema": { "$ref": "#/definitions/app.Response" } @@ -502572,19 +518033,36 @@ "ApiKeyAuth": [] } ], - "summary": "Fetch the app's cached-pull offline feed (protobuf) decoded without a schema", + "summary": "Search TikTok effects/stickers by keyword", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/feed/post": { + "/tiktok/mobile/search/hashtags": { "get": { "consumes": [ "application/json" ], - "description": "Calls the app's primary feed route - `POST /aweme/v2/feed/`, which the Android client sends with a protobuf request body and answers with protobuf - and returns a schema-free decode: field numbers become keys, length-delimited fields become strings when printable, nested messages when they parse and base64 otherwise, plus a flat list of every string leaf. Field numbering is inferred because TikTok publishes no schema for this message; use the JSON `GET /tiktok/mobile/feed` route when you need the stable structured contract.", - "operationId": "tiktok-mobile-feed-post", + "description": "Returns the hashtag suggestions the app shows while typing in the search box, keyed by `keyword`. The upstream is `/aweme/v1/search/challengesug/`; each `sug_list` row carries `cha_name` (hashtag name), `view_count`, `use_count` and `cid` (the numeric hashtag id), so this is the discovery step for the hashtag endpoints (`hashtag info` is name-keyed). Measured 2026-10-21 with the pure-Go (device-free) signer: `keyword=lofi` returned 10 rows (`lofi` 18.2B views / 1.9M uses, then `lofiasmr`, `lofihiphop`, ...), `coffee` and `ラーメン` also returned 10 rows, and a keyword with no suggestions is a valid empty page (`sug_list: []`). `count` is accepted for shape parity but the server was measured to ignore it (5/20/100 all returned 10 rows), and the route has no paging. The route is not signature-gated, so it does not need the device-backed signer.", + "operationId": "tiktok-mobile-search-hashtags", + "parameters": [ + { + "description": "Text typed so far; the server also accepts prefixes (e.g. lofi -> lofihiphop)", + "in": "query", + "name": "keyword", + "required": true, + "type": "string", + "x-example": "lofi" + }, + { + "description": "Accepted for shape parity; the server was measured to ignore it (always up to 10 rows)", + "in": "query", + "name": "count", + "type": "integer", + "x-example": 10 + } + ], "produces": [ "application/json" ], @@ -502592,7 +518070,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.feedPostResponseDoc" + "$ref": "#/definitions/tiktokmobile.hashtagSuggestionsResponseDoc" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -502613,27 +518097,41 @@ "ApiKeyAuth": [] } ], - "summary": "Fetch the app's primary feed call (POST, protobuf) decoded without a schema", + "summary": "Hashtag suggestions for a keyword (hashtag typeahead)", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/hashtag": { + "/tiktok/mobile/search/music": { "get": { "consumes": [ "application/json" ], - "description": "Returns one hashtag's detail by name: `challenge_info` (cid, hashtag_name, desc, ...) and `stats` (view and video counts), exactly as the mobile API returns them. Hashtags are addressed by name; an internal id is rejected upstream.", - "operationId": "tiktok-mobile-hashtag", + "description": "Keyword search over sounds, returning `music_info_list` of full sound objects unmodified with `cursor`, `has_more` and `total`.", + "operationId": "tiktok-mobile-search-music", "parameters": [ { - "description": "Hashtag name without the leading #", + "description": "Search keyword", "in": "query", - "name": "name", + "name": "keyword", "required": true, "type": "string", - "x-example": "readingvlog" + "x-example": "lofi" + }, + { + "default": 20, + "description": "Sounds per page (max 50)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Result offset", + "in": "query", + "name": "offset", + "type": "integer" } ], "produces": [ @@ -502643,7 +518141,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.hashtagInfoResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchMusicResponseDoc" } }, "400": { @@ -502652,12 +518150,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Hashtag not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Rate limit exceeded", "schema": { @@ -502676,52 +518168,62 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve a TikTok hashtag", + "summary": "Search TikTok sounds on the mobile API", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/hashtag/posts": { + "/tiktok/mobile/search/photos": { "get": { "consumes": [ "application/json" ], - "description": "Lists videos for one hashtag name as the mobile app returns them (`aweme_list` with author, music and statistics), plus `cursor` and `has_more`. `sort=fresh` is the newest list and works from any measured egress; `sort=popular` is the hot list and only answers from a US egress.", - "operationId": "tiktok-mobile-hashtag-posts", + "description": "Searches TikTok photo posts with the app's own Photos-tab call and returns the page unmodified. Rows live in `search_item_list` (each row's `aweme_info` carries `image_post_info.images`, the carousel images) while `aweme_list` is an empty array; `feedback_type` is `\"photo_tab\"`. `keyword` is required; `count` is bounded at 50 (default 10, the app's value) and `offset` is forwarded as the app's row offset. `sort_type` (0 relevance, 1 like count, 3 date posted) and `publish_time` (recency window in days) are the app's filter-sheet controls. The route is signature-validated, so it needs device-backed request signing to be configured for the deployment and fails with an error instead of returning an empty page when it is not.", + "operationId": "tiktok-mobile-search-photos", "parameters": [ { - "description": "Hashtag name without the leading #", + "description": "Search keyword", "in": "query", - "name": "name", + "name": "keyword", "required": true, "type": "string", - "x-example": "readingvlog" + "x-example": "lofi" }, { - "default": "fresh", - "description": "Listing: fresh (newest) or popular (hot)", - "enum": [ - "fresh", - "popular" - ], + "description": "Rows per page, bounded at 50 (default 10)", "in": "query", - "name": "sort", - "type": "string" + "name": "count", + "type": "integer", + "x-example": 10 }, { - "default": 20, - "description": "Videos per page (max 50)", + "description": "Row offset forwarded to the app route (first page only in guest mode)", "in": "query", - "name": "count", - "type": "integer" + "name": "offset", + "type": "integer", + "x-example": 0 }, { - "default": 0, - "description": "Pagination cursor", + "description": "Sort: 0 relevance, 1 like count, 3 date posted", "in": "query", - "name": "cursor", - "type": "integer" + "name": "sort_type", + "type": "integer", + "x-example": 0 + }, + { + "description": "Recency window in days: 0 all, 1, 7, 30, 90, 180", + "in": "query", + "name": "publish_time", + "type": "integer", + "x-example": 0 + }, + { + "description": "Forwarded search source (default tab_search)", + "in": "query", + "name": "search_source", + "type": "string", + "x-example": "tab_search" } ], "produces": [ @@ -502731,7 +518233,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.hashtagPostsResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchPhotosResponseDoc" } }, "400": { @@ -502758,41 +518260,34 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve videos for a TikTok hashtag", + "summary": "Search the mobile app's photo-post tab", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/hashtags": { + "/tiktok/mobile/search/place": { "get": { "consumes": [ "application/json" ], - "description": "Searches hashtags by keyword and returns the matching hashtag objects unmodified, with `cursor` and `has_more` for paging.", - "operationId": "tiktok-mobile-hashtags", + "description": "Returns TikTok's place (POI) search results for a keyword, unmodified: each row carries `poi_name`, `poi_id`, `poi_type`, `video_count`, `poi_rating`, `poi_distance`, `poi_location`, `lat`/`lng`, `img_url`, `opening_time`, `price_level` and `parent_poi`. Useful for mapping a location or category to the places TikTok knows about, and for seeing how many videos each place carries. `keyword` is required. The page holds up to 30 rows (`count` 1-30 measured; a larger count makes the upstream answer an empty page, so the service rejects it) and the route is first-page-only — the returned `cursor` is not a reusable page token.", + "operationId": "tiktok-mobile-search-place", "parameters": [ { - "description": "Keyword to search hashtags for", + "description": "Place name or category to search for", "in": "query", "name": "keyword", "required": true, "type": "string", - "x-example": "reading" + "x-example": "pizza" }, { - "default": 20, - "description": "Results per page (max 50)", + "default": 10, + "description": "Rows to return, 1-30 measured (a larger count yields an empty upstream page and is rejected)", "in": "query", "name": "count", "type": "integer" - }, - { - "default": 0, - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "integer" } ], "produces": [ @@ -502802,7 +518297,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.hashtagSearchResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchPlaceResponseDoc" } }, "400": { @@ -502829,19 +518324,35 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok hashtags", + "summary": "Search TikTok places", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/live/effects": { + "/tiktok/mobile/search/pre-info": { "get": { "consumes": [ "application/json" ], - "description": "Returns the complete LIVE effects/sticker asset catalogue in one call: `data.assets` (2,032 assets, each with `id`, `name`, `describe`, `resource_url`, `resource_uri`, `md5`, `size`, `resource_type`, `download_type`, `model_requirements`, `sticker_asset_variant` and `video_resource_list`). There are no request parameters and no paging, and the body is large because the catalogue is complete.", - "operationId": "tiktok-mobile-live-effects", + "description": "Returns the `pre_info_id` token the app attaches to a search session (with its TTL). The token is short-lived; the app requests one before the search stream and reuses it for the following calls.", + "operationId": "tiktok-mobile-search-pre-info", + "parameters": [ + { + "description": "Seed keyword (optional; the app also requests this with an empty keyword)", + "in": "query", + "name": "keyword", + "type": "string", + "x-example": "lofi" + }, + { + "default": 20, + "description": "Suggestion count (max 50)", + "in": "query", + "name": "count", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -502849,7 +518360,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.liveEffectsResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchPreInfoResponseDoc" } }, "400": { @@ -502876,19 +518387,76 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok LIVE effects", + "summary": "Pre-search info token for a search session", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/live/gifts": { + "/tiktok/mobile/search/stream": { "get": { "consumes": [ "application/json" ], - "description": "Returns the complete LIVE gift catalogue in one call: `data.gifts` (771 gift objects with `diamond_count`, `describe`, `duration`, `gift_resources`, `gift_skins`, `batch_gift_info` and `combo`) plus the gift config and resource maps (`gift_configs`, `gifts_info`, `doodle_templates`, `gift_name_group_map`, `gift_resource_group_map`). There are no request parameters and no paging: the response is a single complete catalogue.", - "operationId": "tiktok-mobile-live-gifts", + "description": "Calls the app's primary search route - a form POST to `/aweme/v2/search/general/stream/` whose response is a stream of length-prefixed JSON frames - and returns the frames assembled: `documents` (the flattened `data` entries from the result frame, each a full 145-key video item and other document types), `frames` (every frame in arrival order, opaque, so incremental card patches are preserved), plus `cursor`, `has_more` and `search_id`. Optional `sort_type`, `publish_time` and the app's raw `filter_selected` JSON blob are forwarded to the route and were measured to change the result set (sort_type=1 gave a stable most-liked ordering, publish_time=7 a recency-limited set). This is the high-value search surface: unlike the single-document general search route it supports the app's full result set. It requires the device-backed signing service and returns a generic service-unavailable error when that signer is not configured.", + "operationId": "tiktok-mobile-search-stream", + "parameters": [ + { + "description": "Search keyword", + "in": "query", + "name": "keyword", + "required": true, + "type": "string", + "x-example": "lofi" + }, + { + "default": 10, + "description": "Requested page size (sanity bound: 50)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Row offset", + "in": "query", + "name": "offset", + "type": "integer" + }, + { + "description": "Search source hint forwarded to upstream (measured: video)", + "in": "query", + "name": "search_source", + "type": "string", + "x-example": "video" + }, + { + "default": 0, + "description": "Sort order: 0 relevance, 1 like count (stable ordering measured), 3 date posted", + "enum": [ + 0, + 1, + 3 + ], + "in": "query", + "name": "sort_type", + "type": "integer" + }, + { + "default": 0, + "description": "Recency window in days (0 = unlimited; 7 measured)", + "in": "query", + "name": "publish_time", + "type": "integer" + }, + { + "description": "Raw app filter blob as JSON; takes precedence over sort_type/publish_time", + "in": "query", + "name": "filter_selected", + "type": "string", + "x-example": "{\"sort_type\":\"1\",\"publish_time\":\"7\"}" + } + ], "produces": [ "application/json" ], @@ -502896,7 +518464,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.liveGiftsResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchStreamResponseDoc" } }, "400": { @@ -502923,19 +518491,36 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok LIVE gifts", + "summary": "Run the app's primary (streaming) general search", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/live/hashtags": { + "/tiktok/mobile/search/sug": { "get": { "consumes": [ "application/json" ], - "description": "Returns the reference set the app's \"go LIVE\" flow uses to tag a stream: the general LIVE hashtags (`hashtags`, measured 18 entries of `{id, image, namespace, title}`, where `id` 0 is the \"None\" tag), the live-studio/live-voice/third-party hashtag subsets (`live_studio_hashtags` 16, `live_voice_hashtags` 16, `third_party_hashtags` 9), the single `game_hashtag`, and a 1,500-entry game catalogue (`game_tag_list`, `game_tag_count`) where every entry carries the same 12 keys: `id`, `short_name`, `show_name`, `full_name`, `bundle_id`, `package_name`, `game_category` (`[{game_type, title}]` with PC games/Mobile games/Console games/Others), `hashtag_id`, `hashtag_list`, `gar`, `landscape` (0/1/2) and `is_new_game`. The upstream is `/webcast/room/hashtag/list/` on the webcast edge host (no origin header); the measured body is 539,361 B and byte-identical on both working webcast hosts, `language`/`count` do not change it, and there is no cursor/has_more, so it is a one-shot reference dump. Measured 2026-10-22 with the pure-Go (device-free) signer, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-live-hashtags", + "description": "Returns the mobile app's search typeahead for a seed keyword: `sug_list` of suggestions, each with `content`, `sug_type`, `word_record` (`group_id`, `words_position`, `words_content`, `words_source`) and positional fields, unmodified. Useful for query expansion and for seeing the phrases the app itself associates with a seed term. `keyword` is required; without it the upstream answers a well-formed but empty envelope.", + "operationId": "tiktok-mobile-search-sug", + "parameters": [ + { + "description": "Seed keyword to expand", + "in": "query", + "name": "keyword", + "required": true, + "type": "string", + "x-example": "lofi" + }, + { + "default": 10, + "description": "Suggestions to return (max 50)", + "in": "query", + "name": "count", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -502943,7 +518528,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.liveHashtagCatalogResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchSuggestionResponseDoc" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -502964,27 +518555,27 @@ "ApiKeyAuth": [] } ], - "summary": "LIVE category/game reference catalogue (hashtags, live-studio/voice/third-party tags, game tags)", + "summary": "Retrieve TikTok search suggestions", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/live/room": { + "/tiktok/mobile/search/tabs": { "get": { "consumes": [ "application/json" ], - "description": "Returns one LIVE room's detail, keyed by `room_id` — the numeric id that `/api/v1/tiktok/mobile/live/search` returns under `data[].lives.author.room_id`. The upstream is `/webcast/room/info/` on the webcast edge host (no origin header), captured from the running 47.4.3 app's LIVE surface and reproduced against the live gateway. The response projects the fields callers key on — `title`, `status` (2 = live), `user_count` (concurrent viewers), `create_time`, `owner` (user id, nickname, avatar), `stats` (cumulative `enter_count`/`total_user`, `watch_user_count`, `like_count`, `comment_count`, `share_count`, `follow_count`, `replay_viewers`), `stream` (playable `flv_pull_url` per resolution plus `default_resolution`/`candidate_resolution` and the HLS/RTMP URLs) and `cover` — and keeps the upstream room object unmodified in `data` (it has ~500 keys, so a partial struct would drop fields). Measured 2026-10-22 with the pure-Go (device-free) signer: one room returned 193-198 KB with 1,595-1,600 concurrent viewers, 27,916 cumulative viewers, 27,096 enters and FLV URLs for FULL_HD1/HD1/SD1/SD2. `anchor_id` is deliberately NOT forwarded: it was measured to suppress the audience-only `stats.total_user` (27,916 -> 0 on the same room). A missing, non-numeric or unknown room id answers the webcast envelope's status 10011 and is surfaced as a 400; a finished room (status 30003) is a 400 too. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-live-room", + "description": "Returns the tab keys the mobile search screen offers for a keyword (`general`, `video`, `photos`, `user`, `music`, `live`, `place`, `hashtag`), plus the gateway's `is_failed` flag. Measured on the mobile search edge with a form POST.", + "operationId": "tiktok-mobile-search-tabs", "parameters": [ { - "description": "Numeric LIVE room id from /api/v1/tiktok/mobile/live/search (data[].lives.author.room_id)", + "description": "Search keyword", "in": "query", - "name": "room_id", + "name": "keyword", "required": true, "type": "string", - "x-example": "7699174209096059678" + "x-example": "lofi" } ], "produces": [ @@ -502994,11 +518585,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.liveRoomInfoResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchTabsResponseDoc" } }, "400": { - "description": "Invalid input, an unknown/not-live room, or a finished room", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } @@ -503021,27 +518612,41 @@ "ApiKeyAuth": [] } ], - "summary": "LIVE room detail: status, viewers, owner, stream URLs, cover", + "summary": "Search tabs available for a keyword", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/live/room-by-user": { + "/tiktok/mobile/search/user": { "get": { "consumes": [ "application/json" ], - "description": "Returns the LIVE room a TikTok user is currently streaming, keyed by `user_id`. The upstream is `/webcast/room/info_by_user/` on the webcast edge host (no origin header) and returns the same room payload as `/api/v1/tiktok/mobile/live/room` (title, status, concurrent viewers, owner, cumulative stats, per-resolution FLV URLs, cover and the ~500-key room object in `data`), except that the caller addresses a user and the room id is filled from the payload (both `user_id` and `room_id` are echoed). Measured 2026-10-22 with the pure-Go (device-free) signer: `user_id=6707748031095751686` answered 184,575 B (195,220 B on the second webcast host); `anchor_id` alone answers a 57-byte empty payload, so `user_id` is the address. A user with no live room answers status 30003 \"room has finished\" and is surfaced as a 400; a non-numeric user id is a 400 (status 10011); a bare call answers a 57-byte empty success envelope, which is why this endpoint requires `user_id`. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-live-room-by-user", + "description": "Keyword search over users, returning `user_list` unmodified. Each `user_info` carries the populated creator statistics (follower_count, following_count, total_favorited, aweme_count, custom_verify). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", + "operationId": "tiktok-mobile-search-user", "parameters": [ { - "description": "Numeric TikTok user id (e.g. the owner id from a profile, video author or live search row)", + "description": "Search keyword (a username or display name)", "in": "query", - "name": "user_id", + "name": "keyword", "required": true, "type": "string", - "x-example": "6707748031095751686" + "x-example": "mrbeast" + }, + { + "default": 20, + "description": "Users per page (max 50)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Pagination cursor", + "in": "query", + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -503051,11 +518656,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.liveRoomInfoResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchUsersResponseDoc" } }, "400": { - "description": "Invalid input, or the user has no live room right now", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } @@ -503078,19 +518683,19 @@ "ApiKeyAuth": [] } ], - "summary": "LIVE room by user: the room a user is currently streaming", + "summary": "Search TikTok users on the mobile API", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/live/search": { + "/tiktok/mobile/search/videos": { "get": { "consumes": [ "application/json" ], - "description": "Searches the mobile app's LIVE surface by keyword: `data` of `{type, anchor}` entries with `feedback_type` set to `live`, plus `cursor` and `has_more`. `keyword` is required; without it the gateway answers a valid but empty envelope. This is the API's first LIVE endpoint.", - "operationId": "tiktok-mobile-live-search", + "description": "Keyword search over videos. The videos are in `aweme_list` (each entry is the full video object); `search_item_list` is kept for compatibility and is `null`. `cursor`, `has_more` and `search_id` accompany the page. `keyword` is required, `count` is bounded at 50, `offset` is a row offset and `search_id` (returned by a previous page) scopes paging to the same search session. `sort_type` is one of `0` (relevance), `1` (like count) or `3` (date posted); `publish_time` is a recency window in days between `0` and `365` (the app uses `0`, `1`, `7`, `30`, `90`, `180`). This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", + "operationId": "tiktok-mobile-search-videos", "parameters": [ { "description": "Search keyword", @@ -503101,11 +518706,50 @@ "x-example": "lofi" }, { - "default": 0, - "description": "Results to request (0 = app default, max 50)", + "default": 10, + "description": "Rows per page (sanity bound: 50)", "in": "query", "name": "count", "type": "integer" + }, + { + "default": 0, + "description": "Row offset; pass search_id with a non-zero offset", + "in": "query", + "name": "offset", + "type": "integer" + }, + { + "default": 0, + "description": "Sort order: 0 relevance, 1 like count, 3 date posted", + "enum": [ + 0, + 1, + 3 + ], + "in": "query", + "name": "sort_type", + "type": "integer" + }, + { + "default": 0, + "description": "Date-posted window in days (0 to 365; the app uses 0, 1, 7, 30, 90, 180)", + "in": "query", + "name": "publish_time", + "type": "integer" + }, + { + "default": "tab_search", + "description": "Search source forwarded as the app sends it", + "in": "query", + "name": "search_source", + "type": "string" + }, + { + "description": "search_id returned by a previous page of the same search", + "in": "query", + "name": "search_id", + "type": "string" } ], "produces": [ @@ -503115,7 +518759,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.liveSearchResponseDoc" + "$ref": "#/definitions/tiktokmobile.searchVideosResponseDoc" } }, "400": { @@ -503142,19 +518786,36 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok LIVE streams", + "summary": "Search TikTok videos on the mobile API (video tab)", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/live/tabs": { + "/tiktok/mobile/translation/description": { "get": { "consumes": [ "application/json" ], - "description": "Returns the app's LIVE tab catalogue: `data[]` holds one entry per tab with the tab's `id`, `name`, `style`, `enable`/`event` flags and the exact `url`/`inter_url` feed template the client calls for that tab. The measured tab 1 (\"live\") points at `/webcast/feed/?content_type=0&style=2&channel_id=21&sub_channel_id=0&tab_id=1&type=live&sub_type=live&req_type=0&cate_id=0` on `webcast.tiktokv.com`. This closes the route round 553 could not find a host for; it is served by the webcast edge hosts (non-webcast hosts answer 403) and is one of the few LIVE routes that answers device-free: measured with the pure-Go placeholder signer as well as the real device signer, so it does not need the device-backed signing service.", - "operationId": "tiktok-mobile-live-tabs", + "description": "Translates one video's caption with the app's own translation route and returns the translated caption both as the app's raw markup (`translated_client_text.client_text_v2.markup_text`, where line breaks are `
` and hashtags are wrapped in `...`) and as plain text in `text`. `item_id` is required; `target_lang` defaults to `en` and accepts the app's language codes (`en`, `ja`, `pt-BR`, `zh-Hans`, ...). The route is signature-validated, so it needs device-backed request signing to be configured for the deployment and fails with an error instead of returning a stub when it is not.", + "operationId": "tiktok-mobile-translation-description", + "parameters": [ + { + "description": "Video id to translate", + "in": "query", + "name": "item_id", + "required": true, + "type": "string", + "x-example": "7650052642089225493" + }, + { + "description": "Target language code (default en)", + "in": "query", + "name": "target_lang", + "type": "string", + "x-example": "en" + } + ], "produces": [ "application/json" ], @@ -503162,7 +518823,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.liveTabsResponseDoc" + "$ref": "#/definitions/tiktokmobile.translationDescriptionResponseDoc" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -503183,26 +518850,33 @@ "ApiKeyAuth": [] } ], - "summary": "Fetch the LIVE tab catalogue", + "summary": "Translate one TikTok video caption", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/beats": { + "/tiktok/mobile/trending/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns the mobile app's beats/songs chart unmodified: `music_list` of the same full sound objects the pick chart returns (`id_str`, `title`, `user_count`, `album`, `artists`, `cover_*`), ordered as the app's beats list. The measured envelope carries no paging fields.", - "operationId": "tiktok-mobile-music-beats", + "description": "Returns the discover-category feed unmodified: each `category_list` entry is `{aweme_list, category_type, challenge_info, click_track_url_list, desc, track_url_list}`, with `cursor` and `has_more` for paging.", + "operationId": "tiktok-mobile-trending-categories", "parameters": [ { - "default": 0, - "description": "Accepted for compatibility; not measured to change the page (max 50)", + "default": 20, + "description": "Categories per page (max 50)", "in": "query", "name": "count", "type": "integer" + }, + { + "default": 0, + "description": "Pagination cursor", + "in": "query", + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -503212,7 +518886,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicBeatsSongsResponseDoc" + "$ref": "#/definitions/tiktokmobile.categoryListResponseDoc" } }, "400": { @@ -503239,40 +518913,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok music beats", + "summary": "Retrieve TikTok trending categories", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/chart": { + "/tiktok/mobile/trending/effects": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of the app's regional sound chart: `chart_info` (chart id and update time), `cover_image_url` and a ranked `music_list` whose rows are a `music_info` sound object plus a `trend` entry; page with the returned `cursor` while `has_more` is true. `chart_region` selects the regional chart (for example US or GB; omitting it returns the default chart). This is distinct from `music/pick`, which returns the creation panel's pick list with banners. Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", - "operationId": "tiktok-mobile-music-chart", + "description": "Returns the effect/sticker discovery feed unmodified: `aweme_list` of full video objects, each additionally carrying `stickers` and `sticker_detail`, plus `feed_session_id`, `cursor` and `has_more`.", + "operationId": "tiktok-mobile-trending-effects", "parameters": [ { - "description": "2-3 letter region code for the regional chart (e.g. US, GB); omit for the default chart", + "default": 20, + "description": "Videos per page (max 50)", "in": "query", - "name": "chart_region", - "type": "string", - "x-example": "US" + "name": "count", + "type": "integer" }, { "default": 0, - "description": "Paging token from the previous response", + "description": "Pagination cursor", "in": "query", "name": "cursor", "type": "integer" - }, - { - "default": 10, - "description": "Rows per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" } ], "produces": [ @@ -503282,7 +518949,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicChartResponseDoc" + "$ref": "#/definitions/tiktokmobile.stickerDiscoverResponseDoc" } }, "400": { @@ -503309,19 +518976,42 @@ "ApiKeyAuth": [] } ], - "summary": "List a regional TikTok sound chart", + "summary": "Retrieve TikTok trending effects", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/choices": { + "/tiktok/mobile/user/followers": { "get": { "consumes": [ "application/json" ], - "description": "Returns the app's \"music choices\" list: the recommended sounds it offers on the video-creation page. The upstream is `/aweme/v1/music/choices/`; each `music_list` entry is the same full sound object the chart routes return (title, album, artists, covers, play URL, duration, ...). Measured 2026-10-21 with the pure-Go (device-free) signer: 56,078 B / 6 full sound objects on one call and 7 on later calls (the same six at the front), and the payload carries NO paging fields (no cursor/has_more), so this is a one-shot recommendation list. The measured `item_id`, `music_id`, `count` and `scene` parameters did not deterministically change the list — the recommendations rotate — so none is exposed. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-music-choices", + "description": "Lists one creator's followers: `followers` holds the full user objects, `total` is the account's follower total, and the envelope also carries `max_time`/`min_time`/`offset`, `next_page_token` and `myself_user_id`. `count` is the requested page size (20 and 30 were honoured). Measured caveat: the first pages came back with `has_more` false even though `total` reported 2,774,249, and the returned time/offset probes did not advance the window - treat those paging fields as observed values, not as a guaranteed paging contract. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", + "operationId": "tiktok-mobile-user-followers", + "parameters": [ + { + "description": "Creator user id", + "in": "query", + "name": "user_id", + "required": true, + "type": "string", + "x-example": "7141011492116005914" + }, + { + "description": "Followers per page (sanity bound: 50; omitted = app default, not measured)", + "in": "query", + "name": "count", + "type": "integer" + }, + { + "default": 0, + "description": "Page token: the max_time returned by the previous page (omitted at 0 = first page)", + "in": "query", + "name": "cursor", + "type": "integer" + } + ], "produces": [ "application/json" ], @@ -503329,7 +519019,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicChoicesResponseDoc" + "$ref": "#/definitions/tiktokmobile.userFollowersResponseDoc" + } + }, + "400": { + "description": "Invalid input", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -503350,33 +519046,41 @@ "ApiKeyAuth": [] } ], - "summary": "Recommended sounds for video creation", + "summary": "Retrieve the followers of a TikTok creator", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/collection-list": { + "/tiktok/mobile/user/following": { "get": { "consumes": [ "application/json" ], - "description": "Returns the app's music-collection LIST (`mc_list` of collection objects with covers), the browse list of curated music collections. This is a different route from `/api/v1/tiktok/mobile/music/collections`, which is the collection FEED (`mcf_list`, with each entry's music inline). The upstream is `/aweme/v1/music/collection/`. Unlike the feed, this route PAGES for real: `count` is honoured (measured 1 -> 1 item with `cursor: 1, has_more: 1`; 5 -> 5 items with `cursor: 5`; 10/100 -> all 8 collections) and `cursor` advances (measured `count=5&cursor=5` -> the remaining 3 with `has_more: 0`). A negative count answers upstream status 5, which is rejected locally. Measured 2026-10-21 with the pure-Go (device-free) signer: 8 collections total. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-music-collection-list", + "description": "Lists the accounts one creator follows (`followings`, full 120-key user objects) with the mobile API's paging envelope: `total`, `has_more`/`rec_has_more`, `max_time`/`min_time` and `next_page_token`. Some profiles hide their following list; that answers upstream `status_code 3002060` (\"Profile user is hiding following list\"), which surfaces as a typed upstream error. Requires the device-backed signing service and returns a generic service-unavailable error when it is not configured.", + "operationId": "tiktok-mobile-user-following", "parameters": [ { - "description": "Page size: honoured (1-50 measured, capped by the collection set)", + "description": "Creator's numeric user id", + "in": "query", + "name": "user_id", + "required": true, + "type": "string", + "x-example": "7343380121988285482" + }, + { + "default": 20, + "description": "Rows per page (sanity bound: 50)", "in": "query", "name": "count", - "type": "integer", - "x-example": 5 + "type": "integer" }, { - "description": "Next-page token from the previous response (0 = first page)", + "default": 0, + "description": "Page token: max_time returned by the previous page (omitted at 0)", "in": "query", "name": "cursor", - "type": "integer", - "x-example": 5 + "type": "integer" } ], "produces": [ @@ -503386,7 +519090,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicCollectionListResponseDoc" + "$ref": "#/definitions/tiktokmobile.userFollowingResponseDoc" } }, "400": { @@ -503413,33 +519117,41 @@ "ApiKeyAuth": [] } ], - "summary": "Music collection list (paged browse)", + "summary": "Retrieve the accounts a TikTok creator follows", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/collections": { + "/tiktok/mobile/user/original-effects": { "get": { "consumes": [ "application/json" ], - "description": "Returns the mobile app's sound-collection feed unmodified: `mcf_list`, where each entry is `{collection, music_list}` (the measured default page holds 8 entries), plus `cursor` and `has_more`. This route is first-page only: the returned `cursor` is not a reusable page token, so callers should not page with it.", - "operationId": "tiktok-mobile-music-collections", + "description": "Lists the effects one creator published unmodified in `effect`: each row carries the `effect_id`, `name`, `desc`, `icon_url`, `effect_source`, attributions, linked anchors and moderation status, with cursor paging (`cursor`/`has_more`). `user_id` must be the numeric uid. A creator with no published effects returns an empty list. Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", + "operationId": "tiktok-mobile-user-original-effects", "parameters": [ { - "default": 0, - "description": "Collections to request (0 = app default, max 50)", + "description": "Creator's numeric uid", "in": "query", - "name": "count", - "type": "integer" + "name": "user_id", + "required": true, + "type": "string", + "x-example": "107955" }, { "default": 0, - "description": "Accepted for shape compatibility only; not a verified page token", + "description": "Paging token from the previous response", "in": "query", "name": "cursor", "type": "integer" + }, + { + "default": 10, + "description": "Effects per page (max 50)", + "in": "query", + "name": "count", + "type": "integer" } ], "produces": [ @@ -503449,7 +519161,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicCollectionFeedResponseDoc" + "$ref": "#/definitions/tiktokmobile.userOriginalEffectsResponseDoc" } }, "400": { @@ -503476,27 +519188,41 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok music collections", + "summary": "List a creator's original TikTok effects", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/detail": { + "/tiktok/mobile/user/original-music": { "get": { "consumes": [ "application/json" ], - "description": "Returns one sound's page: `music_info` (id, title, author, `user_count`, duration, cover renditions, bound challenge and the other sound fields), its chart rank, similar sounds, recommendation blocks and the behind-the-song flag. `music_id` is required. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", - "operationId": "tiktok-mobile-music-detail", + "description": "Lists the \"original sounds\" groups of one creator unmodified in `groups`: each group carries the `music` sound object, a `similar_music_list` and the `source_music_id`; the envelope also carries the creator's `honor_label`, a flat `music` list and cursor paging (`cursor`/`has_more`). `user_id` must be the numeric uid (a `sec_user_id` alone is rejected upstream with `status_code 5`). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", + "operationId": "tiktok-mobile-user-original-music", "parameters": [ { - "description": "Sound id", + "description": "Creator's numeric uid", "in": "query", - "name": "music_id", + "name": "user_id", "required": true, "type": "string", - "x-example": "7329791746055080709" + "x-example": "107955" + }, + { + "default": 0, + "description": "Paging token from the previous response", + "in": "query", + "name": "cursor", + "type": "integer" + }, + { + "default": 10, + "description": "Groups per page (max 50)", + "in": "query", + "name": "count", + "type": "integer" } ], "produces": [ @@ -503506,7 +519232,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicDetailResponseDoc" + "$ref": "#/definitions/tiktokmobile.userOriginalMusicResponseDoc" } }, "400": { @@ -503533,33 +519259,53 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve one TikTok sound", + "summary": "List a creator's original TikTok sounds", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/pick": { + "/tiktok/mobile/user/posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns the mobile app's sound pick/chart list: `music_list` of full sound objects (id, title, author, user_count, duration, ...) plus the chart list `mc_list` and `radio_cursor`.", - "operationId": "tiktok-mobile-music-pick", + "description": "Lists one creator's videos newest-first: `aweme_list` holds the full video objects (author, statistics, music, video renditions, anchors), and the page is positioned by `max_cursor`/`min_cursor` with `has_more`. Paging is by `max_cursor`: pass the `max_cursor` returned by the previous page back as `cursor`. `count` is the requested page size (the app default returned 9 items; 20 and 30 were honoured). This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", + "operationId": "tiktok-mobile-user-posts", "parameters": [ { - "default": 20, - "description": "Sounds per page (max 50)", + "description": "Creator user id; one of user_id or sec_user_id is required (user_id wins if both are sent)", + "in": "query", + "name": "user_id", + "type": "string", + "x-example": "7141011492116005914" + }, + { + "description": "Creator sec_user_id; one of user_id or sec_user_id is required", + "in": "query", + "name": "sec_user_id", + "type": "string" + }, + { + "default": 9, + "description": "Videos per page (sanity bound: 50; omitted = app default, measured 9)", "in": "query", "name": "count", "type": "integer" }, { "default": 0, - "description": "Pagination cursor", + "description": "Page token: the max_cursor returned by the previous page (omitted at 0 = first page)", "in": "query", "name": "cursor", "type": "integer" + }, + { + "default": 0, + "description": "Sort type (0 = the app default; always sent, non-zero values are forwarded as given)", + "in": "query", + "name": "sort_type", + "type": "integer" } ], "produces": [ @@ -503569,7 +519315,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicPickResponseDoc" + "$ref": "#/definitions/tiktokmobile.userPostsResponseDoc" } }, "400": { @@ -503596,52 +519342,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok sound chart picks", + "summary": "Retrieve the videos posted by a TikTok creator", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/posts": { + "/tiktok/mobile/user/profile": { "get": { "consumes": [ "application/json" ], - "description": "Lists the videos that use one sound, as the mobile app returns them: `aweme_list` of full video objects (with `author`, `statistics` and `added_sound_music_info`), plus `cursor` and `has_more`. `music_id` is required. `count` is accepted but ignored upstream - the server returns its own default page, so page with `cursor`.", - "operationId": "tiktok-mobile-music-posts", + "description": "Returns one creator's profile page: `common` (the identity, account and relation blocks: user_profile_info, user_account_info, user_relation_info, user_statics_info with the follower/following/heart counters), plus the `header`, `nav_bar` and `profile_tab` layout components and the app's status/provenance fields. Address the creator by `user_id` or by `sec_user_id`; at least one is required and `user_id` wins when both are supplied. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", + "operationId": "tiktok-mobile-user-profile", "parameters": [ { - "description": "Sound (music) id", + "description": "Creator user id", "in": "query", - "name": "music_id", - "required": true, + "name": "user_id", "type": "string", - "x-example": "6799585653702019073" - }, - { - "default": "fresh", - "description": "Listing: fresh (newest, default) or popular (app canonical music.posts list; requires the device-backed signer)", - "enum": [ - "fresh", - "popular" - ], - "in": "query", - "name": "sort", - "type": "string" - }, - { - "default": 0, - "description": "Accepted for compatibility; the server ignores it (max 50)", - "in": "query", - "name": "count", - "type": "integer" + "x-example": "7141011492116005914" }, { - "default": 0, - "description": "Pagination cursor", + "description": "Creator sec_user_id (alternate identifier; use instead of user_id)", "in": "query", - "name": "cursor", - "type": "integer" + "name": "sec_user_id", + "type": "string", + "x-example": "MS4wLjABAAAAexample" } ], "produces": [ @@ -503651,7 +519378,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicFreshAwemeResponseDoc" + "$ref": "#/definitions/tiktokmobile.userProfileResponseDoc" } }, "400": { @@ -503678,41 +519405,26 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve videos for a TikTok sound", + "summary": "Retrieve a TikTok creator profile", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/related": { + "/tiktok/mobile/user/recommendations": { "get": { "consumes": [ "application/json" ], - "description": "Returns sounds related to one video: `music_list` of full sound objects, `recall_info_list` explaining why each was recalled, `similar_song_ids`, plus `cursor` and `has_more`.", - "operationId": "tiktok-mobile-music-related", + "description": "Returns the app's suggested creators for the Following page unmodified: `user_list` entries are `{user, aweme_list}` where `user` is the full creator projection (uid, sec_uid, nickname, signature, avatars, follower/following counts, verification and privacy flags) and `aweme_list` holds up to three recent videos, so this is a creator-discovery surface rather than a bare id list. The route has no paging fields and returns one page of 13-17 creators (fresh recommendations differ per call). `count` is accepted for parity but the gateway was measured to ignore it. The route is not signature-value gated, so unlike the profile/posts routes it does not need the device-backed signer.", + "operationId": "tiktok-mobile-user-recommendations", "parameters": [ { - "description": "Video id to find related sounds for", - "in": "query", - "name": "aweme_id", - "required": true, - "type": "string", - "x-example": "7681236055831416084" - }, - { - "default": 20, - "description": "Sounds per page (max 50)", + "description": "Requested page size; forwarded when set, but the gateway was measured to ignore it", "in": "query", "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "integer" + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -503722,7 +519434,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.musicRelatedResponseDoc" + "$ref": "#/definitions/tiktokmobile.userRecommendationsResponseDoc" } }, "400": { @@ -503749,33 +519461,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve sounds related to a TikTok video", + "summary": "Recommended creators on the mobile app's Following page", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/music/trending": { + "/tiktok/mobile/video/detail": { "get": { "consumes": [ "application/json" ], - "description": "Returns the mobile app's trending sound chart: `music_list` of full sound objects (`id_str`, `title`, `user_count`, `album`, `artists`, `cover_large`/`cover_medium`/`cover_thumb`, `binded_challenge_id`, `collect_stat`, `audition_duration`) unmodified, plus `cursor` and `has_more` for paging. This is the chart behind `music.trending`.", - "operationId": "tiktok-mobile-music-trending", + "description": "Returns one video's full item: author, statistics (`play_count`, `digg_count`, `comment_count` and the rest), music, video renditions, anchors and the other item fields - the complete object, not a projection. `aweme_id` is required. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", + "operationId": "tiktok-mobile-video-detail", "parameters": [ { - "default": 20, - "description": "Sounds per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Pagination cursor", + "description": "Video id", "in": "query", - "name": "cursor", - "type": "integer" + "name": "aweme_id", + "required": true, + "type": "string", + "x-example": "7329791719535283462" } ], "produces": [ @@ -503785,7 +519491,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.hotMusicResponseDoc" + "$ref": "#/definitions/tiktokmobile.videoDetailResponseDoc" } }, "400": { @@ -503812,34 +519518,35 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok trending sounds", + "summary": "Retrieve one TikTok video", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/mv/videos": { + "/tiktok/mobile/video/subtitles": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of an MV channel feed, the app's music-video (\"MV\") tab. The upstream is `/aweme/v1/mv/aweme/`; `mv_id` is a small numeric CHANNEL index, NOT a video id — measured ids 0-10 each returned a 15-video page of full aweme objects (1.05-1.24 MB), while 100 returned a valid empty page and a real aweme id returned an empty list. The server's page size is 15 and `count` was measured IGNORED (`count=5` and `count=10` both returned 15 items), so `count` is not exposed; page with `cursor`. The returned `cursor` is a reusable next-page token (measured page 1 `cursor: 18, has_more: 1`; `cursor=18` returned a fresh page with `cursor: 38, has_more: 1`). The envelope's `top_awemes` (pinned entries), `original_aweme_id`, `page_extra` and `extra`/`log_pb` are kept as measured. Measured 2026-10-22 with the pure-Go (device-free) signer, so it does not need the device-backed signer. A missing or non-numeric `mv_id` is a 400; an unknown numeric channel is a valid empty page.", - "operationId": "tiktok-mobile-mv-videos", + "description": "Returns one video's own captions translated into the requested language, as TikTok's caption/language (`cla`) service serves them. The response carries the track twice: `webvtt` is the upstream WebVTT text verbatim, and `cues` is the same track parsed into `{start_ms, end_ms, start, end, text}` records so a caller does not have to implement WebVTT. `video_id` is the aweme id returned by the feed, search, profile-posts and hashtag endpoints. Measured 2026-10-21 with the pure-Go (device-free) signer: the Korean-caption video 7696141388324293918 answered 11 English cues for `language=en`, and the same video answered Japanese, Chinese, Spanish, French, German, Korean, Portuguese, Russian, Arabic, Hindi, Indonesian, Thai, Vietnamese, Turkish and Italian tracks; a Portuguese-lyrics video answered an 18,494-character English track (240 cues). Track size is a snapshot rather than a contract (the upstream re-translates from a cache), so assert a non-empty track in the requested language, not a byte count. The route is not signature-gated, so it does not need the device-backed signer. A video with no captions answers 400 (upstream status 5); a nonexistent video answers 500 (upstream status 4).", + "operationId": "tiktok-mobile-video-subtitles", "parameters": [ { - "description": "MV channel index (small integer; measured 0-10 populated, 100 empty)", + "description": "Numeric id of the video (aweme id)", "in": "query", - "name": "mv_id", + "name": "video_id", "required": true, "type": "string", - "x-example": "1" + "x-example": "7696141388324293918" }, { - "description": "Next-page token from the previous response (0 = first page)", + "description": "Target language code: ar, de, en, es, fr, hi, id, it, ja, ko, pt, ru, th, tr, vi, zh", "in": "query", - "name": "cursor", - "type": "integer", - "x-example": 0 + "name": "language", + "required": true, + "type": "string", + "x-example": "en" } ], "produces": [ @@ -503849,11 +519556,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.mvFeedResponseDoc" + "$ref": "#/definitions/tiktokmobile.videoSubtitlesResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Invalid input, or the video has no captions", "schema": { "$ref": "#/definitions/app.Response" } @@ -503876,78 +519583,33 @@ "ApiKeyAuth": [] } ], - "summary": "MV channel feed: the app's music-video tab, paged", + "summary": "Video captions translated into a target language", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/place/detail": { + "/tiktok/popular-trend/country-industry-meta": { "get": { "consumes": [ "application/json" ], - "description": "Returns one place detail page, keyed by the `poi_id` that the place search endpoint returns. The upstream is TikTok's server-driven UI (`/tiktok/poi/slash/v1`) frame stream, assembled here into the component map of the place-detail screen: `food_head_info` (place name, formatted address, category, phone, coordinates, opening hours, rating/score with mention count, price range, tags and photo album), `poi_top_videos` (top videos strip), `poi_limited_post` (posts about the place: full video items plus `aweme_cursor`/`has_more_aweme`), `poi_review` (review preview with `has_more`) and `ai_summary` when the place has one. `nodes` is opaque and complete, `frames` keeps the raw ordered frames, and the typed counters (`top_video_count`, `post_count`, `post_cursor`, `has_more_posts`, `review_count`, `has_more_reviews`) are convenience projections. The measured page-size controls are forwarded with the app's defaults but the server applies its own bounds. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-place-detail", - "parameters": [ - { - "description": "Place id from the place search endpoint", - "in": "query", - "name": "poi_id", - "required": true, - "type": "string", - "x-example": "42203861086875992" - }, - { - "description": "Review preview size forwarded upstream (default 20, bounded at 50)", - "in": "query", - "name": "review_count", - "type": "integer", - "x-example": 20 - }, - { - "description": "Review cursor forwarded upstream (default 0)", - "in": "query", - "name": "review_cursor", - "type": "integer", - "x-example": 0 - }, - { - "description": "Posts page size forwarded upstream (default 9, bounded at 50)", - "in": "query", - "name": "merged_count", - "type": "integer", - "x-example": 9 - }, - { - "description": "Top-videos cursor forwarded upstream (default 0)", - "in": "query", - "name": "video_cursor", - "type": "integer", - "x-example": 0 - }, - { - "description": "Forwarded analytics origin (default search_places)", - "in": "query", - "name": "enter_from", - "type": "string", - "x-example": "search_places" - } - ], + "description": "Lists the country and industry filter values used by the TikTok Creative Center popular-trend endpoints. Countries have an `id` such as `AR` and a name; industries have a numeric `id` and a name such as Apparel & Accessories. A maintained fallback list is returned if TikTok's own metadata is unavailable.", + "operationId": "tiktok-popular-trend-country-industry-meta", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.placeDetailResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/populartrend.countryIndustryMetaResponseDoc" } }, "429": { @@ -503968,27 +519630,28 @@ "ApiKeyAuth": [] } ], - "summary": "Place (POI) detail from the mobile app's Places surface", + "summary": "Retrieve TikTok popular-trend country and industry metadata", "tags": [ - "TikTok" + "TikTok", + "TikTok Popular Trend" ] } }, - "/tiktok/mobile/place/info": { + "/tiktok/post/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one place's compact record, keyed by the `poi_id` that the place search endpoint returns. The upstream is TikTok's POI read (`/tiktok/poi/get/v1`), the record behind a place card: `name`, `address`, `category`, `average_price`, `latitude`/`longitude`, `city_code`/`region_code`, `review_score` with `review_count`/`no_rating`, `video_count`, `favorite_count`, `opening_hours`/`opening_status`, `cover`, `share_url`/`share_desc` and `parent_poi`, plus the upstream POI object unmodified in `place` so a richer field is never lost. This is the cheap lookup to use instead of the ~1 MB slash detail page when only the place record is needed. A nonexistent id answers 400 (the upstream business status 3009009 \"poi not exist\" is a caller error, not an outage). Measured 2026-10-21 with the pure-Go (device-free) signer: 4,594 B for a coffee shop (score 4.7 / 2 reviews, price \"$\", hours \"8:00 AM – 5:00 PM\", 11 videos), 4,623 B for a second location (score 4.8 / 13 reviews). The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-place-info", + "description": "Returns TikTok's detail record for one video by video id. `itemInfo.itemStruct` holds the video's description, the author's profile and the author's statistics (such as followers, following and hearts) along with the rest of TikTok's video object; `shareMeta` holds the share title and description.", + "operationId": "tiktok-post", "parameters": [ { - "description": "Place id from the place search endpoint", - "in": "query", - "name": "poi_id", + "description": "TikTok video id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "42203861086875992" + "x-example": "7444278905264983342" } ], "produces": [ @@ -503997,12 +519660,18 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.placeInfoResponseDoc" + "$ref": "#/definitions/tiktok.postResponseDoc" } }, "400": { - "description": "Invalid input, or the place id does not exist", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } @@ -504025,47 +519694,46 @@ "ApiKeyAuth": [] } ], - "summary": "Compact place (POI) record: address, coordinates, rating, hours, counters", + "summary": "Retrieve TikTok video details", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/place/media": { + "/tiktok/posts": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a place's mixed video/photo grid unmodified in `item_list`: each row carries an `aweme` video object or a photo entry plus `media_type`/`item_type`, an `aweme_cover`, topic tags and a crop cover. `next_cursor` is the opaque paging token to pass back as `cursor` (send the returned `data_version` with it; the endpoint defaults it to `v1`). `size` is the app's page hint (default 6, max 30; the server caps larger values). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", - "operationId": "tiktok-mobile-place-media", + "description": "Lists posts from a TikTok profile identified by `secUid`. `sort_type` is `0` latest (default), `1` popular or `2` oldest. `cursor` defaults to 0. The response has `itemList`, `hasMore` and a `cursor` to pass back to fetch the next page.", + "operationId": "tiktok-profile-post", "parameters": [ { - "description": "Place id from the place search/detail endpoints", + "description": "TikTok secUid for the profile", "in": "query", - "name": "poi_id", + "name": "secUid", "required": true, "type": "string", - "x-example": "42203861086875992" + "x-example": "MS4wLjABAAAAT4vq3vsh9X-Vb_WtV6tz4QWTbKjliTKCiK5DqnJNtQEA2RUveHb7UdnL7xgPK2HB" }, { - "description": "Opaque next_cursor token from the previous response", + "default": 0, + "description": "Pagination cursor", "in": "query", "name": "cursor", - "type": "string" - }, - { - "default": 6, - "description": "Rows per page hint (max 30)", - "in": "query", - "name": "size", "type": "integer" }, { - "description": "Paging data version carried with cursor (defaults to v1)", + "default": 0, + "description": "Sort mode: 0 latest, 1 popular, 2 oldest", + "enum": [ + 0, + 1, + 2 + ], "in": "query", - "name": "data_version", - "type": "string", - "x-example": "v1" + "name": "sort_type", + "type": "integer" } ], "produces": [ @@ -504074,8 +519742,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.placeMediaResponseDoc" + "$ref": "#/definitions/tiktok.profilePostResponseDoc" } }, "400": { @@ -504102,27 +519776,27 @@ "ApiKeyAuth": [] } ], - "summary": "List a TikTok place's mixed media", + "summary": "Retrieve posts from a TikTok profile", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/place/photos": { + "/tiktok/profile/{handler}": { "get": { "consumes": [ "application/json" ], - "description": "Returns one place's photo album, keyed by the `poi_id` that the place search endpoint returns. The upstream is `/tiktok/poi/picture_album/v1`: `categories` holds each album tab (`name`, `pic_tab_typecode`, `pictures` of bare image URL lists and `pictures_v2`, the same photos with `author` attribution, `pic_id`, `source` and origin/compressed URL info), `photo_count` sums the categories' pictures, and `title` is the app's own header. Measured 2026-10-21 with the pure-Go (device-free) signer: one place answered 5,368 B, title \"Gallery (3)\", 1 category with 3 photos whose `pictures_v2` entries name the Google-places contributor; another answered 24,196 B with more photos. The album is one-shot: `count` and `pic_tab_typecode` were measured and did not change the page. A nonexistent id answers 500 (the upstream answers status 4 \"Server is currently unavailable\" on this route, unlike the poi-not-exist code the other place routes use). The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-place-photos", + "description": "Returns a public TikTok profile by `handler`, the username without the leading `@`. The `user` object has the id, `uniqueId`, nickname, signature, verified and private flags, region, language, avatar, bio link and `secUid`; `stats` has follower, following, heart, video and friend counts. A missing, deleted or banned handle returns 404.", + "operationId": "tiktok-profile", "parameters": [ { - "description": "Place id from the place search endpoint", - "in": "query", - "name": "poi_id", + "description": "TikTok handle without the leading @", + "in": "path", + "name": "handler", "required": true, "type": "string", - "x-example": "42203861086875992" + "x-example": "chatgpt" } ], "produces": [ @@ -504131,8 +519805,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.placePhotosResponseDoc" + "$ref": "#/definitions/tiktok.profileResponseDoc" } }, "400": { @@ -504141,6 +519821,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Profile not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Rate limit exceeded", "schema": { @@ -504148,7 +519834,7 @@ } }, "500": { - "description": "Internal server error, including a place id that does not resolve", + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -504159,52 +519845,41 @@ "ApiKeyAuth": [] } ], - "summary": "Place photo album with per-photo attribution", + "summary": "Retrieve a TikTok profile", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/place/reviews": { + "/tiktok/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of a place's reviews (`reviews`, full review objects: author, content, rating, tags, `server_param`) together with the score summary (`review_summary`: score and score range), the review tags (`review_tags`) and the paging token (`cursor`/`has_more`). The route uses the review-landing tab scene (`scene=7`) that the app's own review interface sends; without that scene the upstream rejects the request with `status_code 5`, which is why this family was previously unusable. `poi_id` is the place id from the place search/detail endpoints. Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", - "operationId": "tiktok-mobile-place-reviews", + "description": "Searches TikTok videos for `keyword`. `cursor` defaults to 0 and `count` defaults to 20, capped at 50. The response has the matching video items, a `cursor` and `has_more` for paging. An empty, blocked or malformed result from TikTok returns an upstream error.", + "operationId": "tiktok-search", "parameters": [ { - "description": "Place id from the place search/detail endpoints", + "description": "Search keyword", "in": "query", - "name": "poi_id", + "name": "keyword", "required": true, "type": "string", - "x-example": "42203861086875992" + "x-example": "dance" }, { "default": 0, - "description": "Paging token from the previous response", + "description": "Pagination cursor", "in": "query", "name": "cursor", "type": "integer" }, { "default": 20, - "description": "Reviews per page (max 30)", + "description": "Result count, clamped to 50", "in": "query", "name": "count", "type": "integer" - }, - { - "default": 1, - "description": "Sort order: 1 = default, 2 = recent", - "enum": [ - 1, - 2 - ], - "in": "query", - "name": "sort_type", - "type": "integer" } ], "produces": [ @@ -504213,8 +519888,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.placeReviewsResponseDoc" + "$ref": "#/definitions/tiktok.searchResponseDoc" } }, "400": { @@ -504241,41 +519922,41 @@ "ApiKeyAuth": [] } ], - "summary": "List a TikTok place's reviews", + "summary": "Search TikTok videos", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/place/videos": { + "/tiktok/search/hashtag": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of the videos posted at a place, keyed by the `poi_id` that the place search endpoint returns. The upstream is `/tiktok/poi/video/list/v1`: `aweme_list` holds the app's full video objects (id, description, author, statistics, media URLs, music, anchors, ...) and `item_count` is this page's size. Page with `cursor`: the returned `cursor` is a reusable next-page token (measured page 1 `cursor: 20` with `has_more: 1`, page 2 `cursor: 40`), never with arithmetic on `count`. `count` is a page-size hint, not a strict size: 1/2/5 returned exactly that many items on the first page, a later page returned 8 for count=5, and 10/20/50 were all server-capped at 17. Measured 2026-10-21 with the pure-Go (device-free) signer: 11 videos (940-944 KB) on one place, 17 videos (1.4 MB) on another. The route exposes no sort control: `sort_type` and `order` were measured and did not change the page or its order. The upstream throttles bursts, so paced clients are expected. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-place-videos", + "description": "Searches TikTok hashtags (challenges) for `keyword`. `cursor` defaults to 0 and `count` defaults to 20, capped at 50. The response has `challenge_list` with each hashtag's name and id, plus a `cursor` and `has_more` for paging. An empty, blocked or malformed result returns an upstream error.", + "operationId": "tiktok-search-hashtag", "parameters": [ { - "description": "Place id from the place search endpoint", + "description": "Search keyword", "in": "query", - "name": "poi_id", + "name": "keyword", "required": true, "type": "string", - "x-example": "42203861086875992" + "x-example": "chatgpt" }, { - "description": "Page-size hint: 1-50 measured, server caps larger pages (default is the app default)", + "default": 0, + "description": "Pagination cursor", "in": "query", - "name": "count", - "type": "integer", - "x-example": 10 + "name": "cursor", + "type": "integer" }, { - "description": "Next-page token from the previous response (0 = first page)", + "default": 20, + "description": "Result count, clamped to 50", "in": "query", - "name": "cursor", - "type": "integer", - "x-example": 0 + "name": "count", + "type": "integer" } ], "produces": [ @@ -504284,12 +519965,18 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.placeVideosResponseDoc" + "$ref": "#/definitions/tiktok.searchHashtagResponseDoc" } }, "400": { - "description": "Invalid input, or the place id does not exist", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } @@ -504312,40 +519999,34 @@ "ApiKeyAuth": [] } ], - "summary": "Videos posted at one place (paged)", + "summary": "Search TikTok hashtags", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/playlist/detail": { + "/tiktok/search/user": { "get": { "consumes": [ "application/json" ], - "description": "Returns one playlist's record unmodified in `mix`: `mix_id`, `name`, `mix_type`, `creator_name`, `author`, `share_info`, `statistic.total` and `status`, plus `is_collect`. `mix_id` is the web playlist id namespace; the owner identity selector (`user_id` or `sec_user_id`) is required as well (the mobile route rejects `mix_id` alone with `status_code 5`). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", - "operationId": "tiktok-mobile-playlist-detail", + "description": "Searches TikTok users for `keyword`, with `cursor` (default 0) for paging. The response has `user_list` with the matching accounts, plus a `cursor` and `has_more` to continue. Pass the returned `cursor` back to fetch the next page.", + "operationId": "tiktok-search-user", "parameters": [ { - "description": "Playlist id (web playlist id namespace)", + "description": "Search keyword", "in": "query", - "name": "mix_id", + "name": "keyword", "required": true, "type": "string", - "x-example": "7681171537575824159" - }, - { - "description": "Playlist owner's numeric user id (one of user_id / sec_user_id is required)", - "in": "query", - "name": "user_id", - "type": "string", - "x-example": "107955" + "x-example": "chatgpt" }, { - "description": "Playlist owner's sec_user_id (one of user_id / sec_user_id is required)", + "default": 0, + "description": "Pagination cursor", "in": "query", - "name": "sec_user_id", - "type": "string" + "name": "cursor", + "type": "integer" } ], "produces": [ @@ -504354,8 +520035,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.playlistDetailResponseDoc" + "$ref": "#/definitions/tiktok.searchUserResponseDoc" } }, "400": { @@ -504382,38 +520069,52 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve one TikTok playlist", + "summary": "Search TikTok users", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/playlist/list": { + "/tiktok/top-ads/analysis": { "get": { "consumes": [ "application/json" ], - "description": "Lists the public playlists (\"mixes\") of one creator unmodified in `mix_list`: each row carries the playlist `mix_id` (the same id the web playlist URL uses), `name`, `mix_type`, `creator_name`, `statistic.total` and `last_add_video_timestamp`. Feed `mix_id` to the playlist detail endpoint. Requires one identity selector (`user_id` or `sec_user_id`). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", - "operationId": "tiktok-mobile-playlist-list", + "description": "Returns the detail-page interactive time analysis chart and percentile for a Top Ads material. Metric values are `retain_ctr` (CTR), `retain_cvr` (CVR), `click_cnt` (Clicks), `convert_cnt` (Conversion), and `play_retain_cnt` (Remain).", + "operationId": "tiktok-top-ads-analysis", "parameters": [ { - "description": "Creator's numeric user id (one of user_id / sec_user_id is required)", + "description": "Top Ads material id", "in": "query", - "name": "user_id", + "name": "material_id", + "required": true, "type": "string", - "x-example": "107955" + "x-example": "7130614705291427842" }, { - "description": "Creator's sec_user_id (one of user_id / sec_user_id is required)", + "default": "retain_ctr", + "description": "Interactive time analysis metric", + "enum": [ + "retain_ctr", + "retain_cvr", + "click_cnt", + "convert_cnt", + "play_retain_cnt" + ], "in": "query", - "name": "sec_user_id", + "name": "metric", "type": "string" }, { - "default": 0, - "description": "Paging token from the previous response", + "default": 7, + "description": "Percentile lookback period in days", + "enum": [ + 7, + 30, + 180 + ], "in": "query", - "name": "cursor", + "name": "period_type", "type": "integer" } ], @@ -504423,8 +520124,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.playlistListResponseDoc" + "$ref": "#/definitions/populartrend.topAdsAnalysisResponseDoc" } }, "400": { @@ -504451,41 +520158,28 @@ "ApiKeyAuth": [] } ], - "summary": "List a creator's TikTok playlists", + "summary": "Retrieve TikTok Top Ads interactive time analysis", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/playlist/videos": { + "/tiktok/top-ads/detail": { "get": { "consumes": [ "application/json" ], - "description": "Lists one page of a playlist's videos unmodified in `item_list`: each entry is the full video object the app renders (author, statistics, music, cover renditions, description). `mix_id` is the playlist id from the playlist list/detail endpoints; pass the returned `cursor` back while `has_more` is true. This endpoint is served from the public web twin (`www.tiktok.com/api/mix/item_list/`) because the mobile item route is not usable, so it is device-free: no signing service or cookie is required.", - "operationId": "tiktok-mobile-playlist-videos", + "description": "Returns detail for one TikTok Creative Center Top Ads material. Use `material_id`; the upstream does not accept `id` or `materialId`.", + "operationId": "tiktok-top-ads-detail", "parameters": [ { - "description": "Playlist id (web playlist id namespace)", + "description": "Top Ads material id", "in": "query", - "name": "mix_id", + "name": "material_id", "required": true, "type": "string", - "x-example": "7681171537575824159" - }, - { - "default": 0, - "description": "Paging token from the previous response", - "in": "query", - "name": "cursor", - "type": "integer" - }, - { - "default": 10, - "description": "Videos per page (max 30)", - "in": "query", - "name": "count", - "type": "integer" + "x-example": "7631130810943897607" } ], "produces": [ @@ -504494,8 +520188,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.playlistVideosResponseDoc" + "$ref": "#/definitions/populartrend.topAdsDetailResponseDoc" } }, "400": { @@ -504522,46 +520222,190 @@ "ApiKeyAuth": [] } ], - "summary": "List a playlist's videos", + "summary": "Retrieve TikTok Top Ads detail", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search": { + "/tiktok/top-ads/filters": { "get": { "consumes": [ "application/json" ], - "description": "Keyword search returning the mobile API result documents unmodified: each entry has `aweme_info` (a full video object with statistics), `card_profile` and search metadata, plus `cursor` and `has_more`. Keep `count` small (20 already exceeds one megabyte of upstream JSON). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", - "operationId": "tiktok-mobile-search", + "description": "Returns filter metadata for TikTok Creative Center Top Ads. Dynamic values come from TikTok; static UI enums are included for `order_by`, `duration`, `like`, and `ad_format`.", + "operationId": "tiktok-top-ads-filters", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/populartrend.topAdsFiltersResponseDoc" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Retrieve TikTok Top Ads filters", + "tags": [ + "TikTok", + "TikTok Top Ads" + ] + } + }, + "/tiktok/top-ads/list": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns high-performing auction ads from TikTok Creative Center. The service defaults `period` to 30, `page` to 1, `limit` to 20, and `order_by` to `for_you`. Use `/tiktok/top-ads/filters` for dynamic enum values and static enums for order, duration, likes, and ad format.", + "operationId": "tiktok-top-ads-list", "parameters": [ { - "description": "Search keyword", + "default": 30, + "description": "Lookback period in days", + "enum": [ + 7, + 30, + 180 + ], "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "lofi" + "name": "period", + "type": "integer" }, { - "default": 5, - "description": "Results per page (max 20)", + "default": 1, + "description": "Page number", "in": "query", - "name": "count", + "minimum": 1, + "name": "page", "type": "integer" }, { - "default": 0, - "description": "Result offset; pass search_id with a non-zero offset", + "default": 20, + "description": "Maximum number of ads to return", "in": "query", - "name": "offset", + "maximum": 100, + "name": "limit", "type": "integer" }, { - "description": "search_id returned by a previous page of the same search", + "default": "for_you", + "description": "Sort order", + "enum": [ + "for_you", + "impression", + "ctr", + "play_2s_rate", + "play_6s_rate", + "cvr", + "like" + ], "in": "query", - "name": "search_id", + "name": "order_by", + "type": "string" + }, + { + "description": "Country code or comma-separated country codes from /tiktok/top-ads/filters", + "in": "query", + "name": "country_code", + "type": "string", + "x-example": "US" + }, + { + "description": "Brand or product keyword search", + "in": "query", + "name": "keyword", + "type": "string", + "x-example": "coffee" + }, + { + "description": "Industry filter id or comma-separated ids from /tiktok/top-ads/filters", + "in": "query", + "name": "industry", + "type": "string", + "x-example": "23118000000" + }, + { + "description": "Objective filter id or comma-separated ids from /tiktok/top-ads/filters", + "in": "query", + "name": "objective", + "type": "string", + "x-example": "3" + }, + { + "description": "Ad language id or comma-separated ids from /tiktok/top-ads/filters", + "in": "query", + "name": "ad_language", + "type": "string", + "x-example": "en" + }, + { + "description": "Pattern label id or comma-separated ids from /tiktok/top-ads/filters", + "in": "query", + "name": "pattern_label", + "type": "string", + "x-example": "10100100000" + }, + { + "description": "Video duration bucket", + "enum": [ + "time-2", + "time-3", + "time-4", + "time-5", + "time-6", + "time-7" + ], + "in": "query", + "name": "duration", + "type": "string" + }, + { + "description": "Like percentile bucket id or comma-separated ids", + "enum": [ + "1", + "2", + "3", + "4", + "5" + ], + "in": "query", + "name": "like", + "type": "string" + }, + { + "description": "Ad format id", + "enum": [ + "1", + "2" + ], + "in": "query", + "name": "ad_format", "type": "string" } ], @@ -504571,8 +520415,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.searchGeneralResponseDoc" + "$ref": "#/definitions/populartrend.topAdsListResponseDoc" } }, "400": { @@ -504599,48 +520449,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok videos on the mobile API", + "summary": "Retrieve TikTok Top Ads", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search/effects": { + "/tiktok/top-ads/location-info": { "get": { "consumes": [ "application/json" ], - "description": "Searches TikTok's effect catalogue by `keyword`, returning the app's full effect objects (`name`, `hint`, `icon_url`, `file_url`, `effect_id`, `types`, `tags`, `parent`/`children`, `effect_type`, `music`, `source`, `designer_id`, `schema`). The upstream is `/aweme/v1/search/effect/`; the page is unfolded to the top level (`effects`, `cursor`, `has_more`, `search_id`, `use_hot`, plus `bind_effects`/`collection` on some queries). Paging is real but needs BOTH halves of the token: pass the previous response's `cursor` and `search_id` together (measured: page 1 `cursor: 100`, page 2 with `cursor=100&search_id=...` returned the final effect with `has_more: false`; a cursor without its `search_id` returns an empty page, which the service rejects as a 400). `count` and `offset` were measured as no-ops. Measured 2026-10-21 with the pure-Go (device-free) signer: `keyword=green screen` -> 6 effects (11,831 B) + 1 on page 2, `green` -> 2, `字幕` -> 4; a keyword with no matches is a valid empty page. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-search-effects", + "description": "Returns TikTok's inferred initial country and industry targeting context for Top Ads. Use it when you need starting targeting values; use the locations, filters, and list endpoints to choose criteria and retrieve ads.", + "operationId": "tiktok-top-ads-location-info", "parameters": [ { - "description": "Effect name or text, e.g. green screen", - "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "green screen" - }, - { - "description": "Accepted for shape parity; the server was measured to ignore it", - "in": "query", - "name": "count", - "type": "integer", - "x-example": 20 - }, - { - "description": "Next-page token from the previous response (0 = first page)", - "in": "query", - "name": "cursor", - "type": "integer", - "x-example": 100 - }, - { - "description": "Search-session token from the previous response; required together with cursor", + "default": 1, + "description": "Optional upstream Creative Center module identifier; omitted or 0 defaults to 1, other nonzero IDs are passed through without local range validation", "in": "query", - "name": "search_id", - "type": "string", - "x-example": "20261021173221C8185FF1D4A1062AD97C" + "name": "module", + "type": "integer" } ], "produces": [ @@ -504649,12 +520478,18 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.searchEffectsResponseDoc" + "$ref": "#/definitions/populartrend.topAdsLocationInfoResponseDoc" } }, "400": { - "description": "Invalid input, including a cursor sent without its search_id", + "description": "Invalid input", "schema": { "$ref": "#/definitions/app.Response" } @@ -504677,50 +520512,34 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok effects/stickers by keyword", + "summary": "Retrieve TikTok Top Ads location info", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search/hashtags": { + "/tiktok/top-ads/locations": { "get": { "consumes": [ "application/json" ], - "description": "Returns the hashtag suggestions the app shows while typing in the search box, keyed by `keyword`. The upstream is `/aweme/v1/search/challengesug/`; each `sug_list` row carries `cha_name` (hashtag name), `view_count`, `use_count` and `cid` (the numeric hashtag id), so this is the discovery step for the hashtag endpoints (`hashtag info` is name-keyed). Measured 2026-10-21 with the pure-Go (device-free) signer: `keyword=lofi` returned 10 rows (`lofi` 18.2B views / 1.9M uses, then `lofiasmr`, `lofihiphop`, ...), `coffee` and `ラーメン` also returned 10 rows, and a keyword with no suggestions is a valid empty page (`sug_list: []`). `count` is accepted for shape parity but the server was measured to ignore it (5/20/100 all returned 10 rows), and the route has no paging. The route is not signature-gated, so it does not need the device-backed signer.", - "operationId": "tiktok-mobile-search-hashtags", - "parameters": [ - { - "description": "Text typed so far; the server also accepts prefixes (e.g. lofi -> lofihiphop)", - "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "lofi" - }, - { - "description": "Accepted for shape parity; the server was measured to ignore it (always up to 10 rows)", - "in": "query", - "name": "count", - "type": "integer", - "x-example": 10 - } - ], + "description": "Lists the country filters offered by TikTok Creative Center Top Ads. Each country has an `id` such as `US`, a `value` (the country name), a `label` and a `has_conversion` flag. Takes no parameters.", + "operationId": "tiktok-top-ads-locations", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.hashtagSuggestionsResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/populartrend.topAdsLocationsResponseDoc" } }, "429": { @@ -504741,40 +520560,43 @@ "ApiKeyAuth": [] } ], - "summary": "Hashtag suggestions for a keyword (hashtag typeahead)", + "summary": "Retrieve TikTok Top Ads locations", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search/music": { + "/tiktok/top-ads/recommend": { "get": { "consumes": [ "application/json" ], - "description": "Keyword search over sounds, returning `music_info_list` of full sound objects unmodified with `cursor`, `has_more` and `total`.", - "operationId": "tiktok-mobile-search-music", + "description": "Lists Top Ads materials that TikTok Creative Center recommends as related to the ad with `material_id`. `page` starts at 1; `limit` defaults to 20 and is capped at 100. Each ad has its title, brand, likes, comments, shares, CTR, objectives and video info. The list can be empty for a valid id.", + "operationId": "tiktok-top-ads-recommend", "parameters": [ { - "description": "Search keyword", + "description": "Top Ads material id", "in": "query", - "name": "keyword", + "name": "material_id", "required": true, "type": "string", - "x-example": "lofi" + "x-example": "7631130810943897607" }, { - "default": 20, - "description": "Sounds per page (max 50)", + "default": 1, + "description": "Page number", "in": "query", - "name": "count", + "minimum": 1, + "name": "page", "type": "integer" }, { - "default": 0, - "description": "Result offset", + "default": 20, + "description": "Maximum number of ads to return", "in": "query", - "name": "offset", + "maximum": 100, + "name": "limit", "type": "integer" } ], @@ -504784,8 +520606,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.searchMusicResponseDoc" + "$ref": "#/definitions/populartrend.topAdsRecommendResponseDoc" } }, "400": { @@ -504812,78 +520640,34 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok sounds on the mobile API", + "summary": "Retrieve TikTok Top Ads recommendations", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search/photos": { + "/tiktok/top-ads/safety": { "get": { "consumes": [ "application/json" ], - "description": "Searches TikTok photo posts with the app's own Photos-tab call and returns the page unmodified. Rows live in `search_item_list` (each row's `aweme_info` carries `image_post_info.images`, the carousel images) while `aweme_list` is an empty array; `feedback_type` is `\"photo_tab\"`. `keyword` is required; `count` is bounded at 50 (default 10, the app's value) and `offset` is forwarded as the app's row offset. `sort_type` (0 relevance, 1 like count, 3 date posted) and `publish_time` (recency window in days) are the app's filter-sheet controls. The route is signature-validated, so it needs device-backed request signing to be configured for the deployment and fails with an error instead of returning an empty page when it is not.", - "operationId": "tiktok-mobile-search-photos", - "parameters": [ - { - "description": "Search keyword", - "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "lofi" - }, - { - "description": "Rows per page, bounded at 50 (default 10)", - "in": "query", - "name": "count", - "type": "integer", - "x-example": 10 - }, - { - "description": "Row offset forwarded to the app route (first page only in guest mode)", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - }, - { - "description": "Sort: 0 relevance, 1 like count, 3 date posted", - "in": "query", - "name": "sort_type", - "type": "integer", - "x-example": 0 - }, - { - "description": "Recency window in days: 0 all, 1, 7, 30, 90, 180", - "in": "query", - "name": "publish_time", - "type": "integer", - "x-example": 0 - }, - { - "description": "Forwarded search source (default tab_search)", - "in": "query", - "name": "search_source", - "type": "string", - "x-example": "tab_search" - } - ], + "description": "Returns the Creative Center safety configuration flags for search: `top_ads_search`, `keyword_search`, `hashtag_search`, `creator_search`, `sound_search` and `cc_banner_key`. It carries feature flags only, not ad materials. Takes no parameters.", + "operationId": "tiktok-top-ads-safety", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.searchPhotosResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/populartrend.topAdsSafetyResponseDoc" } }, "429": { @@ -504904,33 +520688,35 @@ "ApiKeyAuth": [] } ], - "summary": "Search the mobile app's photo-post tab", + "summary": "Retrieve TikTok Top Ads safety configuration", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search/place": { + "/tiktok/top-ads/spotlight": { "get": { "consumes": [ "application/json" ], - "description": "Returns TikTok's place (POI) search results for a keyword, unmodified: each row carries `poi_name`, `poi_id`, `poi_type`, `video_count`, `poi_rating`, `poi_distance`, `poi_location`, `lat`/`lng`, `img_url`, `opening_time`, `price_level` and `parent_poi`. Useful for mapping a location or category to the places TikTok knows about, and for seeing how many videos each place carries. `keyword` is required. The page holds up to 30 rows (`count` 1-30 measured; a larger count makes the upstream answer an empty page, so the service rejects it) and the route is first-page-only — the returned `cursor` is not a reusable page token.", - "operationId": "tiktok-mobile-search-place", + "description": "Lists the Top Ads Spotlight materials that TikTok Creative Center hand-picks. `page` starts at 1; `limit` defaults to 20 and is capped at 100. Each ad has its title, brand, likes, comments, shares, CTR, objectives and video info. `data.pagination` gives the page, size, total and `has_more`.", + "operationId": "tiktok-top-ads-spotlight", "parameters": [ { - "description": "Place name or category to search for", + "default": 1, + "description": "Page number", "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "pizza" + "minimum": 1, + "name": "page", + "type": "integer" }, { - "default": 10, - "description": "Rows to return, 1-30 measured (a larger count yields an empty upstream page and is rejected)", + "default": 20, + "description": "Maximum number of ads to return", "in": "query", - "name": "count", + "maximum": 100, + "name": "limit", "type": "integer" } ], @@ -504940,8 +520726,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.searchPlaceResponseDoc" + "$ref": "#/definitions/populartrend.topAdsSpotlightResponseDoc" } }, "400": { @@ -504968,32 +520760,33 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok places", + "summary": "Retrieve TikTok Top Ads Spotlight", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search/pre-info": { + "/tiktok/top-ads/suggestions": { "get": { "consumes": [ "application/json" ], - "description": "Returns the `pre_info_id` token the app attaches to a search session (with its TTL). The token is short-lived; the app requests one before the search stream and reuses it for the following calls.", - "operationId": "tiktok-mobile-search-pre-info", + "description": "Returns Top Ads search suggestions from TikTok Creative Center. `count` is the maximum number of suggestions (default 50) and `scenario` picks the suggestion scenario id (default 1). The `query` list can be empty for the default scenario.", + "operationId": "tiktok-top-ads-suggestions", "parameters": [ { - "description": "Seed keyword (optional; the app also requests this with an empty keyword)", + "default": 50, + "description": "Maximum number of suggestions to return", "in": "query", - "name": "keyword", - "type": "string", - "x-example": "lofi" + "name": "count", + "type": "integer" }, { - "default": 20, - "description": "Suggestion count (max 50)", + "default": 1, + "description": "Suggestion scenario id", "in": "query", - "name": "count", + "name": "scenario", "type": "integer" } ], @@ -505003,8 +520796,14 @@ "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.searchPreInfoResponseDoc" + "$ref": "#/definitions/populartrend.topAdsSuggestionsResponseDoc" } }, "400": { @@ -505031,96 +520830,34 @@ "ApiKeyAuth": [] } ], - "summary": "Pre-search info token for a search session", + "summary": "Retrieve TikTok Top Ads suggestions", "tags": [ - "TikTok" + "TikTok", + "TikTok Top Ads" ] } }, - "/tiktok/mobile/search/stream": { + "/tiktok/trending": { "get": { "consumes": [ "application/json" ], - "description": "Calls the app's primary search route - a form POST to `/aweme/v2/search/general/stream/` whose response is a stream of length-prefixed JSON frames - and returns the frames assembled: `documents` (the flattened `data` entries from the result frame, each a full 145-key video item and other document types), `frames` (every frame in arrival order, opaque, so incremental card patches are preserved), plus `cursor`, `has_more` and `search_id`. Optional `sort_type`, `publish_time` and the app's raw `filter_selected` JSON blob are forwarded to the route and were measured to change the result set (sort_type=1 gave a stable most-liked ordering, publish_time=7 a recency-limited set). This is the high-value search surface: unlike the single-document general search route it supports the app's full result set. It requires the device-backed signing service and returns a generic service-unavailable error when that signer is not configured.", - "operationId": "tiktok-mobile-search-stream", - "parameters": [ - { - "description": "Search keyword", - "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "lofi" - }, - { - "default": 10, - "description": "Requested page size (sanity bound: 50)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Row offset", - "in": "query", - "name": "offset", - "type": "integer" - }, - { - "description": "Search source hint forwarded to upstream (measured: video)", - "in": "query", - "name": "search_source", - "type": "string", - "x-example": "video" - }, - { - "default": 0, - "description": "Sort order: 0 relevance, 1 like count (stable ordering measured), 3 date posted", - "enum": [ - 0, - 1, - 3 - ], - "in": "query", - "name": "sort_type", - "type": "integer" - }, - { - "default": 0, - "description": "Recency window in days (0 = unlimited; 7 measured)", - "in": "query", - "name": "publish_time", - "type": "integer" - }, - { - "description": "Raw app filter blob as JSON; takes precedence over sort_type/publish_time", - "in": "query", - "name": "filter_selected", - "type": "string", - "x-example": "{\"sort_type\":\"1\",\"publish_time\":\"7\"}" - } - ], + "description": "Returns the current TikTok trending feed: `itemList` holds the videos, and `hasMore` and `cursor` describe paging. The response also has a `trendingTopics` field. Takes no parameters.", + "operationId": "tiktok-trending", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", + "headers": { + "X-RateLimit-Per-Second-Remaining": { + "description": "Number of remaining requests per second", + "type": "string" + } + }, "schema": { - "$ref": "#/definitions/tiktokmobile.searchStreamResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/tiktok.trendingResponseDoc" } }, "500": { @@ -505135,34 +520872,24 @@ "ApiKeyAuth": [] } ], - "summary": "Run the app's primary (streaming) general search", + "summary": "Retrieve TikTok trending posts", "tags": [ "TikTok" ] } }, - "/tiktok/mobile/search/sug": { + "/time/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the mobile app's search typeahead for a seed keyword: `sug_list` of suggestions, each with `content`, `sug_type`, `word_record` (`group_id`, `words_position`, `words_content`, `words_source`) and positional fields, unmodified. Useful for query expansion and for seeing the phrases the app itself associates with a seed term. `keyword` is required; without it the upstream answers a well-formed but empty envelope.", - "operationId": "tiktok-mobile-search-sug", + "description": "Returns one TIME article by `url`, which must be a canonical HTTPS dated `time.com` article link. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag.", + "operationId": "time-article", "parameters": [ { - "description": "Seed keyword to expand", + "description": "Canonical TIME article URL", "in": "query", - "name": "keyword", + "name": "url", "required": true, "type": "string", - "x-example": "lofi" - }, - { - "default": 10, - "description": "Suggestions to return (max 50)", - "in": "query", - "name": "count", - "type": "integer" + "x-example": "https://time.com/article/2026/09/20/example-story/" } ], "produces": [ @@ -505172,23 +520899,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.searchSuggestionResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505199,27 +520926,24 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok search suggestions", + "summary": "Get TIME article content", "tags": [ - "TikTok" + "TIME" ] } }, - "/tiktok/mobile/search/tabs": { + "/time/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the tab keys the mobile search screen offers for a keyword (`general`, `video`, `photos`, `user`, `music`, `live`, `place`, `hashtag`), plus the gateway's `is_failed` flag. Measured on the mobile search edge with a form POST.", - "operationId": "tiktok-mobile-search-tabs", + "description": "Returns a TIME author's profile by `url`, a canonical `time.com/author//` link: name, job title, bio, image URL, social account links and recent articles with title, URL, excerpt, section, section URL and ISO-8601 `published_at`. Not every author lists a social account.", + "operationId": "time-author", "parameters": [ { - "description": "Search keyword", + "description": "Canonical TIME author URL", "in": "query", - "name": "keyword", + "name": "url", "required": true, "type": "string", - "x-example": "lofi" + "x-example": "https://time.com/author/stephanie-zacharek/" } ], "produces": [ @@ -505229,23 +520953,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.searchTabsResponseDoc" + "$ref": "#/definitions/publicnews.timeAuthorResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505256,41 +520980,36 @@ "ApiKeyAuth": [] } ], - "summary": "Search tabs available for a keyword", + "summary": "Get a TIME author profile", "tags": [ - "TikTok" + "TIME" ] } }, - "/tiktok/mobile/search/user": { + "/time/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Keyword search over users, returning `user_list` unmodified. Each `user_info` carries the populated creator statistics (follower_count, following_count, total_favorited, aweme_count, custom_verify). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error instead of an empty page.", - "operationId": "tiktok-mobile-search-user", + "description": "Returns the current headlines for one TIME section. `section` is required and takes one of `news`, `politics`, `world`, `business`, `technology`, `health`, `entertainment`, `sports`, `ideas` or `climate`. Each item has its title and URL.", + "operationId": "time-headlines", "parameters": [ { - "description": "Search keyword (a username or display name)", + "description": "TIME RSS section slug", + "enum": [ + "news", + "politics", + "world", + "business", + "technology", + "health", + "entertainment", + "sports", + "ideas", + "climate" + ], "in": "query", - "name": "keyword", + "name": "section", "required": true, "type": "string", - "x-example": "mrbeast" - }, - { - "default": 20, - "description": "Users per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "integer" + "x-example": "news" } ], "produces": [ @@ -505300,23 +521019,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.searchUsersResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505327,75 +521040,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok users on the mobile API", + "summary": "Get TIME section headlines", "tags": [ - "TikTok" + "TIME" ] } }, - "/tiktok/mobile/search/videos": { + "/time/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Keyword search over videos. The videos are in `aweme_list` (each entry is the full video object); `search_item_list` is kept for compatibility and is `null`. `cursor`, `has_more` and `search_id` accompany the page. `keyword` is required, `count` is bounded at 50, `offset` is a row offset and `search_id` (returned by a previous page) scopes paging to the same search session. `sort_type` is one of `0` (relevance), `1` (like count) or `3` (date posted); `publish_time` is a recency window in days between `0` and `365` (the app uses `0`, `1`, `7`, `30`, `90`, `180`). This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", - "operationId": "tiktok-mobile-search-videos", - "parameters": [ - { - "description": "Search keyword", - "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "lofi" - }, - { - "default": 10, - "description": "Rows per page (sanity bound: 50)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Row offset; pass search_id with a non-zero offset", - "in": "query", - "name": "offset", - "type": "integer" - }, - { - "default": 0, - "description": "Sort order: 0 relevance, 1 like count, 3 date posted", - "enum": [ - 0, - 1, - 3 - ], - "in": "query", - "name": "sort_type", - "type": "integer" - }, - { - "default": 0, - "description": "Date-posted window in days (0 to 365; the app uses 0, 1, 7, 30, 90, 180)", - "in": "query", - "name": "publish_time", - "type": "integer" - }, - { - "default": "tab_search", - "description": "Search source forwarded as the app sends it", - "in": "query", - "name": "search_source", - "type": "string" - }, - { - "description": "search_id returned by a previous page of the same search", - "in": "query", - "name": "search_id", - "type": "string" - } - ], + "description": "Returns the current top stories from TIME. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", + "operationId": "time-news", "produces": [ "application/json" ], @@ -505403,23 +521057,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.searchVideosResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505430,36 +521078,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok videos on the mobile API (video tab)", + "summary": "Get TIME top stories", "tags": [ - "TikTok" + "TIME" ] } }, - "/tiktok/mobile/translation/description": { + "/time/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Translates one video's caption with the app's own translation route and returns the translated caption both as the app's raw markup (`translated_client_text.client_text_v2.markup_text`, where line breaks are `
` and hashtags are wrapped in `...`) and as plain text in `text`. `item_id` is required; `target_lang` defaults to `en` and accepts the app's language codes (`en`, `ja`, `pt-BR`, `zh-Hans`, ...). The route is signature-validated, so it needs device-backed request signing to be configured for the deployment and fails with an error instead of returning a stub when it is not.", - "operationId": "tiktok-mobile-translation-description", - "parameters": [ - { - "description": "Video id to translate", - "in": "query", - "name": "item_id", - "required": true, - "type": "string", - "x-example": "7650052642089225493" - }, - { - "description": "Target language code (default en)", - "in": "query", - "name": "target_lang", - "type": "string", - "x-example": "en" - } - ], + "description": "Lists the 10 TIME section slugs that the headlines endpoint accepts: `news`, `politics`, `world`, `business`, `technology`, `health`, `entertainment`, `sports`, `ideas` and `climate`. Each entry has a `slug`, a display `name` and a `url`.", + "operationId": "time-sections", "produces": [ "application/json" ], @@ -505467,25 +521095,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.translationDescriptionResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -505494,33 +521104,24 @@ "ApiKeyAuth": [] } ], - "summary": "Translate one TikTok video caption", + "summary": "Get TIME RSS sections", "tags": [ - "TikTok" + "TIME" ] } }, - "/tiktok/mobile/trending/categories": { + "/timeslive/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the discover-category feed unmodified: each `category_list` entry is `{aweme_list, category_type, challenge_info, click_track_url_list, desc, track_url_list}`, with `cursor` and `has_more` for paging.", - "operationId": "tiktok-mobile-trending-categories", + "description": "Returns article metadata and body paragraphs for a canonical TimesLIVE editorial article URL. Some stories may have a publisher access gate; paywalled is set when the page's first-party access flags indicate restricted content.", + "operationId": "timeslive-article", "parameters": [ { - "default": 20, - "description": "Categories per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Pagination cursor", + "description": "Canonical TimesLIVE article URL", "in": "query", - "name": "cursor", - "type": "integer" + "name": "url", + "required": true, + "type": "string", + "x-example": "https://www.timeslive.co.za/news/sci-tech/2026-09-29-insight-chinas-ai-agents-can-lie-and-scheme-just-like-their-us-rivals/" } ], "produces": [ @@ -505530,23 +521131,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.categoryListResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505557,33 +521158,49 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok trending categories", + "summary": "Get TimesLIVE article content", "tags": [ - "TikTok" + "TimesLIVE" ] } }, - "/tiktok/mobile/trending/effects": { + "/timeslive/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the effect/sticker discovery feed unmodified: `aweme_list` of full video objects, each additionally carrying `stickers` and `sticker_detail`, plus `feed_session_id`, `cursor` and `has_more`.", - "operationId": "tiktok-mobile-trending-effects", + "description": "Returns current TimesLIVE stories for a section. Pass a slug from timeslive_sections; results are the first 15 items in the live section order.", + "operationId": "timeslive-headlines", "parameters": [ { - "default": 20, - "description": "Videos per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Pagination cursor", + "description": "TimesLIVE editorial section slug", + "enum": [ + "news", + "news/south-africa", + "news/africa", + "news/world", + "news/business", + "news/sci-tech", + "politics", + "opinion", + "ideas", + "investigations", + "tshisa-live", + "lifestyle", + "lifestyle/fashion", + "lifestyle/food", + "lifestyle/travel", + "lifestyle/books", + "lifestyle/spotlight", + "sport", + "sport/soccer", + "sport/rugby", + "sport/cricket", + "sport/arena-sports-show", + "motoring" + ], "in": "query", - "name": "cursor", - "type": "integer" + "name": "section", + "required": true, + "type": "string", + "x-example": "news" } ], "produces": [ @@ -505593,23 +521210,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.stickerDiscoverResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505620,42 +521231,16 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok trending effects", + "summary": "Get TimesLIVE section headlines", "tags": [ - "TikTok" + "TimesLIVE" ] } }, - "/tiktok/mobile/user/followers": { + "/timeslive/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists one creator's followers: `followers` holds the full user objects, `total` is the account's follower total, and the envelope also carries `max_time`/`min_time`/`offset`, `next_page_token` and `myself_user_id`. `count` is the requested page size (20 and 30 were honoured). Measured caveat: the first pages came back with `has_more` false even though `total` reported 2,774,249, and the returned time/offset probes did not advance the window - treat those paging fields as observed values, not as a guaranteed paging contract. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", - "operationId": "tiktok-mobile-user-followers", - "parameters": [ - { - "description": "Creator user id", - "in": "query", - "name": "user_id", - "required": true, - "type": "string", - "x-example": "7141011492116005914" - }, - { - "description": "Followers per page (sanity bound: 50; omitted = app default, not measured)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Page token: the max_time returned by the previous page (omitted at 0 = first page)", - "in": "query", - "name": "cursor", - "type": "integer" - } - ], + "description": "Returns current TimesLIVE stories, including section-specific headlines. Article access can vary by story.", + "operationId": "timeslive-news", "produces": [ "application/json" ], @@ -505663,23 +521248,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.userFollowersResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505690,43 +521269,16 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve the followers of a TikTok creator", + "summary": "Get TimesLIVE top stories", "tags": [ - "TikTok" + "TimesLIVE" ] } }, - "/tiktok/mobile/user/following": { + "/timeslive/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the accounts one creator follows (`followings`, full 120-key user objects) with the mobile API's paging envelope: `total`, `has_more`/`rec_has_more`, `max_time`/`min_time` and `next_page_token`. Some profiles hide their following list; that answers upstream `status_code 3002060` (\"Profile user is hiding following list\"), which surfaces as a typed upstream error. Requires the device-backed signing service and returns a generic service-unavailable error when it is not configured.", - "operationId": "tiktok-mobile-user-following", - "parameters": [ - { - "description": "Creator's numeric user id", - "in": "query", - "name": "user_id", - "required": true, - "type": "string", - "x-example": "7343380121988285482" - }, - { - "default": 20, - "description": "Rows per page (sanity bound: 50)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Page token: max_time returned by the previous page (omitted at 0)", - "in": "query", - "name": "cursor", - "type": "integer" - } - ], + "description": "Returns the complete public editorial navigation set accepted by the TimesLIVE headlines endpoint. External Sunday Times, partner, podcast, account, and link-only surfaces are excluded.", + "operationId": "timeslive-sections", "produces": [ "application/json" ], @@ -505734,25 +521286,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.userFollowingResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -505761,41 +521295,24 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve the accounts a TikTok creator follows", + "summary": "Get TimesLIVE sections", "tags": [ - "TikTok" + "TimesLIVE" ] } }, - "/tiktok/mobile/user/original-effects": { + "/timesofindia/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the effects one creator published unmodified in `effect`: each row carries the `effect_id`, `name`, `desc`, `icon_url`, `effect_source`, attributions, linked anchors and moderation status, with cursor paging (`cursor`/`has_more`). `user_id` must be the numeric uid. A creator with no published effects returns an empty list. Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", - "operationId": "tiktok-mobile-user-original-effects", + "description": "Returns public Times of India article metadata (title, author(s), published/updated dates, section, lead image) and body paragraphs from a canonical article URL. A story gated behind a subscription returns a permission error instead of a truncated or fabricated body.", + "operationId": "timesofindia-article", "parameters": [ { - "description": "Creator's numeric uid", + "description": "Canonical Times of India article URL", "in": "query", - "name": "user_id", + "name": "url", "required": true, "type": "string", - "x-example": "107955" - }, - { - "default": 0, - "description": "Paging token from the previous response", - "in": "query", - "name": "cursor", - "type": "integer" - }, - { - "default": 10, - "description": "Effects per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" + "x-example": "https://timesofindia.indiatimes.com/business/india-business/example-story/articleshow/134456699.cms" } ], "produces": [ @@ -505805,23 +521322,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.userOriginalEffectsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "403": { + "description": "Forbidden", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505832,41 +521355,24 @@ "ApiKeyAuth": [] } ], - "summary": "List a creator's original TikTok effects", + "summary": "Get The Times of India article content", "tags": [ - "TikTok" + "Times of India" ] } }, - "/tiktok/mobile/user/original-music": { + "/timesofindia/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the \"original sounds\" groups of one creator unmodified in `groups`: each group carries the `music` sound object, a `similar_music_list` and the `source_music_id`; the envelope also carries the creator's `honor_label`, a flat `music` list and cursor paging (`cursor`/`has_more`). `user_id` must be the numeric uid (a `sec_user_id` alone is rejected upstream with `status_code 5`). Requires the device-backed signing service; without it the endpoint returns a generic service-unavailable error.", - "operationId": "tiktok-mobile-user-original-music", + "description": "Returns a Times of India reporter's profile by `url`, a canonical `timesofindia.indiatimes.com/toireporter/author--.cms` link: name, job title, organization, location, email, biography, headshot and recent articles with title and URL. Fields the profile page does not publish may be empty.", + "operationId": "timesofindia-author", "parameters": [ { - "description": "Creator's numeric uid", + "description": "Canonical Times of India author URL", "in": "query", - "name": "user_id", + "name": "url", "required": true, "type": "string", - "x-example": "107955" - }, - { - "default": 0, - "description": "Paging token from the previous response", - "in": "query", - "name": "cursor", - "type": "integer" - }, - { - "default": 10, - "description": "Groups per page (max 50)", - "in": "query", - "name": "count", - "type": "integer" + "x-example": "https://timesofindia.indiatimes.com/toireporter/author-Smriti-Jain-479254229.cms" } ], "produces": [ @@ -505876,23 +521382,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.userOriginalMusicResponseDoc" + "$ref": "#/definitions/publicnews.timesOfIndiaAuthorResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505903,53 +521409,81 @@ "ApiKeyAuth": [] } ], - "summary": "List a creator's original TikTok sounds", + "summary": "Get a Times of India author profile", "tags": [ - "TikTok" + "Times of India" ] } }, - "/tiktok/mobile/user/posts": { + "/timesofindia/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists one creator's videos newest-first: `aweme_list` holds the full video objects (author, statistics, music, video renditions, anchors), and the page is positioned by `max_cursor`/`min_cursor` with `has_more`. Paging is by `max_cursor`: pass the `max_cursor` returned by the previous page back as `cursor`. `count` is the requested page size (the app default returned 9 items; 20 and 30 were honoured). This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", - "operationId": "tiktok-mobile-user-posts", + "description": "Returns the current headlines for one Times of India section or city edition. `section` is required, for example `top-stories`, `india`, `world`, `business`, `cricket`, `mumbai`, `delhi` or `bangalore`. Items carry the title and URL, plus summary, author, publication time and image when the outlet provides them.", + "operationId": "timesofindia-headlines", "parameters": [ { - "description": "Creator user id; one of user_id or sec_user_id is required (user_id wins if both are sent)", - "in": "query", - "name": "user_id", - "type": "string", - "x-example": "7141011492116005914" - }, - { - "description": "Creator sec_user_id; one of user_id or sec_user_id is required", - "in": "query", - "name": "sec_user_id", - "type": "string" - }, - { - "default": 9, - "description": "Videos per page (sanity bound: 50; omitted = app default, measured 9)", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 0, - "description": "Page token: the max_cursor returned by the previous page (omitted at 0 = first page)", - "in": "query", - "name": "cursor", - "type": "integer" - }, - { - "default": 0, - "description": "Sort type (0 = the app default; always sent, non-zero values are forwarded as given)", + "description": "Times of India section slug", + "enum": [ + "top-stories", + "india", + "world", + "nri", + "business", + "cricket", + "sports", + "science", + "environment", + "tech", + "education", + "entertainment", + "life-style", + "astrology", + "auto", + "mumbai", + "delhi", + "bangalore", + "hyderabad", + "chennai", + "ahmedabad", + "allahabad", + "bhubaneswar", + "coimbatore", + "gurgaon", + "guwahati", + "hubli", + "kanpur", + "kolkata", + "ludhiana", + "mangalore", + "mysore", + "noida", + "pune", + "goa", + "chandigarh", + "lucknow", + "patna", + "jaipur", + "nagpur", + "rajkot", + "ranchi", + "surat", + "vadodara", + "varanasi", + "thane", + "thiruvananthapuram", + "us", + "pakistan", + "south-asia", + "uk", + "europe", + "china", + "middle-east", + "rest-of-world" + ], "in": "query", - "name": "sort_type", - "type": "integer" + "name": "section", + "required": true, + "type": "string", + "x-example": "top-stories" } ], "produces": [ @@ -505959,23 +521493,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.userPostsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -505986,35 +521514,16 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve the videos posted by a TikTok creator", + "summary": "Get The Times of India section headlines", "tags": [ - "TikTok" + "Times of India" ] } }, - "/tiktok/mobile/user/profile": { + "/timesofindia/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one creator's profile page: `common` (the identity, account and relation blocks: user_profile_info, user_account_info, user_relation_info, user_statics_info with the follower/following/heart counters), plus the `header`, `nav_bar` and `profile_tab` layout components and the app's status/provenance fields. Address the creator by `user_id` or by `sec_user_id`; at least one is required and `user_id` wins when both are supplied. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", - "operationId": "tiktok-mobile-user-profile", - "parameters": [ - { - "description": "Creator user id", - "in": "query", - "name": "user_id", - "type": "string", - "x-example": "7141011492116005914" - }, - { - "description": "Creator sec_user_id (alternate identifier; use instead of user_id)", - "in": "query", - "name": "sec_user_id", - "type": "string", - "x-example": "MS4wLjABAAAAexample" - } - ], + "description": "Returns the current Times of India top stories. It takes no parameters. Each item has its title, URL, summary, publication time with its UTC offset, author and image URL. Use the headlines endpoint for a section or city edition.", + "operationId": "timesofindia-news", "produces": [ "application/json" ], @@ -506022,23 +521531,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.userProfileResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506049,28 +521552,16 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve a TikTok creator profile", + "summary": "Get The Times of India top stories", "tags": [ - "TikTok" + "Times of India" ] } }, - "/tiktok/mobile/user/recommendations": { + "/timesofindia/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the app's suggested creators for the Following page unmodified: `user_list` entries are `{user, aweme_list}` where `user` is the full creator projection (uid, sec_uid, nickname, signature, avatars, follower/following counts, verification and privacy flags) and `aweme_list` holds up to three recent videos, so this is a creator-discovery surface rather than a bare id list. The route has no paging fields and returns one page of 13-17 creators (fresh recommendations differ per call). `count` is accepted for parity but the gateway was measured to ignore it. The route is not signature-value gated, so unlike the profile/posts routes it does not need the device-backed signer.", - "operationId": "tiktok-mobile-user-recommendations", - "parameters": [ - { - "description": "Requested page size; forwarded when set, but the gateway was measured to ignore it", - "in": "query", - "name": "count", - "type": "integer", - "x-example": 10 - } - ], + "description": "Lists the 55 Times of India sections that the headlines endpoint accepts, covering national and international topics such as `india`, `world`, `business` and `cricket`, and India city editions such as `mumbai`, `delhi` and `bangalore`. Each entry has a `slug`, a display `name` and the section feed `url`.", + "operationId": "timesofindia-sections", "produces": [ "application/json" ], @@ -506078,25 +521569,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.userRecommendationsResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -506105,27 +521578,24 @@ "ApiKeyAuth": [] } ], - "summary": "Recommended creators on the mobile app's Following page", + "summary": "Get The Times of India sections", "tags": [ - "TikTok" + "Times of India" ] } }, - "/tiktok/mobile/video/detail": { + "/timesofisrael/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one video's full item: author, statistics (`play_count`, `digg_count`, `comment_count` and the rest), music, video renditions, anchors and the other item fields - the complete object, not a projection. `aweme_id` is required. This endpoint needs device-backed request signing to be configured for the deployment; without it the request fails with an error instead of returning an empty page.", - "operationId": "tiktok-mobile-video-detail", + "description": "Returns public Times of Israel article metadata and body paragraphs from a canonical article URL. Both regular story pages and individual liveblog-update pages (/liveblog_entry//) are accepted.", + "operationId": "timesofisrael-article", "parameters": [ { - "description": "Video id", + "description": "Canonical Times of Israel article URL", "in": "query", - "name": "aweme_id", + "name": "url", "required": true, "type": "string", - "x-example": "7329791719535283462" + "x-example": "https://www.timesofisrael.com/example-article-slug/" } ], "produces": [ @@ -506135,23 +521605,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.videoDetailResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506162,35 +521632,24 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve one TikTok video", + "summary": "Get Times of Israel article content", "tags": [ - "TikTok" + "Times of Israel" ] } }, - "/tiktok/mobile/video/subtitles": { + "/timesofisrael/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one video's own captions translated into the requested language, as TikTok's caption/language (`cla`) service serves them. The response carries the track twice: `webvtt` is the upstream WebVTT text verbatim, and `cues` is the same track parsed into `{start_ms, end_ms, start, end, text}` records so a caller does not have to implement WebVTT. `video_id` is the aweme id returned by the feed, search, profile-posts and hashtag endpoints. Measured 2026-10-21 with the pure-Go (device-free) signer: the Korean-caption video 7696141388324293918 answered 11 English cues for `language=en`, and the same video answered Japanese, Chinese, Spanish, French, German, Korean, Portuguese, Russian, Arabic, Hindi, Indonesian, Thai, Vietnamese, Turkish and Italian tracks; a Portuguese-lyrics video answered an 18,494-character English track (240 cues). Track size is a snapshot rather than a contract (the upstream re-translates from a cache), so assert a non-empty track in the requested language, not a byte count. The route is not signature-gated, so it does not need the device-backed signer. A video with no captions answers 400 (upstream status 5); a nonexistent video answers 500 (upstream status 4).", - "operationId": "tiktok-mobile-video-subtitles", + "description": "Returns a Times of Israel writer's byline metadata, biography, social links, and recent articles from a canonical writer profile URL.", + "operationId": "timesofisrael-author", "parameters": [ { - "description": "Numeric id of the video (aweme id)", - "in": "query", - "name": "video_id", - "required": true, - "type": "string", - "x-example": "7696141388324293918" - }, - { - "description": "Target language code: ar, de, en, es, fr, hi, id, it, ja, ko, pt, ru, th, tr, vi, zh", + "description": "Canonical Times of Israel author URL", "in": "query", - "name": "language", + "name": "url", "required": true, "type": "string", - "x-example": "en" + "x-example": "https://www.timesofisrael.com/writers/jane-doe/" } ], "produces": [ @@ -506200,23 +521659,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tiktokmobile.videoSubtitlesResponseDoc" + "$ref": "#/definitions/publicnews.timesOfIsraelAuthorResponseDoc" } }, "400": { - "description": "Invalid input, or the video has no captions", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506227,43 +521686,51 @@ "ApiKeyAuth": [] } ], - "summary": "Video captions translated into a target language", + "summary": "Get a Times of Israel author profile", "tags": [ - "TikTok" + "Times of Israel" ] } }, - "/tiktok/popular-trend/country-industry-meta": { + "/timesofisrael/headlines": { "get": { - "consumes": [ - "application/json" + "description": "Returns the current headlines for one Times of Israel section. `section` is required and takes one of `israel-and-the-region`, `israel-inside`, `jewish-times`, `real-estate-israel` or `tech-israel`. Each item has its title and URL.", + "operationId": "timesofisrael-headlines", + "parameters": [ + { + "description": "Times of Israel section slug", + "enum": [ + "israel-and-the-region", + "israel-inside", + "jewish-times", + "real-estate-israel", + "tech-israel" + ], + "in": "query", + "name": "section", + "required": true, + "type": "string", + "x-example": "israel-and-the-region" + } ], - "description": "Lists the country and industry filter values used by the TikTok Creative Center popular-trend endpoints. Countries have an `id` such as `AR` and a name; industries have a numeric `id` and a name such as Apparel & Accessories. A maintained fallback list is returned if TikTok's own metadata is unavailable.", - "operationId": "tiktok-popular-trend-country-industry-meta", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.countryIndustryMetaResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506274,60 +521741,34 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok popular-trend country and industry metadata", + "summary": "Get Times of Israel section headlines", "tags": [ - "TikTok", - "TikTok Popular Trend" + "Times of Israel" ] } }, - "/tiktok/post/{id}": { + "/timesofisrael/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns TikTok's detail record for one video by video id. `itemInfo.itemStruct` holds the video's description, the author's profile and the author's statistics (such as followers, following and hearts) along with the rest of TikTok's video object; `shareMeta` holds the share title and description.", - "operationId": "tiktok-post", - "parameters": [ - { - "description": "TikTok video id", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "7444278905264983342" - } - ], + "description": "Returns the latest Times of Israel stories. It takes no parameters. Each item has a title, URL and publication time. The list includes both regular story pages and individual liveblog-update pages, so expect some entries to be short updates.", + "operationId": "timesofisrael-news", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/tiktok.postResponseDoc" - } - }, - "400": { - "description": "Invalid input", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506338,80 +521779,24 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok video details", + "summary": "Get Times of Israel top stories", "tags": [ - "TikTok" + "Times of Israel" ] } }, - "/tiktok/posts": { + "/timesofisrael/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists posts from a TikTok profile identified by `secUid`. `sort_type` is `0` latest (default), `1` popular or `2` oldest. `cursor` defaults to 0. The response has `itemList`, `hasMore` and a `cursor` to pass back to fetch the next page.", - "operationId": "tiktok-profile-post", - "parameters": [ - { - "description": "TikTok secUid for the profile", - "in": "query", - "name": "secUid", - "required": true, - "type": "string", - "x-example": "MS4wLjABAAAAT4vq3vsh9X-Vb_WtV6tz4QWTbKjliTKCiK5DqnJNtQEA2RUveHb7UdnL7xgPK2HB" - }, - { - "default": 0, - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "integer" - }, - { - "default": 0, - "description": "Sort mode: 0 latest, 1 popular, 2 oldest", - "enum": [ - 0, - 1, - 2 - ], - "in": "query", - "name": "sort_type", - "type": "integer" - } - ], + "description": "Lists the five Times of Israel sections that the headlines endpoint accepts: `israel-and-the-region`, `israel-inside`, `jewish-times`, `real-estate-israel` and `tech-israel`. Each entry has a `slug`, a display `name` and a section `url`.", + "operationId": "timesofisrael-sections", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/tiktok.profilePostResponseDoc" - } - }, - "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -506420,27 +521805,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve posts from a TikTok profile", + "summary": "Get Times of Israel sections", "tags": [ - "TikTok" + "Times of Israel" ] } }, - "/tiktok/profile/{handler}": { + "/tmdb/collection/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns a public TikTok profile by `handler`, the username without the leading `@`. The `user` object has the id, `uniqueId`, nickname, signature, verified and private flags, region, language, avatar, bio link and `secUid`; `stats` has follower, following, heart, video and friend counts. A missing, deleted or banned handle returns 404.", - "operationId": "tiktok-profile", + "description": "Returns a TMDB collection (a movie franchise grouping) by `id`, which can be the collection id or an id-slug. The response has the collection title, overview, `uri` and `source_url`, plus its member movies, each with id, title, overview, poster URL, release date and `uri`.", + "operationId": "tmdb-collection", "parameters": [ { - "description": "TikTok handle without the leading @", + "description": "TMDB collection id or id-slug", "in": "path", - "name": "handler", + "name": "id", "required": true, "type": "string", - "x-example": "chatgpt" + "x-example": "263" } ], "produces": [ @@ -506449,36 +521834,30 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.profileResponseDoc" + "$ref": "#/definitions/tmdb.collectionResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Profile not found", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506489,73 +521868,37 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve a TikTok profile", + "summary": "Get a TMDB collection", "tags": [ - "TikTok" + "TMDB" ] } }, - "/tiktok/search": { + "/tmdb/genres": { "get": { "consumes": [ "application/json" ], - "description": "Searches TikTok videos for `keyword`. `cursor` defaults to 0 and `count` defaults to 20, capped at 50. The response has the matching video items, a `cursor` and `has_more` for paging. An empty, blocked or malformed result from TikTok returns an upstream error.", - "operationId": "tiktok-search", - "parameters": [ - { - "description": "Search keyword", - "in": "query", - "name": "keyword", - "required": true, - "type": "string", - "x-example": "dance" - }, - { - "default": 0, - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "integer" - }, - { - "default": 20, - "description": "Result count, clamped to 50", - "in": "query", - "name": "count", - "type": "integer" - } - ], + "description": "Returns every genre ID for TMDB movie and TV browse pages. Use movie values only with movie list filters and TV values only with TV list filters.", + "operationId": "tmdb-genres", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/tiktok.searchResponseDoc" - } - }, - "400": { - "description": "Invalid input", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/tmdb.genresResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506566,40 +521909,120 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok videos", + "summary": "List TMDB browse genres", "tags": [ - "TikTok" + "TMDB" ] } }, - "/tiktok/search/hashtag": { + "/tmdb/movie/list": { "get": { "consumes": [ "application/json" ], - "description": "Searches TikTok hashtags (challenges) for `keyword`. `cursor` defaults to 0 and `count` defaults to 20, capped at 50. The response has `challenge_list` with each hashtag's name and id, plus a `cursor` and `has_more` for paging. An empty, blocked or malformed result returns an upstream error.", - "operationId": "tiktok-search-hashtag", + "description": "Returns a page of TMDB movies from the `category` chart (`popular` by default, or `top_rated`, `now_playing`, `upcoming`), optionally refined by `sort_by`, `with_genres`, `original_language`, release dates, rating, votes and runtime. `limit` defaults to 10 (max 20). Each movie has id, title, overview, poster, release date and `uri`; `has_next_page` signals more pages.", + "operationId": "tmdb-movie-list", "parameters": [ { - "description": "Search keyword", + "description": "Movie chart, default popular", + "enum": [ + "popular", + "top_rated", + "now_playing", + "upcoming" + ], "in": "query", - "name": "keyword", - "required": true, + "name": "category", + "type": "string" + }, + { + "description": "1-based page, default 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Sort order", + "enum": [ + "popularity.desc", + "popularity.asc", + "vote_average.desc", + "vote_average.asc", + "primary_release_date.desc", + "primary_release_date.asc", + "title.asc", + "title.desc" + ], + "in": "query", + "name": "sort_by", + "type": "string" + }, + { + "description": "Comma- or pipe-separated movie genre ids: 28,12,16,35,80,99,18,10751,14,36,27,10402,9648,10749,878,10770,53,10752,37", + "in": "query", + "name": "with_genres", "type": "string", - "x-example": "chatgpt" + "x-example": "18,878" }, { - "default": 0, - "description": "Pagination cursor", + "description": "Two-letter original-language code", "in": "query", - "name": "cursor", + "name": "original_language", + "type": "string", + "x-example": "en" + }, + { + "description": "Release date lower bound (YYYY-MM-DD)", + "in": "query", + "name": "date_from", + "type": "string" + }, + { + "description": "Release date upper bound (YYYY-MM-DD)", + "in": "query", + "name": "date_to", + "type": "string" + }, + { + "description": "Minimum rating, 0-10", + "in": "query", + "name": "min_rating", + "type": "number" + }, + { + "description": "Maximum rating, 0-10", + "in": "query", + "name": "max_rating", + "type": "number" + }, + { + "description": "Minimum vote count", + "in": "query", + "name": "min_votes", "type": "integer" }, { - "default": 20, - "description": "Result count, clamped to 50", + "description": "Minimum runtime in minutes", "in": "query", - "name": "count", + "name": "min_runtime", + "type": "integer" + }, + { + "description": "Maximum runtime in minutes", + "in": "query", + "name": "max_runtime", + "type": "integer" + }, + { + "description": "Include adult titles", + "in": "query", + "name": "include_adult", + "type": "boolean" + }, + { + "description": "Max movies, default 10, max 20", + "in": "query", + "name": "limit", "type": "integer" } ], @@ -506609,30 +522032,24 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.searchHashtagResponseDoc" + "$ref": "#/definitions/tmdb.movieListResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506643,34 +522060,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok hashtags", + "summary": "Get a TMDB movie chart", "tags": [ - "TikTok" + "TMDB" ] } }, - "/tiktok/search/user": { + "/tmdb/movie/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Searches TikTok users for `keyword`, with `cursor` (default 0) for paging. The response has `user_list` with the matching accounts, plus a `cursor` and `has_more` to continue. Pass the returned `cursor` back to fetch the next page.", - "operationId": "tiktok-search-user", + "description": "Returns a TMDB movie: overview, tagline, genres, countries, runtime, budget/revenue, top-billed cast, top crew (director/writer), and aggregate rating.", + "operationId": "tmdb-movie", "parameters": [ { - "description": "Search keyword", - "in": "query", - "name": "keyword", + "description": "TMDB movie id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "chatgpt" - }, - { - "default": 0, - "description": "Pagination cursor", - "in": "query", - "name": "cursor", - "type": "integer" + "x-example": "27205" } ], "produces": [ @@ -506679,30 +522089,30 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/tiktok.searchUserResponseDoc" + "$ref": "#/definitions/tmdb.movieResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506713,52 +522123,30 @@ "ApiKeyAuth": [] } ], - "summary": "Search TikTok users", + "summary": "Get a TMDB movie", "tags": [ - "TikTok" + "TMDB" ] } }, - "/tiktok/top-ads/analysis": { + "/tmdb/person/list": { "get": { "consumes": [ "application/json" ], - "description": "Returns the detail-page interactive time analysis chart and percentile for a Top Ads material. Metric values are `retain_ctr` (CTR), `retain_cvr` (CVR), `click_cnt` (Clicks), `convert_cnt` (Conversion), and `play_retain_cnt` (Remain).", - "operationId": "tiktok-top-ads-analysis", + "description": "Returns one page from TMDB's Popular People directory, including each person's id, name, known-for titles, profile image, and detail URL.", + "operationId": "tmdb-person-list", "parameters": [ { - "description": "Top Ads material id", - "in": "query", - "name": "material_id", - "required": true, - "type": "string", - "x-example": "7130614705291427842" - }, - { - "default": "retain_ctr", - "description": "Interactive time analysis metric", - "enum": [ - "retain_ctr", - "retain_cvr", - "click_cnt", - "convert_cnt", - "play_retain_cnt" - ], + "description": "1-based page, default 1", "in": "query", - "name": "metric", - "type": "string" + "name": "page", + "type": "integer" }, { - "default": 7, - "description": "Percentile lookback period in days", - "enum": [ - 7, - 30, - 180 - ], + "description": "Max people, default 10, max 20", "in": "query", - "name": "period_type", + "name": "limit", "type": "integer" } ], @@ -506768,30 +522156,24 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsAnalysisResponseDoc" + "$ref": "#/definitions/tmdb.personListResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506802,28 +522184,33 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads interactive time analysis", + "summary": "List popular people on TMDB", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMDB" ] } }, - "/tiktok/top-ads/detail": { + "/tmdb/person/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns detail for one TikTok Creative Center Top Ads material. Use `material_id`; the upstream does not accept `id` or `materialId`.", - "operationId": "tiktok-top-ads-detail", + "description": "Returns a TMDB person by `id`: name, biography, birth date, photo URL and a filmography of movie and TV credits, most prominent first. `limit` caps the credits (default 10, max 20). Each credit has its `type` (`movie` or `tv`), id, title and `uri`. The biography may include a Wikipedia CC-BY-SA attribution note.", + "operationId": "tmdb-person", "parameters": [ { - "description": "Top Ads material id", - "in": "query", - "name": "material_id", + "description": "TMDB person id", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "7631130810943897607" + "x-example": "31" + }, + { + "description": "Max filmography credits, default 10, max 20", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -506832,30 +522219,30 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsDetailResponseDoc" + "$ref": "#/definitions/tmdb.personResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506866,44 +522253,77 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads detail", + "summary": "Get a TMDB person", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMDB" ] } }, - "/tiktok/top-ads/filters": { + "/tmdb/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns filter metadata for TikTok Creative Center Top Ads. Dynamic values come from TikTok; static UI enums are included for `order_by`, `duration`, `like`, and `ad_format`.", - "operationId": "tiktok-top-ads-filters", + "description": "Searches TMDB movies, TV shows, people, and collections. An unscoped query interleaves results across all four types rather than returning whichever type happens to rank first.", + "operationId": "tmdb-search", + "parameters": [ + { + "description": "Search query", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "Inception" + }, + { + "description": "Optional result type filter", + "enum": [ + "movie", + "tv", + "person", + "collection" + ], + "in": "query", + "name": "type", + "type": "string" + }, + { + "description": "1-based results page, default 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Max results, default 10, max 20", + "in": "query", + "name": "limit", + "type": "integer" + } + ], "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsFiltersResponseDoc" + "$ref": "#/definitions/tmdb.searchResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -506914,143 +522334,121 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads filters", + "summary": "Search TMDB", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMDB" ] } }, - "/tiktok/top-ads/list": { + "/tmdb/tv/list": { "get": { "consumes": [ "application/json" ], - "description": "Returns high-performing auction ads from TikTok Creative Center. The service defaults `period` to 30, `page` to 1, `limit` to 20, and `order_by` to `for_you`. Use `/tiktok/top-ads/filters` for dynamic enum values and static enums for order, duration, likes, and ad format.", - "operationId": "tiktok-top-ads-list", + "description": "Returns a page of TMDB TV shows from the `category` chart (`popular` by default, or `top_rated`, `airing_today`, `on_the_air`), optionally refined by `sort_by`, `with_genres`, `original_language`, first-air-date bounds `date_from` and `date_to`, rating, votes and runtime. `limit` defaults to 10 (max 20). A filtered page with no matches returns an empty `shows` array.", + "operationId": "tmdb-tv-list", "parameters": [ { - "default": 30, - "description": "Lookback period in days", + "description": "TV chart, default popular", "enum": [ - 7, - 30, - 180 + "popular", + "top_rated", + "airing_today", + "on_the_air" ], "in": "query", - "name": "period", - "type": "integer" + "name": "category", + "type": "string" }, { - "default": 1, - "description": "Page number", + "description": "1-based page, default 1", "in": "query", - "minimum": 1, "name": "page", "type": "integer" }, { - "default": 20, - "description": "Maximum number of ads to return", - "in": "query", - "maximum": 100, - "name": "limit", - "type": "integer" - }, - { - "default": "for_you", "description": "Sort order", "enum": [ - "for_you", - "impression", - "ctr", - "play_2s_rate", - "play_6s_rate", - "cvr", - "like" + "popularity.desc", + "popularity.asc", + "vote_average.desc", + "vote_average.asc", + "first_air_date.desc", + "first_air_date.asc", + "name.asc", + "name.desc" ], "in": "query", - "name": "order_by", + "name": "sort_by", "type": "string" }, { - "description": "Country code or comma-separated country codes from /tiktok/top-ads/filters", + "description": "Comma- or pipe-separated TV genre ids: 10759,16,35,80,99,18,10751,10762,9648,10763,10764,10765,10766,10767,10768,37", "in": "query", - "name": "country_code", + "name": "with_genres", "type": "string", - "x-example": "US" + "x-example": "18,10765" }, { - "description": "Brand or product keyword search", + "description": "Two-letter original-language code", "in": "query", - "name": "keyword", + "name": "original_language", "type": "string", - "x-example": "coffee" + "x-example": "en" }, { - "description": "Industry filter id or comma-separated ids from /tiktok/top-ads/filters", + "description": "First-air date lower bound (YYYY-MM-DD)", "in": "query", - "name": "industry", - "type": "string", - "x-example": "23118000000" + "name": "date_from", + "type": "string" }, { - "description": "Objective filter id or comma-separated ids from /tiktok/top-ads/filters", + "description": "First-air date upper bound (YYYY-MM-DD)", "in": "query", - "name": "objective", - "type": "string", - "x-example": "3" + "name": "date_to", + "type": "string" }, { - "description": "Ad language id or comma-separated ids from /tiktok/top-ads/filters", + "description": "Minimum rating, 0-10", "in": "query", - "name": "ad_language", - "type": "string", - "x-example": "en" + "name": "min_rating", + "type": "number" }, { - "description": "Pattern label id or comma-separated ids from /tiktok/top-ads/filters", + "description": "Maximum rating, 0-10", "in": "query", - "name": "pattern_label", - "type": "string", - "x-example": "10100100000" + "name": "max_rating", + "type": "number" }, { - "description": "Video duration bucket", - "enum": [ - "time-2", - "time-3", - "time-4", - "time-5", - "time-6", - "time-7" - ], + "description": "Minimum vote count", "in": "query", - "name": "duration", - "type": "string" + "name": "min_votes", + "type": "integer" }, { - "description": "Like percentile bucket id or comma-separated ids", - "enum": [ - "1", - "2", - "3", - "4", - "5" - ], + "description": "Minimum runtime in minutes", "in": "query", - "name": "like", - "type": "string" + "name": "min_runtime", + "type": "integer" }, { - "description": "Ad format id", - "enum": [ - "1", - "2" - ], + "description": "Maximum runtime in minutes", "in": "query", - "name": "ad_format", - "type": "string" + "name": "max_runtime", + "type": "integer" + }, + { + "description": "Include adult titles", + "in": "query", + "name": "include_adult", + "type": "boolean" + }, + { + "description": "Max shows, default 10, max 20", + "in": "query", + "name": "limit", + "type": "integer" } ], "produces": [ @@ -507059,30 +522457,24 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsListResponseDoc" + "$ref": "#/definitions/tmdb.tvListResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -507093,27 +522485,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads", + "summary": "Get a TMDB TV chart", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMDB" ] } }, - "/tiktok/top-ads/location-info": { + "/tmdb/tv/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns TikTok's inferred initial country and industry targeting context for Top Ads. Use it when you need starting targeting values; use the locations, filters, and list endpoints to choose criteria and retrieve ads.", - "operationId": "tiktok-top-ads-location-info", + "description": "Returns a TMDB TV show: overview, tagline, genres, countries, episode count, first/last air year, top-billed cast, top crew (creator), and aggregate rating.", + "operationId": "tmdb-tv", "parameters": [ { - "default": 1, - "description": "Optional upstream Creative Center module identifier; omitted or 0 defaults to 1, other nonzero IDs are passed through without local range validation", - "in": "query", - "name": "module", - "type": "integer" + "description": "TMDB TV show id", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "1396" } ], "produces": [ @@ -507122,78 +522514,30 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsLocationInfoResponseDoc" + "$ref": "#/definitions/tmdb.tvResponseDoc" } }, "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Retrieve TikTok Top Ads location info", - "tags": [ - "TikTok", - "TikTok Top Ads" - ] - } - }, - "/tiktok/top-ads/locations": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the country filters offered by TikTok Creative Center Top Ads. Each country has an `id` such as `US`, a `value` (the country name), a `label` and a `has_conversion` flag. Takes no parameters.", - "operationId": "tiktok-top-ads-locations", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/populartrend.topAdsLocationsResponseDoc" - } }, - "429": { - "description": "Rate limit exceeded", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -507204,44 +522548,24 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads locations", + "summary": "Get a TMDB TV show", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMDB" ] } }, - "/tiktok/top-ads/recommend": { + "/tmz/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists Top Ads materials that TikTok Creative Center recommends as related to the ad with `material_id`. `page` starts at 1; `limit` defaults to 20 and is capped at 100. Each ad has its title, brand, likes, comments, shares, CTR, objectives and video info. The list can be empty for a valid id.", - "operationId": "tiktok-top-ads-recommend", + "description": "Returns one TMZ article by `url`, a canonical HTTPS `tmz.com` link of the form `/////`. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", + "operationId": "tmz-article", "parameters": [ { - "description": "Top Ads material id", + "description": "Canonical TMZ article URL", "in": "query", - "name": "material_id", + "name": "url", "required": true, "type": "string", - "x-example": "7631130810943897607" - }, - { - "default": 1, - "description": "Page number", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 20, - "description": "Maximum number of ads to return", - "in": "query", - "maximum": 100, - "name": "limit", - "type": "integer" + "x-example": "https://www.tmz.com/2026/09/23/example-story/" } ], "produces": [ @@ -507250,30 +522574,24 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsRecommendResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Invalid input", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -507284,44 +522602,63 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads recommendations", + "summary": "Get TMZ article content", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMZ" ] } }, - "/tiktok/top-ads/safety": { + "/tmz/author": { "get": { - "consumes": [ - "application/json" + "description": "Returns a named person's TMZ profile hub: their name and their most recent TMZ coverage, from a canonical person-hub URL or slug. TMZ credits virtually all of its editorial content to a single \"TMZ Staff\" byline with no individual journalist profile pages, so this endpoint surfaces TMZ's own public per-person coverage hub (used for both celebrities and other newsmakers TMZ covers) as the closest available \"profile + recent articles\" surface.", + "operationId": "tmz-author", + "parameters": [ + { + "description": "Person slug, e.g. dolly-parton", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "dolly-parton" + }, + { + "description": "Canonical tmz.com/people/ URL, optionally with a ?page= query parameter; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.tmz.com/people/dolly-parton/" + }, + { + "default": 1, + "description": "1-based page number; overrides any page number in url", + "in": "query", + "name": "page", + "type": "integer" + } ], - "description": "Returns the Creative Center safety configuration flags for search: `top_ads_search`, `keyword_search`, `hashtag_search`, `creator_search`, `sound_search` and `cc_banner_key`. It carries feature flags only, not ad materials. Takes no parameters.", - "operationId": "tiktok-top-ads-safety", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsSafetyResponseDoc" + "$ref": "#/definitions/publicnews.tmzAuthorResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -507332,36 +522669,28 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads safety configuration", + "summary": "Get a TMZ person profile", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMZ" ] } }, - "/tiktok/top-ads/spotlight": { + "/tmz/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists the Top Ads Spotlight materials that TikTok Creative Center hand-picks. `page` starts at 1; `limit` defaults to 20 and is capped at 100. Each ad has its title, brand, likes, comments, shares, CTR, objectives and video info. `data.pagination` gives the page, size, total and `has_more`.", - "operationId": "tiktok-top-ads-spotlight", + "description": "Returns the current headlines for one TMZ section. `section` is required and must be `news` or `sports`. Each item has its title, URL and, where available, a summary, author, publication time, image and `type`, and the response echoes the `section`.", + "operationId": "tmz-headlines", "parameters": [ { - "default": 1, - "description": "Page number", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer" - }, - { - "default": 20, - "description": "Maximum number of ads to return", + "description": "TMZ section slug", + "enum": [ + "news", + "sports" + ], "in": "query", - "maximum": 100, - "name": "limit", - "type": "integer" + "name": "section", + "required": true, + "type": "string", + "x-example": "news" } ], "produces": [ @@ -507370,30 +522699,18 @@ "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, "schema": { - "$ref": "#/definitions/populartrend.topAdsSpotlightResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Invalid input", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -507404,66 +522721,34 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads Spotlight", + "summary": "Get TMZ section headlines", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMZ" ] } }, - "/tiktok/top-ads/suggestions": { + "/tmz/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Top Ads search suggestions from TikTok Creative Center. `count` is the maximum number of suggestions (default 50) and `scenario` picks the suggestion scenario id (default 1). The `query` list can be empty for the default scenario.", - "operationId": "tiktok-top-ads-suggestions", - "parameters": [ - { - "default": 50, - "description": "Maximum number of suggestions to return", - "in": "query", - "name": "count", - "type": "integer" - }, - { - "default": 1, - "description": "Suggestion scenario id", - "in": "query", - "name": "scenario", - "type": "integer" - } - ], + "description": "Returns the current TMZ celebrity news top stories. It takes no parameters. Each item has its title, URL and, where available, an author such as TMZ Staff, a summary, publication time and image URL. Use the headlines endpoint with `sports` for sports stories.", + "operationId": "tmz-news", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/populartrend.topAdsSuggestionsResponseDoc" - } - }, - "400": { - "description": "Invalid input", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -507474,40 +522759,24 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok Top Ads suggestions", + "summary": "Get TMZ top stories", "tags": [ - "TikTok", - "TikTok Top Ads" + "TMZ" ] } }, - "/tiktok/trending": { + "/tmz/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the current TikTok trending feed: `itemList` holds the videos, and `hasMore` and `cursor` describe paging. The response also has a `trendingTopics` field. Takes no parameters.", - "operationId": "tiktok-trending", + "description": "Returns the TMZ section inventory accepted by tmz-headlines: News (the home feed) and Sports. TMZ's public site has no broader stable editorial-category taxonomy beyond its own small main navigation -- see tmz-headlines for details.", + "operationId": "tmz-sections", "produces": [ "application/json" ], "responses": { "200": { "description": "OK", - "headers": { - "X-RateLimit-Per-Second-Remaining": { - "description": "Number of remaining requests per second", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/tiktok.trendingResponseDoc" - } - }, - "500": { - "description": "Internal server error", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -507516,24 +522785,24 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve TikTok trending posts", + "summary": "Get TMZ sections", "tags": [ - "TikTok" + "TMZ" ] } }, - "/time/article": { + "/tokopedia/autocomplete": { "get": { - "description": "Returns one TIME article by `url`, which must be a canonical HTTPS dated `time.com` article link. The response has the title, description, section, authors, publication and update times, lead image URL, body `paragraphs` and a `paywalled` flag.", - "operationId": "time-article", + "description": "Returns current public Tokopedia search suggestions for a partial keyword. Suggestions include canonical product-search URLs and are not product-search results.", + "operationId": "tokopedia-autocomplete", "parameters": [ { - "description": "Canonical TIME article URL", + "description": "Partial product keyword, up to 100 characters", "in": "query", - "name": "url", + "name": "q", "required": true, "type": "string", - "x-example": "https://time.com/article/2026/09/20/example-story/" + "x-example": "iph" } ], "produces": [ @@ -507543,7 +522812,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/tokopedia.autocompleteResponseDoc" } }, "400": { @@ -507552,8 +522821,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -507570,24 +522839,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get TIME article content", + "summary": "Autocomplete Tokopedia product searches", "tags": [ - "TIME" + "Tokopedia" ] } }, - "/time/author": { + "/tokopedia/category": { "get": { - "description": "Returns a TIME author's profile by `url`, a canonical `time.com/author//` link: name, job title, bio, image URL, social account links and recent articles with title, URL, excerpt, section, section URL and ISO-8601 `published_at`. Not every author lists a social account.", - "operationId": "time-author", + "description": "Returns public product cards from a canonical Tokopedia category path. `path` must begin with `/p/`; use the category page path, not a product or search URL.", + "operationId": "tokopedia-category", "parameters": [ { - "description": "Canonical TIME author URL", + "description": "Canonical Tokopedia category path beginning with /p/", "in": "query", - "name": "url", + "name": "path", "required": true, "type": "string", - "x-example": "https://time.com/author/stephanie-zacharek/" + "x-example": "/p/handphone-tablet/handphone" } ], "produces": [ @@ -507597,7 +522866,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.timeAuthorResponseDoc" + "$ref": "#/definitions/tokopedia.categoryResponseDoc" } }, "400": { @@ -507612,6 +522881,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -507624,36 +522899,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TIME author profile", + "summary": "Browse a Tokopedia category", "tags": [ - "TIME" + "Tokopedia" ] } }, - "/time/headlines": { + "/tokopedia/home": { "get": { - "description": "Returns the current headlines for one TIME section. `section` is required and takes one of `news`, `politics`, `world`, `business`, `technology`, `health`, `entertainment`, `sports`, `ideas` or `climate`. Each item has its title and URL.", - "operationId": "time-headlines", + "description": "Returns public product-card recommendations for a current Tokopedia home tab. Omit `tab_id` for the first available tab; discover other tabs through `/tokopedia/home/tabs`.", + "operationId": "tokopedia-home", "parameters": [ { - "description": "TIME RSS section slug", - "enum": [ - "news", - "politics", - "world", - "business", - "technology", - "health", - "entertainment", - "sports", - "ideas", - "climate" - ], + "description": "Current ID from /tokopedia/home/tabs", "in": "query", - "name": "section", - "required": true, + "name": "tab_id", "type": "string", - "x-example": "news" + "x-example": "1" + }, + { + "default": 1, + "description": "Recommendation page from 1 through 5", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -507663,7 +522932,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/tokopedia.homeResponseDoc" } }, "400": { @@ -507672,6 +522941,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -507684,16 +522959,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get TIME section headlines", + "summary": "Get Tokopedia home recommendations", "tags": [ - "TIME" + "Tokopedia" ] } }, - "/time/news": { + "/tokopedia/home/tabs": { "get": { - "description": "Returns the current top stories from TIME. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", - "operationId": "time-news", + "description": "Lists the current Tokopedia home recommendation tabs, each with its `id`, `name` and an optional image URL, plus a `fetched_at` timestamp. It takes no parameters. Pass a returned `id` as `tab_id` to `/tokopedia/home` to load that tab.", + "operationId": "tokopedia-home-tabs", "produces": [ "application/json" ], @@ -507701,7 +522976,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/tokopedia.homeTabsResponseDoc" } }, "429": { @@ -507722,50 +522997,32 @@ "ApiKeyAuth": [] } ], - "summary": "Get TIME top stories", - "tags": [ - "TIME" - ] - } - }, - "/time/sections": { - "get": { - "description": "Lists the 10 TIME section slugs that the headlines endpoint accepts: `news`, `politics`, `world`, `business`, `technology`, `health`, `entertainment`, `sports`, `ideas` and `climate`. Each entry has a `slug`, a display `name` and a `url`.", - "operationId": "time-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get TIME RSS sections", + "summary": "List Tokopedia home recommendation tabs", "tags": [ - "TIME" + "Tokopedia" ] } }, - "/timeslive/article": { + "/tokopedia/product": { "get": { - "description": "Returns article metadata and body paragraphs for a canonical TimesLIVE editorial article URL. Some stories may have a publisher access gate; paywalled is set when the page's first-party access flags indicate restricted content.", - "operationId": "timeslive-article", + "description": "Returns public product detail from a canonical Tokopedia shop domain and product key. This endpoint does not accept arbitrary URLs; numeric product IDs are returned when the product page exposes them but cannot be used as lookup input.", + "operationId": "tokopedia-product", "parameters": [ { - "description": "Canonical TimesLIVE article URL", + "description": "Canonical Tokopedia shop domain", "in": "query", - "name": "url", + "name": "shop_domain", "required": true, "type": "string", - "x-example": "https://www.timeslive.co.za/news/sci-tech/2026-09-29-insight-chinas-ai-agents-can-lie-and-scheme-just-like-their-us-rivals/" + "x-example": "ismile-indonesia" + }, + { + "description": "Canonical Tokopedia product key", + "in": "query", + "name": "product_key", + "required": true, + "type": "string", + "x-example": "apple-iphone-17-pro-max-garansi-resmi-256gb-512gb-1tb-2tb-1733012454966462347" } ], "produces": [ @@ -507775,7 +523032,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/tokopedia.productResponseDoc" } }, "400": { @@ -507790,6 +523047,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -507802,49 +523065,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get TimesLIVE article content", + "summary": "Get a Tokopedia product's public detail", "tags": [ - "TimesLIVE" + "Tokopedia" ] } }, - "/timeslive/headlines": { + "/tokopedia/product/review-filters": { "get": { - "description": "Returns current TimesLIVE stories for a section. Pass a slug from timeslive_sections; results are the first 15 items in the live section order.", - "operationId": "timeslive-headlines", + "description": "Returns which public review media, rating, and topic filters are available for a numeric product ID. It does not return review text, review media, or a review archive.", + "operationId": "tokopedia-product-review-filters", "parameters": [ { - "description": "TimesLIVE editorial section slug", - "enum": [ - "news", - "news/south-africa", - "news/africa", - "news/world", - "news/business", - "news/sci-tech", - "politics", - "opinion", - "ideas", - "investigations", - "tshisa-live", - "lifestyle", - "lifestyle/fashion", - "lifestyle/food", - "lifestyle/travel", - "lifestyle/books", - "lifestyle/spotlight", - "sport", - "sport/soccer", - "sport/rugby", - "sport/cricket", - "sport/arena-sports-show", - "motoring" - ], + "description": "Numeric Tokopedia product ID", "in": "query", - "name": "section", + "name": "product_id", "required": true, "type": "string", - "x-example": "news" + "x-example": "102491859263" } ], "produces": [ @@ -507854,7 +523092,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/tokopedia.reviewFiltersResponseDoc" } }, "400": { @@ -507863,6 +523101,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -507875,16 +523119,57 @@ "ApiKeyAuth": [] } ], - "summary": "Get TimesLIVE section headlines", + "summary": "Get Tokopedia product review-filter metadata", "tags": [ - "TimesLIVE" + "Tokopedia" ] } }, - "/timeslive/news": { + "/tokopedia/search": { "get": { - "description": "Returns current TimesLIVE stories, including section-specific headlines. Article access can vary by story.", - "operationId": "timeslive-news", + "description": "Returns public Tokopedia product cards for a keyword from Tokopedia's public product-search operation. `sort` accepts `3` (lowest price), `4` (highest price), `5` (most reviewed), `9` (newest), or `23` (most relevant). Repeat `filter` as `key:value` using values from `/tokopedia/search/filters`.", + "operationId": "tokopedia-search", + "parameters": [ + { + "description": "Product keyword", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "sepatu lari" + }, + { + "default": 1, + "description": "Search page from 1 through 5", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "default": 23, + "description": "Sort: 3 lowest price, 4 highest price, 5 most reviewed, 9 newest, 23 most relevant", + "enum": [ + 3, + 4, + 5, + 9, + 23 + ], + "in": "query", + "name": "sort", + "type": "integer" + }, + { + "collectionFormat": "multi", + "description": "Repeat live key:value filter selections from /tokopedia/search/filters", + "in": "query", + "items": { + "type": "string" + }, + "name": "filter", + "type": "array" + } + ], "produces": [ "application/json" ], @@ -507892,7 +523177,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/tokopedia.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { @@ -507913,16 +523204,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get TimesLIVE top stories", + "summary": "Search Tokopedia products", "tags": [ - "TimesLIVE" + "Tokopedia" ] } }, - "/timeslive/sections": { + "/tokopedia/search/filters": { "get": { - "description": "Returns the complete public editorial navigation set accepted by the TimesLIVE headlines endpoint. External Sunday Times, partner, podcast, account, and link-only surfaces are excluded.", - "operationId": "timeslive-sections", + "description": "Returns the live filter tree and supported sort choices for a Tokopedia product search. The response includes categories when the current query exposes them, store type, delivery location, price, rating, offer, condition, recency, shipping, and stock options as applicable.", + "operationId": "tokopedia-search-filters", + "parameters": [ + { + "description": "Product keyword", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "sepatu" + } + ], "produces": [ "application/json" ], @@ -507930,7 +523231,25 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/tokopedia.searchFiltersResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -507939,24 +523258,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get TimesLIVE sections", + "summary": "Get Tokopedia search filters and sorts", "tags": [ - "TimesLIVE" + "Tokopedia" ] } }, - "/timesofindia/article": { + "/tomsguide/article": { "get": { - "description": "Returns public Times of India article metadata (title, author(s), published/updated dates, section, lead image) and body paragraphs from a canonical article URL. A story gated behind a subscription returns a permission error instead of a truncated or fabricated body.", - "operationId": "timesofindia-article", + "description": "Returns one Tom's Guide article by `url`, a canonical HTTPS `tomsguide.com` link such as `tomsguide.com/
/`. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag. On some product reviews `authors` may be empty.", + "operationId": "tomsguide-article", "parameters": [ { - "description": "Canonical Times of India article URL", + "description": "Canonical Tom's Guide article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://timesofindia.indiatimes.com/business/india-business/example-story/articleshow/134456699.cms" + "x-example": "https://www.tomsguide.com/audio/over-ear-headphones/noble-audio-fokus-artemis-review" } ], "produces": [ @@ -507975,12 +523294,6 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "404": { "description": "Not Found", "schema": { @@ -507999,24 +523312,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Times of India article content", + "summary": "Get Tom's Guide article content", "tags": [ - "Times of India" + "Tom's Guide" ] } }, - "/timesofindia/author": { + "/tomsguide/author": { "get": { - "description": "Returns a Times of India reporter's profile by `url`, a canonical `timesofindia.indiatimes.com/toireporter/author--.cms` link: name, job title, organization, location, email, biography, headshot and recent articles with title and URL. Fields the profile page does not publish may be empty.", - "operationId": "timesofindia-author", + "description": "Returns a Tom's Guide author's name, job title, biography, social links and one page of recent articles. Give exactly one of `slug` or `url`; `page` is 1-based, defaults to 1 and overrides any page in `url`. The response also has `page` and `has_next_page`.", + "operationId": "tomsguide-author", "parameters": [ { - "description": "Canonical Times of India author URL", + "description": "Author slug, e.g. tom-pritchard", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "tom-pritchard" + }, + { + "description": "Canonical tomsguide.com/author/ URL, optionally with a /page/ segment; alternative to slug", "in": "query", "name": "url", - "required": true, "type": "string", - "x-example": "https://timesofindia.indiatimes.com/toireporter/author-Smriti-Jain-479254229.cms" + "x-example": "https://www.tomsguide.com/author/tom-pritchard" + }, + { + "default": 1, + "description": "1-based page number; overrides any page number in url", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -508026,7 +523352,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.timesOfIndiaAuthorResponseDoc" + "$ref": "#/definitions/publicnews.tomsguideAuthorResponseDoc" } }, "400": { @@ -508053,81 +523379,48 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Times of India author profile", + "summary": "Get a Tom's Guide author profile", "tags": [ - "Times of India" + "Tom's Guide" ] } }, - "/timesofindia/headlines": { + "/tomsguide/headlines": { "get": { - "description": "Returns the current headlines for one Times of India section or city edition. `section` is required, for example `top-stories`, `india`, `world`, `business`, `cricket`, `mumbai`, `delhi` or `bangalore`. Items carry the title and URL, plus summary, author, publication time and image when the outlet provides them.", - "operationId": "timesofindia-headlines", + "description": "Returns the current headlines for one Tom's Guide section. `section` is required and takes one of 22 slugs, such as `ai`, `audio`, `deals`, `how-to`, `news`, `reviews`, `tvs` or `phones`. Each item has its title, URL, summary, author, publication time and image.", + "operationId": "tomsguide-headlines", "parameters": [ { - "description": "Times of India section slug", + "description": "Tom's Guide section slug", "enum": [ - "top-stories", - "india", - "world", - "nri", - "business", - "cricket", - "sports", - "science", - "environment", - "tech", - "education", + "ai", + "audio", + "best-picks", + "cameras-photography", + "computing", + "deals", "entertainment", - "life-style", - "astrology", - "auto", - "mumbai", - "delhi", - "bangalore", - "hyderabad", - "chennai", - "ahmedabad", - "allahabad", - "bhubaneswar", - "coimbatore", - "gurgaon", - "guwahati", - "hubli", - "kanpur", - "kolkata", - "ludhiana", - "mangalore", - "mysore", - "noida", - "pune", - "goa", - "chandigarh", - "lucknow", - "patna", - "jaipur", - "nagpur", - "rajkot", - "ranchi", - "surat", - "vadodara", - "varanasi", - "thane", - "thiruvananthapuram", - "us", - "pakistan", - "south-asia", - "uk", - "europe", - "china", - "middle-east", - "rest-of-world" + "face-off", + "gaming", + "home", + "how-to", + "mattresses", + "news", + "reference", + "reviews", + "sales-events", + "tech", + "tech-events", + "tvs", + "vehicle-tech", + "wellness", + "phones" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "top-stories" + "x-example": "ai" } ], "produces": [ @@ -508158,16 +523451,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Times of India section headlines", + "summary": "Get Tom's Guide section headlines", "tags": [ - "Times of India" + "Tom's Guide" ] } }, - "/timesofindia/news": { + "/tomsguide/news": { "get": { - "description": "Returns the current Times of India top stories. It takes no parameters. Each item has its title, URL, summary, publication time with its UTC offset, author and image URL. Use the headlines endpoint for a section or city edition.", - "operationId": "timesofindia-news", + "description": "Returns the current top stories from Tom's Guide. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", + "operationId": "tomsguide-news", "produces": [ "application/json" ], @@ -508196,16 +523489,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Times of India top stories", + "summary": "Get Tom's Guide top stories", "tags": [ - "Times of India" + "Tom's Guide" ] } }, - "/timesofindia/sections": { + "/tomsguide/sections": { "get": { - "description": "Lists the 55 Times of India sections that the headlines endpoint accepts, covering national and international topics such as `india`, `world`, `business` and `cricket`, and India city editions such as `mumbai`, `delhi` and `bangalore`. Each entry has a `slug`, a display `name` and the section feed `url`.", - "operationId": "timesofindia-sections", + "description": "Lists the 22 top-level Tom's Guide content verticals that the headlines endpoint accepts, such as `ai`, `best-picks`, `how-to`, `mattresses`, `reviews`, `vehicle-tech` and `phones`. Each entry has a `slug`, a display `name` and a `url`.", + "operationId": "tomsguide-sections", "produces": [ "application/json" ], @@ -508222,24 +523515,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get The Times of India sections", + "summary": "Get Tom's Guide sections", "tags": [ - "Times of India" + "Tom's Guide" ] } }, - "/timesofisrael/article": { + "/tomshardware/article": { "get": { - "description": "Returns public Times of Israel article metadata and body paragraphs from a canonical article URL. Both regular story pages and individual liveblog-update pages (/liveblog_entry//) are accepted.", - "operationId": "timesofisrael-article", + "description": "Returns one Tom's Hardware article by its canonical `url`, either the current `tomshardware.com/
//` form or the legacy `/reviews/,.html` form. The response has the title, description, authors, section, published and updated times, lead image, the body `paragraphs` and a `paywalled` flag.", + "operationId": "tomshardware-article", "parameters": [ { - "description": "Canonical Times of Israel article URL", + "description": "Canonical Tom's Hardware article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.timesofisrael.com/example-article-slug/" + "x-example": "https://www.tomshardware.com/monitors/gaming-monitors/sony-inzone-m10s-ii-27-inch-540-hz-qhd-oled-gaming-monitor-review" } ], "produces": [ @@ -508276,24 +523569,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get Times of Israel article content", + "summary": "Get Tom's Hardware article content", "tags": [ - "Times of Israel" + "Tom's Hardware" ] } }, - "/timesofisrael/author": { + "/tomshardware/author": { "get": { - "description": "Returns a Times of Israel writer's byline metadata, biography, social links, and recent articles from a canonical writer profile URL.", - "operationId": "timesofisrael-author", + "description": "Returns a Tom's Hardware author profile with name, job title, biography, social links and one page of recent articles. Identify the author with `slug` (such as `christian-eberle`) or an author `url`; `page` (default 1) overrides any page in the URL. `has_next_page` tells you whether more articles exist.", + "operationId": "tomshardware-author", "parameters": [ { - "description": "Canonical Times of Israel author URL", + "description": "Author slug, e.g. christian-eberle", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "christian-eberle" + }, + { + "description": "Canonical tomshardware.com/author/ URL, optionally with a /page/ segment; alternative to slug", "in": "query", "name": "url", - "required": true, "type": "string", - "x-example": "https://www.timesofisrael.com/writers/jane-doe/" + "x-example": "https://www.tomshardware.com/author/christian-eberle" + }, + { + "default": 1, + "description": "1-based page number; overrides any page number in url", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -508303,7 +523609,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.timesOfIsraelAuthorResponseDoc" + "$ref": "#/definitions/publicnews.tomshardwareAuthorResponseDoc" } }, "400": { @@ -508330,31 +523636,46 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Times of Israel author profile", + "summary": "Get a Tom's Hardware author profile", "tags": [ - "Times of Israel" + "Tom's Hardware" ] } }, - "/timesofisrael/headlines": { + "/tomshardware/headlines": { "get": { - "description": "Returns the current headlines for one Times of Israel section. `section` is required and takes one of `israel-and-the-region`, `israel-inside`, `jewish-times`, `real-estate-israel` or `tech-israel`. Each item has its title and URL.", - "operationId": "timesofisrael-headlines", + "description": "Lists the current headlines for one Tom's Hardware section. `section` is required and takes a slug such as `gpus`, `cpus`, `laptops`, `deals`, `reviews` or `news`; use `tomshardware-sections` for the full set. Each item has its title, URL, author, publication time and lead image, plus a summary when the section's listing provides one.", + "operationId": "tomshardware-headlines", "parameters": [ { - "description": "Times of Israel section slug", + "description": "Tom's Hardware section slug", "enum": [ - "israel-and-the-region", - "israel-inside", - "jewish-times", - "real-estate-israel", - "tech-israel" + "3d-printing", + "best-picks", + "cpus", + "deals", + "desktops", + "features", + "gpus", + "laptops", + "maker-stem", + "monitors", + "networking", + "news", + "news-analysis", + "pc-components", + "peripherals", + "phones", + "reviews", + "service-providers", + "software", + "tech-industry" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "israel-and-the-region" + "x-example": "3d-printing" } ], "produces": [ @@ -508385,16 +523706,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Times of Israel section headlines", + "summary": "Get Tom's Hardware section headlines", "tags": [ - "Times of Israel" + "Tom's Hardware" ] } }, - "/timesofisrael/news": { + "/tomshardware/news": { "get": { - "description": "Returns the latest Times of Israel stories. It takes no parameters. Each item has a title, URL and publication time. The list includes both regular story pages and individual liveblog-update pages, so expect some entries to be short updates.", - "operationId": "timesofisrael-news", + "description": "Returns the latest Tom's Hardware top stories with no parameters. Each item has its title, URL, summary, author, publication time and lead image. Use the item URLs with `tomshardware-article` to read the body.", + "operationId": "tomshardware-news", "produces": [ "application/json" ], @@ -508423,16 +523744,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Times of Israel top stories", + "summary": "Get Tom's Hardware top stories", "tags": [ - "Times of Israel" + "Tom's Hardware" ] } }, - "/timesofisrael/sections": { + "/tomshardware/sections": { "get": { - "description": "Lists the five Times of Israel sections that the headlines endpoint accepts: `israel-and-the-region`, `israel-inside`, `jewish-times`, `real-estate-israel` and `tech-israel`. Each entry has a `slug`, a display `name` and a section `url`.", - "operationId": "timesofisrael-sections", + "description": "Lists the 20 Tom's Hardware top-level sections that `tomshardware-headlines` accepts, including `3d-printing`, `cpus`, `gpus`, `monitors`, `news` and `reviews`. Each section carries its `slug`, display `name` and page `url`. Takes no parameters.", + "operationId": "tomshardware-sections", "produces": [ "application/json" ], @@ -508449,27 +523770,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Times of Israel sections", + "summary": "Get Tom's Hardware sections", "tags": [ - "Times of Israel" + "Tom's Hardware" ] } }, - "/tmdb/collection/{id}": { + "/torontostar/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a TMDB collection (a movie franchise grouping) by `id`, which can be the collection id or an id-slug. The response has the collection title, overview, `uri` and `source_url`, plus its member movies, each with id, title, overview, poster URL, release date and `uri`.", - "operationId": "tmdb-collection", + "description": "Returns public Toronto Star article metadata and the body paragraphs shown to an anonymous reader from a canonical article URL. The Star meters its articles, so paywalled is true and paragraphs holds only the public teaser (typically the first two paragraphs) whenever the page hides the rest from non-subscribers.", + "operationId": "torontostar-article", "parameters": [ { - "description": "TMDB collection id or id-slug", - "in": "path", - "name": "id", + "description": "Canonical Toronto Star article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "263" + "x-example": "https://www.thestar.com/news/gta/court-set-to-hear-from-victims-families-in-case-of-international-poison-seller-kenneth-law/article_e760a06a-60da-49b6-ae00-fe14e1b5eb5b.html" } ], "produces": [ @@ -508479,7 +523797,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.collectionResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -508494,12 +523812,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -508512,19 +523824,32 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TMDB collection", + "summary": "Get Toronto Star article content", "tags": [ - "TMDB" + "Toronto Star" ] } }, - "/tmdb/genres": { + "/torontostar/author": { "get": { - "consumes": [ - "application/json" + "description": "Returns one Toronto Star author's public profile: name, job title, biography, location and topic focus, avatar, and their recent articles.", + "operationId": "torontostar-author", + "parameters": [ + { + "description": "Author profile slug (thestar.com/users/profile/); use this or url", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "omar-mosleh" + }, + { + "description": "Canonical thestar.com/users/profile/ URL; alternative to slug", + "in": "query", + "name": "url", + "type": "string", + "x-example": "https://www.thestar.com/users/profile/omar-mosleh/" + } ], - "description": "Returns every genre ID for TMDB movie and TV browse pages. Use movie values only with movie list filters and TV values only with TV list filters.", - "operationId": "tmdb-genres", "produces": [ "application/json" ], @@ -508532,11 +523857,17 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.genresResponseDoc" + "$ref": "#/definitions/publicnews.torontoStarAuthorResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -508553,121 +523884,95 @@ "ApiKeyAuth": [] } ], - "summary": "List TMDB browse genres", + "summary": "Get a Toronto Star author profile", "tags": [ - "TMDB" + "Toronto Star" ] } }, - "/tmdb/movie/list": { + "/torontostar/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a page of TMDB movies from the `category` chart (`popular` by default, or `top_rated`, `now_playing`, `upcoming`), optionally refined by `sort_by`, `with_genres`, `original_language`, release dates, rating, votes and runtime. `limit` defaults to 10 (max 20). Each movie has id, title, overview, poster, release date and `uri`; `has_next_page` signals more pages.", - "operationId": "tmdb-movie-list", + "description": "Returns fresh Toronto Star headlines from one public section page, with summary, publish time and image when the page shows them.", + "operationId": "torontostar-headlines", "parameters": [ { - "description": "Movie chart, default popular", - "enum": [ - "popular", - "top_rated", - "now_playing", - "upcoming" - ], - "in": "query", - "name": "category", - "type": "string" - }, - { - "description": "1-based page, default 1", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Sort order", + "description": "Toronto Star section path", "enum": [ - "popularity.desc", - "popularity.asc", - "vote_average.desc", - "vote_average.asc", - "primary_release_date.desc", - "primary_release_date.asc", - "title.asc", - "title.desc" - ], - "in": "query", - "name": "sort_by", - "type": "string" - }, - { - "description": "Comma- or pipe-separated movie genre ids: 28,12,16,35,80,99,18,10751,14,36,27,10402,9648,10749,878,10770,53,10752,37", - "in": "query", - "name": "with_genres", - "type": "string", - "x-example": "18,878" - }, - { - "description": "Two-letter original-language code", - "in": "query", - "name": "original_language", - "type": "string", - "x-example": "en" - }, - { - "description": "Release date lower bound (YYYY-MM-DD)", - "in": "query", - "name": "date_from", - "type": "string" - }, - { - "description": "Release date upper bound (YYYY-MM-DD)", - "in": "query", - "name": "date_to", - "type": "string" - }, - { - "description": "Minimum rating, 0-10", - "in": "query", - "name": "min_rating", - "type": "number" - }, - { - "description": "Maximum rating, 0-10", - "in": "query", - "name": "max_rating", - "type": "number" - }, - { - "description": "Minimum vote count", - "in": "query", - "name": "min_votes", - "type": "integer" - }, - { - "description": "Minimum runtime in minutes", - "in": "query", - "name": "min_runtime", - "type": "integer" - }, - { - "description": "Maximum runtime in minutes", - "in": "query", - "name": "max_runtime", - "type": "integer" - }, - { - "description": "Include adult titles", - "in": "query", - "name": "include_adult", - "type": "boolean" - }, - { - "description": "Max movies, default 10, max 20", + "news", + "news/gta", + "news/toronto-election", + "news/police/project-south", + "news/car-thefts", + "news/canada", + "news/ontario", + "news/canada/british-columbia", + "news/canada/alberta", + "news/canada/quebec", + "news/canada/nova-scotia", + "news/investigations", + "news/world", + "news/world/united-states", + "news/world/americas", + "news/world/europe", + "news/world/asia", + "news/world/africa", + "news/world/australia", + "news/world/middle-east", + "news/world/royals", + "politics", + "politics/federal", + "politics/provincial", + "politics/political-opinion", + "opinion", + "opinion/star-columnists", + "opinion/editorials", + "opinion/contributors", + "opinion/letters-to-the-editor", + "opinion/editorial-cartoons", + "life", + "life/relationships", + "life/food-and-drink", + "life/beauty-and-fashion", + "life/health-wellness", + "life/home-and-garden", + "life/autos", + "life/horoscopes", + "sports", + "sports/hockey", + "sports/hockey/pwhl", + "sports/basketball", + "sports/basketball/wnba", + "sports/baseball", + "sports/football", + "sports/football/cfl", + "sports/golf", + "sports/soccer", + "sports/tennis", + "sports/auto-racing", + "sports/cricket", + "sports/olympics-and-paralympics", + "real-estate", + "entertainment", + "entertainment/stage", + "entertainment/books", + "entertainment/music", + "entertainment/movies", + "entertainment/television", + "business", + "business/small-business", + "business/technology", + "business/mars", + "podcasts", + "podcasts/this-matters", + "podcasts/its-political", + "podcasts/billionaire-murders", + "podcasts/deep-left-field" + ], "in": "query", - "name": "limit", - "type": "integer" + "name": "section", + "required": true, + "type": "string", + "x-example": "news" } ], "produces": [ @@ -508677,7 +523982,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.movieListResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -508686,11 +523991,37 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Toronto Star section headlines", + "tags": [ + "Toronto Star" + ] + } + }, + "/torontostar/news": { + "get": { + "description": "Returns the newest Toronto Star editorial stories (up to 50, newest first) from the public news sitemap. Press-release and sponsored pages are excluded.", + "operationId": "torontostar-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.newsResponseDoc" + } }, "503": { "description": "Service Unavailable", @@ -508704,27 +524035,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TMDB movie chart", + "summary": "Get Toronto Star top stories", "tags": [ - "TMDB" + "Toronto Star" ] } }, - "/tmdb/movie/{id}": { + "/torontostar/sections": { "get": { - "consumes": [ + "description": "Lists the 69 Toronto Star sections accepted by the headlines endpoint, taken from thestar.com's main navigation. Each has a `slug`, a display `name` and a `url`. Nested sections use slash paths such as `news/gta`, `sports/hockey/pwhl` and `business/technology`. Takes no parameters.", + "operationId": "torontostar-sections", + "produces": [ "application/json" ], - "description": "Returns a TMDB movie: overview, tagline, genres, countries, runtime, budget/revenue, top-billed cast, top crew (director/writer), and aggregate rating.", - "operationId": "tmdb-movie", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Toronto Star sections", + "tags": [ + "Toronto Star" + ] + } + }, + "/townhall/article": { + "get": { + "description": "Returns public Townhall article metadata and body paragraphs from a canonical news or column URL. VIP stories are flagged with paywalled and return only the free lead paragraphs.", + "operationId": "townhall-article", "parameters": [ { - "description": "TMDB movie id", - "in": "path", - "name": "id", + "description": "Canonical Townhall article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "27205" + "x-example": "https://townhall.com/news/amy-curtis/2026/09/24/second-man-arrested-in-mississippi-hanging-ap-ignores-race-n2683524" } ], "produces": [ @@ -508734,7 +524088,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.movieResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -508749,12 +524103,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -508767,31 +524115,30 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TMDB movie", + "summary": "Get Townhall article content", "tags": [ - "TMDB" + "Townhall" ] } }, - "/tmdb/person/list": { + "/townhall/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page from TMDB's Popular People directory, including each person's id, name, known-for titles, profile image, and detail URL.", - "operationId": "tmdb-person-list", + "description": "Returns a Townhall author profile by `slug` (such as `amy-curtis`) or by an author `url`; exactly one is required. The response has the name, photo, bio, X profile link and the first page of the author's archive, about 50 stories, each with its section label and a `vip` flag. Unknown authors return a not-found error.", + "operationId": "townhall-author", "parameters": [ { - "description": "1-based page, default 1", + "description": "Author slug, e.g. amy-curtis", "in": "query", - "name": "page", - "type": "integer" + "name": "slug", + "type": "string", + "x-example": "amy-curtis" }, { - "description": "Max people, default 10, max 20", + "description": "Canonical townhall.com/author/ URL; alternative to slug", "in": "query", - "name": "limit", - "type": "integer" + "name": "url", + "type": "string", + "x-example": "https://townhall.com/author/amy-curtis" } ], "produces": [ @@ -508801,7 +524148,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.personListResponseDoc" + "$ref": "#/definitions/publicnews.townhallAuthorResponseDoc" } }, "400": { @@ -508810,8 +524157,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -508828,33 +524175,36 @@ "ApiKeyAuth": [] } ], - "summary": "List popular people on TMDB", + "summary": "Get a Townhall author profile", "tags": [ - "TMDB" + "Townhall" ] } }, - "/tmdb/person/{id}": { + "/townhall/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a TMDB person by `id`: name, biography, birth date, photo URL and a filmography of movie and TV credits, most prominent first. `limit` caps the credits (default 10, max 20). Each credit has its `type` (`movie` or `tv`), id, title and `uri`. The biography may include a Wikipedia CC-BY-SA attribution note.", - "operationId": "tmdb-person", + "description": "Lists headlines for one Townhall section. `section` is required: `news` and `columnists` return the 20 most recent stories, while the topic sections (such as `congress`, `economy` or `iran`) return up to 30 stories mixing news and columns. Items carry title, URL, image and, when available, author, time and summary.", + "operationId": "townhall-headlines", "parameters": [ { - "description": "TMDB person id", - "in": "path", - "name": "id", + "description": "Townhall section slug", + "enum": [ + "news", + "columnists", + "2026-elections", + "congress", + "donald-trump", + "economy", + "foreign-policy", + "illegal-immigration", + "iran", + "supreme-court" + ], + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "31" - }, - { - "description": "Max filmography credits, default 10, max 20", - "in": "query", - "name": "limit", - "type": "integer" + "x-example": "news" } ], "produces": [ @@ -508864,7 +524214,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.personResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -508873,16 +524223,36 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } - }, - "500": { - "description": "Internal Server Error", + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Townhall section headlines", + "tags": [ + "Townhall" + ] + } + }, + "/townhall/news": { + "get": { + "description": "Returns the latest Townhall stories, news and opinion columns mixed, newest first, about 50 items. Each has its title, URL, short summary, publication time, author byline and lead image. Video pages are left out. Takes no parameters.", + "operationId": "townhall-news", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "503": { @@ -508897,51 +524267,99 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TMDB person", + "summary": "Get Townhall top stories", "tags": [ - "TMDB" + "Townhall" ] } }, - "/tmdb/search": { + "/townhall/sections": { + "get": { + "description": "Returns the public Townhall section inventory: the site-wide news and column feeds plus the editorial topic hubs the site promotes.", + "operationId": "townhall-sections", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Townhall sections", + "tags": [ + "Townhall" + ] + } + }, + "/tripadvisor/autocomplete": { "get": { "consumes": [ "application/json" ], - "description": "Searches TMDB movies, TV shows, people, and collections. An unscoped query interleaves results across all four types rather than returning whichever type happens to rank first.", - "operationId": "tmdb-search", + "description": "Returns TripAdvisor typeahead suggestions for the required query `q`, optionally narrowed by `limit`, `locale`, `scope_geo_id` and a `type` hint. Each result has its id, title, type, URL, image, parent location and coordinates, and may carry nested search shortcuts. Results can be locations, hotels, restaurants or attractions.", + "operationId": "tripadvisor-autocomplete", "parameters": [ { - "description": "Search query", + "description": "Autocomplete query", "in": "query", - "name": "query", + "name": "q", "required": true, "type": "string", - "x-example": "Inception" + "x-example": "hong kong" }, { - "description": "Optional result type filter", - "enum": [ - "movie", - "tv", - "person", - "collection" - ], + "description": "Maximum results", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 5 + }, + { + "description": "TripAdvisor locale", + "in": "query", + "name": "locale", + "type": "string", + "x-example": "en-HK" + }, + { + "description": "Optional scoped geo id", + "in": "query", + "name": "scope_geo_id", + "type": "integer", + "x-example": 294217 + }, + { + "description": "Optional result type hint", "in": "query", "name": "type", + "type": "string", + "x-example": "attraction" + }, + { + "description": "Optional captured search session id", + "in": "query", + "name": "search_session_id", "type": "string" }, { - "description": "1-based results page, default 1", + "description": "Optional captured typeahead id", "in": "query", - "name": "page", - "type": "integer" + "name": "typeahead_id", + "type": "string" }, { - "description": "Max results, default 10, max 20", + "description": "Optional captured route uid", "in": "query", - "name": "limit", - "type": "integer" + "name": "route_uid", + "type": "string" } ], "produces": [ @@ -508951,7 +524369,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.searchResponseDoc" + "$ref": "#/definitions/tripadvisor.tripadvisorAutocompleteResponseDoc" } }, "400": { @@ -508960,8 +524378,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -508978,121 +524396,150 @@ "ApiKeyAuth": [] } ], - "summary": "Search TMDB", + "summary": "Autocomplete TripAdvisor locations and places", "tags": [ - "TMDB" + "TripAdvisor" ] } }, - "/tmdb/tv/list": { + "/tripadvisor/enums": { + "get": { + "description": "Returns the values TripAdvisor place and listing filters accept: `locales`, `currencies`, `languages`, `listing_types`, `sorts`, `pricing_modes`, `hotel_classes`, `hotel_amenities`, `restaurant_types`, `restaurant_options`, attraction categories with their ids, and `filter_ids`. It also lists `unsupported_entity_types`. Takes no parameters.", + "operationId": "tripadvisor-enums", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/tripadvisor.tripadvisorEnumsResponseDoc" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get TripAdvisor enum metadata", + "tags": [ + "TripAdvisor" + ] + } + }, + "/tripadvisor/hotels": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of TMDB TV shows from the `category` chart (`popular` by default, or `top_rated`, `airing_today`, `on_the_air`), optionally refined by `sort_by`, `with_genres`, `original_language`, first-air-date bounds `date_from` and `date_to`, rating, votes and runtime. `limit` defaults to 10 (max 20). A filtered page with no matches returns an empty `shows` array.", - "operationId": "tmdb-tv-list", + "description": "Searches TripAdvisor hotels in the area given by the required `geo_id`. Filter with `class`, `amenities`, `price_min`, `price_max`, `pricing_mode`, `travelers_choice` and `currency`; page with `offset` and `limit`; order with `sort`. Each hotel has its title, URL, image, rating, review count, star rating, rank, price, provider, location and a review snippet when TripAdvisor supplies them.", + "operationId": "tripadvisor-hotels", "parameters": [ { - "description": "TV chart, default popular", - "enum": [ - "popular", - "top_rated", - "airing_today", - "on_the_air" - ], - "in": "query", - "name": "category", - "type": "string" - }, - { - "description": "1-based page, default 1", + "description": "TripAdvisor geo id", "in": "query", - "name": "page", - "type": "integer" + "name": "geo_id", + "required": true, + "type": "integer", + "x-example": 294217 }, { - "description": "Sort order", - "enum": [ - "popularity.desc", - "popularity.asc", - "vote_average.desc", - "vote_average.asc", - "first_air_date.desc", - "first_air_date.asc", - "name.asc", - "name.desc" - ], + "description": "Optional filter id such as class or ufe", "in": "query", - "name": "sort_by", - "type": "string" + "name": "filter_id", + "type": "string", + "x-example": "ufe" }, { - "description": "Comma- or pipe-separated TV genre ids: 10759,16,35,80,99,18,10751,10762,9648,10763,10764,10765,10766,10767,10768,37", + "description": "Hotel class filter", "in": "query", - "name": "with_genres", - "type": "string", - "x-example": "18,10765" + "name": "class", + "type": "integer", + "x-example": 5 }, { - "description": "Two-letter original-language code", + "collectionFormat": "multi", + "description": "Amenity filter ids", "in": "query", - "name": "original_language", - "type": "string", - "x-example": "en" + "items": { + "type": "integer" + }, + "name": "amenities", + "type": "array" }, { - "description": "First-air date lower bound (YYYY-MM-DD)", + "description": "Minimum price filter", "in": "query", - "name": "date_from", - "type": "string" + "name": "price_min", + "type": "integer", + "x-example": 1000 }, { - "description": "First-air date upper bound (YYYY-MM-DD)", + "description": "Maximum price filter", "in": "query", - "name": "date_to", - "type": "string" + "name": "price_max", + "type": "integer", + "x-example": 3205 }, { - "description": "Minimum rating, 0-10", + "description": "Pricing mode", "in": "query", - "name": "min_rating", - "type": "number" + "name": "pricing_mode", + "type": "string", + "x-example": "ALL_IN_RATE" }, { - "description": "Maximum rating, 0-10", + "description": "Filter Travelers' Choice properties", "in": "query", - "name": "max_rating", - "type": "number" + "name": "travelers_choice", + "type": "boolean" }, { - "description": "Minimum vote count", + "description": "Filter Best of the Best properties", "in": "query", - "name": "min_votes", - "type": "integer" + "name": "travelers_choice_botb", + "type": "boolean" }, { - "description": "Minimum runtime in minutes", + "description": "Currency code", "in": "query", - "name": "min_runtime", - "type": "integer" + "name": "currency", + "type": "string", + "x-example": "HKD" }, { - "description": "Maximum runtime in minutes", + "description": "Zero-based result offset", "in": "query", - "name": "max_runtime", - "type": "integer" + "name": "offset", + "type": "integer", + "x-example": 0 }, { - "description": "Include adult titles", + "description": "Maximum results", "in": "query", - "name": "include_adult", - "type": "boolean" + "name": "limit", + "type": "integer", + "x-example": 3 }, { - "description": "Max shows, default 10, max 20", + "description": "Sort value", "in": "query", - "name": "limit", - "type": "integer" + "name": "sort", + "type": "string", + "x-example": "BEST_VALUE" } ], "produces": [ @@ -509102,7 +524549,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.tvListResponseDoc" + "$ref": "#/definitions/tripadvisor.tripadvisorHotelsResponseDoc" } }, "400": { @@ -509111,8 +524558,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -509129,27 +524576,31 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TMDB TV chart", + "summary": "Search TripAdvisor hotels", "tags": [ - "TMDB" + "TripAdvisor" ] } }, - "/tmdb/tv/{id}": { + "/tripadvisor/place": { "get": { "consumes": [ "application/json" ], - "description": "Returns a TMDB TV show: overview, tagline, genres, countries, episode count, first/last air year, top-billed cast, top crew (creator), and aggregate rating.", - "operationId": "tmdb-tv", + "description": "Returns a rich TripAdvisor place profile.", + "operationId": "tripadvisor-place", "parameters": [ { - "description": "TMDB TV show id", - "in": "path", + "description": "TripAdvisor place URL", + "in": "query", + "name": "url", + "type": "string" + }, + { + "description": "TripAdvisor location id fallback", + "in": "query", "name": "id", - "required": true, - "type": "string", - "x-example": "1396" + "type": "string" } ], "produces": [ @@ -509159,7 +524610,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tmdb.tvResponseDoc" + "$ref": "#/definitions/tripadvisor.PlaceResponse" } }, "400": { @@ -509174,8 +524625,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -509192,91 +524643,105 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TMDB TV show", + "summary": "Get TripAdvisor place", "tags": [ - "TMDB" + "TripAdvisor" ] } }, - "/tmz/article": { + "/tripadvisor/reviews": { "get": { - "description": "Returns one TMZ article by `url`, a canonical HTTPS `tmz.com` link of the form `/////`. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag.", - "operationId": "tmz-article", + "consumes": [ + "application/json" + ], + "description": "Returns reviews for a TripAdvisor place identified by `id` (location id) or `url`. `limit` defaults to 20 (max 50); `page` is 1-based; `language`, `ratings` (1 to 5) and `sort_by` refine the list. Each review has author, title, text, dates, rating, language, helpful votes, photos and URL. A page beyond `total` returns an empty `reviews` array.", + "operationId": "tripadvisor-reviews", "parameters": [ { - "description": "Canonical TMZ article URL", + "description": "TripAdvisor location id", "in": "query", - "name": "url", - "required": true, + "name": "id", "type": "string", - "x-example": "https://www.tmz.com/2026/09/23/example-story/" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" - } + "x-example": "113311" }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "TripAdvisor place URL", + "in": "query", + "name": "url", + "type": "string" }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "1-based review page", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Get TMZ article content", - "tags": [ - "TMZ" - ] - } - }, - "/tmz/author": { - "get": { - "description": "Returns a named person's TMZ profile hub: their name and their most recent TMZ coverage, from a canonical person-hub URL or slug. TMZ credits virtually all of its editorial content to a single \"TMZ Staff\" byline with no individual journalist profile pages, so this endpoint surfaces TMZ's own public per-person coverage hub (used for both celebrities and other newsmakers TMZ covers) as the closest available \"profile + recent articles\" surface.", - "operationId": "tmz-author", - "parameters": [ + "description": "Maximum reviews", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 3 + }, { - "description": "Person slug, e.g. dolly-parton", + "description": "Review language", "in": "query", - "name": "slug", + "name": "language", "type": "string", - "x-example": "dolly-parton" + "x-example": "en" }, { - "description": "Canonical tmz.com/people/ URL, optionally with a ?page= query parameter; alternative to slug", + "description": "Legacy sort type; DEFAULT selects newest first, ML_SORTED uses upstream order unless sort_by is DATE", + "enum": [ + "ML_SORTED", + "DEFAULT" + ], "in": "query", - "name": "url", + "name": "sort_type", "type": "string", - "x-example": "https://www.tmz.com/people/dolly-parton/" + "x-example": "DEFAULT" }, { - "default": 1, - "description": "1-based page number; overrides any page number in url", + "description": "Legacy sort field; DATE selects newest first, FAVORABLE_RATING uses upstream order", + "enum": [ + "FAVORABLE_RATING", + "DATE" + ], "in": "query", - "name": "page", - "type": "integer" + "name": "sort_by", + "type": "string", + "x-example": "DATE" + }, + { + "collectionFormat": "multi", + "description": "Rating filters", + "in": "query", + "items": { + "enum": [ + 1, + 2, + 3, + 4, + 5 + ], + "type": "integer" + }, + "name": "ratings", + "type": "array" + }, + { + "description": "Enable upstream machine translation", + "in": "query", + "name": "do_machine_translation", + "type": "boolean" + }, + { + "description": "Maximum photos per review", + "in": "query", + "name": "photos_per_review_limit", + "type": "integer", + "x-example": 7 } ], "produces": [ @@ -509286,7 +524751,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.tmzAuthorResponseDoc" + "$ref": "#/definitions/tripadvisor.tripadvisorReviewsResponseDoc" } }, "400": { @@ -509301,6 +524766,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -509313,28 +524784,168 @@ "ApiKeyAuth": [] } ], - "summary": "Get a TMZ person profile", + "summary": "Get TripAdvisor reviews", "tags": [ - "TMZ" + "TripAdvisor" ] } }, - "/tmz/headlines": { + "/tripadvisor/search": { "get": { - "description": "Returns the current headlines for one TMZ section. `section` is required and must be `news` or `sports`. Each item has its title, URL and, where available, a summary, author, publication time, image and `type`, and the response echoes the `section`.", - "operationId": "tmz-headlines", + "consumes": [ + "application/json" + ], + "description": "Searches TripAdvisor places in the area given by the required `geo_id`, for the required `type`: `hotel`, `restaurant`, `attraction`, `all`, or an attraction category type from `/tripadvisor/enums`. Hotel and restaurant filters, `offset`, `limit`, `locale`, `currency` and `sort` are optional. Each result has title, URL, rating, review count, rank, price and location. Unsupported entity-only types return a validation error.", + "operationId": "tripadvisor-search", "parameters": [ { - "description": "TMZ section slug", - "enum": [ - "news", - "sports" - ], + "description": "TripAdvisor geo id", "in": "query", - "name": "section", + "name": "geo_id", + "required": true, + "type": "integer", + "x-example": 294217 + }, + { + "description": "Listing type", + "in": "query", + "name": "type", "required": true, "type": "string", - "x-example": "news" + "x-example": "restaurant" + }, + { + "description": "Optional hotel filter id", + "in": "query", + "name": "filter_id", + "type": "string", + "x-example": "ufe" + }, + { + "description": "Hotel class filter", + "in": "query", + "name": "class", + "type": "integer", + "x-example": 5 + }, + { + "collectionFormat": "multi", + "description": "Hotel amenity filter ids", + "in": "query", + "items": { + "type": "integer" + }, + "name": "amenities", + "type": "array" + }, + { + "description": "Minimum hotel price filter", + "in": "query", + "name": "price_min", + "type": "integer", + "x-example": 1000 + }, + { + "description": "Maximum hotel price filter", + "in": "query", + "name": "price_max", + "type": "integer", + "x-example": 3205 + }, + { + "description": "Hotel pricing mode", + "in": "query", + "name": "pricing_mode", + "type": "string", + "x-example": "ALL_IN_RATE" + }, + { + "description": "Filter Travelers' Choice hotels", + "in": "query", + "name": "travelers_choice", + "type": "boolean" + }, + { + "description": "Filter Best of the Best hotels", + "in": "query", + "name": "travelers_choice_botb", + "type": "boolean" + }, + { + "description": "Restaurant availability date", + "in": "query", + "name": "restaurant_date", + "type": "string", + "x-example": "2026-05-20" + }, + { + "description": "Restaurant availability time", + "in": "query", + "name": "restaurant_time", + "type": "string", + "x-example": "1900" + }, + { + "description": "Restaurant guest count", + "in": "query", + "name": "restaurant_guests", + "type": "integer", + "x-example": 3 + }, + { + "collectionFormat": "multi", + "description": "Restaurant establishment type ids", + "in": "query", + "items": { + "type": "integer" + }, + "name": "establishment_types", + "type": "array" + }, + { + "collectionFormat": "multi", + "description": "Restaurant online option ids", + "in": "query", + "items": { + "type": "integer" + }, + "name": "online_options", + "type": "array" + }, + { + "description": "Zero-based result offset", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 + }, + { + "description": "Maximum results", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 3 + }, + { + "description": "TripAdvisor locale", + "in": "query", + "name": "locale", + "type": "string", + "x-example": "en-HK" + }, + { + "description": "Currency code", + "in": "query", + "name": "currency", + "type": "string", + "x-example": "HKD" + }, + { + "description": "Sort value", + "in": "query", + "name": "sort", + "type": "string", + "x-example": "POPULARITY" } ], "produces": [ @@ -509344,7 +524955,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/tripadvisor.tripadvisorSearchResponseDoc" } }, "400": { @@ -509353,38 +524964,6 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get TMZ section headlines", - "tags": [ - "TMZ" - ] - } - }, - "/tmz/news": { - "get": { - "description": "Returns the current TMZ celebrity news top stories. It takes no parameters. Each item has its title, URL and, where available, an author such as TMZ Staff, a summary, publication time and image URL. Use the headlines endpoint with `sports` for sports stories.", - "operationId": "tmz-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -509403,50 +524982,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get TMZ top stories", + "summary": "Search TripAdvisor places", "tags": [ - "TMZ" + "TripAdvisor" ] } }, - "/tmz/sections": { + "/tripcom/hotels/search": { "get": { - "description": "Returns the TMZ section inventory accepted by tmz-headlines: News (the home feed) and Sports. TMZ's public site has no broader stable editorial-category taxonomy beyond its own small main navigation -- see tmz-headlines for details.", - "operationId": "tmz-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get TMZ sections", - "tags": [ - "TMZ" - ] - } - }, - "/tokopedia/autocomplete": { - "get": { - "description": "Returns current public Tokopedia search suggestions for a partial keyword. Suggestions include canonical product-search URLs and are not product-search results.", - "operationId": "tokopedia-autocomplete", + "description": "Returns Trip.com's own top-hotels page for a city: hotel summaries (name, location, star rating, guest rating, review count, image, display price) for the hotels Trip.com features on that city's hotel-list page. Trip.com does not expose a free-text city search, so callers supply the exact city_slug and city_id pair from a known Trip.com hotel-list URL of the form https://www.trip.com/hotels/{city_slug}-hotels-list-{city_id}/.", + "operationId": "tripcom-hotels-search", "parameters": [ { - "description": "Partial product keyword, up to 100 characters", + "description": "Trip.com city slug, the text segment of a /hotels/{city_slug}-hotels-list-{city_id}/ URL", "in": "query", - "name": "q", + "name": "city_slug", "required": true, "type": "string", - "x-example": "iph" + "x-example": "bangkok" + }, + { + "description": "Trip.com numeric city id, the trailing number of a /hotels/{city_slug}-hotels-list-{city_id}/ URL", + "in": "query", + "name": "city_id", + "required": true, + "type": "string", + "x-example": "359" } ], "produces": [ @@ -509456,7 +525020,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.autocompleteResponseDoc" + "$ref": "#/definitions/tripcom.searchResponseDoc" } }, "400": { @@ -509465,8 +525029,14 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -509483,24 +525053,34 @@ "ApiKeyAuth": [] } ], - "summary": "Autocomplete Tokopedia product searches", + "summary": "Search Trip.com hotels by city", "tags": [ - "Tokopedia" + "Trip.com" ] } }, - "/tokopedia/category": { + "/tripcom/hotels/{id}": { "get": { - "description": "Returns public product cards from a canonical Tokopedia category path. `path` must begin with `/p/`; use the category page path, not a product or search URL.", - "operationId": "tokopedia-category", + "consumes": [ + "application/json" + ], + "description": "Returns a Trip.com hotel-detail page: identity (name, local name, star rating, city/province/country), location (address, zone, latitude/longitude, nearby-transport description), guest rating (overall score plus cleanliness/amenities/location/service breakdown), images, description, check-in/check-out and child policy summaries, and popular facilities. Pricing is not included: Trip.com's detail page only returns per-night rates alongside check-in/check-out dates, which this endpoint does not take as input -- use the search endpoint for a city's current display prices.", + "operationId": "tripcom-hotel-detail", "parameters": [ { - "description": "Canonical Tokopedia category path beginning with /p/", - "in": "query", - "name": "path", + "description": "Trip.com hotel id, from a prior search call's hotel_id field", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "/p/handphone-tablet/handphone" + "x-example": "39371462" + }, + { + "description": "Optional slug segment for a nicer canonical source URL (e.g. the district/city slug from a search result's url). Not required and not validated by Trip.com.", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "bang-sao-thong-district" } ], "produces": [ @@ -509510,7 +525090,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.categoryResponseDoc" + "$ref": "#/definitions/tripcom.DetailResponse" } }, "400": { @@ -509525,8 +525105,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -509543,32 +525123,19 @@ "ApiKeyAuth": [] } ], - "summary": "Browse a Tokopedia category", + "summary": "Get Trip.com hotel detail", "tags": [ - "Tokopedia" + "Trip.com" ] } }, - "/tokopedia/home": { + "/trustmrr/acquire": { "get": { - "description": "Returns public product-card recommendations for a current Tokopedia home tab. Omit `tab_id` for the first available tab; discover other tabs through `/tokopedia/home/tabs`.", - "operationId": "tokopedia-home", - "parameters": [ - { - "description": "Current ID from /tokopedia/home/tabs", - "in": "query", - "name": "tab_id", - "type": "string", - "x-example": "1" - }, - { - "default": 1, - "description": "Recommendation page from 1 through 5", - "in": "query", - "name": "page", - "type": "integer" - } + "consumes": [ + "application/json" ], + "description": "Returns the for-sale startups rendered on the public TrustMRR /acquire marketplace page, with deal metrics (asking price, revenue, multiple, growth). Verified revenue figures come from supported payment providers.", + "operationId": "trustmrr-acquire", "produces": [ "application/json" ], @@ -509576,23 +525143,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.homeResponseDoc" + "$ref": "#/definitions/trustmrr.acquireResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "TrustMRR upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -509603,16 +525170,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tokopedia home recommendations", + "summary": "Get TrustMRR acquisition listings", "tags": [ - "Tokopedia" + "TrustMRR" ] } }, - "/tokopedia/home/tabs": { + "/trustmrr/categories": { "get": { - "description": "Lists the current Tokopedia home recommendation tabs, each with its `id`, `name` and an optional image URL, plus a `fetched_at` timestamp. It takes no parameters. Pass a returned `id` as `tab_id` to `/tokopedia/home` to load that tab.", - "operationId": "tokopedia-home-tabs", + "consumes": [ + "application/json" + ], + "description": "Lists the TrustMRR startup categories, with the total `count`. Each category has its `slug`, `label`, short label, icon name, description, keywords and TrustMRR URL. Pass a category `slug` to `/trustmrr/category/{slug}` to list the startups in it.", + "operationId": "trustmrr-categories", "produces": [ "application/json" ], @@ -509620,17 +525190,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.homeTabsResponseDoc" + "$ref": "#/definitions/trustmrr.categoriesResponseDoc" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "TrustMRR upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -509641,32 +525217,27 @@ "ApiKeyAuth": [] } ], - "summary": "List Tokopedia home recommendation tabs", + "summary": "Get TrustMRR categories", "tags": [ - "Tokopedia" + "TrustMRR" ] } }, - "/tokopedia/product": { + "/trustmrr/category/{slug}": { "get": { - "description": "Returns public product detail from a canonical Tokopedia shop domain and product key. This endpoint does not accept arbitrary URLs; numeric product IDs are returned when the product page exposes them but cannot be used as lookup input.", - "operationId": "tokopedia-product", + "consumes": [ + "application/json" + ], + "description": "Returns one TrustMRR category by `slug` (lowercase letters, digits and hyphens, for example `saas`) with the startups listed in it. Each startup has its name, slug, URL, description, current MRR, total revenue and last-30-days revenue, all in USD, plus the `on_sale` flag for startups listed for sale. Valid slugs come from `/trustmrr/categories`.", + "operationId": "trustmrr-category", "parameters": [ { - "description": "Canonical Tokopedia shop domain", - "in": "query", - "name": "shop_domain", - "required": true, - "type": "string", - "x-example": "ismile-indonesia" - }, - { - "description": "Canonical Tokopedia product key", - "in": "query", - "name": "product_key", + "description": "TrustMRR category slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "apple-iphone-17-pro-max-garansi-resmi-256gb-512gb-1tb-2tb-1733012454966462347" + "x-example": "saas" } ], "produces": [ @@ -509676,29 +525247,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.productResponseDoc" + "$ref": "#/definitions/trustmrr.categoryResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid path parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Category not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "TrustMRR upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -509709,24 +525286,33 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Tokopedia product's public detail", + "summary": "Get TrustMRR category detail", "tags": [ - "Tokopedia" + "TrustMRR" ] } }, - "/tokopedia/product/review-filters": { + "/trustmrr/leaderboard": { "get": { - "description": "Returns which public review media, rating, and topic filters are available for a numeric product ID. It does not return review text, review media, or a review archive.", - "operationId": "tokopedia-product-review-filters", + "consumes": [ + "application/json" + ], + "description": "Returns the top 100 startups ranked by the selected metric from the public TrustMRR leaderboard. Revenue and MRR figures are verified through supported payment providers.", + "operationId": "trustmrr-leaderboard", "parameters": [ { - "description": "Numeric Tokopedia product ID", + "description": "Leaderboard metric to rank by (default mrr)", + "enum": [ + "mrr", + "last_30_days_revenue", + "all_time_revenue", + "growth", + "traffic", + "revenue_per_visitor" + ], "in": "query", - "name": "product_id", - "required": true, - "type": "string", - "x-example": "102491859263" + "name": "metric", + "type": "string" } ], "produces": [ @@ -509736,23 +525322,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.reviewFiltersResponseDoc" + "$ref": "#/definitions/trustmrr.leaderboardResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Invalid metric parameter", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "TrustMRR upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -509763,57 +525355,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tokopedia product review-filter metadata", + "summary": "Get TrustMRR revenue leaderboard", "tags": [ - "Tokopedia" + "TrustMRR" ] } }, - "/tokopedia/search": { + "/trustmrr/marketplace": { "get": { - "description": "Returns public Tokopedia product cards for a keyword from Tokopedia's public product-search operation. `sort` accepts `3` (lowest price), `4` (highest price), `5` (most reviewed), `9` (newest), or `23` (most relevant). Repeat `filter` as `key:value` using values from `/tokopedia/search/filters`.", - "operationId": "tokopedia-search", - "parameters": [ - { - "description": "Product keyword", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "sepatu lari" - }, - { - "default": 1, - "description": "Search page from 1 through 5", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "default": 23, - "description": "Sort: 3 lowest price, 4 highest price, 5 most reviewed, 9 newest, 23 most relevant", - "enum": [ - 3, - 4, - 5, - 9, - 23 - ], - "in": "query", - "name": "sort", - "type": "integer" - }, - { - "collectionFormat": "multi", - "description": "Repeat live key:value filter selections from /tokopedia/search/filters", - "in": "query", - "items": { - "type": "string" - }, - "name": "filter", - "type": "array" - } + "consumes": [ + "application/json" ], + "description": "Returns the public TrustMRR marketplace snapshot: the 25 most recently listed startups for sale and the current 25 best deals ranked by TrustMRR's recency-aware deal score. Revenue figures are verified through supported payment providers.", + "operationId": "trustmrr-marketplace", "produces": [ "application/json" ], @@ -509821,23 +525375,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.searchResponseDoc" + "$ref": "#/definitions/trustmrr.marketplaceResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "TrustMRR upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -509848,24 +525402,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Tokopedia products", + "summary": "Get TrustMRR marketplace snapshot", "tags": [ - "Tokopedia" + "TrustMRR" ] } }, - "/tokopedia/search/filters": { + "/trustmrr/startup/{slug}": { "get": { - "description": "Returns the live filter tree and supported sort choices for a Tokopedia product search. The response includes categories when the current query exposes them, store type, delivery location, price, rating, offer, condition, recency, shipping, and stock options as applicable.", - "operationId": "tokopedia-search-filters", + "consumes": [ + "application/json" + ], + "description": "Returns the full verified profile for a single TrustMRR startup by slug: revenue and MRR, growth, asking price and marketplace status, tech stack, marketing channels, and TrustMRR's AI-generated business summary.", + "operationId": "trustmrr-startup", "parameters": [ { - "description": "Product keyword", - "in": "query", - "name": "q", + "description": "TrustMRR startup slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "sepatu" + "x-example": "trackai" } ], "produces": [ @@ -509875,23 +525432,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tokopedia.searchFiltersResponseDoc" + "$ref": "#/definitions/trustmrr.startupResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid path parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Startup not found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "TrustMRR upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -509902,24 +525471,31 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tokopedia search filters and sorts", + "summary": "Get TrustMRR startup detail", "tags": [ - "Tokopedia" + "TrustMRR" ] } }, - "/tomsguide/article": { + "/trustmrr/startups": { "get": { - "description": "Returns one Tom's Guide article by `url`, a canonical HTTPS `tomsguide.com` link such as `tomsguide.com/
/`. The response has the title, description, section, authors, publication and update times, image URL, body `paragraphs` and a `paywalled` flag. On some product reviews `authors` may be empty.", - "operationId": "tomsguide-article", + "consumes": [ + "application/json" + ], + "description": "Returns a paginated list of every startup in the TrustMRR directory. Each entry is a slug you can pass to /trustmrr/startup/{slug} for the full verified profile — together these two endpoints let you enumerate the entire directory.", + "operationId": "trustmrr-startups", "parameters": [ { - "description": "Canonical Tom's Guide article URL", + "description": "1-based page number (default 1)", "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.tomsguide.com/audio/over-ear-headphones/noble-audio-fokus-artemis-review" + "name": "page", + "type": "integer" + }, + { + "description": "Items per page (default 100, max 1000)", + "in": "query", + "name": "page_size", + "type": "integer" } ], "produces": [ @@ -509929,23 +525505,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/trustmrr.startupsResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "TrustMRR upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -509956,37 +525532,51 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tom's Guide article content", + "summary": "List all TrustMRR startups", "tags": [ - "Tom's Guide" + "TrustMRR" ] } }, - "/tomsguide/author": { + "/trustpilot/business-units/search": { "get": { - "description": "Returns a Tom's Guide author's name, job title, biography, social links and one page of recent articles. Give exactly one of `slug` or `url`; `page` is 1-based, defaults to 1 and overrides any page in `url`. The response also has `page` and `has_next_page`.", - "operationId": "tomsguide-author", + "consumes": [ + "application/json" + ], + "description": "Searches Trustpilot for businesses matching a query, for a country (default `US`), with `page` and `page_size` (default 20, max 100). Each result has the display name, identifying name, TrustScore, star rating, review count, categories, website, email, phone, address and Trustpilot URL; `total_hits` gives the full match count.", + "operationId": "trustpilot-business-search", "parameters": [ { - "description": "Author slug, e.g. tom-pritchard", + "description": "Search query", "in": "query", - "name": "slug", + "name": "q", + "required": true, "type": "string", - "x-example": "tom-pritchard" + "x-example": "openai" }, { - "description": "Canonical tomsguide.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "description": "Two-letter country code; defaults to US", "in": "query", - "name": "url", + "name": "country", "type": "string", - "x-example": "https://www.tomsguide.com/author/tom-pritchard" + "x-example": "US" }, { - "default": 1, - "description": "1-based page number; overrides any page number in url", + "description": "1-based page number; defaults to 1", "in": "query", + "minimum": 1, "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 + }, + { + "description": "Results per page; defaults to 20, maximum 100", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "page_size", + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -509996,23 +525586,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.tomsguideAuthorResponseDoc" + "$ref": "#/definitions/trustpilot.businessSearchResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "No results found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Trustpilot upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -510023,48 +525625,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Tom's Guide author profile", + "summary": "Search Trustpilot business units", "tags": [ - "Tom's Guide" + "Trustpilot" ] } }, - "/tomsguide/headlines": { + "/trustpilot/business/{slug}": { "get": { - "description": "Returns the current headlines for one Tom's Guide section. `section` is required and takes one of 22 slugs, such as `ai`, `audio`, `deals`, `how-to`, `news`, `reviews`, `tvs` or `phones`. Each item has its title, URL, summary, author, publication time and image.", - "operationId": "tomsguide-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a Trustpilot business profile by `slug`, such as `openai.com`. The profile has the name, `trust_score`, `review_count`, rating histogram, review summary and topics, categories, claimed status, website URL, reply metrics, company activity and verification flags, and an about section with description and contact details.", + "operationId": "trustpilot-business", "parameters": [ { - "description": "Tom's Guide section slug", - "enum": [ - "ai", - "audio", - "best-picks", - "cameras-photography", - "computing", - "deals", - "entertainment", - "face-off", - "gaming", - "home", - "how-to", - "mattresses", - "news", - "reference", - "reviews", - "sales-events", - "tech", - "tech-events", - "tvs", - "vehicle-tech", - "wellness", - "phones" - ], - "in": "query", - "name": "section", + "description": "Trustpilot business slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "ai" + "x-example": "openai.com" } ], "produces": [ @@ -510074,55 +525655,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/trustpilot.businessProfileResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid path parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Business not found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Tom's Guide section headlines", - "tags": [ - "Tom's Guide" - ] - } - }, - "/tomsguide/news": { - "get": { - "description": "Returns the current top stories from Tom's Guide. It takes no parameters. Each item has its title, URL and, where available, a summary, author, publication time, image URL and `type`. Use the headlines endpoint to read one section.", - "operationId": "tomsguide-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "429": { + "description": "Rate limit exceeded", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Trustpilot upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -510133,50 +525694,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tom's Guide top stories", + "summary": "Get Trustpilot business profile", "tags": [ - "Tom's Guide" + "Trustpilot" ] } }, - "/tomsguide/sections": { + "/trustpilot/business/{slug}/related": { "get": { - "description": "Lists the 22 top-level Tom's Guide content verticals that the headlines endpoint accepts, such as `ai`, `best-picks`, `how-to`, `mattresses`, `reviews`, `vehicle-tech` and `phones`. Each entry has a `slug`, a display `name` and a `url`.", - "operationId": "tomsguide-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Tom's Guide sections", - "tags": [ - "Tom's Guide" - ] - } - }, - "/tomshardware/article": { - "get": { - "description": "Returns one Tom's Hardware article by its canonical `url`, either the current `tomshardware.com/
//` form or the legacy `/reviews/,.html` form. The response has the title, description, authors, section, published and updated times, lead image, the body `paragraphs` and a `paywalled` flag.", - "operationId": "tomshardware-article", + "description": "Returns the businesses Trustpilot shows as related to a given business slug such as `openai.com`. Each related business has its display name, identifying name, logo, star rating, TrustScore, review count and Trustpilot URL; the response also includes a summary of the business you asked about.", + "operationId": "trustpilot-business-related", "parameters": [ { - "description": "Canonical Tom's Hardware article URL", - "in": "query", - "name": "url", + "description": "Trustpilot business slug", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "https://www.tomshardware.com/monitors/gaming-monitors/sony-inzone-m10s-ii-27-inch-540-hz-qhd-oled-gaming-monitor-review" + "x-example": "openai.com" } ], "produces": [ @@ -510186,23 +525724,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/trustpilot.businessRelatedResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid path parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Business not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Trustpilot upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -510213,37 +525763,84 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tom's Hardware article content", + "summary": "Get Trustpilot related businesses", "tags": [ - "Tom's Hardware" + "Trustpilot" ] } }, - "/tomshardware/author": { + "/trustpilot/business/{slug}/reviews": { "get": { - "description": "Returns a Tom's Hardware author profile with name, job title, biography, social links and one page of recent articles. Identify the author with `slug` (such as `christian-eberle`) or an author `url`; `page` (default 1) overrides any page in the URL. `has_next_page` tells you whether more articles exist.", - "operationId": "tomshardware-author", + "consumes": [ + "application/json" + ], + "description": "Returns one page of Trustpilot reviews for a business slug such as `openai.com`, with filters for star rating, verified reviews, reviews with a company reply, language and text search. Each review has its rating, title, body, author name, country and review count, dates, and any company reply; the response also carries the business summary and pagination totals.", + "operationId": "trustpilot-business-reviews", "parameters": [ { - "description": "Author slug, e.g. christian-eberle", - "in": "query", + "description": "Trustpilot business slug", + "in": "path", "name": "slug", + "required": true, "type": "string", - "x-example": "christian-eberle" + "x-example": "openai.com" }, { - "description": "Canonical tomshardware.com/author/ URL, optionally with a /page/ segment; alternative to slug", + "description": "1-based page number; defaults to 1", "in": "query", - "name": "url", + "minimum": 1, + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Filter by star rating from 1 to 5", + "in": "query", + "maximum": 5, + "minimum": 1, + "name": "stars", + "type": "integer", + "x-example": 1 + }, + { + "description": "Filter to verified reviews", + "in": "query", + "name": "verified", + "type": "boolean" + }, + { + "description": "Filter to reviews with business replies", + "in": "query", + "name": "replied", + "type": "boolean" + }, + { + "description": "Review language code used by Trustpilot", + "in": "query", + "name": "language", "type": "string", - "x-example": "https://www.tomshardware.com/author/christian-eberle" + "x-example": "en" }, { - "default": 1, - "description": "1-based page number; overrides any page number in url", + "description": "Text search within reviews", "in": "query", - "name": "page", - "type": "integer" + "name": "q", + "type": "string", + "x-example": "refund" + }, + { + "description": "Date range start in YYYY-MM-DD; currently rejected by upstream", + "in": "query", + "name": "date_from", + "type": "string", + "x-example": "2026-03-01" + }, + { + "description": "Date range end in YYYY-MM-DD; currently rejected by upstream", + "in": "query", + "name": "date_to", + "type": "string", + "x-example": "2026-03-30" } ], "produces": [ @@ -510253,93 +525850,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.tomshardwareAuthorResponseDoc" + "$ref": "#/definitions/trustpilot.businessReviewsResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid path/query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Business not found", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "429": { + "description": "Rate limit exceeded", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get a Tom's Hardware author profile", - "tags": [ - "Tom's Hardware" - ] - } - }, - "/tomshardware/headlines": { - "get": { - "description": "Lists the current headlines for one Tom's Hardware section. `section` is required and takes a slug such as `gpus`, `cpus`, `laptops`, `deals`, `reviews` or `news`; use `tomshardware-sections` for the full set. Each item has its title, URL, author, publication time and lead image, plus a summary when the section's listing provides one.", - "operationId": "tomshardware-headlines", - "parameters": [ - { - "description": "Tom's Hardware section slug", - "enum": [ - "3d-printing", - "best-picks", - "cpus", - "deals", - "desktops", - "features", - "gpus", - "laptops", - "maker-stem", - "monitors", - "networking", - "news", - "news-analysis", - "pc-components", - "peripherals", - "phones", - "reviews", - "service-providers", - "software", - "tech-industry" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "3d-printing" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" - } }, - "400": { - "description": "Bad Request", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Trustpilot upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -510350,16 +525889,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tom's Hardware section headlines", + "summary": "Get Trustpilot business reviews", "tags": [ - "Tom's Hardware" + "Trustpilot" ] } }, - "/tomshardware/news": { + "/trustpilot/categories": { "get": { - "description": "Returns the latest Tom's Hardware top stories with no parameters. Each item has its title, URL, summary, author, publication time and lead image. Use the item URLs with `tomshardware-article` to read the body.", - "operationId": "tomshardware-news", + "consumes": [ + "application/json" + ], + "description": "Lists the Trustpilot category index grouped by top-level category. Each group has its name, slug and URL, and an `items` list of subcategories with their own name, slug and URL. It takes no parameters.", + "operationId": "trustpilot-categories", "produces": [ "application/json" ], @@ -510367,17 +525909,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/trustpilot.categoriesResponseDoc" + } + }, + "404": { + "description": "Categories not found", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Too Many Requests", + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Trustpilot upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -510388,50 +525942,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get Tom's Hardware top stories", + "summary": "Get Trustpilot categories", "tags": [ - "Tom's Hardware" + "Trustpilot" ] } }, - "/tomshardware/sections": { + "/trustpilot/categories/search": { "get": { - "description": "Lists the 20 Tom's Hardware top-level sections that `tomshardware-headlines` accepts, including `3d-printing`, `cpus`, `gpus`, `monitors`, `news` and `reviews`. Each section carries its `slug`, display `name` and page `url`. Takes no parameters.", - "operationId": "tomshardware-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Tom's Hardware sections", - "tags": [ - "Tom's Hardware" - ] - } - }, - "/torontostar/article": { - "get": { - "description": "Returns public Toronto Star article metadata and the body paragraphs shown to an anonymous reader from a canonical article URL. The Star meters its articles, so paywalled is true and paragraphs holds only the public teaser (typically the first two paragraphs) whenever the page hides the rest from non-subscribers.", - "operationId": "torontostar-article", + "description": "Searches Trustpilot categories for the required `q`. `size` sets the maximum number of categories (default 20, from 1 to 100), `country` is a two-letter code (default US) and `locale` uses `ll-CC` format (default `en-US`). Each category has its `category_id`, `display_name` and `top_level_category_id`.", + "operationId": "trustpilot-category-search", "parameters": [ { - "description": "Canonical Toronto Star article URL", + "description": "Search query", "in": "query", - "name": "url", + "name": "q", "required": true, "type": "string", - "x-example": "https://www.thestar.com/news/gta/court-set-to-hear-from-victims-families-in-case-of-international-poison-seller-kenneth-law/article_e760a06a-60da-49b6-ae00-fe14e1b5eb5b.html" + "x-example": "openai" + }, + { + "description": "Two-letter country code; defaults to US", + "in": "query", + "name": "country", + "type": "string", + "x-example": "US" + }, + { + "description": "Locale in ll-CC format; defaults to en-US", + "in": "query", + "name": "locale", + "type": "string", + "x-example": "en-US" + }, + { + "description": "Maximum number of categories; defaults to 20", + "in": "query", + "maximum": 100, + "minimum": 1, + "name": "size", + "type": "integer", + "x-example": 3 } ], "produces": [ @@ -510441,23 +525995,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/trustpilot.categorySearchResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "No results found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Trustpilot upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -510468,30 +526034,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get Toronto Star article content", + "summary": "Search Trustpilot categories", "tags": [ - "Toronto Star" + "Trustpilot" ] } }, - "/torontostar/author": { + "/trustpilot/category/{slug}": { "get": { - "description": "Returns one Toronto Star author's public profile: name, job title, biography, location and topic focus, avatar, and their recent articles.", - "operationId": "torontostar-author", + "consumes": [ + "application/json" + ], + "description": "Returns a Trustpilot category by `slug` (for example `software_company`), with the companies listed on one page; `page` is 1-based and defaults to 1. Each company has its display name, `identifying_name`, `trust_score`, `stars`, `review_count`, location, contact details, categories and Trustpilot URL. Also returns breadcrumbs, newest companies and `pagination.has_next_page`.", + "operationId": "trustpilot-category", "parameters": [ { - "description": "Author profile slug (thestar.com/users/profile/); use this or url", - "in": "query", + "description": "Trustpilot category slug", + "in": "path", "name": "slug", + "required": true, "type": "string", - "x-example": "omar-mosleh" + "x-example": "software_company" }, { - "description": "Canonical thestar.com/users/profile/ URL; alternative to slug", + "description": "1-based page number; defaults to 1", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.thestar.com/users/profile/omar-mosleh/" + "minimum": 1, + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -510501,23 +526072,35 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.torontoStarAuthorResponseDoc" + "$ref": "#/definitions/trustpilot.categoryResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "Missing or invalid path/query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "Category not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Rate limit exceeded", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Service Unavailable", + "description": "Trustpilot upstream request failed", "schema": { "$ref": "#/definitions/app.Response" } @@ -510528,95 +526111,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Toronto Star author profile", + "summary": "Get Trustpilot category detail", "tags": [ - "Toronto Star" + "Trustpilot" ] } }, - "/torontostar/headlines": { + "/twitch/channel": { "get": { - "description": "Returns fresh Toronto Star headlines from one public section page, with summary, publish time and image when the page shows them.", - "operationId": "torontostar-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a Twitch channel's profile (partner status, team, last broadcast title) plus its current live status (started time and game/category, when live).", + "operationId": "twitch-channel", "parameters": [ { - "description": "Toronto Star section path", - "enum": [ - "news", - "news/gta", - "news/toronto-election", - "news/police/project-south", - "news/car-thefts", - "news/canada", - "news/ontario", - "news/canada/british-columbia", - "news/canada/alberta", - "news/canada/quebec", - "news/canada/nova-scotia", - "news/investigations", - "news/world", - "news/world/united-states", - "news/world/americas", - "news/world/europe", - "news/world/asia", - "news/world/africa", - "news/world/australia", - "news/world/middle-east", - "news/world/royals", - "politics", - "politics/federal", - "politics/provincial", - "politics/political-opinion", - "opinion", - "opinion/star-columnists", - "opinion/editorials", - "opinion/contributors", - "opinion/letters-to-the-editor", - "opinion/editorial-cartoons", - "life", - "life/relationships", - "life/food-and-drink", - "life/beauty-and-fashion", - "life/health-wellness", - "life/home-and-garden", - "life/autos", - "life/horoscopes", - "sports", - "sports/hockey", - "sports/hockey/pwhl", - "sports/basketball", - "sports/basketball/wnba", - "sports/baseball", - "sports/football", - "sports/football/cfl", - "sports/golf", - "sports/soccer", - "sports/tennis", - "sports/auto-racing", - "sports/cricket", - "sports/olympics-and-paralympics", - "real-estate", - "entertainment", - "entertainment/stage", - "entertainment/books", - "entertainment/music", - "entertainment/movies", - "entertainment/television", - "business", - "business/small-business", - "business/technology", - "business/mars", - "podcasts", - "podcasts/this-matters", - "podcasts/its-political", - "podcasts/billionaire-murders", - "podcasts/deep-left-field" - ], + "description": "Twitch channel login (the lowercase URL slug, e.g. caedrel for twitch.tv/caedrel)", "in": "query", - "name": "section", + "name": "login", "required": true, "type": "string", - "x-example": "news" + "x-example": "caedrel" } ], "produces": [ @@ -510626,7 +526141,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/twitch.channelResponseDoc" } }, "400": { @@ -510635,36 +526150,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Toronto Star section headlines", - "tags": [ - "Toronto Star" - ] - } - }, - "/torontostar/news": { - "get": { - "description": "Returns the newest Toronto Star editorial stories (up to 50, newest first) from the public news sitemap. Press-release and sponsored pages are excluded.", - "operationId": "torontostar-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "429": { + "description": "Too Many Requests", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/app.Response" } }, "503": { @@ -510679,50 +526174,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Toronto Star top stories", + "summary": "Get a Twitch channel's profile and live status", "tags": [ - "Toronto Star" + "Twitch" ] } }, - "/torontostar/sections": { + "/twitch/clips": { "get": { - "description": "Lists the 69 Toronto Star sections accepted by the headlines endpoint, taken from thestar.com's main navigation. Each has a `slug`, a display `name` and a `url`. Nested sections use slash paths such as `news/gta`, `sports/hockey/pwhl` and `business/technology`. Takes no parameters.", - "operationId": "torontostar-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Toronto Star sections", - "tags": [ - "Toronto Star" - ] - } - }, - "/townhall/article": { - "get": { - "description": "Returns public Townhall article metadata and body paragraphs from a canonical news or column URL. VIP stories are flagged with paywalled and return only the free lead paragraphs.", - "operationId": "townhall-article", + "description": "Returns a Twitch channel's clips (last 7 days), most-viewed first: title, view count, duration, curator, and the game it was recorded under.", + "operationId": "twitch-clips", "parameters": [ { - "description": "Canonical Townhall article URL", + "description": "Twitch channel login (the lowercase URL slug, e.g. caedrel for twitch.tv/caedrel)", "in": "query", - "name": "url", + "name": "login", "required": true, "type": "string", - "x-example": "https://townhall.com/news/amy-curtis/2026/09/24/second-man-arrested-in-mississippi-hanging-ap-ignores-race-n2683524" + "x-example": "caedrel" + }, + { + "description": "Number of clips to return (default 20, max 100)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], "produces": [ @@ -510732,7 +526211,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/twitch.clipsResponseDoc" } }, "400": { @@ -510747,6 +526226,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -510759,30 +526244,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Townhall article content", + "summary": "Get a Twitch channel's clips", "tags": [ - "Townhall" + "Twitch" ] } }, - "/townhall/author": { + "/twitch/schedule": { "get": { - "description": "Returns a Townhall author profile by `slug` (such as `amy-curtis`) or by an author `url`; exactly one is required. The response has the name, photo, bio, X profile link and the first page of the author's archive, about 50 stories, each with its section label and a `vip` flag. Unknown authors return a not-found error.", - "operationId": "townhall-author", + "consumes": [ + "application/json" + ], + "description": "Returns a Twitch channel's upcoming broadcast schedule -- planned segments with title, start/end time, and game/category -- starting today. A channel with no schedule configured returns an empty segments list, not an error.", + "operationId": "twitch-schedule", "parameters": [ { - "description": "Author slug, e.g. amy-curtis", + "description": "Twitch channel login (the lowercase URL slug)", "in": "query", - "name": "slug", + "name": "channel", + "required": true, "type": "string", - "x-example": "amy-curtis" + "x-example": "caedrel" }, { - "description": "Canonical townhall.com/author/ URL; alternative to slug", + "description": "Number of weeks ahead to return, starting today (default 1, max 4)", "in": "query", - "name": "url", - "type": "string", - "x-example": "https://townhall.com/author/amy-curtis" + "name": "weeks", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -510792,7 +526281,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.townhallAuthorResponseDoc" + "$ref": "#/definitions/twitch.scheduleResponseDoc" } }, "400": { @@ -510807,6 +526296,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -510819,36 +526314,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Townhall author profile", + "summary": "Get a Twitch channel's broadcast schedule", "tags": [ - "Townhall" + "Twitch" ] } }, - "/townhall/headlines": { + "/twitch/search": { "get": { - "description": "Lists headlines for one Townhall section. `section` is required: `news` and `columnists` return the 20 most recent stories, while the topic sections (such as `congress`, `economy` or `iran`) return up to 30 stories mixing news and columns. Items carry title, URL, image and, when available, author, time and summary.", - "operationId": "townhall-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns mixed category and channel matches for a query -- live channels include current viewer count and stream title. Sourced from Twitch's own search-typeahead surface (a capped suggestion list, not a fully paginated results page).", + "operationId": "twitch-search", "parameters": [ { - "description": "Townhall section slug", - "enum": [ - "news", - "columnists", - "2026-elections", - "congress", - "donald-trump", - "economy", - "foreign-policy", - "illegal-immigration", - "iran", - "supreme-court" - ], + "description": "Search text (category/game name or channel name)", "in": "query", - "name": "section", + "name": "query", "required": true, "type": "string", - "x-example": "news" + "x-example": "valorant" + }, + { + "description": "Number of results to return (default 10, max 30)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -510858,7 +526351,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/twitch.searchResponseDoc" } }, "400": { @@ -510867,6 +526360,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -510879,48 +526378,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get Townhall section headlines", + "summary": "Search Twitch channels and games/categories", "tags": [ - "Townhall" + "Twitch" ] } }, - "/townhall/news": { + "/twitch/streams": { "get": { - "description": "Returns the latest Townhall stories, news and opinion columns mixed, newest first, about 50 items. Each has its title, URL, short summary, publication time, author byline and lead image. Video pages are left out. Takes no parameters.", - "operationId": "townhall-news", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } + "description": "Returns the top currently-live streams for a Twitch game/category, ranked by viewer count: title, viewer count, broadcaster, and tags.", + "operationId": "twitch-streams", + "parameters": [ + { + "description": "Twitch game/category slug (the lowercase URL slug from twitch.tv/directory/category/{slug})", + "in": "query", + "name": "game", + "required": true, + "type": "string", + "x-example": "league-of-legends" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] + "description": "Number of streams to return (default 20, max 100)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 } ], - "summary": "Get Townhall top stories", - "tags": [ - "Townhall" - ] - } - }, - "/townhall/sections": { - "get": { - "description": "Returns the public Townhall section inventory: the site-wide news and column feeds plus the editorial topic hubs the site promotes.", - "operationId": "townhall-sections", "produces": [ "application/json" ], @@ -510928,7 +526415,31 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/twitch.streamsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" } } }, @@ -510937,73 +526448,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Townhall sections", + "summary": "Get the top live streams for a Twitch game/category", "tags": [ - "Townhall" + "Twitch" ] } }, - "/tripadvisor/autocomplete": { + "/twitch/team": { "get": { "consumes": [ "application/json" ], - "description": "Returns TripAdvisor typeahead suggestions for the required query `q`, optionally narrowed by `limit`, `locale`, `scope_geo_id` and a `type` hint. Each result has its id, title, type, URL, image, parent location and coordinates, and may carry nested search shortcuts. Results can be locations, hotels, restaurants or attractions.", - "operationId": "tripadvisor-autocomplete", + "description": "Returns a Twitch team's full member roster, with live status and viewer count for whoever is currently live, plus team-level metadata (banner, logo, description, owner).", + "operationId": "twitch-team", "parameters": [ { - "description": "Autocomplete query", + "description": "Twitch team slug (the lowercase URL slug from twitch.tv/team/{slug})", "in": "query", - "name": "q", + "name": "team", "required": true, "type": "string", - "x-example": "hong kong" - }, - { - "description": "Maximum results", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 5 - }, - { - "description": "TripAdvisor locale", - "in": "query", - "name": "locale", - "type": "string", - "x-example": "en-HK" - }, - { - "description": "Optional scoped geo id", - "in": "query", - "name": "scope_geo_id", - "type": "integer", - "x-example": 294217 - }, - { - "description": "Optional result type hint", - "in": "query", - "name": "type", - "type": "string", - "x-example": "attraction" - }, - { - "description": "Optional captured search session id", - "in": "query", - "name": "search_session_id", - "type": "string" - }, - { - "description": "Optional captured typeahead id", - "in": "query", - "name": "typeahead_id", - "type": "string" - }, - { - "description": "Optional captured route uid", - "in": "query", - "name": "route_uid", - "type": "string" + "x-example": "yumetalent" } ], "produces": [ @@ -511013,7 +526478,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripadvisor.tripadvisorAutocompleteResponseDoc" + "$ref": "#/definitions/twitch.teamResponseDoc" } }, "400": { @@ -511022,6 +526487,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -511040,16 +526511,28 @@ "ApiKeyAuth": [] } ], - "summary": "Autocomplete TripAdvisor locations and places", + "summary": "Get a Twitch team's roster", "tags": [ - "TripAdvisor" + "Twitch" ] } }, - "/tripadvisor/enums": { + "/twitch/top-games": { "get": { - "description": "Returns the values TripAdvisor place and listing filters accept: `locales`, `currencies`, `languages`, `listing_types`, `sorts`, `pricing_modes`, `hotel_classes`, `hotel_amenities`, `restaurant_types`, `restaurant_options`, attraction categories with their ids, and `filter_ids`. It also lists `unsupported_entity_types`. Takes no parameters.", - "operationId": "tripadvisor-enums", + "consumes": [ + "application/json" + ], + "description": "Returns the top games/categories site-wide, ranked by total current viewers across all live streams under each one.", + "operationId": "twitch-top-games", + "parameters": [ + { + "description": "Number of games to return (default 20, max 100)", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + } + ], "produces": [ "application/json" ], @@ -511057,17 +526540,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripadvisor.tripadvisorEnumsResponseDoc" + "$ref": "#/definitions/twitch.topGamesResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -511078,112 +526567,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get TripAdvisor enum metadata", + "summary": "Get Twitch's top games/categories", "tags": [ - "TripAdvisor" + "Twitch" ] } }, - "/tripadvisor/hotels": { + "/twitch/videos": { "get": { "consumes": [ "application/json" ], - "description": "Searches TripAdvisor hotels in the area given by the required `geo_id`. Filter with `class`, `amenities`, `price_min`, `price_max`, `pricing_mode`, `travelers_choice` and `currency`; page with `offset` and `limit`; order with `sort`. Each hotel has its title, URL, image, rating, review count, star rating, rank, price, provider, location and a review snippet when TripAdvisor supplies them.", - "operationId": "tripadvisor-hotels", + "description": "Returns a Twitch channel's past-broadcast videos (VODs), ranked by view count: title, view count, length, publish date, and the game it was recorded under.", + "operationId": "twitch-videos", "parameters": [ { - "description": "TripAdvisor geo id", + "description": "Twitch channel login (the lowercase URL slug, e.g. lck for twitch.tv/lck)", "in": "query", - "name": "geo_id", + "name": "login", "required": true, - "type": "integer", - "x-example": 294217 - }, - { - "description": "Optional filter id such as class or ufe", - "in": "query", - "name": "filter_id", - "type": "string", - "x-example": "ufe" - }, - { - "description": "Hotel class filter", - "in": "query", - "name": "class", - "type": "integer", - "x-example": 5 - }, - { - "collectionFormat": "multi", - "description": "Amenity filter ids", - "in": "query", - "items": { - "type": "integer" - }, - "name": "amenities", - "type": "array" - }, - { - "description": "Minimum price filter", - "in": "query", - "name": "price_min", - "type": "integer", - "x-example": 1000 - }, - { - "description": "Maximum price filter", - "in": "query", - "name": "price_max", - "type": "integer", - "x-example": 3205 - }, - { - "description": "Pricing mode", - "in": "query", - "name": "pricing_mode", - "type": "string", - "x-example": "ALL_IN_RATE" - }, - { - "description": "Filter Travelers' Choice properties", - "in": "query", - "name": "travelers_choice", - "type": "boolean" - }, - { - "description": "Filter Best of the Best properties", - "in": "query", - "name": "travelers_choice_botb", - "type": "boolean" - }, - { - "description": "Currency code", - "in": "query", - "name": "currency", "type": "string", - "x-example": "HKD" - }, - { - "description": "Zero-based result offset", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 + "x-example": "lck" }, { - "description": "Maximum results", + "description": "Number of videos to return (default 20, max 100)", "in": "query", "name": "limit", "type": "integer", - "x-example": 3 - }, - { - "description": "Sort value", - "in": "query", - "name": "sort", - "type": "string", - "x-example": "BEST_VALUE" + "x-example": 20 } ], "produces": [ @@ -511193,7 +526604,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripadvisor.tripadvisorHotelsResponseDoc" + "$ref": "#/definitions/twitch.videosResponseDoc" } }, "400": { @@ -511202,6 +526613,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -511220,31 +526637,34 @@ "ApiKeyAuth": [] } ], - "summary": "Search TripAdvisor hotels", + "summary": "Get a Twitch channel's videos (VODs)", "tags": [ - "TripAdvisor" + "Twitch" ] } }, - "/tripadvisor/place": { + "/twitch/vod-comments": { "get": { "consumes": [ "application/json" ], - "description": "Returns a rich TripAdvisor place profile.", - "operationId": "tripadvisor-place", + "description": "Returns one page of a Twitch VOD's chat replay (past-broadcast chat messages), starting at a given point in the video's timeline. Paginate forward by re-requesting with the last returned comment's offset_seconds.", + "operationId": "twitch-vod-comments", "parameters": [ { - "description": "TripAdvisor place URL", + "description": "Twitch VOD/video id (the numeric id from twitch.tv/videos/{id})", "in": "query", - "name": "url", - "type": "string" + "name": "video", + "required": true, + "type": "string", + "x-example": "2845804307" }, { - "description": "TripAdvisor location id fallback", + "description": "Start the page from this point in the VOD's timeline, in seconds (default 0)", "in": "query", - "name": "id", - "type": "string" + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -511254,7 +526674,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripadvisor.PlaceResponse" + "$ref": "#/definitions/twitch.vodCommentsResponseDoc" } }, "400": { @@ -511287,105 +526707,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get TripAdvisor place", + "summary": "Get a Twitch VOD's chat replay", "tags": [ - "TripAdvisor" + "Twitch" ] } }, - "/tripadvisor/reviews": { + "/ubereats/feed": { "get": { "consumes": [ "application/json" ], - "description": "Returns reviews for a TripAdvisor place identified by `id` (location id) or `url`. `limit` defaults to 20 (max 50); `page` is 1-based; `language`, `ratings` (1 to 5) and `sort_by` refine the list. Each review has author, title, text, dates, rating, language, helpful votes, photos and URL. A page beyond `total` returns an empty `reviews` array.", - "operationId": "tripadvisor-reviews", + "description": "Returns restaurants delivering to a specific location: name, rating, review count, delivery estimate, cuisine tags, and cover image.", + "operationId": "ubereats-feed", "parameters": [ { - "description": "TripAdvisor location id", + "description": "Delivery search center latitude", "in": "query", - "name": "id", - "type": "string", - "x-example": "113311" + "name": "latitude", + "required": true, + "type": "number", + "x-example": 37.7749 }, { - "description": "TripAdvisor place URL", + "description": "Delivery search center longitude", "in": "query", - "name": "url", - "type": "string" + "name": "longitude", + "required": true, + "type": "number", + "x-example": -122.4194 }, { - "description": "1-based review page", + "description": "Result offset for the location feed. Default 0", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "offset", + "type": "integer" }, { - "description": "Maximum reviews", + "description": "Number of restaurants to return, clamped to 50. Default 20", "in": "query", "name": "limit", - "type": "integer", - "x-example": 3 - }, - { - "description": "Review language", - "in": "query", - "name": "language", - "type": "string", - "x-example": "en" - }, - { - "description": "Legacy sort type; DEFAULT selects newest first, ML_SORTED uses upstream order unless sort_by is DATE", - "enum": [ - "ML_SORTED", - "DEFAULT" - ], - "in": "query", - "name": "sort_type", - "type": "string", - "x-example": "DEFAULT" - }, - { - "description": "Legacy sort field; DATE selects newest first, FAVORABLE_RATING uses upstream order", - "enum": [ - "FAVORABLE_RATING", - "DATE" - ], - "in": "query", - "name": "sort_by", - "type": "string", - "x-example": "DATE" - }, - { - "collectionFormat": "multi", - "description": "Rating filters", - "in": "query", - "items": { - "enum": [ - 1, - 2, - 3, - 4, - 5 - ], - "type": "integer" - }, - "name": "ratings", - "type": "array" - }, - { - "description": "Enable upstream machine translation", - "in": "query", - "name": "do_machine_translation", - "type": "boolean" - }, - { - "description": "Maximum photos per review", - "in": "query", - "name": "photos_per_review_limit", - "type": "integer", - "x-example": 7 + "type": "integer" } ], "produces": [ @@ -511395,7 +526757,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripadvisor.tripadvisorReviewsResponseDoc" + "$ref": "#/definitions/ubereats.feedResponseDoc" } }, "400": { @@ -511404,14 +526766,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -511428,168 +526784,60 @@ "ApiKeyAuth": [] } ], - "summary": "Get TripAdvisor reviews", + "summary": "Browse UberEats location feed", "tags": [ - "TripAdvisor" + "UberEats" ] } }, - "/tripadvisor/search": { + "/ubereats/search": { "get": { "consumes": [ "application/json" ], - "description": "Searches TripAdvisor places in the area given by the required `geo_id`, for the required `type`: `hotel`, `restaurant`, `attraction`, `all`, or an attraction category type from `/tripadvisor/enums`. Hotel and restaurant filters, `offset`, `limit`, `locale`, `currency` and `sort` are optional. Each result has title, URL, rating, review count, rank, price and location. Unsupported entity-only types return a validation error.", - "operationId": "tripadvisor-search", + "description": "Returns restaurants delivering to a location: name, rating, review count, delivery estimate, cuisine tags, and image. Pass a keyword to search by name/cuisine/dish, or omit it to browse the general feed for that location.", + "operationId": "ubereats-search", "parameters": [ { - "description": "TripAdvisor geo id", + "description": "Delivery search center latitude", "in": "query", - "name": "geo_id", + "name": "latitude", "required": true, - "type": "integer", - "x-example": 294217 + "type": "number", + "x-example": 37.7749 }, { - "description": "Listing type", + "description": "Delivery search center longitude", "in": "query", - "name": "type", + "name": "longitude", "required": true, - "type": "string", - "x-example": "restaurant" - }, - { - "description": "Optional hotel filter id", - "in": "query", - "name": "filter_id", - "type": "string", - "x-example": "ufe" - }, - { - "description": "Hotel class filter", - "in": "query", - "name": "class", - "type": "integer", - "x-example": 5 - }, - { - "collectionFormat": "multi", - "description": "Hotel amenity filter ids", - "in": "query", - "items": { - "type": "integer" - }, - "name": "amenities", - "type": "array" - }, - { - "description": "Minimum hotel price filter", - "in": "query", - "name": "price_min", - "type": "integer", - "x-example": 1000 - }, - { - "description": "Maximum hotel price filter", - "in": "query", - "name": "price_max", - "type": "integer", - "x-example": 3205 - }, - { - "description": "Hotel pricing mode", - "in": "query", - "name": "pricing_mode", - "type": "string", - "x-example": "ALL_IN_RATE" - }, - { - "description": "Filter Travelers' Choice hotels", - "in": "query", - "name": "travelers_choice", - "type": "boolean" - }, - { - "description": "Filter Best of the Best hotels", - "in": "query", - "name": "travelers_choice_botb", - "type": "boolean" - }, - { - "description": "Restaurant availability date", - "in": "query", - "name": "restaurant_date", - "type": "string", - "x-example": "2026-05-20" + "type": "number", + "x-example": -122.4194 }, { - "description": "Restaurant availability time", + "description": "Keyword — restaurant name, cuisine, or dish", "in": "query", - "name": "restaurant_time", + "name": "query", "type": "string", - "x-example": "1900" - }, - { - "description": "Restaurant guest count", - "in": "query", - "name": "restaurant_guests", - "type": "integer", - "x-example": 3 - }, - { - "collectionFormat": "multi", - "description": "Restaurant establishment type ids", - "in": "query", - "items": { - "type": "integer" - }, - "name": "establishment_types", - "type": "array" - }, - { - "collectionFormat": "multi", - "description": "Restaurant online option ids", - "in": "query", - "items": { - "type": "integer" - }, - "name": "online_options", - "type": "array" + "x-example": "pizza" }, { - "description": "Zero-based result offset", + "description": "Result offset for the location feed (used only when query is omitted). Default 0", "in": "query", "name": "offset", - "type": "integer", - "x-example": 0 + "type": "integer" }, { - "description": "Maximum results", + "description": "Number of restaurants to return, clamped to 50. Default 20", "in": "query", "name": "limit", - "type": "integer", - "x-example": 3 - }, - { - "description": "TripAdvisor locale", - "in": "query", - "name": "locale", - "type": "string", - "x-example": "en-HK" - }, - { - "description": "Currency code", - "in": "query", - "name": "currency", - "type": "string", - "x-example": "HKD" + "type": "integer" }, { - "description": "Sort value", + "description": "Opaque pagination cursor from a previous keyword-search response", "in": "query", - "name": "sort", - "type": "string", - "x-example": "POPULARITY" + "name": "cursor", + "type": "string" } ], "produces": [ @@ -511599,7 +526847,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripadvisor.tripadvisorSearchResponseDoc" + "$ref": "#/definitions/ubereats.searchResponseDoc" } }, "400": { @@ -511608,8 +526856,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -511626,35 +526874,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search TripAdvisor places", + "summary": "Search UberEats restaurants", "tags": [ - "TripAdvisor" + "UberEats" ] } }, - "/tripcom/hotels/search": { + "/ubereats/store/{store_id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Trip.com's own top-hotels page for a city: hotel summaries (name, location, star rating, guest rating, review count, image, display price) for the hotels Trip.com features on that city's hotel-list page. Trip.com does not expose a free-text city search, so callers supply the exact city_slug and city_id pair from a known Trip.com hotel-list URL of the form https://www.trip.com/hotels/{city_slug}-hotels-list-{city_id}/.", - "operationId": "tripcom-hotels-search", + "description": "Returns an UberEats store: address, phone, rating, cuisine tags, hours tagline, and the full menu (sections with items, descriptions, and prices).", + "operationId": "ubereats-store", "parameters": [ { - "description": "Trip.com city slug, the text segment of a /hotels/{city_slug}-hotels-list-{city_id}/ URL", - "in": "query", - "name": "city_slug", - "required": true, - "type": "string", - "x-example": "bangkok" - }, - { - "description": "Trip.com numeric city id, the trailing number of a /hotels/{city_slug}-hotels-list-{city_id}/ URL", - "in": "query", - "name": "city_id", + "description": "UberEats store UUID, as returned by the search endpoint's storeUuid field", + "in": "path", + "name": "store_id", "required": true, "type": "string", - "x-example": "359" + "x-example": "259fe6e9-9e3a-429d-ae24-be5eda54ba64" } ], "produces": [ @@ -511664,7 +526904,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripcom.searchResponseDoc" + "$ref": "#/definitions/ubereats.storeResponseDoc" } }, "400": { @@ -511697,34 +526937,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Trip.com hotels by city", + "summary": "Get an UberEats store", "tags": [ - "Trip.com" + "UberEats" ] } }, - "/tripcom/hotels/{id}": { + "/ubereats/store/{store_id}/menu": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Trip.com hotel-detail page: identity (name, local name, star rating, city/province/country), location (address, zone, latitude/longitude, nearby-transport description), guest rating (overall score plus cleanliness/amenities/location/service breakdown), images, description, check-in/check-out and child policy summaries, and popular facilities. Pricing is not included: Trip.com's detail page only returns per-night rates alongside check-in/check-out dates, which this endpoint does not take as input -- use the search endpoint for a city's current display prices.", - "operationId": "tripcom-hotel-detail", + "description": "Returns the full menu for an UberEats store: section titles, items, item descriptions, prices, and availability status.", + "operationId": "ubereats-store-menu", "parameters": [ { - "description": "Trip.com hotel id, from a prior search call's hotel_id field", + "description": "UberEats store UUID, as returned by the search endpoint's storeUuid field", "in": "path", - "name": "id", + "name": "store_id", "required": true, "type": "string", - "x-example": "39371462" - }, - { - "description": "Optional slug segment for a nicer canonical source URL (e.g. the district/city slug from a search result's url). Not required and not validated by Trip.com.", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "bang-sao-thong-district" + "x-example": "259fe6e9-9e3a-429d-ae24-be5eda54ba64" } ], "produces": [ @@ -511734,7 +526967,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/tripcom.DetailResponse" + "$ref": "#/definitions/ubereats.menuResponseDoc" } }, "400": { @@ -511767,19 +527000,29 @@ "ApiKeyAuth": [] } ], - "summary": "Get Trip.com hotel detail", + "summary": "Get an UberEats store menu", "tags": [ - "Trip.com" + "UberEats" ] } }, - "/trustmrr/acquire": { + "/ubereats/store/{store_id}/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns the for-sale startups rendered on the public TrustMRR /acquire marketplace page, with deal metrics (asking price, revenue, multiple, growth). Verified revenue figures come from supported payment providers.", - "operationId": "trustmrr-acquire", + "description": "Returns the reviews snapshot embedded in an UberEats store page: aggregate rating, review count, and a sample of recent reviews (reviewer name, text, and relative/absolute date). This is a single on-page snapshot, not a full paginated feed. A store with no written reviews returns an empty reviews list.", + "operationId": "ubereats-store-reviews", + "parameters": [ + { + "description": "UberEats store UUID, as returned by the search endpoint's storeUuid field", + "in": "path", + "name": "store_id", + "required": true, + "type": "string", + "x-example": "259fe6e9-9e3a-429d-ae24-be5eda54ba64" + } + ], "produces": [ "application/json" ], @@ -511787,23 +527030,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustmrr.acquireResponseDoc" + "$ref": "#/definitions/ubereats.storeReviewsResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "TrustMRR upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -511814,19 +527063,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get TrustMRR acquisition listings", + "summary": "Get UberEats store reviews", "tags": [ - "TrustMRR" + "UberEats" ] } }, - "/trustmrr/categories": { + "/ulta/categories": { "get": { "consumes": [ "application/json" ], - "description": "Lists the TrustMRR startup categories, with the total `count`. Each category has its `slug`, `label`, short label, icon name, description, keywords and TrustMRR URL. Pass a category `slug` to `/trustmrr/category/{slug}` to list the startups in it.", - "operationId": "trustmrr-categories", + "description": "Lists Ulta Beauty's own storefront category navigation: department, group, name, and a URL usable directly as GET /ulta/category's own category parameter. Closes the discovery gap of not already knowing a category path. department, if set, filters to just that department's entries. group is empty for a department's own top-level link or a group's own heading link, and set to that group's name for the leaf categories nested under it. The exact same real category can legitimately appear more than once under a different department/group when the site's own navigation cross-lists it.", + "operationId": "ulta-categories", + "parameters": [ + { + "description": "Filter to one department", + "enum": [ + "makeup-nails", + "skin-care", + "hair-care", + "fragrance", + "body-care", + "wellness", + "mens-care", + "tools-brushes" + ], + "in": "query", + "name": "department", + "type": "string", + "x-example": "makeup-nails" + } + ], "produces": [ "application/json" ], @@ -511834,23 +527102,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustmrr.categoriesResponseDoc" + "$ref": "#/definitions/ulta.categoriesResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "TrustMRR upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -511861,27 +527129,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get TrustMRR categories", + "summary": "List Ulta Beauty storefront categories", "tags": [ - "TrustMRR" + "Ulta Beauty" ] } }, - "/trustmrr/category/{slug}": { + "/ulta/category": { "get": { "consumes": [ "application/json" ], - "description": "Returns one TrustMRR category by `slug` (lowercase letters, digits and hyphens, for example `saas`) with the startups listed in it. Each startup has its name, slug, URL, description, current MRR, total revenue and last-30-days revenue, all in USD, plus the `on_sale` flag for startups listed for sale. Valid slugs come from `/trustmrr/categories`.", - "operationId": "trustmrr-category", + "description": "Browses an Ulta Beauty category page's product grid, with real page-based pagination and the category's own guided-navigation refinement options. category accepts a category path or full URL copied from Ulta's own site navigation (e.g. shop/makeup/eyes/mascara). filter narrows results using Ulta's own guided-navigation facet-code shape (e.g. BENEFIT--WATERPROOF, or a comma-joined combination of codes) -- discover valid codes for a category from that category's own response facets field, whose value is ready to use directly as this parameter. An unrecognized category returns 404.", + "operationId": "ulta-category", "parameters": [ { - "description": "TrustMRR category slug", - "in": "path", - "name": "slug", + "description": "Ulta category path or URL", + "in": "query", + "name": "category", "required": true, "type": "string", - "x-example": "saas" + "x-example": "shop/makeup/eyes/mascara" + }, + { + "description": "Guided-navigation facet code(s), comma-joined for multiple", + "in": "query", + "name": "filter", + "type": "string", + "x-example": "BENEFIT--WATERPROOF" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -511891,35 +527173,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustmrr.categoryResponseDoc" + "$ref": "#/definitions/ulta.categoryResponseDoc" } }, "400": { - "description": "Missing or invalid path parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Category not found", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "TrustMRR upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -511930,33 +527206,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get TrustMRR category detail", + "summary": "Browse an Ulta Beauty category page", "tags": [ - "TrustMRR" + "Ulta Beauty" ] } }, - "/trustmrr/leaderboard": { + "/ulta/product/questions": { "get": { "consumes": [ "application/json" ], - "description": "Returns the top 100 startups ranked by the selected metric from the public TrustMRR leaderboard. Revenue and MRR figures are verified through supported payment providers.", - "operationId": "trustmrr-leaderboard", + "description": "Returns one page of an Ulta Beauty product's customer questions, each with every answer it received. product_id is taken from a search result's product_id field or a product page's URL. A product with zero questions, or a well-formed but unrecognized product_id, returns a normal, empty result rather than an error.", + "operationId": "ulta-product-questions", "parameters": [ { - "description": "Leaderboard metric to rank by (default mrr)", - "enum": [ - "mrr", - "last_30_days_revenue", - "all_time_revenue", - "growth", - "traffic", - "revenue_per_visitor" - ], + "description": "Ulta product id, from a search result's product_id field", "in": "query", - "name": "metric", - "type": "string" + "name": "product_id", + "required": true, + "type": "string", + "x-example": "pimprod2020260" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -511966,29 +527243,87 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustmrr.leaderboardResponseDoc" + "$ref": "#/definitions/ulta.productQuestionsResponseDoc" } }, "400": { - "description": "Invalid metric parameter", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "429": { - "description": "Rate limit exceeded", + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get an Ulta Beauty product's customer questions and answers", + "tags": [ + "Ulta Beauty" + ] + } + }, + "/ulta/product/reviews": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one page of an Ulta Beauty product's customer reviews, plus the retailer's own site-wide rating summary (rating count, average rating, recommended ratio, rating histogram) for the product. product_id is taken from a search result's product_id field or a product page's URL. A product with zero reviews, or a well-formed but unrecognized product_id, returns a normal, empty result rather than an error.", + "operationId": "ulta-product-reviews", + "parameters": [ + { + "description": "Ulta product id, from a search result's product_id field", + "in": "query", + "name": "product_id", + "required": true, + "type": "string", + "x-example": "pimprod2020260" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ulta.productReviewsResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "TrustMRR upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -511999,19 +527334,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get TrustMRR revenue leaderboard", + "summary": "Get an Ulta Beauty product's customer reviews", "tags": [ - "TrustMRR" + "Ulta Beauty" ] } }, - "/trustmrr/marketplace": { + "/ulta/product/{productId}": { "get": { "consumes": [ "application/json" ], - "description": "Returns the public TrustMRR marketplace snapshot: the 25 most recently listed startups for sale and the current 25 best deals ranked by TrustMRR's recency-aware deal score. Revenue figures are verified through supported payment providers.", - "operationId": "trustmrr-marketplace", + "description": "Returns one Ulta Beauty product's full detail: name, brand, description, category, pricing, rating, review count, images, and every purchasable color/shade variant. productId is taken from a search result's product_id field or a product page's URL (e.g. pimprod2020260). sku is optional and selects a specific color/shade variant; an omitted or invalid sku still resolves the base product using its own default variant. An unrecognized productId returns 404.", + "operationId": "ulta-product", + "parameters": [ + { + "description": "Ulta product id, from a search result's product_id field", + "in": "path", + "name": "productId", + "required": true, + "type": "string", + "x-example": "pimprod2020260" + }, + { + "description": "Numeric Ulta sku id selecting a specific color/shade variant", + "in": "query", + "name": "sku", + "type": "string", + "x-example": "2574523" + } + ], "produces": [ "application/json" ], @@ -512019,23 +527371,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustmrr.marketplaceResponseDoc" + "$ref": "#/definitions/ulta.productDetailResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "TrustMRR upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -512046,27 +527404,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get TrustMRR marketplace snapshot", + "summary": "Get an Ulta Beauty product's full detail", "tags": [ - "TrustMRR" + "Ulta Beauty" ] } }, - "/trustmrr/startup/{slug}": { + "/ulta/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the full verified profile for a single TrustMRR startup by slug: revenue and MRR, growth, asking price and marketplace status, tech stack, marketing channels, and TrustMRR's AI-generated business summary.", - "operationId": "trustmrr-startup", + "description": "Searches Ulta Beauty's product catalog by keyword, with real page-based pagination. Returns products with brand, pricing, rating, and review count. An unrecognized/nonsense keyword returns a genuine empty result rather than a fallback set. Requesting a page beyond the available results returns a normal, empty result rather than an error.", + "operationId": "ulta-search", "parameters": [ { - "description": "TrustMRR startup slug", - "in": "path", - "name": "slug", + "description": "Search keyword", + "in": "query", + "name": "query", "required": true, "type": "string", - "x-example": "trackai" + "x-example": "mascara" + }, + { + "description": "Result page, 1-based, defaults to 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -512076,35 +527441,100 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustmrr.startupResponseDoc" + "$ref": "#/definitions/ulta.searchResponseDoc" } }, "400": { - "description": "Missing or invalid path parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Startup not found", + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Search Ulta Beauty products", + "tags": [ + "Ulta Beauty" + ] + } + }, + "/ulta/stores": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns Ulta Beauty physical retail store locations near a point: name, phone, full address, hours, services, and coordinates. Either search, or both lat and lng, is required. search is a free-text zip code, city, or address that is first resolved to coordinates; if it does not resolve to any location, a well-formed empty result is returned rather than an error. lat and lng, when given directly, skip that resolution step. radius_meters is optional (1000 to 50000, defaults to 25000). A location with no stores within the radius returns a well-formed empty result rather than an error.", + "operationId": "ulta-stores", + "parameters": [ + { + "description": "Free-text zip code, city, or address to resolve to coordinates", + "in": "query", + "name": "search", + "type": "string", + "x-example": "60601" + }, + { + "description": "Latitude, requires lng", + "in": "query", + "name": "lat", + "type": "number", + "x-example": 41.8781 + }, + { + "description": "Longitude, requires lat", + "in": "query", + "name": "lng", + "type": "number", + "x-example": -87.6298 + }, + { + "description": "Search radius in meters, 1000 to 50000, defaults to 25000", + "in": "query", + "name": "radius_meters", + "type": "integer", + "x-example": 25000 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/ulta.storesResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "TrustMRR upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -512115,31 +527545,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get TrustMRR startup detail", + "summary": "Find nearby Ulta Beauty physical stores", "tags": [ - "TrustMRR" + "Ulta Beauty" ] } }, - "/trustmrr/startups": { + "/ulta/suggest": { "get": { "consumes": [ "application/json" ], - "description": "Returns a paginated list of every startup in the TrustMRR directory. Each entry is a slug you can pass to /trustmrr/startup/{slug} for the full verified profile — together these two endpoints let you enumerate the entire directory.", - "operationId": "trustmrr-startups", + "description": "Returns Ulta Beauty's own search-suggestion (typeahead) result for a partial search term: suggested search terms, each with its own top product matches, plus a featured top result matching what a real user sees at the top of the dropdown. A partial term with no matches returns a normal, empty result rather than an error.", + "operationId": "ulta-suggest", "parameters": [ { - "description": "1-based page number (default 1)", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Items per page (default 100, max 1000)", + "description": "Partial search term", "in": "query", - "name": "page_size", - "type": "integer" + "name": "query", + "required": true, + "type": "string", + "x-example": "masc" } ], "produces": [ @@ -512149,23 +527575,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustmrr.startupsResponseDoc" + "$ref": "#/definitions/ulta.suggestResponseDoc" } }, - "429": { - "description": "Rate limit exceeded", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "TrustMRR upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -512176,51 +527602,27 @@ "ApiKeyAuth": [] } ], - "summary": "List all TrustMRR startups", + "summary": "Get Ulta Beauty search suggestions", "tags": [ - "TrustMRR" + "Ulta Beauty" ] } }, - "/trustpilot/business-units/search": { + "/upwork/freelancer/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Searches Trustpilot for businesses matching a query, for a country (default `US`), with `page` and `page_size` (default 20, max 100). Each result has the display name, identifying name, TrustScore, star rating, review count, categories, website, email, phone, address and Trustpilot URL; `total_hits` gives the full match count.", - "operationId": "trustpilot-business-search", + "description": "Returns an Upwork freelancer profile: name, title, verification badge, overview, hourly rate, rating and review count, Job Success Score, location and local time, total jobs/hours worked, and recent client feedback (title, comment, date, client name, rating).", + "operationId": "upwork-freelancer", "parameters": [ { - "description": "Search query", - "in": "query", - "name": "q", + "description": "Upwork freelancer id, the value after \\", + "in": "path", + "name": "id", "required": true, "type": "string", - "x-example": "openai" - }, - { - "description": "Two-letter country code; defaults to US", - "in": "query", - "name": "country", - "type": "string", - "x-example": "US" - }, - { - "description": "1-based page number; defaults to 1", - "in": "query", - "minimum": 1, - "name": "page", - "type": "integer", - "x-example": 1 - }, - { - "description": "Results per page; defaults to 20, maximum 100", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "page_size", - "type": "integer", - "x-example": 5 + "x-example": "0157e03059a690281f" } ], "produces": [ @@ -512230,35 +527632,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustpilot.businessSearchResponseDoc" + "$ref": "#/definitions/upwork.freelancerResponseDoc" } }, "400": { - "description": "Missing or invalid query parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "No results found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Trustpilot upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -512269,27 +527665,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Trustpilot business units", + "summary": "Get Upwork freelancer profile", "tags": [ - "Trustpilot" + "Upwork" ] } }, - "/trustpilot/business/{slug}": { + "/upwork/job/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Trustpilot business profile by `slug`, such as `openai.com`. The profile has the name, `trust_score`, `review_count`, rating histogram, review summary and topics, categories, claimed status, website URL, reply metrics, company activity and verification flags, and an about section with description and contact details.", - "operationId": "trustpilot-business", + "description": "Returns an Upwork job posting: title, full description, employment type, budget (hourly range or fixed amount), location/remote type, experience level, duration, project type, proposal count, allowed applicant countries, and a summary of the posting client (member since, location, total spend, hires, hours, industry, company size).", + "operationId": "upwork-job", "parameters": [ { - "description": "Trustpilot business slug", + "description": "Upwork job id, e.g. from a search result's id field", "in": "path", - "name": "slug", + "name": "id", "required": true, "type": "string", - "x-example": "openai.com" + "x-example": "022085006288356888767" } ], "produces": [ @@ -512299,35 +527695,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustpilot.businessProfileResponseDoc" + "$ref": "#/definitions/upwork.jobResponseDoc" } }, "400": { - "description": "Missing or invalid path parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Business not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Trustpilot upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -512338,27 +527728,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get Trustpilot business profile", + "summary": "Get Upwork job posting detail", "tags": [ - "Trustpilot" + "Upwork" ] } }, - "/trustpilot/business/{slug}/related": { + "/upwork/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the businesses Trustpilot shows as related to a given business slug such as `openai.com`. Each related business has its display name, identifying name, logo, star rating, TrustScore, review count and Trustpilot URL; the response also includes a summary of the business you asked about.", - "operationId": "trustpilot-business-related", + "description": "Searches Upwork's public job listings by free-text keyword, returning job summaries (title, budget, experience level, duration, posted date, description snippet, skill tags).", + "operationId": "upwork-search", "parameters": [ { - "description": "Trustpilot business slug", - "in": "path", - "name": "slug", + "description": "Free-text job search keyword", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "openai.com" + "x-example": "python developer" + }, + { + "description": "1-based result page. Defaults to 1.", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 2 } ], "produces": [ @@ -512368,35 +527765,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/trustpilot.businessRelatedResponseDoc" + "$ref": "#/definitions/upwork.searchResponseDoc" } }, "400": { - "description": "Missing or invalid path parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Business not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Rate limit exceeded", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } }, "503": { - "description": "Trustpilot upstream request failed", + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -512407,84 +527792,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get Trustpilot related businesses", + "summary": "Search Upwork job postings", "tags": [ - "Trustpilot" + "Upwork" ] } }, - "/trustpilot/business/{slug}/reviews": { + "/usage/me/endpoints": { "get": { "consumes": [ "application/json" ], - "description": "Returns one page of Trustpilot reviews for a business slug such as `openai.com`, with filters for star rating, verified reviews, reviews with a company reply, language and text search. Each review has its rating, title, body, author name, country and review count, dates, and any company reply; the response also carries the business summary and pagination totals.", - "operationId": "trustpilot-business-reviews", + "description": "Returns the signed-in user's usage broken down by endpoint, ordered by request volume. `range` is `period` (the current billing period, default), `day`, `week`, `month` or `custom`, which takes RFC3339 `from` and `to`. `limit` defaults to 20 (max 100). Each item has `requests`, `charged_requests`, `failed_requests`, `non_billable_requests`, `credits` and `overage`. Authenticated with a dashboard JWT.", + "operationId": "usage-me-endpoints", "parameters": [ { - "description": "Trustpilot business slug", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "openai.com" - }, - { - "description": "1-based page number; defaults to 1", + "description": "Time range preset. Defaults to the current billing period.", + "enum": [ + "period", + "day", + "week", + "month", + "custom" + ], "in": "query", - "minimum": 1, - "name": "page", - "type": "integer", - "x-example": 1 + "name": "range", + "type": "string" }, { - "description": "Filter by star rating from 1 to 5", + "description": "Maximum endpoints to return. Defaults to 20 and clamps to 100.", "in": "query", - "maximum": 5, + "maximum": 100, "minimum": 1, - "name": "stars", - "type": "integer", - "x-example": 1 - }, - { - "description": "Filter to verified reviews", - "in": "query", - "name": "verified", - "type": "boolean" - }, - { - "description": "Filter to reviews with business replies", - "in": "query", - "name": "replied", - "type": "boolean" - }, - { - "description": "Review language code used by Trustpilot", - "in": "query", - "name": "language", - "type": "string", - "x-example": "en" - }, - { - "description": "Text search within reviews", - "in": "query", - "name": "q", - "type": "string", - "x-example": "refund" + "name": "limit", + "type": "integer" }, { - "description": "Date range start in YYYY-MM-DD; currently rejected by upstream", + "description": "Custom lower bound in RFC3339 format when range=custom", "in": "query", - "name": "date_from", + "name": "from", "type": "string", - "x-example": "2026-03-01" + "x-example": "2026-04-01T00:00:00Z" }, { - "description": "Date range end in YYYY-MM-DD; currently rejected by upstream", + "description": "Custom upper bound in RFC3339 format when range=custom", "in": "query", - "name": "date_to", + "name": "to", "type": "string", - "x-example": "2026-03-30" + "x-example": "2026-04-22T00:00:00Z" } ], "produces": [ @@ -512492,25 +527847,19 @@ ], "responses": { "200": { - "description": "OK", + "description": "Endpoint usage breakdown", "schema": { - "$ref": "#/definitions/trustpilot.businessReviewsResponseDoc" + "$ref": "#/definitions/usage.usageEndpointsResponseDoc" } }, "400": { - "description": "Missing or invalid path/query parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Business not found", + "description": "Invalid query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } @@ -512520,12 +527869,6 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "503": { - "description": "Trustpilot upstream request failed", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -512533,37 +527876,66 @@ "ApiKeyAuth": [] } ], - "summary": "Get Trustpilot business reviews", + "summary": "Get current user's endpoint usage breakdown", "tags": [ - "Trustpilot" + "Usage" ] } }, - "/trustpilot/categories": { + "/usage/me/overview": { "get": { "consumes": [ "application/json" ], - "description": "Lists the Trustpilot category index grouped by top-level category. Each group has its name, slug and URL, and an `items` list of subcategories with their own name, slug and URL. It takes no parameters.", - "operationId": "trustpilot-categories", + "description": "Returns a JWT-authenticated user's current billing snapshot plus recent request and credit consumption metrics for the selected UTC time range. The `requests` summary is limited to product API traffic and excludes console, billing, usage, and user-management endpoints.", + "operationId": "usage-me-overview", + "parameters": [ + { + "description": "Time range preset. Defaults to the current billing period.", + "enum": [ + "period", + "day", + "week", + "month", + "custom" + ], + "in": "query", + "name": "range", + "type": "string" + }, + { + "description": "Custom lower bound in RFC3339 format when range=custom", + "in": "query", + "name": "from", + "type": "string", + "x-example": "2026-04-01T00:00:00Z" + }, + { + "description": "Custom upper bound in RFC3339 format when range=custom", + "in": "query", + "name": "to", + "type": "string", + "x-example": "2026-04-22T00:00:00Z" + } + ], "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Usage overview", "schema": { - "$ref": "#/definitions/trustpilot.categoriesResponseDoc" + "$ref": "#/definitions/usage.usageOverviewResponseDoc" } }, - "404": { - "description": "Categories not found", + "400": { + "description": "Invalid query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } @@ -512573,12 +527945,6 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "503": { - "description": "Trustpilot upstream request failed", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -512586,50 +527952,54 @@ "ApiKeyAuth": [] } ], - "summary": "Get Trustpilot categories", + "summary": "Get current user's usage overview", "tags": [ - "Trustpilot" + "Usage" ] } }, - "/trustpilot/categories/search": { + "/usage/me/recent-ips": { "get": { "consumes": [ "application/json" ], - "description": "Searches Trustpilot categories for the required `q`. `size` sets the maximum number of categories (default 20, from 1 to 100), `country` is a two-letter code (default US) and `locale` uses `ll-CC` format (default `en-US`). Each category has its `category_id`, `display_name` and `top_level_category_id`.", - "operationId": "trustpilot-category-search", + "description": "Returns recent client IP addresses observed for the JWT-authenticated user's product API traffic, ordered by last seen time. Console, billing, usage, and user-management endpoints are excluded.", + "operationId": "usage-me-recent-ips", "parameters": [ { - "description": "Search query", + "description": "Time range preset. Defaults to the current billing period.", + "enum": [ + "period", + "day", + "week", + "month", + "custom" + ], "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "openai" + "name": "range", + "type": "string" }, { - "description": "Two-letter country code; defaults to US", + "description": "Maximum IPs to return. Defaults to 20 and clamps to 100.", "in": "query", - "name": "country", - "type": "string", - "x-example": "US" + "maximum": 100, + "minimum": 1, + "name": "limit", + "type": "integer" }, { - "description": "Locale in ll-CC format; defaults to en-US", + "description": "Custom lower bound in RFC3339 format when range=custom", "in": "query", - "name": "locale", + "name": "from", "type": "string", - "x-example": "en-US" + "x-example": "2026-04-01T00:00:00Z" }, { - "description": "Maximum number of categories; defaults to 20", + "description": "Custom upper bound in RFC3339 format when range=custom", "in": "query", - "maximum": 100, - "minimum": 1, - "name": "size", - "type": "integer", - "x-example": 3 + "name": "to", + "type": "string", + "x-example": "2026-04-22T00:00:00Z" } ], "produces": [ @@ -512637,25 +528007,19 @@ ], "responses": { "200": { - "description": "OK", + "description": "Recent API client IPs", "schema": { - "$ref": "#/definitions/trustpilot.categorySearchResponseDoc" + "$ref": "#/definitions/usage.usageRecentIPsResponseDoc" } }, "400": { - "description": "Missing or invalid query parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "No results found", + "description": "Invalid query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } @@ -512665,12 +528029,6 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "503": { - "description": "Trustpilot upstream request failed", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -512678,35 +528036,63 @@ "ApiKeyAuth": [] } ], - "summary": "Search Trustpilot categories", + "summary": "Get current user's recent API client IPs", "tags": [ - "Trustpilot" + "Usage" ] } }, - "/trustpilot/category/{slug}": { + "/usage/me/timeseries": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Trustpilot category by `slug` (for example `software_company`), with the companies listed on one page; `page` is 1-based and defaults to 1. Each company has its display name, `identifying_name`, `trust_score`, `stars`, `review_count`, location, contact details, categories and Trustpilot URL. Also returns breadcrumbs, newest companies and `pagination.has_next_page`.", - "operationId": "trustpilot-category", + "description": "Returns the signed-in user's request usage as UTC time buckets for charts. `range` is `period` (default), `day`, `week`, `month` or `custom` (with RFC3339 `from` and `to`); `bucket` is `hour` or `day`; `endpoint` filters to one endpoint such as `google/search`. Each bucket has start, end, `requests`, `charged_requests`, `credits` and `overage`. Empty buckets are filled with zeros.", + "operationId": "usage-me-timeseries", "parameters": [ { - "description": "Trustpilot category slug", - "in": "path", - "name": "slug", - "required": true, + "description": "Time range preset. Defaults to the current billing period.", + "enum": [ + "period", + "day", + "week", + "month", + "custom" + ], + "in": "query", + "name": "range", + "type": "string" + }, + { + "description": "Bucket size. Defaults to hour for day range and day otherwise.", + "enum": [ + "hour", + "day" + ], + "in": "query", + "name": "bucket", + "type": "string" + }, + { + "description": "Optional endpoint filter", + "in": "query", + "name": "endpoint", "type": "string", - "x-example": "software_company" + "x-example": "google/search" }, { - "description": "1-based page number; defaults to 1", + "description": "Custom lower bound in RFC3339 format when range=custom", "in": "query", - "minimum": 1, - "name": "page", - "type": "integer", - "x-example": 1 + "name": "from", + "type": "string", + "x-example": "2026-04-01T00:00:00Z" + }, + { + "description": "Custom upper bound in RFC3339 format when range=custom", + "in": "query", + "name": "to", + "type": "string", + "x-example": "2026-04-22T00:00:00Z" } ], "produces": [ @@ -512714,25 +528100,19 @@ ], "responses": { "200": { - "description": "OK", + "description": "Usage timeseries", "schema": { - "$ref": "#/definitions/trustpilot.categoryResponseDoc" + "$ref": "#/definitions/usage.usageTimeseriesResponseDoc" } }, "400": { - "description": "Missing or invalid path/query parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Category not found", + "description": "Invalid query parameters", "schema": { "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Rate limit exceeded", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } @@ -512742,12 +528122,6 @@ "schema": { "$ref": "#/definitions/app.Response" } - }, - "503": { - "description": "Trustpilot upstream request failed", - "schema": { - "$ref": "#/definitions/app.Response" - } } }, "security": [ @@ -512755,59 +528129,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get Trustpilot category detail", + "summary": "Get current user's usage timeseries", "tags": [ - "Trustpilot" + "Usage" ] } }, - "/twitch/channel": { + "/usage/platform-adjacency": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Twitch channel's profile (partner status, team, last broadcast title) plus its current live status (started time and game/category, when live).", - "operationId": "twitch-channel", - "parameters": [ - { - "description": "Twitch channel login (the lowercase URL slug, e.g. caedrel for twitch.tv/caedrel)", - "in": "query", - "name": "login", - "required": true, - "type": "string", - "x-example": "caedrel" - } - ], + "description": "Returns, per platform, how many real users have used it (lifetime, successful requests only), its request volume, top entry endpoints, and which other platforms those users also use. Aggregated across all customers with non-customer, static, and console traffic excluded; recomputed at most once per 24 hours and served from cache. Powers the console dashboard's \"Explore more\" recommendation.", + "operationId": "usage-platform-adjacency", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/twitch.channelResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Platform reach and co-usage aggregate", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/usage.usagePlatformAdjacencyResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -512818,34 +528170,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Twitch channel's profile and live status", + "summary": "Get cross-user platform reach and co-usage", "tags": [ - "Twitch" + "Usage" ] } }, - "/twitch/clips": { + "/usatoday/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Twitch channel's clips (last 7 days), most-viewed first: title, view count, duration, curator, and the game it was recorded under.", - "operationId": "twitch-clips", + "description": "Returns one normal USA Today article's public metadata and body paragraphs from a canonical article URL. Video, gallery, and other non-article routes are not supported.", + "operationId": "usatoday-article", "parameters": [ { - "description": "Twitch channel login (the lowercase URL slug, e.g. caedrel for twitch.tv/caedrel)", + "description": "Canonical USA Today article URL", "in": "query", - "name": "login", + "name": "url", "required": true, "type": "string", - "x-example": "caedrel" - }, - { - "description": "Number of clips to return (default 20, max 100)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 + "x-example": "https://www.usatoday.com/story/sports/mlb/dodgers/2026/09/23/shohei-ohtani-return-from-il/91899080007/" } ], "produces": [ @@ -512855,7 +528197,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/twitch.clipsResponseDoc" + "$ref": "#/definitions/usatoday.articleResponseDoc" } }, "400": { @@ -512888,34 +528230,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Twitch channel's clips", + "summary": "Get a USA Today article's content", "tags": [ - "Twitch" + "USA Today" ] } }, - "/twitch/schedule": { + "/usatoday/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Twitch channel's upcoming broadcast schedule -- planned segments with title, start/end time, and game/category -- starting today. A channel with no schedule configured returns an empty segments list, not an error.", - "operationId": "twitch-schedule", + "description": "Returns one USA Today staff writer's public profile: name, bio, social accounts, and their recent articles, from a canonical staff page URL.", + "operationId": "usatoday-author", "parameters": [ { - "description": "Twitch channel login (the lowercase URL slug)", + "description": "Canonical USA Today staff URL", "in": "query", - "name": "channel", + "name": "url", "required": true, "type": "string", - "x-example": "caedrel" - }, - { - "description": "Number of weeks ahead to return, starting today (default 1, max 4)", - "in": "query", - "name": "weeks", - "type": "integer", - "x-example": 1 + "x-example": "https://www.usatoday.com/staff/87951836007/andres-soto/" } ], "produces": [ @@ -512925,7 +528257,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/twitch.scheduleResponseDoc" + "$ref": "#/definitions/usatoday.authorResponseDoc" } }, "400": { @@ -512958,34 +528290,39 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Twitch channel's broadcast schedule", + "summary": "Get a USA Today staff/author profile", "tags": [ - "Twitch" + "USA Today" ] } }, - "/twitch/search": { + "/usatoday/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns mixed category and channel matches for a query -- live channels include current viewer count and stream title. Sourced from Twitch's own search-typeahead surface (a capped suggestion list, not a fully paginated results page).", - "operationId": "twitch-search", + "description": "Returns the newest USA Today items for one top-level section, up to 100. `section` is required and takes `news`, `sports`, `entertainment`, `life`, `money`, `tech`, `travel`, `opinion`, `cars`, `shopping`, `weather`, `politics` or `grocery`. Each item has its title, URL, published and updated times, and lead image when there is one.", + "operationId": "usatoday-headlines", "parameters": [ { - "description": "Search text (category/game name or channel name)", + "description": "Top-level USA Today section", + "enum": [ + "news", + "sports", + "entertainment", + "life", + "money", + "tech", + "travel", + "opinion", + "cars", + "shopping", + "weather", + "politics", + "grocery" + ], "in": "query", - "name": "query", + "name": "section", "required": true, "type": "string", - "x-example": "valorant" - }, - { - "description": "Number of results to return (default 10, max 30)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 10 + "x-example": "news" } ], "produces": [ @@ -512995,7 +528332,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/twitch.searchResponseDoc" + "$ref": "#/definitions/usatoday.headlinesResponseDoc" } }, "400": { @@ -513022,36 +528359,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search Twitch channels and games/categories", + "summary": "Get USA Today section headlines", "tags": [ - "Twitch" + "USA Today" ] } }, - "/twitch/streams": { + "/usatoday/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the top currently-live streams for a Twitch game/category, ranked by viewer count: title, viewer count, broadcaster, and tags.", - "operationId": "twitch-streams", - "parameters": [ - { - "description": "Twitch game/category slug (the lowercase URL slug from twitch.tv/directory/category/{slug})", - "in": "query", - "name": "game", - "required": true, - "type": "string", - "x-example": "league-of-legends" - }, - { - "description": "Number of streams to return (default 20, max 100)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - } - ], + "description": "Returns the newest window of USA Today's public news feed: title, canonical URL, publication and update times, and the lead image when USA Today publishes one.", + "operationId": "usatoday-news", "produces": [ "application/json" ], @@ -513059,19 +528376,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/twitch.streamsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/usatoday.newsResponseDoc" } }, "429": { @@ -513092,29 +528397,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get the top live streams for a Twitch game/category", + "summary": "Get fresh USA Today headlines", "tags": [ - "Twitch" + "USA Today" ] } }, - "/twitch/team": { + "/usatoday/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Twitch team's full member roster, with live status and viewer count for whoever is currently live, plus team-level metadata (banner, logo, description, owner).", - "operationId": "twitch-team", - "parameters": [ - { - "description": "Twitch team slug (the lowercase URL slug from twitch.tv/team/{slug})", - "in": "query", - "name": "team", - "required": true, - "type": "string", - "x-example": "yumetalent" - } - ], + "description": "Lists the 13 top-level USA Today sections accepted by `usatoday-headlines`, from `news` and `sports` to `politics` and `grocery`. Each has a `slug`, a display `name` and a landing-page `url`. Takes no parameters.", + "operationId": "usatoday-sections", "produces": [ "application/json" ], @@ -513122,19 +528414,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/twitch.teamResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/usatoday.sectionsResponseDoc" } }, "429": { @@ -513155,52 +528435,31 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Twitch team's roster", + "summary": "List USA Today sections", "tags": [ - "Twitch" + "USA Today" ] } }, - "/twitch/top-games": { + "/user/me": { "get": { "consumes": [ "application/json" ], - "description": "Returns the top games/categories site-wide, ranked by total current viewers across all live streams under each one.", - "operationId": "twitch-top-games", - "parameters": [ - { - "description": "Number of games to return (default 20, max 100)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - } - ], + "description": "Returns the profile of the user who owns the `Token ` in the `Authorization` header: `id`, `username`, `email` and `plan`. Password hashes, activation tokens, API keys and billing identifiers are never returned, which makes it a quick check that a session token is valid.", + "operationId": "user-me", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/twitch.topGamesResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", + "description": "Current user", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/user.userMeResponseDoc" } }, - "503": { - "description": "Service Unavailable", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } @@ -513208,69 +528467,40 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Get Twitch's top games/categories", + "summary": "Get current user", "tags": [ - "Twitch" + "User" ] } }, - "/twitch/videos": { + "/user/me/api-keys": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Twitch channel's past-broadcast videos (VODs), ranked by view count: title, view count, length, publish date, and the game it was recorded under.", - "operationId": "twitch-videos", - "parameters": [ - { - "description": "Twitch channel login (the lowercase URL slug, e.g. lck for twitch.tv/lck)", - "in": "query", - "name": "login", - "required": true, - "type": "string", - "x-example": "lck" - }, - { - "description": "Number of videos to return (default 20, max 100)", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 20 - } - ], + "description": "Lists the signed-in user's API keys in masked form. Each item has `id`, `masked_key`, `key_prefix`, `key_suffix`, `status` (`active`, `grace` or `revoked`), `source`, and created, updated, rotated, expiry and last-used timestamps with the last-used IP. Raw keys are not returned; the reveal endpoint, `POST /api/v1/user/me/api-keys/{id}/reveal`, retrieves one.", + "operationId": "user-me-api-keys", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/twitch.videosResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "API keys", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/user.userAPIKeysResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -513278,69 +528508,40 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Get a Twitch channel's videos (VODs)", + "summary": "List current user's API keys", "tags": [ - "Twitch" + "User" ] } }, - "/twitch/vod-comments": { - "get": { + "/user/me/api-keys/rotate": { + "post": { "consumes": [ "application/json" ], - "description": "Returns one page of a Twitch VOD's chat replay (past-broadcast chat messages), starting at a given point in the video's timeline. Paginate forward by re-requesting with the last returned comment's offset_seconds.", - "operationId": "twitch-vod-comments", - "parameters": [ - { - "description": "Twitch VOD/video id (the numeric id from twitch.tv/videos/{id})", - "in": "query", - "name": "video", - "required": true, - "type": "string", - "x-example": "2845804307" - }, - { - "description": "Start the page from this point in the VOD's timeline, in seconds (default 0)", - "in": "query", - "name": "offset", - "type": "integer", - "x-example": 0 - } - ], + "description": "Generates a new active API key for the JWT-authenticated user and places the previous key into a 24 hour grace period.", + "operationId": "user-me-api-keys-rotate", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/twitch.vodCommentsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", + "description": "Rotated API key", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/user.userRotateAPIKeyResponseDoc" } }, - "429": { - "description": "Too Many Requests", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -513348,50 +528549,29 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Get a Twitch VOD's chat replay", + "summary": "Rotate current user's API key", "tags": [ - "Twitch" + "User" ] } }, - "/ubereats/feed": { - "get": { + "/user/me/api-keys/{id}/reveal": { + "post": { "consumes": [ "application/json" ], - "description": "Returns restaurants delivering to a specific location: name, rating, review count, delivery estimate, cuisine tags, and cover image.", - "operationId": "ubereats-feed", + "description": "Returns the raw value for a selected active or unexpired grace API key owned by the JWT-authenticated user when raw key material is available.", + "operationId": "user-me-api-keys-reveal", "parameters": [ { - "description": "Delivery search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 37.7749 - }, - { - "description": "Delivery search center longitude", - "in": "query", - "name": "longitude", + "description": "API key id", + "in": "path", + "name": "id", "required": true, - "type": "number", - "x-example": -122.4194 - }, - { - "description": "Result offset for the location feed. Default 0", - "in": "query", - "name": "offset", - "type": "integer" - }, - { - "description": "Number of restaurants to return, clamped to 50. Default 20", - "in": "query", - "name": "limit", - "type": "integer" + "type": "string" } ], "produces": [ @@ -513399,25 +528579,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Raw API key", "schema": { - "$ref": "#/definitions/ubereats.feedResponseDoc" + "$ref": "#/definitions/user.userRevealAPIKeyResponseDoc" } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "404": { + "description": "API key not found or raw value unavailable", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -513425,63 +528605,31 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Browse UberEats location feed", + "summary": "Reveal current user's API key", "tags": [ - "UberEats" + "User" ] } }, - "/ubereats/search": { - "get": { + "/user/me/browser-language": { + "post": { "consumes": [ "application/json" ], - "description": "Returns restaurants delivering to a location: name, rating, review count, delivery estimate, cuisine tags, and image. Pass a keyword to search by name/cuisine/dish, or omit it to browse the general feed for that location.", - "operationId": "ubereats-search", + "description": "Captures the Accept-Language header from a live dashboard visit and, only if the caller's signup Accept-Language was never recorded, saves it and its derived primary subtag. A no-op for a caller who already has a value on file.", + "operationId": "user-me-browser-language", "parameters": [ { - "description": "Delivery search center latitude", - "in": "query", - "name": "latitude", - "required": true, - "type": "number", - "x-example": 37.7749 - }, - { - "description": "Delivery search center longitude", - "in": "query", - "name": "longitude", + "description": "Accept-Language header captured from the visit", + "in": "body", + "name": "body", "required": true, - "type": "number", - "x-example": -122.4194 - }, - { - "description": "Keyword — restaurant name, cuisine, or dish", - "in": "query", - "name": "query", - "type": "string", - "x-example": "pizza" - }, - { - "description": "Result offset for the location feed (used only when query is omitted). Default 0", - "in": "query", - "name": "offset", - "type": "integer" - }, - { - "description": "Number of restaurants to return, clamped to 50. Default 20", - "in": "query", - "name": "limit", - "type": "integer" - }, - { - "description": "Opaque pagination cursor from a previous keyword-search response", - "in": "query", - "name": "cursor", - "type": "string" + "schema": { + "$ref": "#/definitions/user.userBrowserLanguageReq" + } } ], "produces": [ @@ -513489,25 +528637,19 @@ ], "responses": { "200": { - "description": "OK", + "description": "Backfill result", "schema": { - "$ref": "#/definitions/ubereats.searchResponseDoc" + "$ref": "#/definitions/user.userBrowserLanguageResponseDoc" } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -513515,62 +528657,46 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Search UberEats restaurants", + "summary": "Backfill current user's browser language", "tags": [ - "UberEats" - ] - } - }, - "/ubereats/store/{store_id}": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns an UberEats store: address, phone, rating, cuisine tags, hours tagline, and the full menu (sections with items, descriptions, and prices).", - "operationId": "ubereats-store", - "parameters": [ - { - "description": "UberEats store UUID, as returned by the search endpoint's storeUuid field", - "in": "path", - "name": "store_id", - "required": true, - "type": "string", - "x-example": "259fe6e9-9e3a-429d-ae24-be5eda54ba64" - } + "User" + ] + } + }, + "/user/me/deletion-request": { + "delete": { + "consumes": [ + "application/json" ], + "description": "Withdraws the authenticated user's own pending or approved deletion request before purge. If this request scheduled Stripe cancellation and the paid-through date has not arrived, the renewal cancellation is reversed.", + "operationId": "account-deletion-cancel", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Cancelled deletion request", "schema": { - "$ref": "#/definitions/ubereats.storeResponseDoc" + "$ref": "#/definitions/accountdeletion.accountDeletionResponseDoc" } }, "400": { - "description": "Bad Request", + "description": "No active deletion request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -513578,62 +528704,38 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Get an UberEats store", + "summary": "Cancel current user's account deletion request", "tags": [ - "UberEats" + "Account Deletion" ] - } - }, - "/ubereats/store/{store_id}/menu": { + }, "get": { "consumes": [ "application/json" ], - "description": "Returns the full menu for an UberEats store: section titles, items, item descriptions, prices, and availability status.", - "operationId": "ubereats-store-menu", - "parameters": [ - { - "description": "UberEats store UUID, as returned by the search endpoint's storeUuid field", - "in": "path", - "name": "store_id", - "required": true, - "type": "string", - "x-example": "259fe6e9-9e3a-429d-ae24-be5eda54ba64" - } - ], + "description": "Returns the signed-in user's active account deletion request (`pending` or `approved`), including its `status`, request time, `scheduled_purge_at`, `subscription_period_end` and the Stripe cancellation flags. A user with no active request gets a 200 with an empty request (empty `id`), not an error.", + "operationId": "account-deletion-my-request", "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ubereats.menuResponseDoc" - } - }, - "400": { - "description": "Bad Request", + "description": "Deletion request, empty if none active", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/accountdeletion.accountDeletionResponseDoc" } }, - "404": { - "description": "Not Found", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -513641,30 +528743,28 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Get an UberEats store menu", + "summary": "Get current user's account deletion request", "tags": [ - "UberEats" + "Account Deletion" ] - } - }, - "/ubereats/store/{store_id}/reviews": { - "get": { + }, + "post": { "consumes": [ "application/json" ], - "description": "Returns the reviews snapshot embedded in an UberEats store page: aggregate rating, review count, and a sample of recent reviews (reviewer name, text, and relative/absolute date). This is a single on-page snapshot, not a full paginated feed. A store with no written reviews returns an empty reviews list.", - "operationId": "ubereats-store-reviews", + "description": "Records the authenticated user's request to delete their account. If approved with a live Stripe subscription, renewal is stopped at the current paid-through date; account access continues until expiry, then deletion runs after the existing 72-hour minimum review window. Account deletion never issues refunds or prorated credits. Idempotent — repeat calls while a request is pending or approved return the existing request.", + "operationId": "account-deletion-request", "parameters": [ { - "description": "UberEats store UUID, as returned by the search endpoint's storeUuid field", - "in": "path", - "name": "store_id", - "required": true, - "type": "string", - "x-example": "259fe6e9-9e3a-429d-ae24-be5eda54ba64" + "description": "Optional reason for the request", + "in": "body", + "name": "request", + "schema": { + "$ref": "#/definitions/accountdeletion.accountDeletionRequestBodyDoc" + } } ], "produces": [ @@ -513672,31 +528772,25 @@ ], "responses": { "200": { - "description": "OK", + "description": "Deletion request", "schema": { - "$ref": "#/definitions/ubereats.storeReviewsResponseDoc" + "$ref": "#/definitions/accountdeletion.accountDeletionResponseDoc" } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Authentication required", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "Not Found", + "description": "User not found", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "description": "Internal server error", "schema": { "$ref": "#/definitions/app.Response" } @@ -513704,39 +528798,27 @@ }, "security": [ { - "ApiKeyAuth": [] + "JWTAuth": [] } ], - "summary": "Get UberEats store reviews", + "summary": "Request account deletion", "tags": [ - "UberEats" + "Account Deletion" ] } }, - "/ulta/categories": { + "/usmagazine/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Lists Ulta Beauty's own storefront category navigation: department, group, name, and a URL usable directly as GET /ulta/category's own category parameter. Closes the discovery gap of not already knowing a category path. department, if set, filters to just that department's entries. group is empty for a department's own top-level link or a group's own heading link, and set to that group's name for the leaf categories nested under it. The exact same real category can legitimately appear more than once under a different department/group when the site's own navigation cross-lists it.", - "operationId": "ulta-categories", + "description": "Returns one Us Weekly article by its canonical `url`, in the form `/
/news//`. The response has the title, description, published and updated times, section, authors, lead image and the body `paragraphs`, without sub-headings or embeds. Photo-gallery URLs and non-article pages return a 400 error.", + "operationId": "usmagazine-article", "parameters": [ { - "description": "Filter to one department", - "enum": [ - "makeup-nails", - "skin-care", - "hair-care", - "fragrance", - "body-care", - "wellness", - "mens-care", - "tools-brushes" - ], + "description": "Canonical Us Weekly article URL", "in": "query", - "name": "department", + "name": "url", + "required": true, "type": "string", - "x-example": "makeup-nails" + "x-example": "https://www.usmagazine.com/celebrity-news/news/example-article-slug/" } ], "produces": [ @@ -513746,7 +528828,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.categoriesResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -513755,8 +528837,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -513773,41 +528855,24 @@ "ApiKeyAuth": [] } ], - "summary": "List Ulta Beauty storefront categories", + "summary": "Get Us Weekly article content", "tags": [ - "Ulta Beauty" + "Us Weekly" ] } }, - "/ulta/category": { + "/usmagazine/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Browses an Ulta Beauty category page's product grid, with real page-based pagination and the category's own guided-navigation refinement options. category accepts a category path or full URL copied from Ulta's own site navigation (e.g. shop/makeup/eyes/mascara). filter narrows results using Ulta's own guided-navigation facet-code shape (e.g. BENEFIT--WATERPROOF, or a comma-joined combination of codes) -- discover valid codes for a category from that category's own response facets field, whose value is ready to use directly as this parameter. An unrecognized category returns 404.", - "operationId": "ulta-category", + "description": "Returns a Us Weekly author's profile from their canonical `url` (`/author//`, required): name, biography, contact links and the newest articles, about 20. Staff and desk bylines may have no biography or links. Photo galleries are skipped and `published_at` is not set on the articles.", + "operationId": "usmagazine-author", "parameters": [ { - "description": "Ulta category path or URL", + "description": "Canonical Us Weekly author URL", "in": "query", - "name": "category", + "name": "url", "required": true, "type": "string", - "x-example": "shop/makeup/eyes/mascara" - }, - { - "description": "Guided-navigation facet code(s), comma-joined for multiple", - "in": "query", - "name": "filter", - "type": "string", - "x-example": "BENEFIT--WATERPROOF" - }, - { - "description": "Result page, 1-based, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "https://www.usmagazine.com/author/jane-doe/" } ], "produces": [ @@ -513817,7 +528882,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.categoryResponseDoc" + "$ref": "#/definitions/publicnews.usmagazineAuthorResponseDoc" } }, "400": { @@ -513832,12 +528897,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -513850,34 +528909,38 @@ "ApiKeyAuth": [] } ], - "summary": "Browse an Ulta Beauty category page", + "summary": "Get a Us Weekly author profile", "tags": [ - "Ulta Beauty" + "Us Weekly" ] } }, - "/ulta/product/questions": { + "/usmagazine/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of an Ulta Beauty product's customer questions, each with every answer it received. product_id is taken from a search result's product_id field or a product page's URL. A product with zero questions, or a well-formed but unrecognized product_id, returns a normal, empty result rather than an error.", - "operationId": "ulta-product-questions", + "description": "Lists recent Us Weekly headlines for one section. `section` is required and takes `celebrity-news`, `entertainment`, `sports`, `shopping`, `crime-news`, `stylish`, `celebrity-moms`, `celebrity-body`, `food`, `reviews`, `reality-tv` or `royal-family`. Returns up to about 20 items, with photo galleries excluded; `reviews` holds only a few.", + "operationId": "usmagazine-headlines", "parameters": [ { - "description": "Ulta product id, from a search result's product_id field", + "description": "Us Weekly RSS section slug", + "enum": [ + "celebrity-news", + "entertainment", + "sports", + "shopping", + "crime-news", + "stylish", + "celebrity-moms", + "celebrity-body", + "food", + "reviews", + "reality-tv", + "royal-family" + ], "in": "query", - "name": "product_id", + "name": "section", "required": true, "type": "string", - "x-example": "pimprod2020260" - }, - { - "description": "Result page, 1-based, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "celebrity-news" } ], "produces": [ @@ -513887,7 +528950,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.productQuestionsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -513896,12 +528959,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -513914,36 +528971,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Ulta Beauty product's customer questions and answers", + "summary": "Get Us Weekly section headlines", "tags": [ - "Ulta Beauty" + "Us Weekly" ] } }, - "/ulta/product/reviews": { + "/usmagazine/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one page of an Ulta Beauty product's customer reviews, plus the retailer's own site-wide rating summary (rating count, average rating, recommended ratio, rating histogram) for the product. product_id is taken from a search result's product_id field or a product page's URL. A product with zero reviews, or a well-formed but unrecognized product_id, returns a normal, empty result rather than an error.", - "operationId": "ulta-product-reviews", - "parameters": [ - { - "description": "Ulta product id, from a search result's product_id field", - "in": "query", - "name": "product_id", - "required": true, - "type": "string", - "x-example": "pimprod2020260" - }, - { - "description": "Result page, 1-based, defaults to 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 - } - ], + "description": "Returns the latest Us Weekly top stories with no parameters. Each item has its title and URL, plus summary, publication time, author and image when the outlet provides them. Only article URLs of the form `/
/news//` appear; photo galleries are left out.", + "operationId": "usmagazine-news", "produces": [ "application/json" ], @@ -513951,13 +528988,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.productReviewsResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -513978,36 +529009,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Ulta Beauty product's customer reviews", + "summary": "Get Us Weekly top stories", "tags": [ - "Ulta Beauty" + "Us Weekly" ] } }, - "/ulta/product/{productId}": { + "/usmagazine/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns one Ulta Beauty product's full detail: name, brand, description, category, pricing, rating, review count, images, and every purchasable color/shade variant. productId is taken from a search result's product_id field or a product page's URL (e.g. pimprod2020260). sku is optional and selects a specific color/shade variant; an omitted or invalid sku still resolves the base product using its own default variant. An unrecognized productId returns 404.", - "operationId": "ulta-product", - "parameters": [ - { - "description": "Ulta product id, from a search result's product_id field", - "in": "path", - "name": "productId", - "required": true, - "type": "string", - "x-example": "pimprod2020260" - }, - { - "description": "Numeric Ulta sku id selecting a specific color/shade variant", - "in": "query", - "name": "sku", - "type": "string", - "x-example": "2574523" - } - ], + "description": "Lists the 12 Us Weekly sections accepted by `usmagazine-headlines`, from `celebrity-news` and `entertainment` to `reality-tv` and `royal-family`. Each entry has a `slug`, display `name` and section feed `url`. Takes no parameters.", + "operationId": "usmagazine-sections", "produces": [ "application/json" ], @@ -514015,31 +529026,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.productDetailResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -514048,34 +529035,35 @@ "ApiKeyAuth": [] } ], - "summary": "Get an Ulta Beauty product's full detail", + "summary": "Get Us Weekly RSS sections", "tags": [ - "Ulta Beauty" + "Us Weekly" ] } }, - "/ulta/search": { + "/usptoppubs/detail": { "get": { "consumes": [ "application/json" ], - "description": "Searches Ulta Beauty's product catalog by keyword, with real page-based pagination. Returns products with brand, pricing, rating, and review count. An unrecognized/nonsense keyword returns a genuine empty result rather than a fallback set. Requesting a page beyond the available results returns a normal, empty result rather than an error.", - "operationId": "ulta-search", + "description": "Fetches a single USPTO Patent Public Search record's full text -- bibliographic data, abstract, description, and claims -- by GUID and source database. guid and source normally come straight from a prior /usptoppubs/search result's guid and database fields. Public data, sourced from USPTO's own official search tool.", + "operationId": "usptoppubs-detail", "parameters": [ { - "description": "Search keyword", + "description": "Document GUID, e.g. from a prior search result's guid field", "in": "query", - "name": "query", + "name": "guid", "required": true, "type": "string", - "x-example": "mascara" + "x-example": "US-20260238009-A1" }, { - "description": "Result page, 1-based, defaults to 1", + "description": "Source database. Allowed values: US-PGPUB, USPAT, USOCR", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "source", + "required": true, + "type": "string", + "x-example": "US-PGPUB" } ], "produces": [ @@ -514085,7 +529073,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.searchResponseDoc" + "$ref": "#/definitions/usptoppubs.detailResponseDoc" } }, "400": { @@ -514094,12 +529082,24 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -514112,47 +529112,48 @@ "ApiKeyAuth": [] } ], - "summary": "Search Ulta Beauty products", + "summary": "Fetch a document's full bibliographic data, abstract, description, and claims", "tags": [ - "Ulta Beauty" + "USPTO Patent Public Search" ] } }, - "/ulta/stores": { + "/usptoppubs/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns Ulta Beauty physical retail store locations near a point: name, phone, full address, hours, services, and coordinates. Either search, or both lat and lng, is required. search is a free-text zip code, city, or address that is first resolved to coordinates; if it does not resolve to any location, a well-formed empty result is returned rather than an error. lat and lng, when given directly, skip that resolution step. radius_meters is optional (1000 to 50000, defaults to 25000). A location with no stores within the radius returns a well-formed empty result rather than an error.", - "operationId": "ulta-stores", + "description": "Searches USPTO Patent Public Search's full-text index of granted patents and published applications, returning bibliographic results (title, applicant/assignee, inventors, filing and publication dates, application number, IPC/CPC classifications, page count). q accepts USPTO's full Advanced Search query syntax -- field-specific search (e.g. battery.ti., Microsoft.as.), date ranges (@pd>=20200101<=20241231), boolean and proximity operators, and wildcards -- see the markdown doc for the full field-code table and syntax reference.", + "operationId": "usptoppubs-search", "parameters": [ { - "description": "Free-text zip code, city, or address to resolve to coordinates", + "description": "Search query text -- accepts USPTO's full Advanced Search (BRS) query syntax: field codes, date ranges, boolean/proximity operators, wildcards", "in": "query", - "name": "search", + "name": "q", + "required": true, "type": "string", - "x-example": "60601" + "x-example": "battery" }, { - "description": "Latitude, requires lng", + "description": "Comma-separated subset of databases to search. Allowed values: US-PGPUB, USPAT, USOCR. Defaults to all three", "in": "query", - "name": "lat", - "type": "number", - "x-example": 41.8781 + "name": "databases", + "type": "string", + "x-example": "US-PGPUB,USPAT,USOCR" }, { - "description": "Longitude, requires lat", + "description": "Results to return, default 20, max 100", "in": "query", - "name": "lng", - "type": "number", - "x-example": -87.6298 + "name": "num", + "type": "integer", + "x-example": 20 }, { - "description": "Search radius in meters, 1000 to 50000, defaults to 25000", + "description": "Results page, 0-indexed, default 0", "in": "query", - "name": "radius_meters", + "name": "page", "type": "integer", - "x-example": 25000 + "x-example": 0 } ], "produces": [ @@ -514162,7 +529163,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.storesResponseDoc" + "$ref": "#/definitions/usptoppubs.searchResponseDoc" } }, "400": { @@ -514177,6 +529178,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -514189,27 +529196,24 @@ "ApiKeyAuth": [] } ], - "summary": "Find nearby Ulta Beauty physical stores", + "summary": "Search USPTO's own patent full-text search index", "tags": [ - "Ulta Beauty" + "USPTO Patent Public Search" ] } }, - "/ulta/suggest": { + "/vanguardng/article": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Ulta Beauty's own search-suggestion (typeahead) result for a partial search term: suggested search terms, each with its own top product matches, plus a featured top result matching what a real user sees at the top of the dropdown. A partial term with no matches returns a normal, empty result rather than an error.", - "operationId": "ulta-suggest", + "description": "Returns one Vanguard (Nigeria) story by its `url`, a vanguardngr.com link in the `/YYYY/MM//` form; section pages and feeds are rejected. The response has the title, description, times, section, authors, lead image and body `paragraphs`. Vanguard has no paywall, so `paywalled` is never set.", + "operationId": "vanguardng-article", "parameters": [ { - "description": "Partial search term", + "description": "Canonical Vanguard article URL", "in": "query", - "name": "query", + "name": "url", "required": true, "type": "string", - "x-example": "masc" + "x-example": "https://www.vanguardngr.com/2026/09/nigerias-trauma-burden-calls-for-coordinated-care-orthopaedic-surgeons/" } ], "produces": [ @@ -514219,7 +529223,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/ulta.suggestResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -514228,8 +529232,8 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } @@ -514246,27 +529250,74 @@ "ApiKeyAuth": [] } ], - "summary": "Get Ulta Beauty search suggestions", + "summary": "Get Vanguard article content", "tags": [ - "Ulta Beauty" + "Vanguard" ] } }, - "/upwork/freelancer/{id}": { + "/vanguardng/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns an Upwork freelancer profile: name, title, verification badge, overview, hourly rate, rating and review count, Job Success Score, location and local time, total jobs/hours worked, and recent client feedback (title, comment, date, client name, rating).", - "operationId": "upwork-freelancer", + "description": "Vanguard publishes no author profile pages, so this returns the recent articles in one public feed (site-wide by default, or one section) credited to a byline, matched on the on-page \"By \" line or the site's creator field.", + "operationId": "vanguardng-author", "parameters": [ { - "description": "Upwork freelancer id, the value after \\", - "in": "path", - "name": "id", + "description": "Byline to look for (3 to 80 characters), e.g. Chioma Obinna", + "in": "query", + "name": "name", "required": true, "type": "string", - "x-example": "0157e03059a690281f" + "x-example": "Chioma Obinna" + }, + { + "description": "Optional section slug to scan instead of the site-wide feed", + "enum": [ + "national-news", + "top-stories", + "more-news", + "politics", + "business", + "business/energy", + "business/insurance-and-you", + "sports", + "entertainment", + "health", + "education-2", + "technology", + "innovation-2", + "aviation", + "agric", + "motoring", + "pension", + "foreign", + "editorial", + "opinion", + "columns", + "viewpoints", + "discourse", + "features", + "special-reports", + "thearts", + "cartoons", + "romance-an-relationships", + "homes-property", + "travel-and-tourism", + "style/allure/interviews", + "tribute", + "promoted", + "videos", + "top-podcasts", + "national-news/icymi", + "more", + "more/education", + "more/interview", + "more/labour", + "more/law-and-human-rights", + "more/metro" + ], + "in": "query", + "name": "section", + "type": "string" } ], "produces": [ @@ -514276,7 +529327,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/upwork.freelancerResponseDoc" + "$ref": "#/definitions/publicnews.vanguardngAuthorResponseDoc" } }, "400": { @@ -514291,12 +529342,6 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -514309,27 +529354,68 @@ "ApiKeyAuth": [] } ], - "summary": "Get Upwork freelancer profile", + "summary": "Find recent Vanguard articles by byline", "tags": [ - "Upwork" + "Vanguard" ] } }, - "/upwork/job/{id}": { + "/vanguardng/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns an Upwork job posting: title, full description, employment type, budget (hourly range or fixed amount), location/remote type, experience level, duration, project type, proposal count, allowed applicant countries, and a summary of the posting client (member since, location, total spend, hires, hours, industry, company size).", - "operationId": "upwork-job", + "description": "Lists up to 20 recent Vanguard stories from one category. `section` is required and takes one of 42 slugs such as `national-news`, `politics`, `business`, `sports`, `business/energy` or `more/metro`. Items carry title, URL, summary, author and publication time. An unknown section returns an invalid-params error.", + "operationId": "vanguardng-headlines", "parameters": [ { - "description": "Upwork job id, e.g. from a search result's id field", - "in": "path", - "name": "id", + "description": "Vanguard section slug", + "enum": [ + "national-news", + "top-stories", + "more-news", + "politics", + "business", + "business/energy", + "business/insurance-and-you", + "sports", + "entertainment", + "health", + "education-2", + "technology", + "innovation-2", + "aviation", + "agric", + "motoring", + "pension", + "foreign", + "editorial", + "opinion", + "columns", + "viewpoints", + "discourse", + "features", + "special-reports", + "thearts", + "cartoons", + "romance-an-relationships", + "homes-property", + "travel-and-tourism", + "style/allure/interviews", + "tribute", + "promoted", + "videos", + "top-podcasts", + "national-news/icymi", + "more", + "more/education", + "more/interview", + "more/labour", + "more/law-and-human-rights", + "more/metro" + ], + "in": "query", + "name": "section", "required": true, "type": "string", - "x-example": "022085006288356888767" + "x-example": "national-news" } ], "produces": [ @@ -514339,7 +529425,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/upwork.jobResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -514348,18 +529434,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -514372,36 +529446,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Upwork job posting detail", + "summary": "Get Vanguard section headlines", "tags": [ - "Upwork" + "Vanguard" ] } }, - "/upwork/search": { + "/vanguardng/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Upwork's public job listings by free-text keyword, returning job summaries (title, budget, experience level, duration, posted date, description snippet, skill tags).", - "operationId": "upwork-search", - "parameters": [ - { - "description": "Free-text job search keyword", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "python developer" - }, - { - "description": "1-based result page. Defaults to 1.", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 2 - } - ], + "description": "Returns the latest 20 Vanguard (Nigeria) stories with no parameters. Each has a title, URL, summary, publication time and image where available. `author` is the site's account name, often a desk account such as `Nwafor`; use `vanguardng-article` for the on-page byline.", + "operationId": "vanguardng-news", "produces": [ "application/json" ], @@ -514409,19 +529463,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/upwork.searchResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "503": { @@ -514436,54 +529478,50 @@ "ApiKeyAuth": [] } ], - "summary": "Search Upwork job postings", + "summary": "Get Vanguard top stories", "tags": [ - "Upwork" + "Vanguard" ] } }, - "/usage/me/endpoints": { + "/vanguardng/sections": { "get": { - "consumes": [ + "description": "Lists the 42 Vanguard sections accepted by `vanguardng-headlines`. Each has a `slug` (nested categories contain a `/`, as in `business/energy`), a display `name` and a feed `url`. `national-news` is the site's News category and `promoted` is sponsored content. Takes no parameters.", + "operationId": "vanguardng-sections", + "produces": [ "application/json" ], - "description": "Returns the signed-in user's usage broken down by endpoint, ordered by request volume. `range` is `period` (the current billing period, default), `day`, `week`, `month` or `custom`, which takes RFC3339 `from` and `to`. `limit` defaults to 20 (max 100). Each item has `requests`, `charged_requests`, `failed_requests`, `non_billable_requests`, `credits` and `overage`. Authenticated with a dashboard JWT.", - "operationId": "usage-me-endpoints", - "parameters": [ - { - "description": "Time range preset. Defaults to the current billing period.", - "enum": [ - "period", - "day", - "week", - "month", - "custom" - ], - "in": "query", - "name": "range", - "type": "string" - }, - { - "description": "Maximum endpoints to return. Defaults to 20 and clamps to 100.", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "limit", - "type": "integer" - }, + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/publicnews.sectionsResponseDoc" + } + } + }, + "security": [ { - "description": "Custom lower bound in RFC3339 format when range=custom", - "in": "query", - "name": "from", - "type": "string", - "x-example": "2026-04-01T00:00:00Z" - }, + "ApiKeyAuth": [] + } + ], + "summary": "Get Vanguard sections", + "tags": [ + "Vanguard" + ] + } + }, + "/vanityfair/article": { + "get": { + "description": "Returns public Vanity Fair article metadata and body paragraphs from a canonical article URL. A story Vanity Fair marks as subscriber-only in its own page metadata is reported as a permission error instead of a partial or fabricated body.", + "operationId": "vanityfair-article", + "parameters": [ { - "description": "Custom upper bound in RFC3339 format when range=custom", + "description": "Canonical Vanity Fair article URL", "in": "query", - "name": "to", + "name": "url", + "required": true, "type": "string", - "x-example": "2026-04-22T00:00:00Z" + "x-example": "https://www.vanityfair.com/story/example-article" } ], "produces": [ @@ -514491,25 +529529,31 @@ ], "responses": { "200": { - "description": "Endpoint usage breakdown", + "description": "OK", "schema": { - "$ref": "#/definitions/usage.usageEndpointsResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { - "description": "Invalid query parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Authentication required", + "403": { + "description": "Forbidden", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -514520,46 +529564,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get current user's endpoint usage breakdown", + "summary": "Get Vanity Fair article content", "tags": [ - "Usage" + "Vanity Fair" ] } }, - "/usage/me/overview": { + "/vanityfair/author": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a JWT-authenticated user's current billing snapshot plus recent request and credit consumption metrics for the selected UTC time range. The `requests` summary is limited to product API traffic and excludes console, billing, usage, and user-management endpoints.", - "operationId": "usage-me-overview", + "description": "Returns a Vanity Fair contributor profile from their canonical `url` (`www.vanityfair.com/contributor/`, required). The response has the name, job title when present, biography, headshot, social links and recent articles with title, URL and publication time.", + "operationId": "vanityfair-author", "parameters": [ { - "description": "Time range preset. Defaults to the current billing period.", - "enum": [ - "period", - "day", - "week", - "month", - "custom" - ], - "in": "query", - "name": "range", - "type": "string" - }, - { - "description": "Custom lower bound in RFC3339 format when range=custom", - "in": "query", - "name": "from", - "type": "string", - "x-example": "2026-04-01T00:00:00Z" - }, - { - "description": "Custom upper bound in RFC3339 format when range=custom", + "description": "Canonical Vanity Fair contributor URL", "in": "query", - "name": "to", + "name": "url", + "required": true, "type": "string", - "x-example": "2026-04-22T00:00:00Z" + "x-example": "https://www.vanityfair.com/contributor/example-writer" } ], "produces": [ @@ -514567,25 +529589,25 @@ ], "responses": { "200": { - "description": "Usage overview", + "description": "OK", "schema": { - "$ref": "#/definitions/usage.usageOverviewResponseDoc" + "$ref": "#/definitions/publicnews.vanityFairAuthorResponseDoc" } }, "400": { - "description": "Invalid query parameters", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Authentication required", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -514596,54 +529618,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get current user's usage overview", + "summary": "Get a Vanity Fair contributor profile", "tags": [ - "Usage" + "Vanity Fair" ] } }, - "/usage/me/recent-ips": { + "/vanityfair/headlines": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns recent client IP addresses observed for the JWT-authenticated user's product API traffic, ordered by last seen time. Console, billing, usage, and user-management endpoints are excluded.", - "operationId": "usage-me-recent-ips", + "description": "Lists the current headlines for one Vanity Fair section. `section` is required and takes `hollywood`, `movies`, `television`, `award-season`, `what-is-cinema`, `culture`, `politics`, `business`, `style`, `beauty`, `fashion` or `royals`. Each item has its title and URL.", + "operationId": "vanityfair-headlines", "parameters": [ { - "description": "Time range preset. Defaults to the current billing period.", + "description": "Vanity Fair section slug", "enum": [ - "period", - "day", - "week", - "month", - "custom" + "hollywood", + "movies", + "television", + "award-season", + "what-is-cinema", + "culture", + "politics", + "business", + "style", + "beauty", + "fashion", + "royals" ], "in": "query", - "name": "range", - "type": "string" - }, - { - "description": "Maximum IPs to return. Defaults to 20 and clamps to 100.", - "in": "query", - "maximum": 100, - "minimum": 1, - "name": "limit", - "type": "integer" - }, - { - "description": "Custom lower bound in RFC3339 format when range=custom", - "in": "query", - "name": "from", - "type": "string", - "x-example": "2026-04-01T00:00:00Z" - }, - { - "description": "Custom upper bound in RFC3339 format when range=custom", - "in": "query", - "name": "to", + "name": "section", + "required": true, "type": "string", - "x-example": "2026-04-22T00:00:00Z" + "x-example": "hollywood" } ], "produces": [ @@ -514651,25 +529657,19 @@ ], "responses": { "200": { - "description": "Recent API client IPs", + "description": "OK", "schema": { - "$ref": "#/definitions/usage.usageRecentIPsResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { - "description": "Invalid query parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "401": { - "description": "Authentication required", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -514680,89 +529680,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get current user's recent API client IPs", + "summary": "Get Vanity Fair section headlines", "tags": [ - "Usage" + "Vanity Fair" ] } }, - "/usage/me/timeseries": { + "/vanityfair/news": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the signed-in user's request usage as UTC time buckets for charts. `range` is `period` (default), `day`, `week`, `month` or `custom` (with RFC3339 `from` and `to`); `bucket` is `hour` or `day`; `endpoint` filters to one endpoint such as `google/search`. Each bucket has start, end, `requests`, `charged_requests`, `credits` and `overage`. Empty buckets are filled with zeros.", - "operationId": "usage-me-timeseries", - "parameters": [ - { - "description": "Time range preset. Defaults to the current billing period.", - "enum": [ - "period", - "day", - "week", - "month", - "custom" - ], - "in": "query", - "name": "range", - "type": "string" - }, - { - "description": "Bucket size. Defaults to hour for day range and day otherwise.", - "enum": [ - "hour", - "day" - ], - "in": "query", - "name": "bucket", - "type": "string" - }, - { - "description": "Optional endpoint filter", - "in": "query", - "name": "endpoint", - "type": "string", - "x-example": "google/search" - }, - { - "description": "Custom lower bound in RFC3339 format when range=custom", - "in": "query", - "name": "from", - "type": "string", - "x-example": "2026-04-01T00:00:00Z" - }, - { - "description": "Custom upper bound in RFC3339 format when range=custom", - "in": "query", - "name": "to", - "type": "string", - "x-example": "2026-04-22T00:00:00Z" - } - ], + "description": "Returns the latest Vanity Fair top stories and takes no parameters. Each item has its title, canonical URL, summary, author, publication time and lead image.", + "operationId": "vanityfair-news", "produces": [ "application/json" ], "responses": { "200": { - "description": "Usage timeseries", - "schema": { - "$ref": "#/definitions/usage.usageTimeseriesResponseDoc" - } - }, - "400": { - "description": "Invalid query parameters", + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "401": { - "description": "Authentication required", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -514773,39 +529718,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get current user's usage timeseries", + "summary": "Get Vanity Fair top stories", "tags": [ - "Usage" + "Vanity Fair" ] } }, - "/usage/platform-adjacency": { + "/vanityfair/sections": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns, per platform, how many real users have used it (lifetime, successful requests only), its request volume, top entry endpoints, and which other platforms those users also use. Aggregated across all customers with non-customer, static, and console traffic excluded; recomputed at most once per 24 hours and served from cache. Powers the console dashboard's \"Explore more\" recommendation.", - "operationId": "usage-platform-adjacency", + "description": "Returns the Vanity Fair section inventory: Hollywood (plus its Movies, Television, and Award Season sub-verticals), Arts & Culture, Politics, Business, and Style (plus its Beauty, Fashion, and Royals sub-verticals), each linking to its public listing page.", + "operationId": "vanityfair-sections", "produces": [ "application/json" ], "responses": { "200": { - "description": "Platform reach and co-usage aggregate", - "schema": { - "$ref": "#/definitions/usage.usagePlatformAdjacencyResponseDoc" - } - }, - "401": { - "description": "Authentication required", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal server error", + "description": "OK", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -514814,24 +529744,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get cross-user platform reach and co-usage", + "summary": "Get Vanity Fair sections", "tags": [ - "Usage" + "Vanity Fair" ] } }, - "/usatoday/article": { + "/variety/article": { "get": { - "description": "Returns one normal USA Today article's public metadata and body paragraphs from a canonical article URL. Video, gallery, and other non-article routes are not supported.", - "operationId": "usatoday-article", + "description": "Returns one Variety article by its canonical `variety.com` `url`, in the form `////-/`. The response has the title, description, authors, section, published and updated times, lead image, body `paragraphs` and a `paywalled` flag.", + "operationId": "variety-article", "parameters": [ { - "description": "Canonical USA Today article URL", + "description": "Canonical Variety article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.usatoday.com/story/sports/mlb/dodgers/2026/09/23/shohei-ohtani-return-from-il/91899080007/" + "x-example": "https://variety.com/2026/music/global/oasis-more-live-27-shows-uk-italy-germany-1236873146/" } ], "produces": [ @@ -514841,7 +529771,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/usatoday.articleResponseDoc" + "$ref": "#/definitions/publicnews.articleResponseDoc" } }, "400": { @@ -514856,12 +529786,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -514874,24 +529798,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get a USA Today article's content", + "summary": "Get Variety article content", "tags": [ - "USA Today" + "Variety" ] } }, - "/usatoday/author": { + "/variety/author": { "get": { - "description": "Returns one USA Today staff writer's public profile: name, bio, social accounts, and their recent articles, from a canonical staff page URL.", - "operationId": "usatoday-author", + "description": "Returns a Variety author profile with name, biography, photo, social links and one page of recent articles. Give either `slug` (such as `ellise-shafer`) or an author `url`, which may include a `/page//` segment; `page` (default 1) overrides it. `has_next_page` shows whether another page exists.", + "operationId": "variety-author", "parameters": [ { - "description": "Canonical USA Today staff URL", + "description": "Author slug, e.g. ellise-shafer", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "ellise-shafer" + }, + { + "description": "Canonical variety.com/author/ URL, optionally with a /page// segment; alternative to slug", "in": "query", "name": "url", - "required": true, "type": "string", - "x-example": "https://www.usatoday.com/staff/87951836007/andres-soto/" + "x-example": "https://variety.com/author/ellise-shafer/" + }, + { + "default": 1, + "description": "1-based page number; overrides any page number in url", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -514901,7 +529838,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/usatoday.authorResponseDoc" + "$ref": "#/definitions/publicnews.varietyAuthorResponseDoc" } }, "400": { @@ -514916,12 +529853,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -514934,39 +529865,50 @@ "ApiKeyAuth": [] } ], - "summary": "Get a USA Today staff/author profile", + "summary": "Get a Variety author profile", "tags": [ - "USA Today" + "Variety" ] } }, - "/usatoday/headlines": { + "/variety/headlines": { "get": { - "description": "Returns the newest USA Today items for one top-level section, up to 100. `section` is required and takes `news`, `sports`, `entertainment`, `life`, `money`, `tech`, `travel`, `opinion`, `cars`, `shopping`, `weather`, `politics` or `grocery`. Each item has its title, URL, published and updated times, and lead image when there is one.", - "operationId": "usatoday-headlines", + "description": "Lists fresh Variety headlines for one vertical. `section` is required and takes a slug such as `film`, `music`, `tv`, `biz`, `awards`, `gaming`, `global`, `legit` or `vip`; `variety-sections` lists all 24. Each item has its title and URL, plus summary, author, publication time and image when the outlet provides them.", + "operationId": "variety-headlines", "parameters": [ { - "description": "Top-level USA Today section", + "description": "Variety vertical slug", "enum": [ - "news", - "sports", - "entertainment", - "life", - "money", - "tech", - "travel", - "opinion", - "cars", - "shopping", - "weather", + "artisans", + "awards", + "biz", + "data", + "digital", + "dirt", + "film", + "gaming", + "global", + "legit", + "music", "politics", - "grocery" + "scene", + "shopping", + "sports", + "streaming", + "theater", + "tune-in", + "tv", + "video", + "vintage", + "vip", + "vivant", + "voices" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "news" + "x-example": "artisans" } ], "produces": [ @@ -514976,7 +529918,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/usatoday.headlinesResponseDoc" + "$ref": "#/definitions/publicnews.headlinesResponseDoc" } }, "400": { @@ -514985,12 +529927,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -515003,16 +529939,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get USA Today section headlines", + "summary": "Get Variety section headlines", "tags": [ - "USA Today" + "Variety" ] } }, - "/usatoday/news": { + "/variety/news": { "get": { - "description": "Returns the newest window of USA Today's public news feed: title, canonical URL, publication and update times, and the lead image when USA Today publishes one.", - "operationId": "usatoday-news", + "description": "Returns the latest Variety top stories with no parameters. Each item has its title, URL, summary, author, publication time and image. Item URLs can be passed to `variety-article` for the body.", + "operationId": "variety-news", "produces": [ "application/json" ], @@ -515020,7 +529956,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/usatoday.newsResponseDoc" + "$ref": "#/definitions/publicnews.newsResponseDoc" } }, "429": { @@ -515041,16 +529977,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get fresh USA Today headlines", + "summary": "Get Variety top stories", "tags": [ - "USA Today" + "Variety" ] } }, - "/usatoday/sections": { + "/variety/sections": { "get": { - "description": "Lists the 13 top-level USA Today sections accepted by `usatoday-headlines`, from `news` and `sports` to `politics` and `grocery`. Each has a `slug`, a display `name` and a landing-page `url`. Takes no parameters.", - "operationId": "usatoday-sections", + "description": "Lists the 24 Variety verticals accepted by `variety-headlines`, such as `film`, `tv`, `music`, `biz`, `awards`, `legit` and `voices`. Each has a `slug`, a display `name` and a `url`. Takes no parameters.", + "operationId": "variety-sections", "produces": [ "application/json" ], @@ -515058,19 +529994,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/usatoday.sectionsResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/publicnews.sectionsResponseDoc" } } }, @@ -515079,31 +530003,43 @@ "ApiKeyAuth": [] } ], - "summary": "List USA Today sections", + "summary": "Get Variety sections", "tags": [ - "USA Today" + "Variety" ] } }, - "/user/me": { + "/vestiaire/brands": { "get": { "consumes": [ "application/json" ], - "description": "Returns the profile of the user who owns the `Token ` in the `Authorization` header: `id`, `username`, `email` and `plan`. Password hashes, activation tokens, API keys and billing identifiers are never returned, which makes it a quick check that a session token is valid.", - "operationId": "user-me", + "description": "Returns Vestiaire Collective's full brand directory (id, name, url), not just brands with active listings for a given search -- resolves search's otherwise-opaque brand_id filter, and a search response's facets.brands, to the complete set of valid ids. Public data, sourced from Vestiaire Collective's own brand-directory page.", + "operationId": "vestiaire-brands", "produces": [ "application/json" ], "responses": { "200": { - "description": "Current user", + "description": "OK", "schema": { - "$ref": "#/definitions/user.userMeResponseDoc" + "$ref": "#/definitions/vestiaire.brandsResponseDoc" } }, - "401": { - "description": "Authentication required", + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515111,40 +530047,46 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Get current user", + "summary": "Vestiaire Collective's full brand directory", "tags": [ - "User" + "Vestiaire" ] } }, - "/user/me/api-keys": { + "/vestiaire/categories": { "get": { "consumes": [ "application/json" ], - "description": "Lists the signed-in user's API keys in masked form. Each item has `id`, `masked_key`, `key_prefix`, `key_suffix`, `status` (`active`, `grace` or `revoked`), `source`, and created, updated, rotated, expiry and last-used timestamps with the last-used IP. Raw keys are not returned; the reveal endpoint, `POST /api/v1/user/me/api-keys/{id}/reveal`, retrieves one.", - "operationId": "user-me-api-keys", + "description": "Returns the full Vestiaire Collective category taxonomy: universes (Women, Men, Kids) at the root, with up to three nested category levels beneath each. Every id returned here is accepted by /vestiaire/search's category_id filter.", + "operationId": "vestiaire-categories", "produces": [ "application/json" ], "responses": { "200": { - "description": "API keys", + "description": "OK", "schema": { - "$ref": "#/definitions/user.userAPIKeysResponseDoc" + "$ref": "#/definitions/vestiaire.categoriesResponseDoc" } }, - "401": { - "description": "Authentication required", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515152,40 +530094,46 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "List current user's API keys", + "summary": "Vestiaire Collective category taxonomy", "tags": [ - "User" + "Vestiaire" ] } }, - "/user/me/api-keys/rotate": { - "post": { + "/vestiaire/conditions": { + "get": { "consumes": [ "application/json" ], - "description": "Generates a new active API key for the JWT-authenticated user and places the previous key into a 24 hour grace period.", - "operationId": "user-me-api-keys-rotate", + "description": "Returns the fixed set of condition ids accepted by /vestiaire/search's condition_id filter, with each id's display name and current listing count.", + "operationId": "vestiaire-conditions", "produces": [ "application/json" ], "responses": { "200": { - "description": "Rotated API key", + "description": "OK", "schema": { - "$ref": "#/definitions/user.userRotateAPIKeyResponseDoc" + "$ref": "#/definitions/vestiaire.conditionsResponseDoc" } }, - "401": { - "description": "Authentication required", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515193,29 +530141,30 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Rotate current user's API key", + "summary": "Vestiaire Collective condition values", "tags": [ - "User" + "Vestiaire" ] } }, - "/user/me/api-keys/{id}/reveal": { - "post": { + "/vestiaire/product": { + "get": { "consumes": [ "application/json" ], - "description": "Returns the raw value for a selected active or unexpired grace API key owned by the JWT-authenticated user when raw key material is available.", - "operationId": "user-me-api-keys-reveal", + "description": "Returns a single Vestiaire Collective listing's public detail: price, brand, category, condition, material, color, size, seller summary, and photos. `path` is the listing's URL or site-relative path, as returned by /vestiaire/search's `url` field -- the numeric id alone cannot be resolved to a page. Public data, sourced from Vestiaire Collective's own listing page.", + "operationId": "vestiaire-product", "parameters": [ { - "description": "API key id", - "in": "path", - "name": "id", + "description": "Listing URL or path, from a search result's url field", + "in": "query", + "name": "path", "required": true, - "type": "string" + "type": "string", + "x-example": "/women-clothing/biker-jackets/off-white/black-leather-off-white-biker-jacket-70860454.shtml" } ], "produces": [ @@ -515223,25 +530172,37 @@ ], "responses": { "200": { - "description": "Raw API key", + "description": "OK", "schema": { - "$ref": "#/definitions/user.userRevealAPIKeyResponseDoc" + "$ref": "#/definitions/vestiaire.productResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, "404": { - "description": "API key not found or raw value unavailable", + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515249,31 +530210,84 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Reveal current user's API key", + "summary": "Vestiaire Collective listing detail", "tags": [ - "User" + "Vestiaire" ] } }, - "/user/me/browser-language": { - "post": { + "/vestiaire/search": { + "get": { "consumes": [ "application/json" ], - "description": "Captures the Accept-Language header from a live dashboard visit and, only if the caller's signup Accept-Language was never recorded, saves it and its derived primary subtag. A no-op for a caller who already has a value on file.", - "operationId": "user-me-browser-language", + "description": "Searches Vestiaire Collective's public pre-owned luxury resale catalog by keyword, category, brand, and condition, with sort and pagination. `sort` values: `relevance`, `price_asc`, `price_desc`, `recency`. `category_id` and `condition_id` come from /vestiaire/categories and /vestiaire/conditions. `page` * `per_page` cannot exceed an offset of 1000 (the upstream service's own pagination limit) -- narrow the query instead of paging deeper. Public data, sourced from Vestiaire Collective's own search service.", + "operationId": "vestiaire-search", "parameters": [ { - "description": "Accept-Language header captured from the visit", - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/user.userBrowserLanguageReq" - } + "description": "Keyword search text", + "in": "query", + "name": "q", + "type": "string", + "x-example": "chanel bag" + }, + { + "description": "Category id, from /vestiaire/categories", + "in": "query", + "name": "category_id", + "type": "string", + "x-example": "5" + }, + { + "description": "Brand id, from a prior search's facets.brands", + "in": "query", + "name": "brand_id", + "type": "string", + "x-example": "50" + }, + { + "description": "Condition id. Allowed values: 1, 2, 3, 4, 5", + "enum": [ + "1", + "2", + "3", + "4", + "5" + ], + "in": "query", + "name": "condition_id", + "type": "string", + "x-example": "3" + }, + { + "description": "Sort order. Allowed values: relevance, price_asc, price_desc, recency", + "enum": [ + "relevance", + "price_asc", + "price_desc", + "recency" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "price_asc" + }, + { + "description": "Page number, starting at 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Results per page, up to 60", + "in": "query", + "name": "per_page", + "type": "integer", + "x-example": 24 } ], "produces": [ @@ -515281,19 +530295,37 @@ ], "responses": { "200": { - "description": "Backfill result", + "description": "OK", "schema": { - "$ref": "#/definitions/user.userBrowserLanguageResponseDoc" + "$ref": "#/definitions/vestiaire.searchResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515301,46 +530333,62 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Backfill current user's browser language", + "summary": "Vestiaire Collective listing search", "tags": [ - "User" + "Vestiaire" ] } }, - "/user/me/deletion-request": { - "delete": { + "/vestiaire/search-sellers": { + "get": { "consumes": [ "application/json" ], - "description": "Withdraws the authenticated user's own pending or approved deletion request before purge. If this request scheduled Stripe cancellation and the paid-through date has not arrived, the renewal cancellation is reversed.", - "operationId": "account-deletion-cancel", + "description": "Finds Vestiaire Collective sellers by username or first name. A matched result's id can be passed directly to GET /vestiaire/seller for that seller's full public storefront profile. Public data, sourced from Vestiaire Collective's own member-search service.", + "operationId": "vestiaire-search-sellers", + "parameters": [ + { + "description": "Seller username or first name to search for", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "michelle" + } + ], "produces": [ "application/json" ], "responses": { "200": { - "description": "Cancelled deletion request", + "description": "OK", "schema": { - "$ref": "#/definitions/accountdeletion.accountDeletionResponseDoc" + "$ref": "#/definitions/vestiaire.searchSellersResponseDoc" } }, "400": { - "description": "No active deletion request", + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "401": { - "description": "Authentication required", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515348,38 +530396,68 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Cancel current user's account deletion request", + "summary": "Search Vestiaire Collective sellers by name", "tags": [ - "Account Deletion" + "Vestiaire" ] - }, + } + }, + "/vestiaire/seller": { "get": { "consumes": [ "application/json" ], - "description": "Returns the signed-in user's active account deletion request (`pending` or `approved`), including its `status`, request time, `scheduled_purge_at`, `subscription_period_end` and the Stripe cancellation flags. A user with no active request gets a 200 with an empty request (empty `id`), not an error.", - "operationId": "account-deletion-my-request", + "description": "Returns a Vestiaire Collective seller's public storefront profile: username, country, segment, aggregate sold/listed/bought counts, and follower/following counts. `id` is the numeric seller id, as returned by /vestiaire/search's `seller_id` field or /vestiaire/product's `seller.id`. Public data, sourced from Vestiaire Collective's own seller profile page.", + "operationId": "vestiaire-seller", + "parameters": [ + { + "description": "Seller id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "36526194" + } + ], "produces": [ "application/json" ], "responses": { "200": { - "description": "Deletion request, empty if none active", + "description": "OK", "schema": { - "$ref": "#/definitions/accountdeletion.accountDeletionResponseDoc" + "$ref": "#/definitions/vestiaire.sellerResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515387,28 +530465,30 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Get current user's account deletion request", + "summary": "Vestiaire Collective seller profile", "tags": [ - "Account Deletion" + "Vestiaire" ] - }, - "post": { + } + }, + "/vestiaire/suggest": { + "get": { "consumes": [ "application/json" ], - "description": "Records the authenticated user's request to delete their account. If approved with a live Stripe subscription, renewal is stopped at the current paid-through date; account access continues until expiry, then deletion runs after the existing 72-hour minimum review window. Account deletion never issues refunds or prorated credits. Idempotent — repeat calls while a request is pending or approved return the existing request.", - "operationId": "account-deletion-request", + "description": "Returns Vestiaire Collective's own search-box autocomplete suggestions for a partial query: matching brands plus completed search phrases. Public data, sourced from Vestiaire Collective's own search-suggestions service.", + "operationId": "vestiaire-suggest", "parameters": [ { - "description": "Optional reason for the request", - "in": "body", - "name": "request", - "schema": { - "$ref": "#/definitions/accountdeletion.accountDeletionRequestBodyDoc" - } + "description": "Partial search query to autocomplete", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "chane" } ], "produces": [ @@ -515416,25 +530496,31 @@ ], "responses": { "200": { - "description": "Deletion request", + "description": "OK", "schema": { - "$ref": "#/definitions/accountdeletion.accountDeletionResponseDoc" + "$ref": "#/definitions/vestiaire.suggestResponseDoc" } }, - "401": { - "description": "Authentication required", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "User not found", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, "500": { - "description": "Internal server error", + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -515442,27 +530528,27 @@ }, "security": [ { - "JWTAuth": [] + "ApiKeyAuth": [] } ], - "summary": "Request account deletion", + "summary": "Vestiaire Collective search-box autocomplete", "tags": [ - "Account Deletion" + "Vestiaire" ] } }, - "/usmagazine/article": { + "/vice/article": { "get": { - "description": "Returns one Us Weekly article by its canonical `url`, in the form `/
/news//`. The response has the title, description, published and updated times, section, authors, lead image and the body `paragraphs`, without sub-headings or embeds. Photo-gallery URLs and non-article pages return a 400 error.", - "operationId": "usmagazine-article", + "description": "Returns one VICE article by its canonical `url`, in the form `www.vice.com/en/article/`. The response has the title, description, authors, section, published and updated times, lead image and body `paragraphs`, plus a `paywalled` flag.", + "operationId": "vice-article", "parameters": [ { - "description": "Canonical Us Weekly article URL", + "description": "Canonical VICE article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.usmagazine.com/celebrity-news/news/example-article-slug/" + "x-example": "https://www.vice.com/en/article/example-article/" } ], "produces": [ @@ -515499,24 +530585,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Us Weekly article content", + "summary": "Get VICE article content", "tags": [ - "Us Weekly" + "VICE" ] } }, - "/usmagazine/author": { + "/vice/author": { "get": { - "description": "Returns a Us Weekly author's profile from their canonical `url` (`/author//`, required): name, biography, contact links and the newest articles, about 20. Staff and desk bylines may have no biography or links. Photo galleries are skipped and `published_at` is not set on the articles.", - "operationId": "usmagazine-author", + "description": "Returns a VICE contributor profile from their canonical `url` (`www.vice.com/en/contributor/`, required). The response has the name and headshot when present, the biography paragraphs and recent articles with title, URL, summary, author, publication time and image.", + "operationId": "vice-author", "parameters": [ { - "description": "Canonical Us Weekly author URL", + "description": "Canonical VICE contributor URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.usmagazine.com/author/jane-doe/" + "x-example": "https://www.vice.com/en/contributor/example-writer/" } ], "produces": [ @@ -515526,7 +530612,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.usmagazineAuthorResponseDoc" + "$ref": "#/definitions/publicnews.viceAuthorResponseDoc" } }, "400": { @@ -515553,38 +530639,38 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Us Weekly author profile", + "summary": "Get a VICE contributor profile", "tags": [ - "Us Weekly" + "VICE" ] } }, - "/usmagazine/headlines": { + "/vice/headlines": { "get": { - "description": "Lists recent Us Weekly headlines for one section. `section` is required and takes `celebrity-news`, `entertainment`, `sports`, `shopping`, `crime-news`, `stylish`, `celebrity-moms`, `celebrity-body`, `food`, `reviews`, `reality-tv` or `royal-family`. Returns up to about 20 items, with photo galleries excluded; `reviews` holds only a few.", - "operationId": "usmagazine-headlines", + "description": "Returns fresh headlines from one VICE section, either its public RSS feed (News, Life, Tech, Music) or its public listing page for the remaining sections.", + "operationId": "vice-headlines", "parameters": [ { - "description": "Us Weekly RSS section slug", + "description": "VICE section slug", "enum": [ - "celebrity-news", - "entertainment", - "sports", - "shopping", - "crime-news", - "stylish", - "celebrity-moms", - "celebrity-body", - "food", - "reviews", - "reality-tv", - "royal-family" + "news", + "life", + "tech", + "music", + "munchies", + "waypoint", + "rec-room", + "membership", + "via-vice", + "spotlights", + "theunstoppables", + "eu" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "celebrity-news" + "x-example": "news" } ], "produces": [ @@ -515615,16 +530701,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Us Weekly section headlines", + "summary": "Get VICE section headlines", "tags": [ - "Us Weekly" + "VICE" ] } }, - "/usmagazine/news": { + "/vice/news": { "get": { - "description": "Returns the latest Us Weekly top stories with no parameters. Each item has its title and URL, plus summary, publication time, author and image when the outlet provides them. Only article URLs of the form `/
/news//` appear; photo galleries are left out.", - "operationId": "usmagazine-news", + "description": "Returns the latest VICE stories with no parameters. Each item has its title and URL, plus summary, author, publication time and lead image when the outlet provides them. Pass an item URL to `vice-article` to read the story.", + "operationId": "vice-news", "produces": [ "application/json" ], @@ -515653,16 +530739,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Us Weekly top stories", + "summary": "Get VICE top stories", "tags": [ - "Us Weekly" + "VICE" ] } }, - "/usmagazine/sections": { + "/vice/sections": { "get": { - "description": "Lists the 12 Us Weekly sections accepted by `usmagazine-headlines`, from `celebrity-news` and `entertainment` to `reality-tv` and `royal-family`. Each entry has a `slug`, display `name` and section feed `url`. Takes no parameters.", - "operationId": "usmagazine-sections", + "description": "Returns the VICE section inventory: the site's own 12 curated sections (News, Life, Tech, Music, and others), each linking to its public listing page.", + "operationId": "vice-sections", "produces": [ "application/json" ], @@ -515679,35 +530765,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get Us Weekly RSS sections", + "summary": "Get VICE sections", "tags": [ - "Us Weekly" + "VICE" ] } }, - "/usptoppubs/detail": { + "/vinted/brand": { "get": { "consumes": [ "application/json" ], - "description": "Fetches a single USPTO Patent Public Search record's full text -- bibliographic data, abstract, description, and claims -- by GUID and source database. guid and source normally come straight from a prior /usptoppubs/search result's guid and database fields. Public data, sourced from USPTO's own official search tool.", - "operationId": "usptoppubs-detail", + "description": "Returns Vinted listings for a specific brand, with optional price filtering and sort order. `order` values: `relevance`, `newest_first`, `price_high_to_low`, `price_low_to_high`. Public data, sourced from Vinted's own server-rendered brand page.", + "operationId": "vinted-brand", "parameters": [ { - "description": "Document GUID, e.g. from a prior search result's guid field", + "description": "Numeric Vinted brand ID, from a /vinted/item result's brand link", "in": "query", - "name": "guid", + "name": "id", "required": true, "type": "string", - "x-example": "US-20260238009-A1" + "x-example": "386688" }, { - "description": "Source database. Allowed values: US-PGPUB, USPAT, USOCR", + "description": "Minimum price", "in": "query", - "name": "source", - "required": true, + "name": "price_from", + "type": "number", + "x-example": 10 + }, + { + "description": "Maximum price", + "in": "query", + "name": "price_to", + "type": "number", + "x-example": 50 + }, + { + "description": "Sort order. Allowed values: relevance, newest_first, price_high_to_low, price_low_to_high", + "enum": [ + "relevance", + "newest_first", + "price_high_to_low", + "price_low_to_high" + ], + "in": "query", + "name": "order", "type": "string", - "x-example": "US-PGPUB" + "x-example": "price_low_to_high" + }, + { + "description": "Page number, starting at 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -515717,7 +530829,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/usptoppubs.detailResponseDoc" + "$ref": "#/definitions/vinted.brandResponseDoc" } }, "400": { @@ -515756,50 +530868,19 @@ "ApiKeyAuth": [] } ], - "summary": "Fetch a document's full bibliographic data, abstract, description, and claims", + "summary": "Vinted listings for a brand", "tags": [ - "USPTO Patent Public Search" + "Vinted" ] } }, - "/usptoppubs/search": { + "/vinted/brands": { "get": { "consumes": [ "application/json" ], - "description": "Searches USPTO Patent Public Search's full-text index of granted patents and published applications, returning bibliographic results (title, applicant/assignee, inventors, filing and publication dates, application number, IPC/CPC classifications, page count). q accepts USPTO's full Advanced Search query syntax -- field-specific search (e.g. battery.ti., Microsoft.as.), date ranges (@pd>=20200101<=20241231), boolean and proximity operators, and wildcards -- see the markdown doc for the full field-code table and syntax reference.", - "operationId": "usptoppubs-search", - "parameters": [ - { - "description": "Search query text -- accepts USPTO's full Advanced Search (BRS) query syntax: field codes, date ranges, boolean/proximity operators, wildcards", - "in": "query", - "name": "q", - "required": true, - "type": "string", - "x-example": "battery" - }, - { - "description": "Comma-separated subset of databases to search. Allowed values: US-PGPUB, USPAT, USOCR. Defaults to all three", - "in": "query", - "name": "databases", - "type": "string", - "x-example": "US-PGPUB,USPAT,USOCR" - }, - { - "description": "Results to return, default 20, max 100", - "in": "query", - "name": "num", - "type": "integer", - "x-example": 20 - }, - { - "description": "Results page, 0-indexed, default 0", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 0 - } - ], + "description": "Returns Vinted's \"Popular brands\" directory. This is Vinted's own curated list, not an exhaustive list of every brand in its catalog. Each entry's `id` is usable directly as the `id` query parameter to /vinted/brand. Public data, sourced from Vinted's own server-rendered brands page.", + "operationId": "vinted-brands", "produces": [ "application/json" ], @@ -515807,13 +530888,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/usptoppubs.searchResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/vinted.brandsResponseDoc" } }, "429": { @@ -515840,128 +530915,61 @@ "ApiKeyAuth": [] } ], - "summary": "Search USPTO's own patent full-text search index", + "summary": "Vinted popular-brands directory", "tags": [ - "USPTO Patent Public Search" + "Vinted" ] } }, - "/vanguardng/article": { + "/vinted/catalog": { "get": { - "description": "Returns one Vanguard (Nigeria) story by its `url`, a vanguardngr.com link in the `/YYYY/MM//` form; section pages and feeds are rejected. The response has the title, description, times, section, authors, lead image and body `paragraphs`. Vanguard has no paywall, so `paywalled` is never set.", - "operationId": "vanguardng-article", + "consumes": [ + "application/json" + ], + "description": "Returns Vinted resale listings matching a text search, with optional price filtering and sort order. `order` values: `relevance`, `newest_first`, `price_high_to_low`, `price_low_to_high`. Public data, sourced from Vinted's own server-rendered catalog page.", + "operationId": "vinted-catalog", "parameters": [ { - "description": "Canonical Vanguard article URL", + "description": "Search text", "in": "query", - "name": "url", + "name": "search_text", "required": true, "type": "string", - "x-example": "https://www.vanguardngr.com/2026/09/nigerias-trauma-burden-calls-for-coordinated-care-orthopaedic-surgeons/" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } + "x-example": "jacket" }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vanguard article content", - "tags": [ - "Vanguard" - ] - } - }, - "/vanguardng/author": { - "get": { - "description": "Vanguard publishes no author profile pages, so this returns the recent articles in one public feed (site-wide by default, or one section) credited to a byline, matched on the on-page \"By \" line or the site's creator field.", - "operationId": "vanguardng-author", - "parameters": [ + "description": "Minimum price", + "in": "query", + "name": "price_from", + "type": "number", + "x-example": 10 + }, { - "description": "Byline to look for (3 to 80 characters), e.g. Chioma Obinna", + "description": "Maximum price", "in": "query", - "name": "name", - "required": true, - "type": "string", - "x-example": "Chioma Obinna" + "name": "price_to", + "type": "number", + "x-example": 50 }, { - "description": "Optional section slug to scan instead of the site-wide feed", + "description": "Sort order. Allowed values: relevance, newest_first, price_high_to_low, price_low_to_high", "enum": [ - "national-news", - "top-stories", - "more-news", - "politics", - "business", - "business/energy", - "business/insurance-and-you", - "sports", - "entertainment", - "health", - "education-2", - "technology", - "innovation-2", - "aviation", - "agric", - "motoring", - "pension", - "foreign", - "editorial", - "opinion", - "columns", - "viewpoints", - "discourse", - "features", - "special-reports", - "thearts", - "cartoons", - "romance-an-relationships", - "homes-property", - "travel-and-tourism", - "style/allure/interviews", - "tribute", - "promoted", - "videos", - "top-podcasts", - "national-news/icymi", - "more", - "more/education", - "more/interview", - "more/labour", - "more/law-and-human-rights", - "more/metro" + "relevance", + "newest_first", + "price_high_to_low", + "price_low_to_high" ], "in": "query", - "name": "section", - "type": "string" + "name": "order", + "type": "string", + "x-example": "price_low_to_high" + }, + { + "description": "Page number, starting at 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -515971,7 +530979,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.vanguardngAuthorResponseDoc" + "$ref": "#/definitions/vinted.catalogResponseDoc" } }, "400": { @@ -515986,6 +530994,18 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -515998,70 +531018,19 @@ "ApiKeyAuth": [] } ], - "summary": "Find recent Vanguard articles by byline", + "summary": "Vinted listing search", "tags": [ - "Vanguard" + "Vinted" ] } }, - "/vanguardng/headlines": { + "/vinted/categories": { "get": { - "description": "Lists up to 20 recent Vanguard stories from one category. `section` is required and takes one of 42 slugs such as `national-news`, `politics`, `business`, `sports`, `business/energy` or `more/metro`. Items carry title, URL, summary, author and publication time. An unknown section returns an invalid-params error.", - "operationId": "vanguardng-headlines", - "parameters": [ - { - "description": "Vanguard section slug", - "enum": [ - "national-news", - "top-stories", - "more-news", - "politics", - "business", - "business/energy", - "business/insurance-and-you", - "sports", - "entertainment", - "health", - "education-2", - "technology", - "innovation-2", - "aviation", - "agric", - "motoring", - "pension", - "foreign", - "editorial", - "opinion", - "columns", - "viewpoints", - "discourse", - "features", - "special-reports", - "thearts", - "cartoons", - "romance-an-relationships", - "homes-property", - "travel-and-tourism", - "style/allure/interviews", - "tribute", - "promoted", - "videos", - "top-podcasts", - "national-news/icymi", - "more", - "more/education", - "more/interview", - "more/labour", - "more/law-and-human-rights", - "more/metro" - ], - "in": "query", - "name": "section", - "required": true, - "type": "string", - "x-example": "national-news" - } + "consumes": [ + "application/json" ], + "description": "Returns Vinted's top-level catalog categories (e.g. Women, Men, Kids, Home, Electronics, Sports, Entertainment, Hobbies & collectibles). This is the root level only -- Vinted's full category tree goes several levels deeper on the live site, but deeper levels aren't server-rendered so aren't covered here. Each entry's `id` is usable directly as the `id` query parameter to /vinted/category. Public data, sourced from Vinted's own server-rendered catalog navigation.", + "operationId": "vinted-categories", "produces": [ "application/json" ], @@ -516069,46 +531038,20 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/vinted.categoriesResponseDoc" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vanguard section headlines", - "tags": [ - "Vanguard" - ] - } - }, - "/vanguardng/news": { - "get": { - "description": "Returns the latest 20 Vanguard (Nigeria) stories with no parameters. Each has a title, URL, summary, publication time and image where available. `author` is the site's account name, often a desk account such as `Nwafor`; use `vanguardng-article` for the on-page byline.", - "operationId": "vanguardng-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "503": { "description": "Service Unavailable", @@ -516122,50 +531065,61 @@ "ApiKeyAuth": [] } ], - "summary": "Get Vanguard top stories", + "summary": "Vinted top-level catalog categories", "tags": [ - "Vanguard" + "Vinted" ] } }, - "/vanguardng/sections": { + "/vinted/category": { "get": { - "description": "Lists the 42 Vanguard sections accepted by `vanguardng-headlines`. Each has a `slug` (nested categories contain a `/`, as in `business/energy`), a display `name` and a feed `url`. `national-news` is the site's News category and `promoted` is sponsored content. Takes no parameters.", - "operationId": "vanguardng-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vanguard sections", - "tags": [ - "Vanguard" - ] - } - }, - "/vanityfair/article": { - "get": { - "description": "Returns public Vanity Fair article metadata and body paragraphs from a canonical article URL. A story Vanity Fair marks as subscriber-only in its own page metadata is reported as a permission error instead of a partial or fabricated body.", - "operationId": "vanityfair-article", + "description": "Returns Vinted listings for a specific category, with optional price filtering and sort order. `order` values: `relevance`, `newest_first`, `price_high_to_low`, `price_low_to_high`. Public data, sourced from Vinted's own server-rendered category page.", + "operationId": "vinted-category", "parameters": [ { - "description": "Canonical Vanity Fair article URL", + "description": "Numeric Vinted category ID, from a /vinted/item result's categories breadcrumb link", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.vanityfair.com/story/example-article" + "x-example": "1904" + }, + { + "description": "Minimum price", + "in": "query", + "name": "price_from", + "type": "number", + "x-example": 10 + }, + { + "description": "Maximum price", + "in": "query", + "name": "price_to", + "type": "number", + "x-example": 50 + }, + { + "description": "Sort order. Allowed values: relevance, newest_first, price_high_to_low, price_low_to_high", + "enum": [ + "relevance", + "newest_first", + "price_high_to_low", + "price_low_to_high" + ], + "in": "query", + "name": "order", + "type": "string", + "x-example": "price_low_to_high" + }, + { + "description": "Page number, starting at 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -516175,7 +531129,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/vinted.categoryResponseDoc" } }, "400": { @@ -516184,14 +531138,20 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } @@ -516208,24 +531168,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Vanity Fair article content", + "summary": "Vinted listings for a category", "tags": [ - "Vanity Fair" + "Vinted" ] } }, - "/vanityfair/author": { + "/vinted/item": { "get": { - "description": "Returns a Vanity Fair contributor profile from their canonical `url` (`www.vanityfair.com/contributor/`, required). The response has the name, job title when present, biography, headshot, social links and recent articles with title, URL and publication time.", - "operationId": "vanityfair-author", + "consumes": [ + "application/json" + ], + "description": "Returns a single Vinted listing's detail: title, description, brand, size, condition, material, color, price, category breadcrumb, and photos. Public data, sourced from Vinted's own server-rendered item page.", + "operationId": "vinted-item", "parameters": [ { - "description": "Canonical Vanity Fair contributor URL", + "description": "Numeric Vinted item ID, from a /vinted/catalog result's id field", "in": "query", - "name": "url", + "name": "id", "required": true, "type": "string", - "x-example": "https://www.vanityfair.com/contributor/example-writer" + "x-example": "9595406652" } ], "produces": [ @@ -516235,7 +531198,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.vanityFairAuthorResponseDoc" + "$ref": "#/definitions/vinted.itemResponseDoc" } }, "400": { @@ -516250,6 +531213,18 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -516262,38 +531237,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Vanity Fair contributor profile", + "summary": "A single Vinted listing's detail", "tags": [ - "Vanity Fair" + "Vinted" ] } }, - "/vanityfair/headlines": { + "/vinted/member": { "get": { - "description": "Lists the current headlines for one Vanity Fair section. `section` is required and takes `hollywood`, `movies`, `television`, `award-season`, `what-is-cinema`, `culture`, `politics`, `business`, `style`, `beauty`, `fashion` or `royals`. Each item has its title and URL.", - "operationId": "vanityfair-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a Vinted seller's public storefront profile: username, self-disclosed coarse location, rating, and follower/following counts. Deliberately excludes online-presence and activity data (last-seen timestamps, upload-frequency badges) present on the live page. Public data, sourced from Vinted's own server-rendered member page.", + "operationId": "vinted-member", "parameters": [ { - "description": "Vanity Fair section slug", - "enum": [ - "hollywood", - "movies", - "television", - "award-season", - "what-is-cinema", - "culture", - "politics", - "business", - "style", - "beauty", - "fashion", - "royals" - ], + "description": "Numeric Vinted member ID, from a /vinted/item result's seller link", "in": "query", - "name": "section", + "name": "id", "required": true, "type": "string", - "x-example": "hollywood" + "x-example": "3159465141" } ], "produces": [ @@ -516303,7 +531267,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/vinted.memberResponseDoc" } }, "400": { @@ -516312,37 +531276,11 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vanity Fair section headlines", - "tags": [ - "Vanity Fair" - ] - } - }, - "/vanityfair/news": { - "get": { - "description": "Returns the latest Vanity Fair top stories and takes no parameters. Each item has its title, canonical URL, summary, author, publication time and lead image.", - "operationId": "vanityfair-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -516350,36 +531288,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "500": { + "description": "Internal Server Error", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vanity Fair top stories", - "tags": [ - "Vanity Fair" - ] - } - }, - "/vanityfair/sections": { - "get": { - "description": "Returns the Vanity Fair section inventory: Hollywood (plus its Movies, Television, and Award Season sub-verticals), Arts & Culture, Politics, Business, and Style (plus its Beauty, Fashion, and Royals sub-verticals), each linking to its public listing page.", - "operationId": "vanityfair-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service Unavailable", "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" + "$ref": "#/definitions/app.Response" } } }, @@ -516388,24 +531306,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Vanity Fair sections", + "summary": "A Vinted seller's public storefront profile", "tags": [ - "Vanity Fair" + "Vinted" ] } }, - "/variety/article": { + "/vox/article": { "get": { - "description": "Returns one Variety article by its canonical `variety.com` `url`, in the form `////-/`. The response has the title, description, authors, section, published and updated times, lead image, body `paragraphs` and a `paywalled` flag.", - "operationId": "variety-article", + "description": "Returns one Vox article by its canonical `url`: title, description, authors, section, published and updated times, lead image and the body `paragraphs`. Only public content is returned; a subscriber-only or blocked article comes back as an upstream error rather than a partial body.", + "operationId": "vox-article", "parameters": [ { - "description": "Canonical Variety article URL", + "description": "Canonical Vox article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://variety.com/2026/music/global/oasis-more-live-27-shows-uk-italy-germany-1236873146/" + "x-example": "https://www.vox.com/politics/example" } ], "produces": [ @@ -516442,37 +531360,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Variety article content", + "summary": "Get Vox article content", "tags": [ - "Variety" + "Vox" ] } }, - "/variety/author": { + "/vox/author": { "get": { - "description": "Returns a Variety author profile with name, biography, photo, social links and one page of recent articles. Give either `slug` (such as `ellise-shafer`) or an author `url`, which may include a `/page//` segment; `page` (default 1) overrides it. `has_next_page` shows whether another page exists.", - "operationId": "variety-author", + "description": "Returns a Vox author profile from their canonical `url` (`www.vox.com/authors/`, required). The response has the name, `job_title` from the masthead (such as Senior Politics Correspondent), `bio` and recent articles, each with title, URL, excerpt, category and an ISO-8601 `published_at`.", + "operationId": "vox-author", "parameters": [ { - "description": "Author slug, e.g. ellise-shafer", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "ellise-shafer" - }, - { - "description": "Canonical variety.com/author/ URL, optionally with a /page// segment; alternative to slug", + "description": "Canonical Vox author URL", "in": "query", "name": "url", + "required": true, "type": "string", - "x-example": "https://variety.com/author/ellise-shafer/" - }, - { - "default": 1, - "description": "1-based page number; overrides any page number in url", - "in": "query", - "name": "page", - "type": "integer" + "x-example": "https://www.vox.com/authors/andrew-prokop" } ], "produces": [ @@ -516482,7 +531387,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.varietyAuthorResponseDoc" + "$ref": "#/definitions/publicnews.voxAuthorResponseDoc" } }, "400": { @@ -516509,50 +531414,36 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Variety author profile", + "summary": "Get a Vox author profile", "tags": [ - "Variety" + "Vox" ] } }, - "/variety/headlines": { + "/vox/headlines": { "get": { - "description": "Lists fresh Variety headlines for one vertical. `section` is required and takes a slug such as `film`, `music`, `tv`, `biz`, `awards`, `gaming`, `global`, `legit` or `vip`; `variety-sections` lists all 24. Each item has its title and URL, plus summary, author, publication time and image when the outlet provides them.", - "operationId": "variety-headlines", + "description": "Lists the current Vox headlines for one section. `section` is required and takes `politics`, `culture`, `policy`, `world`, `money`, `technology`, `science-and-health`, `climate`, `future-perfect` or `explainers`. Each item has its title, URL, summary, author and publication time.", + "operationId": "vox-headlines", "parameters": [ { - "description": "Variety vertical slug", + "description": "Vox section slug", "enum": [ - "artisans", - "awards", - "biz", - "data", - "digital", - "dirt", - "film", - "gaming", - "global", - "legit", - "music", "politics", - "scene", - "shopping", - "sports", - "streaming", - "theater", - "tune-in", - "tv", - "video", - "vintage", - "vip", - "vivant", - "voices" + "culture", + "policy", + "world", + "money", + "technology", + "science-and-health", + "climate", + "future-perfect", + "explainers" ], "in": "query", "name": "section", "required": true, "type": "string", - "x-example": "artisans" + "x-example": "politics" } ], "produces": [ @@ -516583,16 +531474,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Variety section headlines", + "summary": "Get Vox section headlines", "tags": [ - "Variety" + "Vox" ] } }, - "/variety/news": { + "/vox/news": { "get": { - "description": "Returns the latest Variety top stories with no parameters. Each item has its title, URL, summary, author, publication time and image. Item URLs can be passed to `variety-article` for the body.", - "operationId": "variety-news", + "description": "Returns the latest Vox top stories with no parameters. Each item has its title, URL, summary, author and publication time. Item URLs can be passed to `vox-article` for the body.", + "operationId": "vox-news", "produces": [ "application/json" ], @@ -516603,12 +531494,6 @@ "$ref": "#/definitions/publicnews.newsResponseDoc" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -516621,16 +531506,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get Variety top stories", + "summary": "Get Vox top stories", "tags": [ - "Variety" + "Vox" ] } }, - "/variety/sections": { + "/vox/sections": { "get": { - "description": "Lists the 24 Variety verticals accepted by `variety-headlines`, such as `film`, `tv`, `music`, `biz`, `awards`, `legit` and `voices`. Each has a `slug`, a display `name` and a `url`. Takes no parameters.", - "operationId": "variety-sections", + "description": "Lists the Vox editorial sections accepted by `vox-headlines`, each with a stable `slug`, a display `name` and the section `url`. Use the slugs as the `section` value. Takes no parameters.", + "operationId": "vox-sections", "produces": [ "application/json" ], @@ -516647,66 +531532,26 @@ "ApiKeyAuth": [] } ], - "summary": "Get Variety sections", + "summary": "Get Vox sections", "tags": [ - "Variety" + "Vox" ] } }, - "/vestiaire/brands": { + "/vrbo/locations/search": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Vestiaire Collective's full brand directory (id, name, url), not just brands with active listings for a given search -- resolves search's otherwise-opaque brand_id filter, and a search response's facets.brands, to the complete set of valid ids. Public data, sourced from Vestiaire Collective's own brand-directory page.", - "operationId": "vestiaire-brands", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/vestiaire.brandsResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ + "description": "Returns public destination suggestions, including region IDs and location types when Vrbo provides them. The verified search term is sent with Vrbo's observed lodging, destination, and entry-page criteria.", + "operationId": "vrbo-location-suggestions", + "parameters": [ { - "ApiKeyAuth": [] + "description": "Destination text to suggest", + "in": "query", + "name": "search_term", + "required": true, + "type": "string", + "x-example": "Miami%20Beach" } ], - "summary": "Vestiaire Collective's full brand directory", - "tags": [ - "Vestiaire" - ] - } - }, - "/vestiaire/categories": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns the full Vestiaire Collective category taxonomy: universes (Women, Men, Kids) at the root, with up to three nested category levels beneath each. Every id returned here is accepted by /vestiaire/search's category_id filter.", - "operationId": "vestiaire-categories", "produces": [ "application/json" ], @@ -516714,17 +531559,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vestiaire.categoriesResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/vrbo.vrboLocationSuggestionsResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -516741,19 +531580,26 @@ "ApiKeyAuth": [] } ], - "summary": "Vestiaire Collective category taxonomy", + "summary": "Suggest Vrbo destinations", "tags": [ - "Vestiaire" + "Vrbo" ] } }, - "/vestiaire/conditions": { + "/vrbo/properties/{property_id}": { "get": { - "consumes": [ - "application/json" + "description": "Reads public traveler-facing property details, grouped amenities, photos, content sections, FAQs, and aggregate rating.", + "operationId": "vrbo-property", + "parameters": [ + { + "description": "Vrbo property ID (optionally ending in ha)", + "in": "path", + "name": "property_id", + "required": true, + "type": "string", + "x-example": "961219" + } ], - "description": "Returns the fixed set of condition ids accepted by /vestiaire/search's condition_id filter, with each id's display name and current listing count.", - "operationId": "vestiaire-conditions", "produces": [ "application/json" ], @@ -516761,17 +531607,11 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vestiaire.conditionsResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/vrbo.vrboPropertyResponseDoc" } }, - "500": { - "description": "Internal Server Error", + "400": { + "description": "Bad Request", "schema": { "$ref": "#/definitions/app.Response" } @@ -516788,27 +531628,24 @@ "ApiKeyAuth": [] } ], - "summary": "Vestiaire Collective condition values", + "summary": "Get Vrbo property details", "tags": [ - "Vestiaire" + "Vrbo" ] } }, - "/vestiaire/product": { + "/vrbo/properties/{property_id}/rate-calendar": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a single Vestiaire Collective listing's public detail: price, brand, category, condition, material, color, size, seller summary, and photos. `path` is the listing's URL or site-relative path, as returned by /vestiaire/search's `url` field -- the numeric id alone cannot be resolved to a page. Public data, sourced from Vestiaire Collective's own listing page.", - "operationId": "vestiaire-product", + "description": "Returns public calendar dates, nightly display prices when provided, availability, check-in/out validity, and stay constraints.", + "operationId": "vrbo-rate-calendar", "parameters": [ { - "description": "Listing URL or path, from a search result's url field", - "in": "query", - "name": "path", + "description": "Vrbo property ID (optionally ending in ha)", + "in": "path", + "name": "property_id", "required": true, "type": "string", - "x-example": "/women-clothing/biker-jackets/off-white/black-leather-off-white-biker-jacket-70860454.shtml" + "x-example": "961219" } ], "produces": [ @@ -516818,7 +531655,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vestiaire.productResponseDoc" + "$ref": "#/definitions/vrbo.vrboRateCalendarResponseDoc" } }, "400": { @@ -516827,24 +531664,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -516857,81 +531676,68 @@ "ApiKeyAuth": [] } ], - "summary": "Vestiaire Collective listing detail", + "summary": "Get a Vrbo property rate calendar", "tags": [ - "Vestiaire" + "Vrbo" ] } }, - "/vestiaire/search": { + "/vrbo/properties/{property_id}/reviews": { "get": { - "consumes": [ - "application/json" - ], - "description": "Searches Vestiaire Collective's public pre-owned luxury resale catalog by keyword, category, brand, and condition, with sort and pagination. `sort` values: `relevance`, `price_asc`, `price_desc`, `recency`. `category_id` and `condition_id` come from /vestiaire/categories and /vestiaire/conditions. `page` * `per_page` cannot exceed an offset of 1000 (the upstream service's own pagination limit) -- narrow the query instead of paging deeper. Public data, sourced from Vestiaire Collective's own search service.", - "operationId": "vestiaire-search", + "description": "Returns one page of public traveler reviews, aggregate count, and current sort choices. Pagination and sort values follow the public reviews query.", + "operationId": "vrbo-property-reviews", "parameters": [ { - "description": "Keyword search text", - "in": "query", - "name": "q", - "type": "string", - "x-example": "chanel bag" - }, - { - "description": "Category id, from /vestiaire/categories", - "in": "query", - "name": "category_id", + "description": "Vrbo property ID (optionally ending in ha)", + "in": "path", + "name": "property_id", + "required": true, "type": "string", - "x-example": "5" + "x-example": "11458735ha" }, { - "description": "Brand id, from a prior search's facets.brands", + "default": 0, + "description": "Zero-based review offset", "in": "query", - "name": "brand_id", - "type": "string", - "x-example": "50" + "minimum": 0, + "name": "start_index", + "type": "integer" }, { - "description": "Condition id. Allowed values: 1, 2, 3, 4, 5", - "enum": [ - "1", - "2", - "3", - "4", - "5" - ], + "default": 10, + "description": "Page size from 1 to 50", "in": "query", - "name": "condition_id", - "type": "string", - "x-example": "3" + "maximum": 50, + "minimum": 1, + "name": "size", + "type": "integer" }, { - "description": "Sort order. Allowed values: relevance, price_asc, price_desc, recency", + "description": "Sort value from the response's sort_options", "enum": [ - "relevance", - "price_asc", - "price_desc", - "recency" + "HIGHEST_TO_LOWEST_RATED", + "LOWEST_TO_HIGHEST_RATED", + "NEWEST_TO_OLDEST", + "NEWEST_TO_OLDEST_BY_LANGUAGE", + "NEWEST_TO_OLDEST_BY_RELEVANCY" ], "in": "query", - "name": "sort", - "type": "string", - "x-example": "price_asc" + "name": "sort_by", + "type": "string" }, { - "description": "Page number, starting at 1", + "default": true, + "description": "Include recent reviews", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "include_recent_reviews", + "type": "boolean" }, { - "description": "Results per page, up to 60", + "default": true, + "description": "Include rating-only reviews", "in": "query", - "name": "per_page", - "type": "integer", - "x-example": 24 + "name": "include_ratings_only_reviews", + "type": "boolean" } ], "produces": [ @@ -516941,7 +531747,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vestiaire.searchResponseDoc" + "$ref": "#/definitions/vrbo.vrboReviewsResponseDoc" } }, "400": { @@ -516950,24 +531756,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -516980,27 +531768,28 @@ "ApiKeyAuth": [] } ], - "summary": "Vestiaire Collective listing search", + "summary": "Get Vrbo property reviews", "tags": [ - "Vestiaire" + "Vrbo" ] } }, - "/vestiaire/search-sellers": { - "get": { + "/vrbo/search": { + "post": { "consumes": [ "application/json" ], - "description": "Finds Vestiaire Collective sellers by username or first name. A matched result's id can be passed directly to GET /vestiaire/seller for that seller's full public storefront profile. Public data, sourced from Vestiaire Collective's own member-search service.", - "operationId": "vestiaire-search-sellers", + "description": "Searches public Vrbo rental listings for a selected destination and dates. Obtain destination, region_id, and lat_long from Vrbo's destination suggestion UI. Supports date flexibility, per-room adult and child-age inputs, current filter selections and ranges, and observed sort values. Copy filter IDs and option values from the returned filters.", + "operationId": "vrbo-search", "parameters": [ { - "description": "Seller username or first name to search for", - "in": "query", - "name": "q", + "description": "Search criteria", + "in": "body", + "name": "request", "required": true, - "type": "string", - "x-example": "michelle" + "schema": { + "$ref": "#/definitions/vrbo.SearchOption" + } } ], "produces": [ @@ -517010,7 +531799,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vestiaire.searchSellersResponseDoc" + "$ref": "#/definitions/vrbo.vrboSearchResponseDoc" } }, "400": { @@ -517019,18 +531808,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -517043,29 +531820,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search Vestiaire Collective sellers by name", + "summary": "Search Vrbo vacation rentals", "tags": [ - "Vestiaire" + "Vrbo" ] } }, - "/vestiaire/seller": { + "/vrbo/travel-pages": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns a Vestiaire Collective seller's public storefront profile: username, country, segment, aggregate sold/listed/bought counts, and follower/following counts. `id` is the numeric seller id, as returned by /vestiaire/search's `seller_id` field or /vestiaire/product's `seller.id`. Public data, sourced from Vestiaire Collective's own seller profile page.", - "operationId": "vestiaire-seller", - "parameters": [ - { - "description": "Seller id", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "36526194" - } - ], + "description": "Lists the public stay-type and travel-theme pages linked from Vrbo's vacation-rental index. These are editorial browse pages, not a complete search-filter enumeration.", + "operationId": "vrbo-travel-pages", "produces": [ "application/json" ], @@ -517073,31 +531837,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vestiaire.sellerResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/vrbo.vrboTravelPagesResponseDoc" } }, "503": { @@ -517112,27 +531852,24 @@ "ApiKeyAuth": [] } ], - "summary": "Vestiaire Collective seller profile", + "summary": "List Vrbo travel pages", "tags": [ - "Vestiaire" + "Vrbo" ] } }, - "/vestiaire/suggest": { + "/vrbo/travel-pages/{slug}": { "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Vestiaire Collective's own search-box autocomplete suggestions for a partial query: matching brands plus completed search phrases. Public data, sourced from Vestiaire Collective's own search-suggestions service.", - "operationId": "vestiaire-suggest", + "description": "Returns public editorial sections, visible rental cards, and related travel-page links for a /travel/{slug} page. Date-scoped prices are omitted; page slugs are not search-filter values.", + "operationId": "vrbo-travel-page-detail", "parameters": [ { - "description": "Partial search query to autocomplete", - "in": "query", - "name": "q", + "description": "Vrbo travel-page slug returned by /vrbo/travel-pages", + "in": "path", + "name": "slug", "required": true, "type": "string", - "x-example": "chane" + "x-example": "cabins" } ], "produces": [ @@ -517142,7 +531879,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vestiaire.suggestResponseDoc" + "$ref": "#/definitions/vrbo.vrboTravelPageDetailResponseDoc" } }, "400": { @@ -517151,18 +531888,6 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "503": { "description": "Service Unavailable", "schema": { @@ -517175,24 +531900,24 @@ "ApiKeyAuth": [] } ], - "summary": "Vestiaire Collective search-box autocomplete", + "summary": "Get a Vrbo travel page", "tags": [ - "Vestiaire" + "Vrbo" ] } }, - "/vice/article": { + "/walesonline/article": { "get": { - "description": "Returns one VICE article by its canonical `url`, in the form `www.vice.com/en/article/`. The response has the title, description, authors, section, published and updated times, lead image and body `paragraphs`, plus a `paywalled` flag.", - "operationId": "vice-article", + "description": "Returns public WalesOnline article metadata (including the section) and body paragraphs from a canonical article URL, including live blogs. Photo-gallery URLs are rejected.", + "operationId": "walesonline-article", "parameters": [ { - "description": "Canonical VICE article URL", + "description": "Canonical WalesOnline article URL", "in": "query", "name": "url", "required": true, "type": "string", - "x-example": "https://www.vice.com/en/article/example-article/" + "x-example": "https://www.walesonline.co.uk/news/wales-news/major-welsh-theatre-figure-who-34653727" } ], "produces": [ @@ -517217,6 +531942,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -517229,24 +531960,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get VICE article content", + "summary": "Get WalesOnline article content", "tags": [ - "VICE" + "WalesOnline" ] } }, - "/vice/author": { + "/walesonline/author": { "get": { - "description": "Returns a VICE contributor profile from their canonical `url` (`www.vice.com/en/contributor/`, required). The response has the name and headshot when present, the biography paragraphs and recent articles with title, URL, summary, author, publication time and image.", - "operationId": "vice-author", + "description": "Returns one WalesOnline author's public profile (name, plus job title, bio, email and X/Twitter handle when the author lists them) and one page of their recent articles.", + "operationId": "walesonline-author", "parameters": [ { - "description": "Canonical VICE contributor URL", + "description": "Author slug, e.g. rahaf-ali", + "in": "query", + "name": "slug", + "type": "string", + "x-example": "rahaf-ali" + }, + { + "description": "Canonical walesonline.co.uk/authors// URL; alternative to slug", "in": "query", "name": "url", - "required": true, "type": "string", - "x-example": "https://www.vice.com/en/contributor/example-writer/" + "x-example": "https://www.walesonline.co.uk/authors/rahaf-ali/" + }, + { + "default": 1, + "description": "1-based page number of the author's article list (1 to 100); overrides any pageNumber in url", + "in": "query", + "name": "page", + "type": "integer" } ], "produces": [ @@ -517256,7 +532000,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.viceAuthorResponseDoc" + "$ref": "#/definitions/publicnews.reachAuthorResponseDoc" } }, "400": { @@ -517271,6 +532015,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -517283,32 +532033,57 @@ "ApiKeyAuth": [] } ], - "summary": "Get a VICE contributor profile", + "summary": "Get a WalesOnline author profile", "tags": [ - "VICE" + "WalesOnline" ] } }, - "/vice/headlines": { + "/walesonline/headlines": { "get": { - "description": "Returns fresh headlines from one VICE section, either its public RSS feed (News, Life, Tech, Music) or its public listing page for the remaining sections.", - "operationId": "vice-headlines", + "description": "Lists recent WalesOnline headlines for one section, up to about 25 items. `section` is required and takes a slug such as `news/wales-news`, `news/politics`, `sport/rugby`, `sport/football` or `whats-on`; `walesonline-sections` lists all 37. Photo galleries are omitted, and an invalid value returns a 400 error.", + "operationId": "walesonline-headlines", "parameters": [ { - "description": "VICE section slug", + "description": "WalesOnline section slug", "enum": [ "news", - "life", - "tech", - "music", - "munchies", - "waypoint", - "rec-room", - "membership", - "via-vice", - "spotlights", - "theunstoppables", - "eu" + "news/wales-news", + "news/uk-news", + "news/world-news", + "news/politics", + "news/local-news", + "news/education", + "news/health", + "news/cost-of-living", + "news/homes-property", + "news/motoring", + "news/motoring/motoring-news", + "news/news-opinion", + "sport", + "sport/football", + "sport/football/football-news", + "sport/football/transfer-news", + "sport/rugby", + "sport/rugby/rugby-news", + "sport/boxing", + "sport/other-sport", + "sport/other-sport/athletics", + "whats-on", + "whats-on/whats-on-news", + "whats-on/arts-culture-news", + "whats-on/family-kids-news", + "whats-on/food-drink-news", + "whats-on/music-nightlife-news", + "whats-on/restaurants-bars", + "whats-on/shopping", + "whats-on/travel", + "lifestyle", + "lifestyle/showbiz", + "lifestyle/tv", + "lifestyle/welsh-homes", + "special-features", + "in-your-area" ], "in": "query", "name": "section", @@ -517333,6 +532108,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -517345,16 +532126,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get VICE section headlines", + "summary": "Get WalesOnline section headlines", "tags": [ - "VICE" + "WalesOnline" ] } }, - "/vice/news": { + "/walesonline/news": { "get": { - "description": "Returns the latest VICE stories with no parameters. Each item has its title and URL, plus summary, author, publication time and lead image when the outlet provides them. Pass an item URL to `vice-article` to read the story.", - "operationId": "vice-news", + "description": "Returns fresh WalesOnline top stories from the public home RSS feed. Photo galleries are omitted because they have no readable article body.", + "operationId": "walesonline-news", "produces": [ "application/json" ], @@ -517383,16 +532164,16 @@ "ApiKeyAuth": [] } ], - "summary": "Get VICE top stories", + "summary": "Get WalesOnline top stories", "tags": [ - "VICE" + "WalesOnline" ] } }, - "/vice/sections": { + "/walesonline/sections": { "get": { - "description": "Returns the VICE section inventory: the site's own 12 curated sections (News, Life, Tech, Music, and others), each linking to its public listing page.", - "operationId": "vice-sections", + "description": "Lists the 37 WalesOnline sections accepted by `walesonline-headlines`, with nested slugs such as `news/wales-news`, `sport/rugby` and `whats-on/food-drink-news`. Each has a `slug`, a display `name` and a feed `url`. Takes no parameters.", + "operationId": "walesonline-sections", "produces": [ "application/json" ], @@ -517409,61 +532190,40 @@ "ApiKeyAuth": [] } ], - "summary": "Get VICE sections", + "summary": "Get WalesOnline sections", "tags": [ - "VICE" + "WalesOnline" ] } }, - "/vinted/brand": { + "/walgreens/stores": { "get": { "consumes": [ "application/json" ], - "description": "Returns Vinted listings for a specific brand, with optional price filtering and sort order. `order` values: `relevance`, `newest_first`, `price_high_to_low`, `price_low_to_high`. Public data, sourced from Vinted's own server-rendered brand page.", - "operationId": "vinted-brand", + "description": "Returns Walgreens stores near a latitude/longitude or a zip code, nearest first: name, address, phone, hours, and in-store services (pharmacy, clinic, photo, and more) for each. Public data sourced from Walgreens' own store locator.", + "operationId": "walgreens-stores", "parameters": [ { - "description": "Numeric Vinted brand ID, from a /vinted/item result's brand link", - "in": "query", - "name": "id", - "required": true, - "type": "string", - "x-example": "386688" - }, - { - "description": "Minimum price", + "description": "Latitude; provide with longitude, or provide zip instead", "in": "query", - "name": "price_from", + "name": "latitude", "type": "number", - "x-example": 10 + "x-example": 41.8781 }, { - "description": "Maximum price", + "description": "Longitude; provide with latitude, or provide zip instead", "in": "query", - "name": "price_to", + "name": "longitude", "type": "number", - "x-example": 50 + "x-example": -87.6298 }, { - "description": "Sort order. Allowed values: relevance, newest_first, price_high_to_low, price_low_to_high", - "enum": [ - "relevance", - "newest_first", - "price_high_to_low", - "price_low_to_high" - ], + "description": "US ZIP code; used when latitude/longitude are omitted", "in": "query", - "name": "order", + "name": "zip", "type": "string", - "x-example": "price_low_to_high" - }, - { - "description": "Page number, starting at 1", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "60601" } ], "produces": [ @@ -517473,7 +532233,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vinted.brandResponseDoc" + "$ref": "#/definitions/walgreens.storesResponseDoc" } }, "400": { @@ -517482,18 +532242,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "500": { "description": "Internal Server Error", "schema": { @@ -517512,19 +532260,19 @@ "ApiKeyAuth": [] } ], - "summary": "Vinted listings for a brand", + "summary": "Find nearby Walgreens stores", "tags": [ - "Vinted" + "Walgreens" ] } }, - "/vinted/brands": { + "/wallapop/categories": { "get": { "consumes": [ "application/json" ], - "description": "Returns Vinted's \"Popular brands\" directory. This is Vinted's own curated list, not an exhaustive list of every brand in its catalog. Each entry's `id` is usable directly as the `id` query parameter to /vinted/brand. Public data, sourced from Vinted's own server-rendered brands page.", - "operationId": "vinted-brands", + "description": "Returns the complete live search taxonomy as a flat parent-linked list, including all descendant IDs used by /wallapop/search. Only IDs from this search taxonomy are accepted; legacy navigation-only IDs are excluded. Re-fetch periodically because the upstream taxonomy changes.", + "operationId": "wallapop-categories", "produces": [ "application/json" ], @@ -517532,7 +532280,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vinted.brandsResponseDoc" + "$ref": "#/definitions/wallapop.categoriesResponseDoc" } }, "429": { @@ -517559,211 +532307,76 @@ "ApiKeyAuth": [] } ], - "summary": "Vinted popular-brands directory", + "summary": "Discover Wallapop search categories", "tags": [ - "Vinted" + "Wallapop" ] } }, - "/vinted/catalog": { + "/wallapop/filter-options": { "get": { "consumes": [ "application/json" ], - "description": "Returns Vinted resale listings matching a text search, with optional price filtering and sort order. `order` values: `relevance`, `newest_first`, `price_high_to_low`, `price_low_to_high`. Public data, sourced from Vinted's own server-rendered catalog page.", - "operationId": "vinted-catalog", + "description": "Returns one page from a remote option list advertised by /wallapop/filters. Use its exact filter_id and category_id. brand/model lists use a root category ID; category-specific lists use the selected category ID. Model discovery requires brand. Multi-select options such as size map to the live search parameter fashion_size. q and sort provide listing context; options_query narrows the option list. Follow next_cursor while repeating the same context; an empty terminal page has no next_cursor. Option IDs are accepted by /wallapop/search's filter parameter.", + "operationId": "wallapop-filter-options", "parameters": [ { - "description": "Search text", + "description": "Remote filter ID advertised by /wallapop/filters for this category", "in": "query", - "name": "search_text", + "name": "filter_id", "required": true, "type": "string", - "x-example": "jacket" - }, - { - "description": "Minimum price", - "in": "query", - "name": "price_from", - "type": "number", - "x-example": 10 - }, - { - "description": "Maximum price", - "in": "query", - "name": "price_to", - "type": "number", - "x-example": 50 - }, - { - "description": "Sort order. Allowed values: relevance, newest_first, price_high_to_low, price_low_to_high", - "enum": [ - "relevance", - "newest_first", - "price_high_to_low", - "price_low_to_high" - ], - "in": "query", - "name": "order", - "type": "string", - "x-example": "price_low_to_high" + "x-example": "item_language" }, { - "description": "Page number, starting at 1", + "description": "Live category ID from /wallapop/categories. Use a root for brand/model or the selected category for category-specific remote options.", "in": "query", - "name": "page", + "name": "category_id", + "required": true, "type": "integer", - "x-example": 1 - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/vinted.catalogResponseDoc" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Vinted listing search", - "tags": [ - "Vinted" - ] - } - }, - "/vinted/categories": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Vinted's top-level catalog categories (e.g. Women, Men, Kids, Home, Electronics, Sports, Entertainment, Hobbies & collectibles). This is the root level only -- Vinted's full category tree goes several levels deeper on the live site, but deeper levels aren't server-rendered so aren't covered here. Each entry's `id` is usable directly as the `id` query parameter to /vinted/category. Public data, sourced from Vinted's own server-rendered catalog navigation.", - "operationId": "vinted-categories", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/vinted.categoriesResponseDoc" - } - }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/app.Response" - } + "x-example": 24100 }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Vinted top-level catalog categories", - "tags": [ - "Vinted" - ] - } - }, - "/vinted/category": { - "get": { - "consumes": [ - "application/json" - ], - "description": "Returns Vinted listings for a specific category, with optional price filtering and sort order. `order` values: `relevance`, `newest_first`, `price_high_to_low`, `price_low_to_high`. Public data, sourced from Vinted's own server-rendered category page.", - "operationId": "vinted-category", - "parameters": [ { - "description": "Numeric Vinted category ID, from a /vinted/item result's categories breadcrumb link", + "description": "Required with filter_id=model; a brand option ID", "in": "query", - "name": "id", - "required": true, + "name": "brand", "type": "string", - "x-example": "1904" + "x-example": "BMW" }, { - "description": "Minimum price", + "description": "Optional listing search context", "in": "query", - "name": "price_from", - "type": "number", - "x-example": 10 + "name": "q", + "type": "string", + "x-example": "iphone" }, { - "description": "Maximum price", + "description": "Optional listing sort context", + "enum": [ + "closest", + "most_relevance", + "newest", + "price_low_to_high", + "price_high_to_low" + ], "in": "query", - "name": "price_to", - "type": "number", - "x-example": 50 + "name": "sort", + "type": "string", + "x-example": "most_relevance" }, { - "description": "Sort order. Allowed values: relevance, newest_first, price_high_to_low, price_low_to_high", - "enum": [ - "relevance", - "newest_first", - "price_high_to_low", - "price_low_to_high" - ], + "description": "Optional text search inside the dynamic option list", "in": "query", - "name": "order", + "name": "options_query", "type": "string", - "x-example": "price_low_to_high" + "x-example": "BMW" }, { - "description": "Page number, starting at 1", + "description": "Opaque next_cursor returned by this endpoint", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "cursor", + "type": "string" } ], "produces": [ @@ -517773,7 +532386,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vinted.categoryResponseDoc" + "$ref": "#/definitions/wallapop.filterOptionsResponseDoc" } }, "400": { @@ -517812,27 +532425,33 @@ "ApiKeyAuth": [] } ], - "summary": "Vinted listings for a category", + "summary": "Discover Wallapop remote filter values", "tags": [ - "Vinted" + "Wallapop" ] } }, - "/vinted/item": { + "/wallapop/filters": { "get": { "consumes": [ "application/json" ], - "description": "Returns a single Vinted listing's detail: title, description, brand, size, condition, material, color, price, category breadcrumb, and photos. Public data, sourced from Vinted's own server-rendered item page.", - "operationId": "vinted-item", + "description": "Returns Wallapop's live search filter schema for a query and optional category. Each filter includes its current type, the upstream search-enabled flag when provided, accepted parameter names, inline option values or slider bounds, and a category-scoped /wallapop/filter-options link for remote value lists.", + "operationId": "wallapop-filters", "parameters": [ { - "description": "Numeric Vinted item ID, from a /vinted/catalog result's id field", + "description": "Optional search phrase used to select relevant filters", "in": "query", - "name": "id", - "required": true, + "name": "q", "type": "string", - "x-example": "9595406652" + "x-example": "iphone" + }, + { + "description": "Any live search taxonomy ID from /wallapop/categories", + "in": "query", + "name": "category_id", + "type": "integer", + "x-example": 100 } ], "produces": [ @@ -517842,7 +532461,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vinted.itemResponseDoc" + "$ref": "#/definitions/wallapop.filtersResponseDoc" } }, "400": { @@ -517881,27 +532500,27 @@ "ApiKeyAuth": [] } ], - "summary": "A single Vinted listing's detail", + "summary": "Discover Wallapop search filters", "tags": [ - "Vinted" + "Wallapop" ] } }, - "/vinted/member": { + "/wallapop/item": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Vinted seller's public storefront profile: username, self-disclosed coarse location, rating, and follower/following counts. Deliberately excludes online-presence and activity data (last-seen timestamps, upload-frequency badges) present on the live page. Public data, sourced from Vinted's own server-rendered member page.", - "operationId": "vinted-member", + "description": "Returns public listing details parsed from the anonymous server-rendered item page: description, price, taxonomy, condition, images, coarse location, shipping, category attributes, hashtags, and related-search links. Pass a clean https item URL returned by /wallapop/search, using es.wallapop.com, it.wallapop.com, or pt.wallapop.com. Seller/profile/contact data, exact coordinates, postal codes, favorites, and view-tracking state are omitted. The upstream may rate-limit or block requests; this endpoint uses the measured browser_android_native@fresh profile and retries up to three times.", + "operationId": "wallapop-item-detail", "parameters": [ { - "description": "Numeric Vinted member ID, from a /vinted/item result's seller link", + "description": "Clean https public item URL from /wallapop/search on es.wallapop.com, it.wallapop.com, or pt.wallapop.com", "in": "query", - "name": "id", + "name": "url", "required": true, "type": "string", - "x-example": "3159465141" + "x-example": "https%3A%2F%2Fes.wallapop.com%2Fitem%2Fchaqueta-1183989904" } ], "produces": [ @@ -517911,7 +532530,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vinted.memberResponseDoc" + "$ref": "#/definitions/wallapop.itemDetailResponseDoc" } }, "400": { @@ -517950,24 +532569,132 @@ "ApiKeyAuth": [] } ], - "summary": "A Vinted seller's public storefront profile", + "summary": "Fetch a public Wallapop listing detail page", "tags": [ - "Vinted" + "Wallapop" ] } }, - "/vox/article": { + "/wallapop/search": { "get": { - "description": "Returns one Vox article by its canonical `url`: title, description, authors, section, published and updated times, lead image and the body `paragraphs`. Only public content is returned; a subscriber-only or blocked article comes back as an upstream error rather than a partial body.", - "operationId": "vox-article", + "consumes": [ + "application/json" + ], + "description": "Returns one page of public Wallapop listing cards with title, price, currency, images, coarse location, taxonomy, shipping state, and a public item URL. q is a free-text search. latitude and longitude are required caller-provided coordinates because Wallapop otherwise resolves location from the request egress. category_id accepts any ID returned by /wallapop/categories, including descendants. sort is one of closest, most_relevance, newest, price_low_to_high, or price_high_to_low. When category_id is supplied, discover condition values from /wallapop/filters; categories can add values beyond the base set. Use /wallapop/filter-options for remote filter values. Pass next_cursor back as cursor by itself to fetch the next page.", + "operationId": "wallapop-search", "parameters": [ { - "description": "Canonical Vox article URL", + "description": "Free-text listing search, 2 to 200 characters", "in": "query", - "name": "url", + "name": "q", "required": true, "type": "string", - "x-example": "https://www.vox.com/politics/example" + "x-example": "iphone" + }, + { + "description": "Caller-provided search latitude, -90 through 90", + "in": "query", + "name": "latitude", + "required": true, + "type": "number", + "x-example": 40.4168 + }, + { + "description": "Caller-provided search longitude, -180 through 180", + "in": "query", + "name": "longitude", + "required": true, + "type": "number", + "x-example": -3.7038 + }, + { + "description": "Any live search taxonomy ID from /wallapop/categories", + "in": "query", + "name": "category_id", + "type": "integer", + "x-example": 24200 + }, + { + "description": "Wallapop sort order", + "enum": [ + "closest", + "most_relevance", + "newest", + "price_low_to_high", + "price_high_to_low" + ], + "in": "query", + "name": "sort", + "type": "string", + "x-example": "most_relevance" + }, + { + "description": "Minimum sale price", + "in": "query", + "name": "min_price", + "type": "number", + "x-example": 10 + }, + { + "description": "Maximum sale price", + "in": "query", + "name": "max_price", + "type": "number", + "x-example": 500 + }, + { + "description": "Repeatable or comma-separated condition values. With category_id, use the current values from /wallapop/filters; without category_id, base values are new, as_good_as_new, good, fair, and has_given_it_all.", + "in": "query", + "name": "condition", + "type": "string", + "x-example": "new,good" + }, + { + "description": "Pass true to limit to shipping-capable listings; omit to include all. false is rejected because Wallapop ignores it.", + "enum": [ + "true" + ], + "in": "query", + "name": "is_shippable", + "type": "string", + "x-example": "true" + }, + { + "description": "Listing date window", + "enum": [ + "today", + "lastWeek", + "lastMonth" + ], + "in": "query", + "name": "time_filter", + "type": "string", + "x-example": "lastWeek" + }, + { + "description": "Maximum distance from the supplied coordinates, 0 through 1000 km", + "in": "query", + "name": "distance_in_km", + "type": "integer", + "x-example": 25 + }, + { + "collectionFormat": "csv", + "description": "Repeatable category-specific key:value pair discovered from /wallapop/filters, e.g. brand:BMW, color:Black, has_warranty:true, storage_capacity:128gb, item_language:english, or fashion_size:3,4. For remote values use IDs returned by /wallapop/filter-options.", + "in": "query", + "items": { + "type": "string" + }, + "name": "filter", + "type": "array", + "x-example": "storage_capacity:128gb" + }, + { + "description": "Opaque next_cursor returned by a previous response. Use it alone, without initial search parameters.", + "in": "query", + "name": "cursor", + "type": "string", + "x-example": "eyJ2IjoxLCJuZXh0X3BhZ2UiOiJ..." } ], "produces": [ @@ -517977,7 +532704,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/wallapop.searchResponseDoc" } }, "400": { @@ -517992,6 +532719,18 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -518004,24 +532743,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Vox article content", + "summary": "Search Wallapop public listings", "tags": [ - "Vox" + "Wallapop" ] } }, - "/vox/author": { + "/walmart/product/{item_id}": { "get": { - "description": "Returns a Vox author profile from their canonical `url` (`www.vox.com/authors/`, required). The response has the name, `job_title` from the masthead (such as Senior Politics Correspondent), `bio` and recent articles, each with title, URL, excerpt, category and an ISO-8601 `published_at`.", - "operationId": "vox-author", + "consumes": [ + "application/json" + ], + "description": "Returns a Walmart product: price, availability, brand, images, rating, seller, description, highlights, specifications, and variants.", + "operationId": "walmart-product", "parameters": [ { - "description": "Canonical Vox author URL", - "in": "query", - "name": "url", + "description": "Walmart item id (the numeric id in a /ip/{id} URL)", + "in": "path", + "name": "item_id", "required": true, "type": "string", - "x-example": "https://www.vox.com/authors/andrew-prokop" + "x-example": "5689919121" } ], "produces": [ @@ -518031,7 +532773,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.voxAuthorResponseDoc" + "$ref": "#/definitions/walmart.productResponseDoc" } }, "400": { @@ -518046,6 +532788,12 @@ "$ref": "#/definitions/app.Response" } }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -518058,36 +532806,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Vox author profile", + "summary": "Get a Walmart product", "tags": [ - "Vox" + "Walmart" ] } }, - "/vox/headlines": { + "/walmart/product/{item_id}/reviews": { "get": { - "description": "Lists the current Vox headlines for one section. `section` is required and takes `politics`, `culture`, `policy`, `world`, `money`, `technology`, `science-and-health`, `climate`, `future-perfect` or `explainers`. Each item has its title, URL, summary, author and publication time.", - "operationId": "vox-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns the reviews snapshot embedded in a Walmart product page: average rating, total review count, the per-star rating breakdown, the recommended percentage, the top positive and top negative review, and a sample of recent reviews. This is a single on-page snapshot, not a full paginated feed. A product that exists but has no reviews returns zero counts and an empty reviews list.", + "operationId": "walmart-product-reviews", "parameters": [ { - "description": "Vox section slug", - "enum": [ - "politics", - "culture", - "policy", - "world", - "money", - "technology", - "science-and-health", - "climate", - "future-perfect", - "explainers" - ], - "in": "query", - "name": "section", + "description": "Walmart item id (the numeric id in a /ip/{id} URL)", + "in": "path", + "name": "item_id", "required": true, "type": "string", - "x-example": "politics" + "x-example": "5689919121" } ], "produces": [ @@ -518097,7 +532836,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/walmart.reviewsResponseDoc" } }, "400": { @@ -518106,36 +532845,16 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vox section headlines", - "tags": [ - "Vox" - ] - } - }, - "/vox/news": { - "get": { - "description": "Returns the latest Vox top stories with no parameters. Each item has its title, URL, summary, author and publication time. Item URLs can be passed to `vox-article` for the body.", - "operationId": "vox-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" + "$ref": "#/definitions/app.Response" } }, "503": { @@ -518150,50 +532869,47 @@ "ApiKeyAuth": [] } ], - "summary": "Get Vox top stories", + "summary": "Get Walmart product reviews", "tags": [ - "Vox" + "Walmart" ] } }, - "/vox/sections": { + "/walmart/search": { "get": { - "description": "Lists the Vox editorial sections accepted by `vox-headlines`, each with a stable `slug`, a display `name` and the section `url`. Use the slugs as the `section` value. Takes no parameters.", - "operationId": "vox-sections", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vox sections", - "tags": [ - "Vox" - ] - } - }, - "/vrbo/locations/search": { - "get": { - "description": "Returns public destination suggestions, including region IDs and location types when Vrbo provides them. The verified search term is sent with Vrbo's observed lodging, destination, and entry-page criteria.", - "operationId": "vrbo-location-suggestions", + "description": "Returns Walmart search results: item id, title, brand, price, image, availability, seller, and rating per product.", + "operationId": "walmart-search", "parameters": [ { - "description": "Destination text to suggest", + "description": "Search query", "in": "query", - "name": "search_term", + "name": "q", "required": true, "type": "string", - "x-example": "Miami%20Beach" + "x-example": "wireless earbuds" + }, + { + "description": "1-based page number (default 1)", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Sort order", + "enum": [ + "best_match", + "price_low", + "price_high", + "best_seller", + "new_arrivals", + "rating_high" + ], + "in": "query", + "name": "sort", + "type": "string" } ], "produces": [ @@ -518203,7 +532919,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vrbo.vrboLocationSuggestionsResponseDoc" + "$ref": "#/definitions/walmart.searchResponseDoc" } }, "400": { @@ -518212,6 +532928,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -518224,24 +532952,24 @@ "ApiKeyAuth": [] } ], - "summary": "Suggest Vrbo destinations", + "summary": "Search Walmart products", "tags": [ - "Vrbo" + "Walmart" ] } }, - "/vrbo/properties/{property_id}": { + "/wapo/article": { "get": { - "description": "Reads public traveler-facing property details, grouped amenities, photos, content sections, FAQs, and aggregate rating.", - "operationId": "vrbo-property", + "description": "Returns one public Washington Post article's metadata and body paragraphs from a canonical article URL. Metered articles that the site truncates are not available.", + "operationId": "wapo-article", "parameters": [ { - "description": "Vrbo property ID (optionally ending in ha)", - "in": "path", - "name": "property_id", + "description": "Canonical Washington Post article URL", + "in": "query", + "name": "url", "required": true, "type": "string", - "x-example": "961219" + "x-example": "https://www.washingtonpost.com/business/2026/09/17/example-slug/" } ], "produces": [ @@ -518251,7 +532979,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vrbo.vrboPropertyResponseDoc" + "$ref": "#/definitions/wapo.articleResponseDoc" } }, "400": { @@ -518260,50 +532988,20 @@ "$ref": "#/definitions/app.Response" } }, - "503": { - "description": "Service Unavailable", + "403": { + "description": "Forbidden", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get Vrbo property details", - "tags": [ - "Vrbo" - ] - } - }, - "/vrbo/properties/{property_id}/rate-calendar": { - "get": { - "description": "Returns public calendar dates, nightly display prices when provided, availability, check-in/out validity, and stay constraints.", - "operationId": "vrbo-rate-calendar", - "parameters": [ - { - "description": "Vrbo property ID (optionally ending in ha)", - "in": "path", - "name": "property_id", - "required": true, - "type": "string", - "x-example": "961219" - } - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not Found", "schema": { - "$ref": "#/definitions/vrbo.vrboRateCalendarResponseDoc" + "$ref": "#/definitions/app.Response" } }, - "400": { - "description": "Bad Request", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -518320,68 +533018,37 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Vrbo property rate calendar", + "summary": "Get a Washington Post article's content", "tags": [ - "Vrbo" + "Washington Post" ] } }, - "/vrbo/properties/{property_id}/reviews": { + "/wapo/author": { "get": { - "description": "Returns one page of public traveler reviews, aggregate count, and current sort choices. Pagination and sort values follow the public reviews query.", - "operationId": "vrbo-property-reviews", + "description": "Returns one Washington Post staff author's public profile: byline metadata, bio, contact/social links, and one page of their recent articles.", + "operationId": "wapo-author", "parameters": [ { - "description": "Vrbo property ID (optionally ending in ha)", - "in": "path", - "name": "property_id", - "required": true, + "description": "Washington Post people slug, e.g. adam-taylor", + "in": "query", + "name": "slug", "type": "string", - "x-example": "11458735ha" + "x-example": "adam-taylor" }, { - "default": 0, - "description": "Zero-based review offset", + "description": "Canonical washingtonpost.com/people// URL, optionally with a ?page= query; alternative to slug", "in": "query", - "minimum": 0, - "name": "start_index", - "type": "integer" + "name": "url", + "type": "string", + "x-example": "https://www.washingtonpost.com/people/adam-taylor/?page=2" }, { - "default": 10, - "description": "Page size from 1 to 50", + "default": 1, + "description": "1-based page number; overrides any page number in url", "in": "query", - "maximum": 50, - "minimum": 1, - "name": "size", + "name": "page", "type": "integer" - }, - { - "description": "Sort value from the response's sort_options", - "enum": [ - "HIGHEST_TO_LOWEST_RATED", - "LOWEST_TO_HIGHEST_RATED", - "NEWEST_TO_OLDEST", - "NEWEST_TO_OLDEST_BY_LANGUAGE", - "NEWEST_TO_OLDEST_BY_RELEVANCY" - ], - "in": "query", - "name": "sort_by", - "type": "string" - }, - { - "default": true, - "description": "Include recent reviews", - "in": "query", - "name": "include_recent_reviews", - "type": "boolean" - }, - { - "default": true, - "description": "Include rating-only reviews", - "in": "query", - "name": "include_ratings_only_reviews", - "type": "boolean" } ], "produces": [ @@ -518391,7 +533058,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vrbo.vrboReviewsResponseDoc" + "$ref": "#/definitions/wapo.authorResponseDoc" } }, "400": { @@ -518400,6 +533067,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -518412,28 +533091,24 @@ "ApiKeyAuth": [] } ], - "summary": "Get Vrbo property reviews", + "summary": "Get a Washington Post staff author profile", "tags": [ - "Vrbo" + "Washington Post" ] } }, - "/vrbo/search": { - "post": { - "consumes": [ - "application/json" - ], - "description": "Searches public Vrbo rental listings for a selected destination and dates. Obtain destination, region_id, and lat_long from Vrbo's destination suggestion UI. Supports date flexibility, per-room adult and child-age inputs, current filter selections and ranges, and observed sort values. Copy filter IDs and option values from the returned filters.", - "operationId": "vrbo-search", + "/wapo/headlines": { + "get": { + "description": "Returns the first page of a Washington Post section front: each story's title, canonical URL, description, section, publication time, and lead image. Section must be a path returned by /wapo/sections.", + "operationId": "wapo-headlines", "parameters": [ { - "description": "Search criteria", - "in": "body", - "name": "request", + "description": "Section path from /wapo/sections", + "in": "query", + "name": "section", "required": true, - "schema": { - "$ref": "#/definitions/vrbo.SearchOption" - } + "type": "string", + "x-example": "world" } ], "produces": [ @@ -518443,7 +533118,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vrbo.vrboSearchResponseDoc" + "$ref": "#/definitions/wapo.headlinesResponseDoc" } }, "400": { @@ -518452,6 +533127,18 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -518464,16 +533151,16 @@ "ApiKeyAuth": [] } ], - "summary": "Search Vrbo vacation rentals", + "summary": "Get the latest stories in a Washington Post section", "tags": [ - "Vrbo" + "Washington Post" ] } }, - "/vrbo/travel-pages": { + "/wapo/news": { "get": { - "description": "Lists the public stay-type and travel-theme pages linked from Vrbo's vacation-rental index. These are editorial browse pages, not a complete search-filter enumeration.", - "operationId": "vrbo-travel-pages", + "description": "Returns the current Washington Post news list with no parameters. Each item has its `title`, canonical `url`, `published_at` and `last_modified`, the last when the publisher supplies it. Items do not include summaries or authors.", + "operationId": "wapo-news", "produces": [ "application/json" ], @@ -518481,7 +533168,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vrbo.vrboTravelPagesResponseDoc" + "$ref": "#/definitions/wapo.newsResponseDoc" + } + }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" } }, "503": { @@ -518496,26 +533189,16 @@ "ApiKeyAuth": [] } ], - "summary": "List Vrbo travel pages", + "summary": "Get the latest Washington Post stories", "tags": [ - "Vrbo" + "Washington Post" ] } }, - "/vrbo/travel-pages/{slug}": { + "/wapo/sections": { "get": { - "description": "Returns public editorial sections, visible rental cards, and related travel-page links for a /travel/{slug} page. Date-scoped prices are omitted; page slugs are not search-filter values.", - "operationId": "vrbo-travel-page-detail", - "parameters": [ - { - "description": "Vrbo travel-page slug returned by /vrbo/travel-pages", - "in": "path", - "name": "slug", - "required": true, - "type": "string", - "x-example": "cabins" - } - ], + "description": "Lists the Washington Post sections accepted by `wapo-headlines`. Each has a path `slug` such as `politics` or `business/technology`, a display `name` and a landing-page `url`. Use it to find valid `section` values. Takes no parameters.", + "operationId": "wapo-sections", "produces": [ "application/json" ], @@ -518523,7 +533206,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/vrbo.vrboTravelPageDetailResponseDoc" + "$ref": "#/definitions/wapo.sectionsResponseDoc" } }, "400": { @@ -518532,6 +533215,12 @@ "$ref": "#/definitions/app.Response" } }, + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "503": { "description": "Service Unavailable", "schema": { @@ -518544,26 +533233,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Vrbo travel page", + "summary": "List Washington Post sections", "tags": [ - "Vrbo" + "Washington Post" ] } }, - "/walesonline/article": { + "/wattpad/categories": { "get": { - "description": "Returns public WalesOnline article metadata (including the section) and body paragraphs from a canonical article URL, including live blogs. Photo-gallery URLs are rejected.", - "operationId": "walesonline-article", - "parameters": [ - { - "description": "Canonical WalesOnline article URL", - "in": "query", - "name": "url", - "required": true, - "type": "string", - "x-example": "https://www.walesonline.co.uk/news/wales-news/major-welsh-theatre-figure-who-34653727" - } + "consumes": [ + "application/json" ], + "description": "Returns Wattpad's story categories (Romance, Fantasy, Fanfiction, Werewolf, ...) with id, name and English name. These ids are the values the category parameter of wattpad-search takes and the values in every story's category_ids. The list is read live from Wattpad.", + "operationId": "wattpad-categories", "produces": [ "application/json" ], @@ -518571,7 +533253,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.articleResponseDoc" + "$ref": "#/definitions/wattpad.categoriesResponseDoc" } }, "400": { @@ -518580,12 +533262,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -518604,39 +533280,19 @@ "ApiKeyAuth": [] } ], - "summary": "Get WalesOnline article content", + "summary": "List Wattpad story categories", "tags": [ - "WalesOnline" + "Wattpad" ] } }, - "/walesonline/author": { + "/wattpad/languages": { "get": { - "description": "Returns one WalesOnline author's public profile (name, plus job title, bio, email and X/Twitter handle when the author lists them) and one page of their recent articles.", - "operationId": "walesonline-author", - "parameters": [ - { - "description": "Author slug, e.g. rahaf-ali", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "rahaf-ali" - }, - { - "description": "Canonical walesonline.co.uk/authors// URL; alternative to slug", - "in": "query", - "name": "url", - "type": "string", - "x-example": "https://www.walesonline.co.uk/authors/rahaf-ali/" - }, - { - "default": 1, - "description": "1-based page number of the author's article list (1 to 100); overrides any pageNumber in url", - "in": "query", - "name": "page", - "type": "integer" - } + "consumes": [ + "application/json" ], + "description": "Returns the story languages Wattpad's search can filter by, each with its numeric id and native-script name (50 at the time of writing). These ids are the values the language parameter of wattpad-search takes.", + "operationId": "wattpad-languages", "produces": [ "application/json" ], @@ -518644,7 +533300,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.reachAuthorResponseDoc" + "$ref": "#/definitions/wattpad.languagesResponseDoc" } }, "400": { @@ -518653,12 +533309,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Too Many Requests", "schema": { @@ -518677,63 +533327,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a WalesOnline author profile", + "summary": "List Wattpad story languages", "tags": [ - "WalesOnline" + "Wattpad" ] } }, - "/walesonline/headlines": { + "/wattpad/part": { "get": { - "description": "Lists recent WalesOnline headlines for one section, up to about 25 items. `section` is required and takes a slug such as `news/wales-news`, `news/politics`, `sport/rugby`, `sport/football` or `whats-on`; `walesonline-sections` lists all 37. Photo galleries are omitted, and an invalid value returns a 400 error.", - "operationId": "walesonline-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns one Wattpad chapter's metadata: id, title, link, word count, reads, votes, comments, length, dates and the story it belongs to (id and title). part_id is the numeric chapter id from wattpad-story-parts. A chapter that does not exist returns not found. Chapter text is never returned.", + "operationId": "wattpad-part", "parameters": [ { - "description": "WalesOnline section slug", - "enum": [ - "news", - "news/wales-news", - "news/uk-news", - "news/world-news", - "news/politics", - "news/local-news", - "news/education", - "news/health", - "news/cost-of-living", - "news/homes-property", - "news/motoring", - "news/motoring/motoring-news", - "news/news-opinion", - "sport", - "sport/football", - "sport/football/football-news", - "sport/football/transfer-news", - "sport/rugby", - "sport/rugby/rugby-news", - "sport/boxing", - "sport/other-sport", - "sport/other-sport/athletics", - "whats-on", - "whats-on/whats-on-news", - "whats-on/arts-culture-news", - "whats-on/family-kids-news", - "whats-on/food-drink-news", - "whats-on/music-nightlife-news", - "whats-on/restaurants-bars", - "whats-on/shopping", - "whats-on/travel", - "lifestyle", - "lifestyle/showbiz", - "lifestyle/tv", - "lifestyle/welsh-homes", - "special-features", - "in-your-area" - ], + "description": "Numeric chapter id from the id field of wattpad-story-parts", "in": "query", - "name": "section", + "name": "part_id", "required": true, "type": "string", - "x-example": "news" + "x-example": "1353317758" } ], "produces": [ @@ -518743,7 +533357,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/publicnews.headlinesResponseDoc" + "$ref": "#/definitions/wattpad.partResponseDoc" } }, "400": { @@ -518752,43 +533366,11 @@ "$ref": "#/definitions/app.Response" } }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "503": { - "description": "Service Unavailable", + "404": { + "description": "Not Found", "schema": { "$ref": "#/definitions/app.Response" } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get WalesOnline section headlines", - "tags": [ - "WalesOnline" - ] - } - }, - "/walesonline/news": { - "get": { - "description": "Returns fresh WalesOnline top stories from the public home RSS feed. Photo galleries are omitted because they have no readable article body.", - "operationId": "walesonline-news", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.newsResponseDoc" - } }, "429": { "description": "Too Many Requests", @@ -518808,66 +533390,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get WalesOnline top stories", - "tags": [ - "WalesOnline" - ] - } - }, - "/walesonline/sections": { - "get": { - "description": "Lists the 37 WalesOnline sections accepted by `walesonline-headlines`, with nested slugs such as `news/wales-news`, `sport/rugby` and `whats-on/food-drink-news`. Each has a `slug`, a display `name` and a feed `url`. Takes no parameters.", - "operationId": "walesonline-sections", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/publicnews.sectionsResponseDoc" - } - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ], - "summary": "Get WalesOnline sections", + "summary": "Get a Wattpad chapter", "tags": [ - "WalesOnline" + "Wattpad" ] } }, - "/walgreens/stores": { + "/wattpad/part-comments": { "get": { "consumes": [ "application/json" ], - "description": "Returns Walgreens stores near a latitude/longitude or a zip code, nearest first: name, address, phone, hours, and in-store services (pharmacy, clinic, photo, and more) for each. Public data sourced from Walgreens' own store locator.", - "operationId": "walgreens-stores", + "description": "Returns one page of the public reader comments on a Wattpad chapter, newest first: id, text, commenter username and avatar, reply count, whether it is a reply, parent id, link and creation time. part_id is the numeric chapter id from wattpad-story-parts. limit is 1 to 100 (default 20) and offset pages the list; next_offset is absent on the last page. A chapter with no comments, or an unknown chapter, returns an empty list.", + "operationId": "wattpad-part-comments", "parameters": [ { - "description": "Latitude; provide with longitude, or provide zip instead", + "description": "Numeric chapter id from the id field of wattpad-story-parts", "in": "query", - "name": "latitude", - "type": "number", - "x-example": 41.8781 + "name": "part_id", + "required": true, + "type": "string", + "x-example": "1353317758" }, { - "description": "Longitude; provide with latitude, or provide zip instead", + "description": "Page size, 1 to 100; defaults to 20", "in": "query", - "name": "longitude", - "type": "number", - "x-example": -87.6298 + "name": "limit", + "type": "integer", + "x-example": 5 }, { - "description": "US ZIP code; used when latitude/longitude are omitted", + "description": "Zero-based result offset, below 100000; defaults to 0", "in": "query", - "name": "zip", - "type": "string", - "x-example": "60601" + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -518877,7 +533434,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/walgreens.storesResponseDoc" + "$ref": "#/definitions/wattpad.partCommentsResponseDoc" } }, "400": { @@ -518886,8 +533443,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -518904,27 +533461,118 @@ "ApiKeyAuth": [] } ], - "summary": "Find nearby Walgreens stores", + "summary": "List reader comments on a Wattpad chapter", "tags": [ - "Walgreens" + "Wattpad" ] } }, - "/walmart/product/{item_id}": { + "/wattpad/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns a Walmart product: price, availability, brand, images, rating, seller, description, highlights, specifications, and variants.", - "operationId": "walmart-product", + "description": "Searches Wattpad's story catalog by text or browses it by ranking, category and language, and returns one page of stories: id, title, description, cover, link, author, votes, reads, comments, chapter count, completed and mature flags, language, category ids, tags and dates. Give at least one of query, filter, category or language. filter is hot, new or featured; category is an id from wattpad-categories; language is an id from wattpad-languages. limit is 1 to 100 (default 20) and offset pages the results: a text search reaches offset 9999, while browsing without a query is capped at 1500 results. Browse pages can hold fewer stories than limit (or none) because Wattpad filters after paging, so advance with next_offset rather than the item count.", + "operationId": "wattpad-search", "parameters": [ { - "description": "Walmart item id (the numeric id in a /ip/{id} URL)", - "in": "path", - "name": "item_id", - "required": true, + "description": "Text to search for in story titles, descriptions and tags, up to 200 characters", + "in": "query", + "name": "query", "type": "string", - "x-example": "5689919121" + "x-example": "romance" + }, + { + "description": "Ranking: hot is currently popular, new is recently published, featured is Wattpad's featured stories", + "enum": [ + "hot", + "new", + "featured" + ], + "in": "query", + "name": "filter", + "type": "string", + "x-example": "hot" + }, + { + "description": "Category id from wattpad-categories, for example 4 for Romance", + "in": "query", + "name": "category", + "type": "integer", + "x-example": 4 + }, + { + "description": "Story language id from wattpad-languages, for example 1 for English", + "enum": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 46, + 47, + 48, + 49, + 50, + 51, + 53 + ], + "in": "query", + "name": "language", + "type": "integer", + "x-example": 1 + }, + { + "description": "Page size, 1 to 100; defaults to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 20 + }, + { + "description": "Zero-based result offset; below 10000 with query, below 1500 without", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -518934,7 +533582,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/walmart.productResponseDoc" + "$ref": "#/definitions/wattpad.searchResponseDoc" } }, "400": { @@ -518943,14 +533591,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -518967,27 +533609,41 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Walmart product", + "summary": "Search and browse Wattpad stories", "tags": [ - "Walmart" + "Wattpad" ] } }, - "/walmart/product/{item_id}/reviews": { + "/wattpad/search-users": { "get": { "consumes": [ "application/json" ], - "description": "Returns the reviews snapshot embedded in a Walmart product page: average rating, total review count, the per-star rating breakdown, the recommended percentage, the top positive and top negative review, and a sample of recent reviews. This is a single on-page snapshot, not a full paginated feed. A product that exists but has no reviews returns zero counts and an empty reviews list.", - "operationId": "walmart-product-reviews", + "description": "Searches Wattpad's authors by username or name and returns one page: username, display name, bio, avatar, verified flag, published story count and follower count. limit is 1 to 100 (default 20) and offset pages the results. Authors with a private profile or who have opted out of crawling are left out, so a page can hold fewer authors than limit; advance with next_offset.", + "operationId": "wattpad-search-users", "parameters": [ { - "description": "Walmart item id (the numeric id in a /ip/{id} URL)", - "in": "path", - "name": "item_id", + "description": "Author name to search for, up to 200 characters", + "in": "query", + "name": "query", "required": true, "type": "string", - "x-example": "5689919121" + "x-example": "notjust" + }, + { + "description": "Page size, 1 to 100; defaults to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 5 + }, + { + "description": "Zero-based result offset, below 10000; defaults to 0", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], "produces": [ @@ -518997,7 +533653,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/walmart.reviewsResponseDoc" + "$ref": "#/definitions/wattpad.searchUsersResponseDoc" } }, "400": { @@ -519006,14 +533662,8 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -519030,47 +533680,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get Walmart product reviews", + "summary": "Search Wattpad authors by name", "tags": [ - "Walmart" + "Wattpad" ] } }, - "/walmart/search": { + "/wattpad/story": { "get": { "consumes": [ "application/json" ], - "description": "Returns Walmart search results: item id, title, brand, price, image, availability, seller, and rating per product.", - "operationId": "walmart-search", + "description": "Returns one Wattpad story's public details: title, description, cover, link, author, votes, reads, comments, chapter count, completed and mature flags, language, category ids, tags, first chapter id, last published date, rating and copyright codes, paywall flag and dates. story_id is the numeric id from the story's wattpad.com link; the full link is also accepted. A story that does not exist returns not found. Chapter text is never returned.", + "operationId": "wattpad-story", "parameters": [ { - "description": "Search query", + "description": "Numeric Wattpad story id, such as 344352588; a wattpad.com/story link is also accepted", "in": "query", - "name": "q", + "name": "story_id", "required": true, "type": "string", - "x-example": "wireless earbuds" - }, - { - "description": "1-based page number (default 1)", - "in": "query", - "name": "page", - "type": "integer" - }, - { - "description": "Sort order", - "enum": [ - "best_match", - "price_low", - "price_high", - "best_seller", - "new_arrivals", - "rating_high" - ], - "in": "query", - "name": "sort", - "type": "string" + "x-example": "344352588" } ], "produces": [ @@ -519080,7 +533710,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/walmart.searchResponseDoc" + "$ref": "#/definitions/wattpad.storyResponseDoc" } }, "400": { @@ -519095,8 +533725,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -519113,24 +533743,27 @@ "ApiKeyAuth": [] } ], - "summary": "Search Walmart products", + "summary": "Get a Wattpad story", "tags": [ - "Walmart" + "Wattpad" ] } }, - "/wapo/article": { + "/wattpad/story-parts": { "get": { - "description": "Returns one public Washington Post article's metadata and body paragraphs from a canonical article URL. Metered articles that the site truncates are not available.", - "operationId": "wapo-article", + "consumes": [ + "application/json" + ], + "description": "Returns a Wattpad story's chapter list, in reading order: id, title, link, word count, reads, votes, comments, length, and created and modified dates for every chapter. The per-chapter reads show where readers drop off. Use it to see how a story is paced and which chapters readers react to. story_id is the numeric story id, or its wattpad.com link. Chapter text is never returned.", + "operationId": "wattpad-story-parts", "parameters": [ { - "description": "Canonical Washington Post article URL", + "description": "Numeric Wattpad story id, such as 344352588; a wattpad.com/story link is also accepted", "in": "query", - "name": "url", + "name": "story_id", "required": true, "type": "string", - "x-example": "https://www.washingtonpost.com/business/2026/09/17/example-slug/" + "x-example": "344352588" } ], "produces": [ @@ -519140,7 +533773,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/wapo.articleResponseDoc" + "$ref": "#/definitions/wattpad.storyPartsResponseDoc" } }, "400": { @@ -519149,12 +533782,6 @@ "$ref": "#/definitions/app.Response" } }, - "403": { - "description": "Forbidden", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "404": { "description": "Not Found", "schema": { @@ -519179,37 +533806,34 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Washington Post article's content", + "summary": "List a Wattpad story's chapters", "tags": [ - "Washington Post" + "Wattpad" ] } }, - "/wapo/author": { + "/wattpad/story-recommendations": { "get": { - "description": "Returns one Washington Post staff author's public profile: byline metadata, bio, contact/social links, and one page of their recent articles.", - "operationId": "wapo-author", + "consumes": [ + "application/json" + ], + "description": "Returns the stories Wattpad recommends alongside one story (readers of this also read these), with the same fields as wattpad-search: id, title, description, cover, link, author, votes, reads, comments, chapter count, completed and mature flags, language, category ids, tags and dates. story_id is the numeric story id or its wattpad.com link. Wattpad returns at most 18 recommendations and does not page; limit is 1 to 20.", + "operationId": "wattpad-story-recommendations", "parameters": [ { - "description": "Washington Post people slug, e.g. adam-taylor", - "in": "query", - "name": "slug", - "type": "string", - "x-example": "adam-taylor" - }, - { - "description": "Canonical washingtonpost.com/people// URL, optionally with a ?page= query; alternative to slug", + "description": "Numeric Wattpad story id, such as 344352588; a wattpad.com/story link is also accepted", "in": "query", - "name": "url", + "name": "story_id", + "required": true, "type": "string", - "x-example": "https://www.washingtonpost.com/people/adam-taylor/?page=2" + "x-example": "344352588" }, { - "default": 1, - "description": "1-based page number; overrides any page number in url", + "description": "Maximum recommendations to return, 1 to 20; defaults to 20", "in": "query", - "name": "page", - "type": "integer" + "name": "limit", + "type": "integer", + "x-example": 5 } ], "produces": [ @@ -519219,7 +533843,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/wapo.authorResponseDoc" + "$ref": "#/definitions/wattpad.recommendationsResponseDoc" } }, "400": { @@ -519252,24 +533876,27 @@ "ApiKeyAuth": [] } ], - "summary": "Get a Washington Post staff author profile", + "summary": "List stories Wattpad recommends for a story", "tags": [ - "Washington Post" + "Wattpad" ] } }, - "/wapo/headlines": { + "/wattpad/user": { "get": { - "description": "Returns the first page of a Washington Post section front: each story's title, canonical URL, description, section, publication time, and lead image. Section must be a path returned by /wapo/sections.", - "operationId": "wapo-headlines", + "consumes": [ + "application/json" + ], + "description": "Returns a Wattpad author's public profile: username, display name, bio, avatar, location, website, verified and ambassador flags, follower and following counts, votes received, published story count, reading list count and join date. username is the name from the author's wattpad.com/user/ link, case-insensitive. Authors with a private profile or who have opted out of crawling are not returned. An unknown author returns not found.", + "operationId": "wattpad-user", "parameters": [ { - "description": "Section path from /wapo/sections", + "description": "Wattpad username from wattpad.com/user/{username}; a profile link or @name is also accepted", "in": "query", - "name": "section", + "name": "username", "required": true, "type": "string", - "x-example": "world" + "x-example": "notjustarandomgirl" } ], "produces": [ @@ -519279,7 +533906,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/wapo.headlinesResponseDoc" + "$ref": "#/definitions/wattpad.userResponseDoc" } }, "400": { @@ -519312,54 +533939,43 @@ "ApiKeyAuth": [] } ], - "summary": "Get the latest stories in a Washington Post section", + "summary": "Get a Wattpad author profile", "tags": [ - "Washington Post" + "Wattpad" ] } }, - "/wapo/news": { + "/wattpad/user-stories": { "get": { - "description": "Returns the current Washington Post news list with no parameters. Each item has its `title`, canonical `url`, `published_at` and `last_modified`, the last when the publisher supplies it. Items do not include summaries or authors.", - "operationId": "wapo-news", - "produces": [ + "consumes": [ "application/json" ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/wapo.newsResponseDoc" - } + "description": "Returns one page of the stories a Wattpad author has published, with the same fields as wattpad-search: id, title, description, cover, link, votes, reads, comments, chapter count, completed and mature flags, language, category ids, tags and dates. username is the name from the author's wattpad.com/user/ link. limit is 1 to 100 (default 20) and offset pages the list; next_offset is absent on the last page. Authors with a private profile or who have opted out of crawling are not returned. This call reads the author's access settings first, so it costs two requests.", + "operationId": "wattpad-user-stories", + "parameters": [ + { + "description": "Wattpad username from wattpad.com/user/{username}; a profile link or @name is also accepted", + "in": "query", + "name": "username", + "required": true, + "type": "string", + "x-example": "notjustarandomgirl" }, - "429": { - "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/app.Response" - } + { + "description": "Page size, 1 to 100; defaults to 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 5 }, - "503": { - "description": "Service Unavailable", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - }, - "security": [ { - "ApiKeyAuth": [] + "description": "Zero-based result offset; defaults to 0", + "in": "query", + "name": "offset", + "type": "integer", + "x-example": 0 } ], - "summary": "Get the latest Washington Post stories", - "tags": [ - "Washington Post" - ] - } - }, - "/wapo/sections": { - "get": { - "description": "Lists the Washington Post sections accepted by `wapo-headlines`. Each has a path `slug` such as `politics` or `business/technology`, a display `name` and a landing-page `url`. Use it to find valid `section` values. Takes no parameters.", - "operationId": "wapo-sections", "produces": [ "application/json" ], @@ -519367,7 +533983,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/wapo.sectionsResponseDoc" + "$ref": "#/definitions/wattpad.userStoriesResponseDoc" } }, "400": { @@ -519376,6 +533992,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Too Many Requests", "schema": { @@ -519394,9 +534016,9 @@ "ApiKeyAuth": [] } ], - "summary": "List Washington Post sections", + "summary": "List a Wattpad author's stories", "tags": [ - "Washington Post" + "Wattpad" ] } }, diff --git a/pom.xml b/pom.xml index 32d65cd..5ef0ecc 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ net.crawlora crawlora-sdk - 1.49.0-sdk.4 + 1.50.0-sdk.1 jar Crawlora Java SDK diff --git a/src/main/java/net/crawlora/ClientGroups.java b/src/main/java/net/crawlora/ClientGroups.java index ceaf9fc..e19281a 100644 --- a/src/main/java/net/crawlora/ClientGroups.java +++ b/src/main/java/net/crawlora/ClientGroups.java @@ -922,6 +922,14 @@ public DraftKingsSportsbookGroup draftKingsSportsbook() { return new DraftKingsSportsbookGroup((CrawloraClient) this); } + /** + * Typed accessor for the "dramaBox" operation group. + * @return a new {@link DramaBoxGroup} bound to this client + */ + public DramaBoxGroup dramaBox() { + return new DramaBoxGroup((CrawloraClient) this); + } + /** * Typed accessor for the "duckDuckGoSearch" operation group. * @return a new {@link DuckDuckGoSearchGroup} bound to this client @@ -1754,6 +1762,14 @@ public KhaleejTimesGroup khaleejTimes() { return new KhaleejTimesGroup((CrawloraClient) this); } + /** + * Typed accessor for the "kick" operation group. + * @return a new {@link KickGroup} bound to this client + */ + public KickGroup kick() { + return new KickGroup((CrawloraClient) this); + } + /** * Typed accessor for the "kickstarter" operation group. * @return a new {@link KickstarterGroup} bound to this client @@ -2482,6 +2498,14 @@ public PradaGroup prada() { return new PradaGroup((CrawloraClient) this); } + /** + * Typed accessor for the "priceCharting" operation group. + * @return a new {@link PriceChartingGroup} bound to this client + */ + public PriceChartingGroup priceCharting() { + return new PriceChartingGroup((CrawloraClient) this); + } + /** * Typed accessor for the "pristineAuction" operation group. * @return a new {@link PristineAuctionGroup} bound to this client @@ -2602,6 +2626,14 @@ public RedfinGroup redfin() { return new RedfinGroup((CrawloraClient) this); } + /** + * Typed accessor for the "reelShort" operation group. + * @return a new {@link ReelShortGroup} bound to this client + */ + public ReelShortGroup reelShort() { + return new ReelShortGroup((CrawloraClient) this); + } + /** * Typed accessor for the "referrals" operation group. * @return a new {@link ReferralsGroup} bound to this client @@ -3130,6 +3162,14 @@ public TargetGroup target() { return new TargetGroup((CrawloraClient) this); } + /** + * Typed accessor for the "tcgplayer" operation group. + * @return a new {@link TcgplayerGroup} bound to this client + */ + public TcgplayerGroup tcgplayer() { + return new TcgplayerGroup((CrawloraClient) this); + } + /** * Typed accessor for the "techCrunch" operation group. * @return a new {@link TechCrunchGroup} bound to this client @@ -3146,6 +3186,14 @@ public TechRadarGroup techRadar() { return new TechRadarGroup((CrawloraClient) this); } + /** + * Typed accessor for the "telegram" operation group. + * @return a new {@link TelegramGroup} bound to this client + */ + public TelegramGroup telegram() { + return new TelegramGroup((CrawloraClient) this); + } + /** * Typed accessor for the "theTelegraph" operation group. * @return a new {@link TheTelegraphGroup} bound to this client @@ -3594,6 +3642,14 @@ public WalgreensGroup walgreens() { return new WalgreensGroup((CrawloraClient) this); } + /** + * Typed accessor for the "wallapop" operation group. + * @return a new {@link WallapopGroup} bound to this client + */ + public WallapopGroup wallapop() { + return new WallapopGroup((CrawloraClient) this); + } + /** * Typed accessor for the "walmart" operation group. * @return a new {@link WalmartGroup} bound to this client @@ -3610,6 +3666,14 @@ public WashingtonPostGroup washingtonPost() { return new WashingtonPostGroup((CrawloraClient) this); } + /** + * Typed accessor for the "wattpad" operation group. + * @return a new {@link WattpadGroup} bound to this client + */ + public WattpadGroup wattpad() { + return new WattpadGroup((CrawloraClient) this); + } + /** * Typed accessor for the "wayfair" operation group. * @return a new {@link WayfairGroup} bound to this client diff --git a/src/main/java/net/crawlora/OperationId.java b/src/main/java/net/crawlora/OperationId.java index d053542..9d6d716 100644 --- a/src/main/java/net/crawlora/OperationId.java +++ b/src/main/java/net/crawlora/OperationId.java @@ -60,9 +60,14 @@ private OperationId() {} public static final String AL_JAZEERA_ALJAZEERA_CATEGORIES = "aljazeera-categories"; public static final String AL_JAZEERA_ALJAZEERA_HEADLINES = "aljazeera-headlines"; public static final String AL_JAZEERA_ALJAZEERA_TOPIC = "aljazeera-topic"; + public static final String ALI_EXPRESS_ALIEXPRESS_CATEGORIES = "aliexpress-categories"; + public static final String ALI_EXPRESS_ALIEXPRESS_CATEGORY_IDS = "aliexpress-category-ids"; + public static final String ALI_EXPRESS_ALIEXPRESS_CATEGORY_PRODUCTS = "aliexpress-category-products"; public static final String ALI_EXPRESS_ALIEXPRESS_REVIEWS = "aliexpress-reviews"; public static final String ALI_EXPRESS_ALIEXPRESS_SEARCH = "aliexpress-search"; public static final String ALI_EXPRESS_ALIEXPRESS_SEARCH_FILTERS = "aliexpress-search-filters"; + public static final String ALI_EXPRESS_ALIEXPRESS_SUGGEST = "aliexpress-suggest"; + public static final String ALI_EXPRESS_ALIEXPRESS_TRENDING_SEARCHES = "aliexpress-trending-searches"; public static final String ALLBIRDS_COLLECTION_PRODUCTS = "allbirds-collection-products"; public static final String ALLBIRDS_COLLECTIONS = "allbirds-collections"; public static final String ALLBIRDS_PAGE = "allbirds-page"; @@ -635,6 +640,10 @@ private OperationId() {} public static final String DATASETS_AIRBNB_MARKETS_ITEM = "datasets-airbnb-markets-item"; public static final String DATASETS_AIRBNB_MARKETS_NEARBY = "datasets-airbnb-markets-nearby"; public static final String DATASETS_AIRBNB_MARKETS_SEARCH = "datasets-airbnb-markets-search"; + public static final String DATASETS_APPLE_MAPS_PLACES_FACETS = "datasets-apple-maps-places-facets"; + public static final String DATASETS_APPLE_MAPS_PLACES_ITEM = "datasets-apple-maps-places-item"; + public static final String DATASETS_APPLE_MAPS_PLACES_NEARBY = "datasets-apple-maps-places-nearby"; + public static final String DATASETS_APPLE_MAPS_PLACES_SEARCH = "datasets-apple-maps-places-search"; public static final String DATASETS_APPLE_PODCASTS_SHOWS_FACETS = "datasets-apple-podcasts-shows-facets"; public static final String DATASETS_APPLE_PODCASTS_SHOWS_ITEM = "datasets-apple-podcasts-shows-item"; public static final String DATASETS_APPLE_PODCASTS_SHOWS_SEARCH = "datasets-apple-podcasts-shows-search"; @@ -848,6 +857,22 @@ private OperationId() {} public static final String DRAFT_KINGS_SPORTSBOOK_DRAFTKINGS_QUICK_LINKS = "draftkings-quick-links"; public static final String DRAFT_KINGS_SPORTSBOOK_DRAFTKINGS_TEAM = "draftkings-team"; public static final String DRAFT_KINGS_SPORTSBOOK_DRAFTKINGS_TEAMS = "draftkings-teams"; + public static final String DRAMA_BOX_DRAMABOX_BROWSE = "dramabox-browse"; + public static final String DRAMA_BOX_DRAMABOX_CATEGORIES = "dramabox-categories"; + public static final String DRAMA_BOX_DRAMABOX_CATEGORY_BOOKS = "dramabox-category-books"; + public static final String DRAMA_BOX_DRAMABOX_CHANNELS = "dramabox-channels"; + public static final String DRAMA_BOX_DRAMABOX_DRAMA = "dramabox-drama"; + public static final String DRAMA_BOX_DRAMABOX_GENRES = "dramabox-genres"; + public static final String DRAMA_BOX_DRAMABOX_HOME = "dramabox-home"; + public static final String DRAMA_BOX_DRAMABOX_MORE = "dramabox-more"; + public static final String DRAMA_BOX_DRAMABOX_PERFORMER = "dramabox-performer"; + public static final String DRAMA_BOX_DRAMABOX_RANK = "dramabox-rank"; + public static final String DRAMA_BOX_DRAMABOX_RECOMMEND = "dramabox-recommend"; + public static final String DRAMA_BOX_DRAMABOX_SEARCH = "dramabox-search"; + public static final String DRAMA_BOX_DRAMABOX_SUGGEST = "dramabox-suggest"; + public static final String DRAMA_BOX_DRAMABOX_TAG = "dramabox-tag"; + public static final String DRAMA_BOX_DRAMABOX_THEATER = "dramabox-theater"; + public static final String DRAMA_BOX_DRAMABOX_TRENDING = "dramabox-trending"; public static final String DUCK_DUCK_GO_SEARCH_DUCKDUCKGO_IMAGE = "duckduckgo-image"; public static final String DUCK_DUCK_GO_SEARCH_DUCKDUCKGO_NEWS = "duckduckgo-news"; public static final String DUCK_DUCK_GO_SEARCH_DUCKDUCKGO_SEARCH = "duckduckgo-search"; @@ -1710,7 +1735,10 @@ private OperationId() {} public static final String JUMIA_CATEGORY = "jumia-category"; public static final String JUMIA_COUNTRIES = "jumia-countries"; public static final String JUMIA_PRODUCT = "jumia-product"; + public static final String JUMIA_REVIEWS = "jumia-reviews"; public static final String JUMIA_SEARCH = "jumia-search"; + public static final String JUMIA_SITEMAP_URLS = "jumia-sitemap-urls"; + public static final String JUMIA_SITEMAPS = "jumia-sitemaps"; public static final String JUST_EAT_JUSTEAT_RESTAURANT = "justeat-restaurant"; public static final String JUST_EAT_JUSTEAT_RESTAURANT_MENU = "justeat-restaurant-menu"; public static final String JUST_EAT_JUSTEAT_SEARCH = "justeat-search"; @@ -1769,6 +1797,27 @@ private OperationId() {} public static final String KHALEEJ_TIMES_KHALEEJTIMES_HEADLINES = "khaleejtimes-headlines"; public static final String KHALEEJ_TIMES_KHALEEJTIMES_NEWS = "khaleejtimes-news"; public static final String KHALEEJ_TIMES_KHALEEJTIMES_SECTIONS = "khaleejtimes-sections"; + public static final String KICK_CATEGORIES = "kick-categories"; + public static final String KICK_CATEGORY_CLIPS = "kick-category-clips"; + public static final String KICK_CHANNEL = "kick-channel"; + public static final String KICK_CHANNEL_CHATROOM = "kick-channel-chatroom"; + public static final String KICK_CHANNEL_CLIPS = "kick-channel-clips"; + public static final String KICK_CHANNEL_EMOTES = "kick-channel-emotes"; + public static final String KICK_CHANNEL_LINKS = "kick-channel-links"; + public static final String KICK_CHANNEL_STREAMS = "kick-channel-streams"; + public static final String KICK_CHANNEL_VIDEOS = "kick-channel-videos"; + public static final String KICK_CLIP = "kick-clip"; + public static final String KICK_CLIPS = "kick-clips"; + public static final String KICK_DROPS = "kick-drops"; + public static final String KICK_GIFTS = "kick-gifts"; + public static final String KICK_LANGUAGES = "kick-languages"; + public static final String KICK_LIVESTREAMS = "kick-livestreams"; + public static final String KICK_SEARCH_CATEGORIES = "kick-search-categories"; + public static final String KICK_SEARCH_CHANNELS = "kick-search-channels"; + public static final String KICK_SUBCATEGORIES = "kick-subcategories"; + public static final String KICK_SUBCATEGORY = "kick-subcategory"; + public static final String KICK_TOP_CHANNELS = "kick-top-channels"; + public static final String KICK_VIDEO = "kick-video"; public static final String KICKSTARTER_COMMENTS = "kickstarter-comments"; public static final String KICKSTARTER_DISCOVER = "kickstarter-discover"; public static final String KICKSTARTER_PROJECT = "kickstarter-project"; @@ -2453,6 +2502,12 @@ private OperationId() {} public static final String PRADA_SEARCH = "prada-search"; public static final String PRADA_STORES = "prada-stores"; public static final String PRADA_SUGGEST = "prada-suggest"; + public static final String PRICE_CHARTING_PRICECHARTING_BIG_MOVERS = "pricecharting-big-movers"; + public static final String PRICE_CHARTING_PRICECHARTING_CATEGORIES = "pricecharting-categories"; + public static final String PRICE_CHARTING_PRICECHARTING_CONSOLE = "pricecharting-console"; + public static final String PRICE_CHARTING_PRICECHARTING_PRICE_HISTORY = "pricecharting-price-history"; + public static final String PRICE_CHARTING_PRICECHARTING_PRODUCT = "pricecharting-product"; + public static final String PRICE_CHARTING_PRICECHARTING_SEARCH = "pricecharting-search"; public static final String PRISTINE_AUCTION_CATEGORIES = "pristine-auction-categories"; public static final String PRISTINE_AUCTION_LOT_DETAIL = "pristine-auction-lot-detail"; public static final String PRISTINE_AUCTION_SEARCH = "pristine-auction-search"; @@ -2496,6 +2551,7 @@ private OperationId() {} public static final String PSA_PRICE_GUIDE_CATEGORIES = "psa-price-guide-categories"; public static final String PSA_PRICE_GUIDE_SEARCH = "psa-price-guide-search"; public static final String PSA_PRICE_GUIDE_SET = "psa-price-guide-set"; + public static final String PSA_PRICE_GUIDE_SETS = "psa-price-guide-sets"; public static final String PSA_PROBATFACTS_CATEGORIES = "psa-probatfacts-categories"; public static final String PSA_PROBATFACTS_GALLERY = "psa-probatfacts-gallery"; public static final String PSA_PROBATFACTS_SUBJECT = "psa-probatfacts-subject"; @@ -2582,6 +2638,17 @@ private OperationId() {} public static final String REDFIN_REGION_TRENDS = "redfin-region-trends"; public static final String REDFIN_SEARCH = "redfin-search"; public static final String REDFIN_SIMILAR = "redfin-similar"; + public static final String REEL_SHORT_REELSHORT_FANDOM_CATEGORIES = "reelshort-fandom-categories"; + public static final String REEL_SHORT_REELSHORT_FANDOM_POST = "reelshort-fandom-post"; + public static final String REEL_SHORT_REELSHORT_FANDOM_POSTS = "reelshort-fandom-posts"; + public static final String REEL_SHORT_REELSHORT_HOME = "reelshort-home"; + public static final String REEL_SHORT_REELSHORT_MOVIE = "reelshort-movie"; + public static final String REEL_SHORT_REELSHORT_NEW_RELEASES = "reelshort-new-releases"; + public static final String REEL_SHORT_REELSHORT_SEARCH = "reelshort-search"; + public static final String REEL_SHORT_REELSHORT_SHELF = "reelshort-shelf"; + public static final String REEL_SHORT_REELSHORT_TAG_BOOKS = "reelshort-tag-books"; + public static final String REEL_SHORT_REELSHORT_TAG_SEARCH = "reelshort-tag-search"; + public static final String REEL_SHORT_REELSHORT_TAGS = "reelshort-tags"; public static final String REFERRALS_CLICK = "referrals-click"; public static final String REFERRALS_ME = "referrals-me"; public static final String REFERRALS_ME_EVENTS = "referrals-me-events"; @@ -3218,6 +3285,15 @@ private OperationId() {} public static final String TARGET_REVIEWS = "target-reviews"; public static final String TARGET_SEARCH = "target-search"; public static final String TARGET_STORES = "target-stores"; + public static final String TCGPLAYER_FILTERS = "tcgplayer-filters"; + public static final String TCGPLAYER_LISTINGS = "tcgplayer-listings"; + public static final String TCGPLAYER_PRICE_GUIDE = "tcgplayer-price-guide"; + public static final String TCGPLAYER_PRICE_HISTORY = "tcgplayer-price-history"; + public static final String TCGPLAYER_PRODUCT = "tcgplayer-product"; + public static final String TCGPLAYER_PRODUCT_LINES = "tcgplayer-product-lines"; + public static final String TCGPLAYER_SALES = "tcgplayer-sales"; + public static final String TCGPLAYER_SEARCH = "tcgplayer-search"; + public static final String TCGPLAYER_SETS = "tcgplayer-sets"; public static final String TECH_CRUNCH_TECHCRUNCH_ARTICLE = "techcrunch-article"; public static final String TECH_CRUNCH_TECHCRUNCH_AUTHOR = "techcrunch-author"; public static final String TECH_CRUNCH_TECHCRUNCH_HEADLINES = "techcrunch-headlines"; @@ -3228,6 +3304,11 @@ private OperationId() {} public static final String TECH_RADAR_TECHRADAR_HEADLINES = "techradar-headlines"; public static final String TECH_RADAR_TECHRADAR_NEWS = "techradar-news"; public static final String TECH_RADAR_TECHRADAR_SECTIONS = "techradar-sections"; + public static final String TELEGRAM_BOT = "telegram-bot"; + public static final String TELEGRAM_CHANNEL = "telegram-channel"; + public static final String TELEGRAM_CHANNEL_POSTS = "telegram-channel-posts"; + public static final String TELEGRAM_GROUP = "telegram-group"; + public static final String TELEGRAM_POST = "telegram-post"; public static final String TES_JOB_DETAIL = "tes-job-detail"; public static final String TES_JOB_EMPLOYER = "tes-job-employer"; public static final String TES_JOB_SEARCH = "tes-job-search"; @@ -3689,6 +3770,11 @@ private OperationId() {} public static final String WALGREENS_STORES = "walgreens-stores"; public static final String WALL_STREET_JOURNAL_WSJ_ARTICLE = "wsj-article"; public static final String WALL_STREET_JOURNAL_WSJ_AUTHOR = "wsj-author"; + public static final String WALLAPOP_CATEGORIES = "wallapop-categories"; + public static final String WALLAPOP_FILTER_OPTIONS = "wallapop-filter-options"; + public static final String WALLAPOP_FILTERS = "wallapop-filters"; + public static final String WALLAPOP_ITEM_DETAIL = "wallapop-item-detail"; + public static final String WALLAPOP_SEARCH = "wallapop-search"; public static final String WALMART_PRODUCT = "walmart-product"; public static final String WALMART_PRODUCT_REVIEWS = "walmart-product-reviews"; public static final String WALMART_SEARCH = "walmart-search"; @@ -3697,6 +3783,17 @@ private OperationId() {} public static final String WASHINGTON_POST_WAPO_HEADLINES = "wapo-headlines"; public static final String WASHINGTON_POST_WAPO_NEWS = "wapo-news"; public static final String WASHINGTON_POST_WAPO_SECTIONS = "wapo-sections"; + public static final String WATTPAD_CATEGORIES = "wattpad-categories"; + public static final String WATTPAD_LANGUAGES = "wattpad-languages"; + public static final String WATTPAD_PART = "wattpad-part"; + public static final String WATTPAD_PART_COMMENTS = "wattpad-part-comments"; + public static final String WATTPAD_SEARCH = "wattpad-search"; + public static final String WATTPAD_SEARCH_USERS = "wattpad-search-users"; + public static final String WATTPAD_STORY = "wattpad-story"; + public static final String WATTPAD_STORY_PARTS = "wattpad-story-parts"; + public static final String WATTPAD_STORY_RECOMMENDATIONS = "wattpad-story-recommendations"; + public static final String WATTPAD_USER = "wattpad-user"; + public static final String WATTPAD_USER_STORIES = "wattpad-user-stories"; public static final String WAYFAIR_CATEGORIES = "wayfair-categories"; public static final String WAYFAIR_CATEGORY = "wayfair-category"; public static final String WAYFAIR_PRODUCT = "wayfair-product"; diff --git a/src/main/java/net/crawlora/Operations.java b/src/main/java/net/crawlora/Operations.java index dd46eb7..4b51ad3 100644 --- a/src/main/java/net/crawlora/Operations.java +++ b/src/main/java/net/crawlora/Operations.java @@ -15,7 +15,7 @@ public final class Operations { private Operations() {} /** Total number of operations in the contract. */ - public static final int OPERATION_COUNT = 3915; + public static final int OPERATION_COUNT = 4012; /** Immutable map of operation id to its runtime metadata. */ public static final Map OPERATIONS = buildOperations(); @@ -91,6 +91,7 @@ private static Map buildOperations() { putOperations63(m); putOperations64(m); putOperations65(m); + putOperations66(m); return Map.copyOf(m); } @@ -962,6 +963,49 @@ private static void putOperations0(Map m) { } private static void putOperations1(Map m) { + m.put("aliexpress-categories", new Operation( + "aliexpress-categories", + "GET", + "/aliexpress/categories", + List.of(), + List.of( + new QueryParam("category_tab", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("aliexpress-category-ids", new Operation( + "aliexpress-category-ids", + "GET", + "/aliexpress/category-ids", + List.of(), + List.of( + new QueryParam("q", false, "string", List.of()), + new QueryParam("category_id", false, "integer", List.of()), + new QueryParam("page", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("aliexpress-category-products", new Operation( + "aliexpress-category-products", + "GET", + "/aliexpress/category-products", + List.of(), + List.of( + new QueryParam("category_id", true, "integer", List.of()), + new QueryParam("slug", false, "string", List.of()), + new QueryParam("page", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); m.put("aliexpress-reviews", new Operation( "aliexpress-reviews", "GET", @@ -989,7 +1033,8 @@ private static void putOperations1(Map m) { new QueryParam("max_price", false, "number", List.of()), new QueryParam("free_shipping", false, "boolean", List.of()), new QueryParam("choice", false, "boolean", List.of()), - new QueryParam("attr", false, "string", List.of())), + new QueryParam("attr", false, "string", List.of()), + new QueryParam("cat_id", false, "integer", List.of())), List.of(), null, false, @@ -1009,6 +1054,33 @@ private static void putOperations1(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("aliexpress-suggest", new Operation( + "aliexpress-suggest", + "GET", + "/aliexpress/suggest", + List.of(), + List.of( + new QueryParam("q", true, "string", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("aliexpress-trending-searches", new Operation( + "aliexpress-trending-searches", + "GET", + "/aliexpress/trending-searches", + List.of(), + List.of( + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("aljazeera-article", new Operation( "aljazeera-article", "GET", @@ -1733,6 +1805,9 @@ private static void putOperations1(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations2(Map m) { m.put("apkTeardownDiff", new Operation( "apkTeardownDiff", "GET", @@ -1796,9 +1871,6 @@ private static void putOperations1(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations2(Map m) { m.put("apnews-article", new Operation( "apnews-article", "GET", @@ -2645,6 +2717,9 @@ private static void putOperations2(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations3(Map m) { m.put("appstore-list", new Operation( "appstore-list", "GET", @@ -2730,9 +2805,6 @@ private static void putOperations2(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations3(Map m) { m.put("appstore-similar", new Operation( "appstore-similar", "GET", @@ -3494,6 +3566,9 @@ private static void putOperations3(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations4(Map m) { m.put("bbb-scamtracker-search", new Operation( "bbb-scamtracker-search", "GET", @@ -3589,9 +3664,6 @@ private static void putOperations3(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations4(Map m) { m.put("bbc-article", new Operation( "bbc-article", "GET", @@ -4321,6 +4393,9 @@ private static void putOperations4(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations5(Map m) { m.put("birminghammail-author", new Operation( "birminghammail-author", "GET", @@ -4386,9 +4461,6 @@ private static void putOperations4(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations5(Map m) { m.put("bleacherreport-author", new Operation( "bleacherreport-author", "GET", @@ -5198,6 +5270,9 @@ private static void putOperations5(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations6(Map m) { m.put("boxofficemojo-weekend-domestic-estimates", new Operation( "boxofficemojo-weekend-domestic-estimates", "GET", @@ -5272,9 +5347,6 @@ private static void putOperations5(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations6(Map m) { m.put("brave-news", new Operation( "brave-news", "GET", @@ -6041,6 +6113,9 @@ private static void putOperations6(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations7(Map m) { m.put("carsdotcom-search", new Operation( "carsdotcom-search", "GET", @@ -6109,9 +6184,6 @@ private static void putOperations6(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations7(Map m) { m.put("cbc-news", new Operation( "cbc-news", "GET", @@ -6871,6 +6943,9 @@ private static void putOperations7(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations8(Map m) { m.put("chromewebstore-collection", new Operation( "chromewebstore-collection", "GET", @@ -6948,9 +7023,6 @@ private static void putOperations7(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations8(Map m) { m.put("chromewebstore-reviews", new Operation( "chromewebstore-reviews", "GET", @@ -7724,6 +7796,9 @@ private static void putOperations8(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations9(Map m) { m.put("colehaan-page", new Operation( "colehaan-page", "GET", @@ -7791,9 +7866,6 @@ private static void putOperations8(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations9(Map m) { m.put("colehaan-sitemap-urls", new Operation( "colehaan-sitemap-urls", "GET", @@ -8542,6 +8614,9 @@ private static void putOperations9(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations10(Map m) { m.put("culvers-menu", new Operation( "culvers-menu", "GET", @@ -8607,9 +8682,6 @@ private static void putOperations9(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations10(Map m) { m.put("cvs-product-ingredients", new Operation( "cvs-product-ingredients", "GET", @@ -9240,6 +9312,92 @@ private static void putOperations10(Map m) { List.of("ApiKeyAuth"), true, List.of())); + m.put("datasets-apple-maps-places-facets", new Operation( + "datasets-apple-maps-places-facets", + "GET", + "/datasets/apple-maps-places/facets", + List.of(), + List.of( + new QueryParam("facet", true, "string", List.of("category", "country_code", "state", "city", "price_symbol", "catalog_country")), + new QueryParam("q", false, "string", List.of()), + new QueryParam("category", false, "string", List.of()), + new QueryParam("city", false, "string", List.of()), + new QueryParam("state", false, "string", List.of()), + new QueryParam("country_code", false, "string", List.of()), + new QueryParam("postal_code", false, "string", List.of()), + new QueryParam("min_rating", false, "number", List.of()), + new QueryParam("min_rating_count", false, "integer", List.of()), + new QueryParam("has_website", false, "boolean", List.of()), + new QueryParam("has_phone", false, "boolean", List.of()), + new QueryParam("lat", false, "number", List.of()), + new QueryParam("lon", false, "number", List.of()), + new QueryParam("radius_m", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("datasets-apple-maps-places-item", new Operation( + "datasets-apple-maps-places-item", + "GET", + "/datasets/apple-maps-places/items/{place_id}", + List.of("place_id"), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("datasets-apple-maps-places-nearby", new Operation( + "datasets-apple-maps-places-nearby", + "GET", + "/datasets/apple-maps-places/nearby", + List.of(), + List.of( + new QueryParam("lat", true, "number", List.of()), + new QueryParam("lon", true, "number", List.of()), + new QueryParam("radius_m", true, "integer", List.of()), + new QueryParam("category", false, "string", List.of()), + new QueryParam("min_rating", false, "number", List.of()), + new QueryParam("min_rating_count", false, "integer", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("page_size", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("datasets-apple-maps-places-search", new Operation( + "datasets-apple-maps-places-search", + "GET", + "/datasets/apple-maps-places/search", + List.of(), + List.of( + new QueryParam("q", false, "string", List.of()), + new QueryParam("category", false, "string", List.of()), + new QueryParam("city", false, "string", List.of()), + new QueryParam("state", false, "string", List.of()), + new QueryParam("country_code", false, "string", List.of()), + new QueryParam("postal_code", false, "string", List.of()), + new QueryParam("min_rating", false, "number", List.of()), + new QueryParam("min_rating_count", false, "integer", List.of()), + new QueryParam("has_website", false, "boolean", List.of()), + new QueryParam("has_phone", false, "boolean", List.of()), + new QueryParam("lat", false, "number", List.of()), + new QueryParam("lon", false, "number", List.of()), + new QueryParam("radius_m", false, "integer", List.of()), + new QueryParam("sort", false, "string", List.of("relevance", "rating_desc", "review_count_desc", "updated_at_desc", "distance_asc")), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("page_size", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); m.put("datasets-apple-podcasts-shows-facets", new Operation( "datasets-apple-podcasts-shows-facets", "GET", @@ -9318,6 +9476,9 @@ private static void putOperations10(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations11(Map m) { m.put("datasets-apps-reviews-search", new Operation( "datasets-apps-reviews-search", "GET", @@ -9517,9 +9678,6 @@ private static void putOperations10(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations11(Map m) { m.put("datasets-boxofficemojo-item", new Operation( "datasets-boxofficemojo-item", "GET", @@ -10669,6 +10827,9 @@ private static void putOperations11(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations12(Map m) { m.put("datasets-numbeo-cities-search", new Operation( "datasets-numbeo-cities-search", "GET", @@ -10848,9 +11009,6 @@ private static void putOperations11(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations12(Map m) { m.put("datasets-pitchbook-funds-facets", new Operation( "datasets-pitchbook-funds-facets", "GET", @@ -11890,6 +12048,9 @@ private static void putOperations12(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations13(Map m) { m.put("datasets-vehicle-listings-search", new Operation( "datasets-vehicle-listings-search", "GET", @@ -12098,9 +12259,6 @@ private static void putOperations12(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations13(Map m) { m.put("dawn-headlines", new Operation( "dawn-headlines", "GET", @@ -12828,6 +12986,9 @@ private static void putOperations13(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations14(Map m) { m.put("doordash-store-fulfillment", new Operation( "doordash-store-fulfillment", "GET", @@ -12946,9 +13107,6 @@ private static void putOperations13(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations14(Map m) { m.put("draftkings-casino-wheel-of-fortune-guide", new Operation( "draftkings-casino-wheel-of-fortune-guide", "GET", @@ -13285,6 +13443,231 @@ private static void putOperations14(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("dramabox-browse", new Operation( + "dramabox-browse", + "GET", + "/dramabox/browse", + List.of(), + List.of( + new QueryParam("genre_id", false, "integer", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("language", false, "string", List.of("en", "ko", "zhHans", "zh", "es", "ja", "de", "in", "th", "tl", "pt", "fr", "ar", "it"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-categories", new Operation( + "dramabox-categories", + "GET", + "/dramabox/categories", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("dramabox-category-books", new Operation( + "dramabox-category-books", + "GET", + "/dramabox/category-books", + List.of(), + List.of( + new QueryParam("language", false, "string", List.of()), + new QueryParam("production", false, "string", List.of("3", "1", "2")), + new QueryParam("dub", false, "string", List.of("1", "0")), + new QueryParam("genre", false, "string", List.of()), + new QueryParam("genre_2", false, "string", List.of()), + new QueryParam("sort", false, "string", List.of("1", "2", "3")), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-channels", new Operation( + "dramabox-channels", + "GET", + "/dramabox/channels", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("dramabox-drama", new Operation( + "dramabox-drama", + "GET", + "/dramabox/drama", + List.of(), + List.of( + new QueryParam("id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("dramabox-genres", new Operation( + "dramabox-genres", + "GET", + "/dramabox/genres", + List.of(), + List.of( + new QueryParam("language", false, "string", List.of("en", "ko", "zhHans", "zh", "es", "ja", "de", "in", "th", "tl", "pt", "fr", "ar", "it"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("dramabox-home", new Operation( + "dramabox-home", + "GET", + "/dramabox/home", + List.of(), + List.of( + new QueryParam("language", false, "string", List.of("en", "ko", "zhHans", "zh", "es", "ja", "de", "in", "th", "tl", "pt", "fr", "ar", "it"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("dramabox-more", new Operation( + "dramabox-more", + "GET", + "/dramabox/more", + List.of(), + List.of( + new QueryParam("position", true, "string", List.of("trending", "must-sees", "hidden-gems")), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("language", false, "string", List.of("en", "ko", "zhHans", "zh", "es", "ja", "de", "in", "th", "tl", "pt", "fr", "ar", "it"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-performer", new Operation( + "dramabox-performer", + "GET", + "/dramabox/performer", + List.of(), + List.of( + new QueryParam("performer_id", true, "integer", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-rank", new Operation( + "dramabox-rank", + "GET", + "/dramabox/rank", + List.of(), + List.of( + new QueryParam("rank_type", false, "integer", List.of("1", "2", "3"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("dramabox-recommend", new Operation( + "dramabox-recommend", + "GET", + "/dramabox/recommend", + List.of(), + List.of( + new QueryParam("page", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-search", new Operation( + "dramabox-search", + "GET", + "/dramabox/search", + List.of(), + List.of( + new QueryParam("keyword", true, "string", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("sort", false, "integer", List.of("1", "2", "3"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-suggest", new Operation( + "dramabox-suggest", + "GET", + "/dramabox/suggest", + List.of(), + List.of( + new QueryParam("keyword", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("dramabox-tag", new Operation( + "dramabox-tag", + "GET", + "/dramabox/tag", + List.of(), + List.of( + new QueryParam("tag_id", true, "integer", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-theater", new Operation( + "dramabox-theater", + "GET", + "/dramabox/theater", + List.of(), + List.of( + new QueryParam("channel", true, "string", List.of("popular", "new", "rankings", "categories", "anime", "live-action", "vip", "original")), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("dramabox-trending", new Operation( + "dramabox-trending", + "GET", + "/dramabox/trending", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("duckduckgo-image", new Operation( "duckduckgo-image", "GET", @@ -13401,6 +13784,9 @@ private static void putOperations14(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations15(Map m) { m.put("dunkin-nearby", new Operation( "dunkin-nearby", "GET", @@ -13723,9 +14109,6 @@ private static void putOperations14(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations15(Map m) { m.put("engadget-headlines", new Operation( "engadget-headlines", "GET", @@ -14200,6 +14583,9 @@ private static void putOperations15(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations16(Map m) { m.put("everlane-product-recommendations", new Operation( "everlane-product-recommendations", "GET", @@ -14522,9 +14908,6 @@ private static void putOperations15(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations16(Map m) { m.put("fanatics-categories", new Operation( "fanatics-categories", "GET", @@ -15058,6 +15441,9 @@ private static void putOperations16(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations17(Map m) { m.put("fanduel-research", new Operation( "fanduel-research", "GET", @@ -15430,9 +15816,6 @@ private static void putOperations16(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations17(Map m) { m.put("fanduel-sportsbook-event-stats", new Operation( "fanduel-sportsbook-event-stats", "GET", @@ -15954,6 +16337,9 @@ private static void putOperations17(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations18(Map m) { m.put("fashionnova-collections", new Operation( "fashionnova-collections", "GET", @@ -16293,9 +16679,6 @@ private static void putOperations17(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations18(Map m) { m.put("fastcompany-headlines", new Operation( "fastcompany-headlines", "GET", @@ -16772,6 +17155,9 @@ private static void putOperations18(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations19(Map m) { m.put("flashscore-match-stats", new Operation( "flashscore-match-stats", "GET", @@ -17104,9 +17490,6 @@ private static void putOperations18(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations19(Map m) { m.put("flashscore-team-results", new Operation( "flashscore-team-results", "GET", @@ -17584,6 +17967,9 @@ private static void putOperations19(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations20(Map m) { m.put("fortune-author", new Operation( "fortune-author", "GET", @@ -17933,9 +18319,6 @@ private static void putOperations19(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations20(Map m) { m.put("fotmob-player-match-stats", new Operation( "fotmob-player-match-stats", "GET", @@ -18408,6 +18791,9 @@ private static void putOperations20(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations21(Map m) { m.put("ft-author", new Operation( "ft-author", "GET", @@ -18784,9 +19170,6 @@ private static void putOperations20(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations21(Map m) { m.put("fussballde-position-history", new Operation( "fussballde-position-history", "GET", @@ -19359,6 +19742,9 @@ private static void putOperations21(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations22(Map m) { m.put("geocoding-reverse", new Operation( "geocoding-reverse", "GET", @@ -19716,9 +20102,6 @@ private static void putOperations21(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations22(Map m) { m.put("github-user-following", new Operation( "github-user-following", "GET", @@ -20190,6 +20573,9 @@ private static void putOperations22(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations23(Map m) { m.put("goldin-search", new Operation( "goldin-search", "GET", @@ -20520,9 +20906,6 @@ private static void putOperations22(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations23(Map m) { m.put("goodrx-drug-options", new Operation( "goodrx-drug-options", "GET", @@ -20984,6 +21367,9 @@ private static void putOperations23(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations24(Map m) { m.put("google-news-search", new Operation( "google-news-search", "POST", @@ -21342,9 +21728,6 @@ private static void putOperations23(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations24(Map m) { m.put("googleplay-permissions", new Operation( "googleplay-permissions", "GET", @@ -21877,6 +22260,9 @@ private static void putOperations24(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations25(Map m) { m.put("grubhub-restaurant", new Operation( "grubhub-restaurant", "GET", @@ -22229,9 +22615,6 @@ private static void putOperations24(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations25(Map m) { m.put("gymshark-collections", new Operation( "gymshark-collections", "GET", @@ -22732,6 +23115,9 @@ private static void putOperations25(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations26(Map m) { m.put("hermes-search", new Operation( "hermes-search", "GET", @@ -23066,9 +23452,6 @@ private static void putOperations25(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations26(Map m) { m.put("homedepot-suggest", new Operation( "homedepot-suggest", "GET", @@ -23534,6 +23917,9 @@ private static void putOperations26(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations27(Map m) { m.put("imdb-name", new Operation( "imdb-name", "GET", @@ -23919,9 +24305,6 @@ private static void putOperations26(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations27(Map m) { m.put("imdb-title-technical-specs", new Operation( "imdb-title-technical-specs", "GET", @@ -24381,6 +24764,9 @@ private static void putOperations27(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations28(Map m) { m.put("inquirer-headlines", new Operation( "inquirer-headlines", "GET", @@ -24709,9 +25095,6 @@ private static void putOperations27(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations28(Map m) { m.put("irishindependent-author", new Operation( "irishindependent-author", "GET", @@ -25180,6 +25563,9 @@ private static void putOperations28(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations29(Map m) { m.put("jobs-eightfold-board", new Operation( "jobs-eightfold-board", "GET", @@ -25568,9 +25954,6 @@ private static void putOperations28(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations29(Map m) { m.put("jobs-workable-postings", new Operation( "jobs-workable-postings", "GET", @@ -25676,6 +26059,21 @@ private static void putOperations29(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("jumia-reviews", new Operation( + "jumia-reviews", + "GET", + "/jumia/reviews", + List.of(), + List.of( + new QueryParam("country", true, "string", List.of("ci", "eg", "ke", "ma", "ng", "sn")), + new QueryParam("sku", true, "string", List.of()), + new QueryParam("page", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); m.put("jumia-search", new Operation( "jumia-search", "GET", @@ -25691,6 +26089,36 @@ private static void putOperations29(Map m) { List.of("ApiKeyAuth"), true, List.of())); + m.put("jumia-sitemap-urls", new Operation( + "jumia-sitemap-urls", + "GET", + "/jumia/sitemap-urls", + List.of(), + List.of( + new QueryParam("country", true, "string", List.of("ci", "eg", "ke", "ma", "ng", "sn")), + new QueryParam("sitemap", true, "string", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("page_size", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("jumia-sitemaps", new Operation( + "jumia-sitemaps", + "GET", + "/jumia/sitemaps", + List.of(), + List.of( + new QueryParam("country", true, "string", List.of("ci", "eg", "ke", "ma", "ng", "sn")), + new QueryParam("type", false, "string", List.of("products", "brands", "categories", "mlps"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("justeat-restaurant", new Operation( "justeat-restaurant", "GET", @@ -26055,6 +26483,9 @@ private static void putOperations29(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations30(Map m) { m.put("justwatch-title-similar", new Operation( "justwatch-title-similar", "GET", @@ -26472,9 +26903,6 @@ private static void putOperations29(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations30(Map m) { m.put("kfc-stores", new Operation( "kfc-stores", "GET", @@ -26559,6 +26987,288 @@ private static void putOperations30(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("kick-categories", new Operation( + "kick-categories", + "GET", + "/kick/categories", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-category-clips", new Operation( + "kick-category-clips", + "GET", + "/kick/category-clips", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of()), + new QueryParam("cursor", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of("cursor"))); + m.put("kick-channel", new Operation( + "kick-channel", + "GET", + "/kick/channel", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-channel-chatroom", new Operation( + "kick-channel-chatroom", + "GET", + "/kick/channel-chatroom", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-channel-clips", new Operation( + "kick-channel-clips", + "GET", + "/kick/channel-clips", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of()), + new QueryParam("cursor", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of("cursor"))); + m.put("kick-channel-emotes", new Operation( + "kick-channel-emotes", + "GET", + "/kick/channel-emotes", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-channel-links", new Operation( + "kick-channel-links", + "GET", + "/kick/channel-links", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-channel-streams", new Operation( + "kick-channel-streams", + "GET", + "/kick/channel-streams", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-channel-videos", new Operation( + "kick-channel-videos", + "GET", + "/kick/channel-videos", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-clip", new Operation( + "kick-clip", + "GET", + "/kick/clip", + List.of(), + List.of( + new QueryParam("id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-clips", new Operation( + "kick-clips", + "GET", + "/kick/clips", + List.of(), + List.of( + new QueryParam("sort", false, "string", List.of("date", "views")), + new QueryParam("time", false, "string", List.of("day", "week", "month", "all")), + new QueryParam("cursor", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of("cursor"))); + m.put("kick-drops", new Operation( + "kick-drops", + "GET", + "/kick/drops", + List.of(), + List.of( + new QueryParam("status", false, "string", List.of("active", "expired", "all"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-gifts", new Operation( + "kick-gifts", + "GET", + "/kick/gifts", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-languages", new Operation( + "kick-languages", + "GET", + "/kick/languages", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-livestreams", new Operation( + "kick-livestreams", + "GET", + "/kick/livestreams", + List.of(), + List.of( + new QueryParam("sort", false, "string", List.of("viewer_count_desc", "featured")), + new QueryParam("language", false, "string", List.of()), + new QueryParam("category_id", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("after", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-search-categories", new Operation( + "kick-search-categories", + "GET", + "/kick/search-categories", + List.of(), + List.of( + new QueryParam("query", true, "string", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-search-channels", new Operation( + "kick-search-channels", + "GET", + "/kick/search-channels", + List.of(), + List.of( + new QueryParam("query", true, "string", List.of()), + new QueryParam("live", false, "boolean", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-subcategories", new Operation( + "kick-subcategories", + "GET", + "/kick/subcategories", + List.of(), + List.of( + new QueryParam("category", false, "string", List.of("games", "irl", "music", "gambling", "creative", "alternative", "chat-roulette")), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("kick-subcategory", new Operation( + "kick-subcategory", + "GET", + "/kick/subcategory", + List.of(), + List.of( + new QueryParam("slug", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-top-channels", new Operation( + "kick-top-channels", + "GET", + "/kick/top-channels", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("kick-video", new Operation( + "kick-video", + "GET", + "/kick/video", + List.of(), + List.of( + new QueryParam("id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("kickstarter-comments", new Operation( "kickstarter-comments", "GET", @@ -26632,6 +27342,9 @@ private static void putOperations30(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations31(Map m) { m.put("kohls-product-reviews", new Operation( "kohls-product-reviews", "GET", @@ -27311,9 +28024,6 @@ private static void putOperations30(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations31(Map m) { m.put("linkedin-product-categories", new Operation( "linkedin-product-categories", "GET", @@ -27457,6 +28167,9 @@ private static void putOperations31(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations32(Map m) { m.put("liverpoolecho-headlines", new Operation( "liverpoolecho-headlines", "GET", @@ -28111,9 +28824,6 @@ private static void putOperations31(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations32(Map m) { m.put("manga-title-characters", new Operation( "manga-title-characters", "GET", @@ -28261,6 +28971,9 @@ private static void putOperations32(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations33(Map m) { m.put("mashable-news", new Operation( "mashable-news", "GET", @@ -28916,9 +29629,6 @@ private static void putOperations32(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations33(Map m) { m.put("metaculus-questions", new Operation( "metaculus-questions", "GET", @@ -29076,6 +29786,9 @@ private static void putOperations33(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations34(Map m) { m.put("microsoftstore-editorial", new Operation( "microsoftstore-editorial", "GET", @@ -30025,9 +30738,6 @@ private static void putOperations33(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations34(Map m) { m.put("mlb-statcast-expected", new Operation( "mlb-statcast-expected", "GET", @@ -30294,6 +31004,9 @@ private static void putOperations34(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations35(Map m) { m.put("mlb-statcast-pitch-arsenal-details", new Operation( "mlb-statcast-pitch-arsenal-details", "GET", @@ -31124,9 +31837,6 @@ private static void putOperations34(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations35(Map m) { m.put("nationafrica-article", new Operation( "nationafrica-article", "GET", @@ -31268,6 +31978,9 @@ private static void putOperations35(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations36(Map m) { m.put("nationalpost-author", new Operation( "nationalpost-author", "GET", @@ -31893,9 +32606,6 @@ private static void putOperations35(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations36(Map m) { m.put("newyorker-sections", new Operation( "newyorker-sections", "GET", @@ -32045,6 +32755,9 @@ private static void putOperations36(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations37(Map m) { m.put("ninetofivegoogle-author", new Operation( "ninetofivegoogle-author", "GET", @@ -32669,9 +33382,6 @@ private static void putOperations36(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations37(Map m) { m.put("ohpolly-collection-products", new Operation( "ohpolly-collection-products", "GET", @@ -32819,6 +33529,9 @@ private static void putOperations37(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations38(Map m) { m.put("oldnavy-category", new Operation( "oldnavy-category", "GET", @@ -33511,9 +34224,6 @@ private static void putOperations37(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations38(Map m) { m.put("pagesix-article", new Operation( "pagesix-article", "GET", @@ -33671,6 +34381,9 @@ private static void putOperations38(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations39(Map m) { m.put("panera-at-work-locations", new Operation( "panera-at-work-locations", "GET", @@ -34338,9 +35051,6 @@ private static void putOperations38(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations39(Map m) { m.put("pcmag-sections", new Operation( "pcmag-sections", "GET", @@ -34480,6 +35190,9 @@ private static void putOperations39(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations40(Map m) { m.put("philstar-article", new Operation( "philstar-article", "GET", @@ -35161,9 +35874,6 @@ private static void putOperations39(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations40(Map m) { m.put("polygon-article", new Operation( "polygon-article", "GET", @@ -35318,6 +36028,9 @@ private static void putOperations40(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations41(Map m) { m.put("polymarket-event-detail-by-id", new Operation( "polymarket-event-detail-by-id", "GET", @@ -36015,9 +36728,6 @@ private static void putOperations40(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations41(Map m) { m.put("polymarket-token-orderbook", new Operation( "polymarket-token-orderbook", "GET", @@ -36161,6 +36871,9 @@ private static void putOperations41(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations42(Map m) { m.put("popeyes-location", new Operation( "popeyes-location", "GET", @@ -36472,6 +37185,97 @@ private static void putOperations41(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("pricecharting-big-movers", new Operation( + "pricecharting-big-movers", + "GET", + "/pricecharting/big-movers", + List.of(), + List.of( + new QueryParam("category", false, "string", List.of("video-games", "coins", "comic-books", "funko-pops", "pokemon-cards", "dragon-ball-cards", "lorcana-cards", "magic-cards", "marvel-cards", "one-piece-cards", "star-wars-cards", "yugioh-cards", "garbage-pail-cards", "other-tcg-cards", "other-cards", "lego-sets")), + new QueryParam("sort", false, "string", List.of("dollar-increase", "dollar-decrease", "percent-increase", "percent-decrease")), + new QueryParam("region", false, "string", List.of("all", "japan", "ntsc", "pal"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("pricecharting-categories", new Operation( + "pricecharting-categories", + "GET", + "/pricecharting/categories", + List.of(), + List.of( + new QueryParam("category", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("pricecharting-console", new Operation( + "pricecharting-console", + "GET", + "/pricecharting/console", + List.of(), + List.of( + new QueryParam("console", true, "string", List.of()), + new QueryParam("sort", false, "string", List.of("popularity", "highest-price", "lowest-price", "name")), + new QueryParam("cursor", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of("cursor"))); + m.put("pricecharting-price-history", new Operation( + "pricecharting-price-history", + "GET", + "/pricecharting/price-history", + List.of(), + List.of( + new QueryParam("id", false, "integer", List.of()), + new QueryParam("url", false, "string", List.of()), + new QueryParam("console", false, "string", List.of()), + new QueryParam("slug", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("pricecharting-product", new Operation( + "pricecharting-product", + "GET", + "/pricecharting/product", + List.of(), + List.of( + new QueryParam("id", false, "integer", List.of()), + new QueryParam("console", false, "string", List.of()), + new QueryParam("slug", false, "string", List.of()), + new QueryParam("url", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("pricecharting-search", new Operation( + "pricecharting-search", + "GET", + "/pricecharting/search", + List.of(), + List.of( + new QueryParam("q", true, "string", List.of()), + new QueryParam("console_uid", false, "string", List.of()), + new QueryParam("exclude_variants", false, "boolean", List.of()), + new QueryParam("sort", false, "string", List.of("popularity", "highest-price", "name"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("pristine-auction-categories", new Operation( "pristine-auction-categories", "GET", @@ -36854,9 +37658,6 @@ private static void putOperations41(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations42(Map m) { m.put("propublica-article", new Operation( "propublica-article", "GET", @@ -36921,6 +37722,9 @@ private static void putOperations42(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations43(Map m) { m.put("psa-autographfacts-categories", new Operation( "psa-autographfacts-categories", "GET", @@ -37065,6 +37869,22 @@ private static void putOperations42(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("psa-price-guide-sets", new Operation( + "psa-price-guide-sets", + "GET", + "/psa/price-guide/sets", + List.of(), + List.of( + new QueryParam("query", true, "string", List.of()), + new QueryParam("category_path", false, "string", List.of("baseball-card-values", "basketball-card-values", "boxing-card-values", "football-card-values", "golf-card-values", "hockey-card-values", "soccer-card-values", "non-sports-tcg-card-values", "racing-card-values", "sports-ticket-values", "tennis-card-values", "unopened-pack-values", "presidential-autograph-values", "sports-autograph-values", "game-used-bat-values", "graded-baseball-values")), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("page_size", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); m.put("psa-probatfacts-categories", new Operation( "psa-probatfacts-categories", "GET", @@ -37648,9 +38468,6 @@ private static void putOperations42(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations43(Map m) { m.put("rappler-sections", new Operation( "rappler-sections", "GET", @@ -37703,6 +38520,9 @@ private static void putOperations43(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations44(Map m) { m.put("rawstory-news", new Operation( "rawstory-news", "GET", @@ -38284,6 +39104,160 @@ private static void putOperations43(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("reelshort-fandom-categories", new Operation( + "reelshort-fandom-categories", + "GET", + "/reelshort/fandom-categories", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("reelshort-fandom-post", new Operation( + "reelshort-fandom-post", + "GET", + "/reelshort/fandom-post", + List.of(), + List.of( + new QueryParam("id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("reelshort-fandom-posts", new Operation( + "reelshort-fandom-posts", + "GET", + "/reelshort/fandom-posts", + List.of(), + List.of( + new QueryParam("search", false, "string", List.of()), + new QueryParam("category", false, "string", List.of("general-topic", "movie-cast-list", "top-movie-stories", "where-to-watch", "where-to-watch-2")), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("reelshort-home", new Operation( + "reelshort-home", + "GET", + "/reelshort/home", + List.of(), + List.of( + new QueryParam("language", false, "string", List.of("en", "es", "pt", "fr", "de", "it", "ja", "ko", "th", "id", "tr", "ar", "ru", "pl", "ro", "cs", "bg", "vi", "zh-TW"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("reelshort-movie", new Operation( + "reelshort-movie", + "GET", + "/reelshort/movie", + List.of(), + List.of( + new QueryParam("id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("reelshort-new-releases", new Operation( + "reelshort-new-releases", + "GET", + "/reelshort/new-releases", + List.of(), + List.of( + new QueryParam("book_id", true, "string", List.of()), + new QueryParam("language", false, "string", List.of("en", "es", "pt", "fr", "de", "it", "ja", "ko", "th", "id", "tr", "ar", "ru", "pl", "ro", "cs", "bg", "vi", "zh-TW"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("reelshort-search", new Operation( + "reelshort-search", + "GET", + "/reelshort/search", + List.of(), + List.of( + new QueryParam("keywords", true, "string", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("language", false, "string", List.of("en", "es", "pt", "fr", "de", "it", "ja", "ko", "th", "id", "tr", "ar", "ru", "pl", "ro", "cs", "bg", "vi", "zh-TW"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("reelshort-shelf", new Operation( + "reelshort-shelf", + "GET", + "/reelshort/shelf", + List.of(), + List.of( + new QueryParam("id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("reelshort-tag-books", new Operation( + "reelshort-tag-books", + "GET", + "/reelshort/tag-books", + List.of(), + List.of( + new QueryParam("tag_id", true, "string", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("language", false, "string", List.of("en", "es", "pt", "fr", "de", "it", "ja", "ko", "th", "id", "tr", "ar", "ru", "pl", "ro", "cs", "bg", "vi", "zh-TW"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("reelshort-tag-search", new Operation( + "reelshort-tag-search", + "GET", + "/reelshort/tag-search", + List.of(), + List.of( + new QueryParam("word", true, "string", List.of()), + new QueryParam("page", false, "integer", List.of()), + new QueryParam("language", false, "string", List.of("en", "es", "pt", "fr", "de", "it", "ja", "ko", "th", "id", "tr", "ar", "ru", "pl", "ro", "cs", "bg", "vi", "zh-TW"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("reelshort-tags", new Operation( + "reelshort-tags", + "GET", + "/reelshort/tags", + List.of(), + List.of( + new QueryParam("category", true, "string", List.of("actor", "actress", "identity", "trope")), + new QueryParam("language", false, "string", List.of("en", "es", "pt", "fr", "de", "it", "ja", "ko", "th", "id", "tr", "ar", "ru", "pl", "ro", "cs", "bg", "vi", "zh-TW"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("referrals-click", new Operation( "referrals-click", "POST", @@ -38408,6 +39382,9 @@ private static void putOperations43(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations45(Map m) { m.put("research-related-papers", new Operation( "research-related-papers", "POST", @@ -38511,9 +39488,6 @@ private static void putOperations43(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations44(Map m) { m.put("resy-locations", new Operation( "resy-locations", "GET", @@ -39264,6 +40238,9 @@ private static void putOperations44(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations46(Map m) { m.put("rothys-collection-products", new Operation( "rothys-collection-products", "GET", @@ -39359,9 +40336,6 @@ private static void putOperations44(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations45(Map m) { m.put("rothys-sitemap-urls", new Operation( "rothys-sitemap-urls", "GET", @@ -40096,6 +41070,9 @@ private static void putOperations45(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations47(Map m) { m.put("scmp-author", new Operation( "scmp-author", "GET", @@ -40185,9 +41162,6 @@ private static void putOperations45(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations46(Map m) { m.put("screenrant-sections", new Operation( "screenrant-sections", "GET", @@ -40938,6 +41912,9 @@ private static void putOperations46(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations48(Map m) { m.put("shein-category-goods", new Operation( "shein-category-goods", "GET", @@ -41037,9 +42014,6 @@ private static void putOperations46(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations47(Map m) { m.put("shein-search-autocomplete", new Operation( "shein-search-autocomplete", "POST", @@ -41772,6 +42746,9 @@ private static void putOperations47(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations49(Map m) { m.put("skysports-article", new Operation( "skysports-article", "GET", @@ -41860,9 +42837,6 @@ private static void putOperations47(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations48(Map m) { m.put("slate-headlines", new Operation( "slate-headlines", "GET", @@ -42567,6 +43541,9 @@ private static void putOperations48(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations50(Map m) { m.put("sofascore-event-votes", new Operation( "sofascore-event-votes", "GET", @@ -42662,9 +43639,6 @@ private static void putOperations48(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations49(Map m) { m.put("sofascore-odds-winning", new Operation( "sofascore-odds-winning", "GET", @@ -43400,6 +44374,9 @@ private static void putOperations49(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations51(Map m) { m.put("sofascore-tournament-cuptree", new Operation( "sofascore-tournament-cuptree", "GET", @@ -43508,9 +44485,6 @@ private static void putOperations49(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations50(Map m) { m.put("sofascore-tournament-team-of-the-season", new Operation( "sofascore-tournament-team-of-the-season", "GET", @@ -44244,6 +45218,9 @@ private static void putOperations50(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations52(Map m) { m.put("sportskeeda-feed", new Operation( "sportskeeda-feed", "GET", @@ -44339,9 +45316,6 @@ private static void putOperations50(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations51(Map m) { m.put("sportskeeda-news", new Operation( "sportskeeda-news", "GET", @@ -45134,6 +46108,9 @@ private static void putOperations51(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations53(Map m) { m.put("spotify-home", new Operation( "spotify-home", "GET", @@ -45255,9 +46232,6 @@ private static void putOperations51(Map m) { List.of("ApiKeyAuth"), true, List.of())); - } - - private static void putOperations52(Map m) { m.put("spotify-profiles-search", new Operation( "spotify-profiles-search", "GET", @@ -46050,6 +47024,9 @@ private static void putOperations52(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations54(Map m) { m.put("stockx-categories", new Operation( "stockx-categories", "GET", @@ -46154,9 +47131,6 @@ private static void putOperations52(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations53(Map m) { m.put("straitstimes-news", new Operation( "straitstimes-news", "GET", @@ -46947,6 +47921,9 @@ private static void putOperations53(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations55(Map m) { m.put("subway-combos", new Operation( "subway-combos", "GET", @@ -47047,9 +48024,6 @@ private static void putOperations53(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations54(Map m) { m.put("sun-headlines", new Operation( "sun-headlines", "GET", @@ -47383,6 +48357,148 @@ private static void putOperations54(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("tcgplayer-filters", new Operation( + "tcgplayer-filters", + "GET", + "/tcgplayer/filters", + List.of(), + List.of( + new QueryParam("product_line", false, "string", List.of()), + new QueryParam("id", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("tcgplayer-listings", new Operation( + "tcgplayer-listings", + "GET", + "/tcgplayer/listings", + List.of(), + List.of( + new QueryParam("id", true, "integer", List.of()), + new QueryParam("condition", false, "string", List.of("near-mint", "lightly-played", "moderately-played", "heavily-played", "damaged")), + new QueryParam("printing", false, "string", List.of()), + new QueryParam("language", false, "string", List.of()), + new QueryParam("sort", false, "string", List.of("price", "price-with-shipping")), + new QueryParam("order", false, "string", List.of("asc", "desc")), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("offset", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("tcgplayer-price-guide", new Operation( + "tcgplayer-price-guide", + "GET", + "/tcgplayer/price-guide", + List.of(), + List.of( + new QueryParam("set_id", true, "integer", List.of()), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("offset", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("tcgplayer-price-history", new Operation( + "tcgplayer-price-history", + "GET", + "/tcgplayer/price-history", + List.of(), + List.of( + new QueryParam("id", true, "integer", List.of()), + new QueryParam("range", false, "string", List.of("month", "quarter", "semi-annual", "annual"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("tcgplayer-product", new Operation( + "tcgplayer-product", + "GET", + "/tcgplayer/product", + List.of(), + List.of( + new QueryParam("id", true, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("tcgplayer-product-lines", new Operation( + "tcgplayer-product-lines", + "GET", + "/tcgplayer/product-lines", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("tcgplayer-sales", new Operation( + "tcgplayer-sales", + "GET", + "/tcgplayer/sales", + List.of(), + List.of( + new QueryParam("id", true, "integer", List.of()), + new QueryParam("condition", false, "string", List.of("near-mint", "lightly-played", "moderately-played", "heavily-played", "damaged", "unopened")), + new QueryParam("variant", false, "string", List.of()), + new QueryParam("language", false, "string", List.of()), + new QueryParam("listing_type", false, "string", List.of("all", "with-photos", "without-photos"))), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("tcgplayer-search", new Operation( + "tcgplayer-search", + "GET", + "/tcgplayer/search", + List.of(), + List.of( + new QueryParam("q", false, "string", List.of()), + new QueryParam("product_line", false, "string", List.of()), + new QueryParam("set", false, "string", List.of()), + new QueryParam("product_type", false, "string", List.of()), + new QueryParam("rarity", false, "string", List.of()), + new QueryParam("card_type", false, "string", List.of()), + new QueryParam("min_price", false, "number", List.of()), + new QueryParam("max_price", false, "number", List.of()), + new QueryParam("sort", false, "string", List.of("market-price", "lowest-price", "lowest-price-with-shipping", "median-price", "listings", "sales", "product-name")), + new QueryParam("order", false, "string", List.of("asc", "desc")), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("offset", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("tcgplayer-sets", new Operation( + "tcgplayer-sets", + "GET", + "/tcgplayer/sets", + List.of(), + List.of( + new QueryParam("product_line", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("techcrunch-article", new Operation( "techcrunch-article", "GET", @@ -47512,6 +48628,74 @@ private static void putOperations54(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("telegram-bot", new Operation( + "telegram-bot", + "GET", + "/telegram/bot", + List.of(), + List.of( + new QueryParam("username", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("telegram-channel", new Operation( + "telegram-channel", + "GET", + "/telegram/channel", + List.of(), + List.of( + new QueryParam("username", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("telegram-channel-posts", new Operation( + "telegram-channel-posts", + "GET", + "/telegram/channel-posts", + List.of(), + List.of( + new QueryParam("username", true, "string", List.of()), + new QueryParam("before", false, "integer", List.of()), + new QueryParam("query", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("telegram-group", new Operation( + "telegram-group", + "GET", + "/telegram/group", + List.of(), + List.of( + new QueryParam("username", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("telegram-post", new Operation( + "telegram-post", + "GET", + "/telegram/post", + List.of(), + List.of( + new QueryParam("username", true, "string", List.of()), + new QueryParam("id", true, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); m.put("telegraph-article", new Operation( "telegraph-article", "GET", @@ -47588,6 +48772,9 @@ private static void putOperations54(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations56(Map m) { m.put("tes-job-employer", new Operation( "tes-job-employer", "GET", @@ -47884,9 +49071,6 @@ private static void putOperations54(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations55(Map m) { m.put("theblaze-sections", new Operation( "theblaze-sections", "GET", @@ -48388,6 +49572,9 @@ private static void putOperations55(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations57(Map m) { m.put("therealreal-category", new Operation( "therealreal-category", "GET", @@ -48671,9 +49858,6 @@ private static void putOperations55(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations56(Map m) { m.put("thisismoney-headlines", new Operation( "thisismoney-headlines", "GET", @@ -49211,6 +50395,9 @@ private static void putOperations56(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations58(Map m) { m.put("tiktok-category", new Operation( "tiktok-category", "GET", @@ -49503,9 +50690,6 @@ private static void putOperations56(Map m) { List.of("ApiKeyAuth"), true, List.of("cursor"))); - } - - private static void putOperations57(Map m) { m.put("tiktok-mobile-live-effects", new Operation( "tiktok-mobile-live-effects", "GET", @@ -49613,7 +50797,7 @@ private static void putOperations57(Map m) { "/tiktok/mobile/music/chart", List.of(), List.of( - new QueryParam("chart_region", false, "string", List.of()), + new QueryParam("chart_region", false, "string", List.of("AE", "BR", "CA", "DE", "EG", "FR", "JP", "KR", "LB", "MX", "NG", "SA", "TR", "US", "ZA")), new QueryParam("cursor", false, "integer", List.of()), new QueryParam("count", false, "integer", List.of())), List.of(), @@ -50071,6 +51255,9 @@ private static void putOperations57(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations59(Map m) { m.put("tiktok-mobile-translation-description", new Operation( "tiktok-mobile-translation-description", "GET", @@ -50367,9 +51554,6 @@ private static void putOperations57(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations58(Map m) { m.put("tiktok-top-ads-filters", new Operation( "tiktok-top-ads-filters", "GET", @@ -50909,6 +52093,9 @@ private static void putOperations58(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations60(Map m) { m.put("tmz-headlines", new Operation( "tmz-headlines", "GET", @@ -51184,9 +52371,6 @@ private static void putOperations58(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations59(Map m) { m.put("torontostar-article", new Operation( "torontostar-article", "GET", @@ -51750,6 +52934,9 @@ private static void putOperations59(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations61(Map m) { m.put("twitch-videos", new Operation( "twitch-videos", "GET", @@ -52045,9 +53232,6 @@ private static void putOperations59(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations60(Map m) { m.put("usage-me-timeseries", new Operation( "usage-me-timeseries", "GET", @@ -52545,6 +53729,9 @@ private static void putOperations60(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations62(Map m) { m.put("vestiaire-conditions", new Operation( "vestiaire-conditions", "GET", @@ -52831,9 +54018,6 @@ private static void putOperations60(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations61(Map m) { m.put("vox-news", new Operation( "vox-news", "GET", @@ -53028,6 +54212,89 @@ private static void putOperations61(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("wallapop-categories", new Operation( + "wallapop-categories", + "GET", + "/wallapop/categories", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wallapop-filter-options", new Operation( + "wallapop-filter-options", + "GET", + "/wallapop/filter-options", + List.of(), + List.of( + new QueryParam("filter_id", true, "string", List.of()), + new QueryParam("category_id", true, "integer", List.of()), + new QueryParam("brand", false, "string", List.of()), + new QueryParam("q", false, "string", List.of()), + new QueryParam("sort", false, "string", List.of("closest", "most_relevance", "newest", "price_low_to_high", "price_high_to_low")), + new QueryParam("options_query", false, "string", List.of()), + new QueryParam("cursor", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of("cursor"))); + m.put("wallapop-filters", new Operation( + "wallapop-filters", + "GET", + "/wallapop/filters", + List.of(), + List.of( + new QueryParam("q", false, "string", List.of()), + new QueryParam("category_id", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wallapop-item-detail", new Operation( + "wallapop-item-detail", + "GET", + "/wallapop/item", + List.of(), + List.of( + new QueryParam("url", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wallapop-search", new Operation( + "wallapop-search", + "GET", + "/wallapop/search", + List.of(), + List.of( + new QueryParam("q", true, "string", List.of()), + new QueryParam("latitude", true, "number", List.of()), + new QueryParam("longitude", true, "number", List.of()), + new QueryParam("category_id", false, "integer", List.of()), + new QueryParam("sort", false, "string", List.of("closest", "most_relevance", "newest", "price_low_to_high", "price_high_to_low")), + new QueryParam("min_price", false, "number", List.of()), + new QueryParam("max_price", false, "number", List.of()), + new QueryParam("condition", false, "string", List.of()), + new QueryParam("is_shippable", false, "string", List.of("true")), + new QueryParam("time_filter", false, "string", List.of("today", "lastWeek", "lastMonth")), + new QueryParam("distance_in_km", false, "integer", List.of()), + new QueryParam("filter", false, "array", List.of()), + new QueryParam("cursor", false, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of("cursor"))); m.put("walmart-product", new Operation( "walmart-product", "GET", @@ -53132,6 +54399,162 @@ private static void putOperations61(Map m) { List.of("ApiKeyAuth"), false, List.of())); + m.put("wattpad-categories", new Operation( + "wattpad-categories", + "GET", + "/wattpad/categories", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wattpad-languages", new Operation( + "wattpad-languages", + "GET", + "/wattpad/languages", + List.of(), + List.of(), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wattpad-part", new Operation( + "wattpad-part", + "GET", + "/wattpad/part", + List.of(), + List.of( + new QueryParam("part_id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wattpad-part-comments", new Operation( + "wattpad-part-comments", + "GET", + "/wattpad/part-comments", + List.of(), + List.of( + new QueryParam("part_id", true, "string", List.of()), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("offset", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("wattpad-search", new Operation( + "wattpad-search", + "GET", + "/wattpad/search", + List.of(), + List.of( + new QueryParam("query", false, "string", List.of()), + new QueryParam("filter", false, "string", List.of("hot", "new", "featured")), + new QueryParam("category", false, "integer", List.of()), + new QueryParam("language", false, "integer", List.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "46", "47", "48", "49", "50", "51", "53")), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("offset", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("wattpad-search-users", new Operation( + "wattpad-search-users", + "GET", + "/wattpad/search-users", + List.of(), + List.of( + new QueryParam("query", true, "string", List.of()), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("offset", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + m.put("wattpad-story", new Operation( + "wattpad-story", + "GET", + "/wattpad/story", + List.of(), + List.of( + new QueryParam("story_id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wattpad-story-parts", new Operation( + "wattpad-story-parts", + "GET", + "/wattpad/story-parts", + List.of(), + List.of( + new QueryParam("story_id", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wattpad-story-recommendations", new Operation( + "wattpad-story-recommendations", + "GET", + "/wattpad/story-recommendations", + List.of(), + List.of( + new QueryParam("story_id", true, "string", List.of()), + new QueryParam("limit", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wattpad-user", new Operation( + "wattpad-user", + "GET", + "/wattpad/user", + List.of(), + List.of( + new QueryParam("username", true, "string", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + false, + List.of())); + m.put("wattpad-user-stories", new Operation( + "wattpad-user-stories", + "GET", + "/wattpad/user-stories", + List.of(), + List.of( + new QueryParam("username", true, "string", List.of()), + new QueryParam("limit", false, "integer", List.of()), + new QueryParam("offset", false, "integer", List.of())), + List.of(), + null, + false, + List.of("ApiKeyAuth"), + true, + List.of())); + } + + private static void putOperations63(Map m) { m.put("wayfair-categories", new Operation( "wayfair-categories", "GET", @@ -53618,9 +55041,6 @@ private static void putOperations61(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations62(Map m) { m.put("wingstop-nearby", new Operation( "wingstop-nearby", "GET", @@ -53936,6 +55356,9 @@ private static void putOperations62(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations64(Map m) { m.put("x-post", new Operation( "x-post", "GET", @@ -54449,9 +55872,6 @@ private static void putOperations62(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations63(Map m) { m.put("yahoo-finance-ticker-dividends", new Operation( "yahoo-finance-ticker-dividends", "GET", @@ -54750,6 +56170,9 @@ private static void putOperations63(Map m) { List.of("ApiKeyAuth"), true, List.of())); + } + + private static void putOperations65(Map m) { m.put("yahoo-health-home", new Operation( "yahoo-health-home", "GET", @@ -55245,9 +56668,6 @@ private static void putOperations63(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations64(Map m) { m.put("yahoo-sports-team-schedule", new Operation( "yahoo-sports-team-schedule", "GET", @@ -55548,6 +56968,9 @@ private static void putOperations64(Map m) { List.of("ApiKeyAuth"), false, List.of())); + } + + private static void putOperations66(Map m) { m.put("yoox-designers", new Operation( "yoox-designers", "GET", @@ -56070,9 +57493,6 @@ private static void putOperations64(Map m) { List.of("ApiKeyAuth"), false, List.of())); - } - - private static void putOperations65(Map m) { m.put("zaxbys-store", new Operation( "zaxbys-store", "GET", @@ -56384,9 +57804,14 @@ private static Map> buildGroups() { } { Map group = new LinkedHashMap<>(); + group.put("aliexpressCategories", "aliexpress-categories"); + group.put("aliexpressCategoryIds", "aliexpress-category-ids"); + group.put("aliexpressCategoryProducts", "aliexpress-category-products"); group.put("aliexpressReviews", "aliexpress-reviews"); group.put("aliexpressSearch", "aliexpress-search"); group.put("aliexpressSearchFilters", "aliexpress-search-filters"); + group.put("aliexpressSuggest", "aliexpress-suggest"); + group.put("aliexpressTrendingSearches", "aliexpress-trending-searches"); g.put("aliExpress", Map.copyOf(group)); } { @@ -57332,6 +58757,10 @@ private static Map> buildGroups() { group.put("airbnbMarketsItem", "datasets-airbnb-markets-item"); group.put("airbnbMarketsNearby", "datasets-airbnb-markets-nearby"); group.put("airbnbMarketsSearch", "datasets-airbnb-markets-search"); + group.put("appleMapsPlacesFacets", "datasets-apple-maps-places-facets"); + group.put("appleMapsPlacesItem", "datasets-apple-maps-places-item"); + group.put("appleMapsPlacesNearby", "datasets-apple-maps-places-nearby"); + group.put("appleMapsPlacesSearch", "datasets-apple-maps-places-search"); group.put("applePodcastsShowsFacets", "datasets-apple-podcasts-shows-facets"); group.put("applePodcastsShowsItem", "datasets-apple-podcasts-shows-item"); group.put("applePodcastsShowsSearch", "datasets-apple-podcasts-shows-search"); @@ -57620,6 +59049,26 @@ private static Map> buildGroups() { group.put("draftkingsTeams", "draftkings-teams"); g.put("draftKingsSportsbook", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("dramaboxBrowse", "dramabox-browse"); + group.put("dramaboxCategories", "dramabox-categories"); + group.put("dramaboxCategoryBooks", "dramabox-category-books"); + group.put("dramaboxChannels", "dramabox-channels"); + group.put("dramaboxDrama", "dramabox-drama"); + group.put("dramaboxGenres", "dramabox-genres"); + group.put("dramaboxHome", "dramabox-home"); + group.put("dramaboxMore", "dramabox-more"); + group.put("dramaboxPerformer", "dramabox-performer"); + group.put("dramaboxRank", "dramabox-rank"); + group.put("dramaboxRecommend", "dramabox-recommend"); + group.put("dramaboxSearch", "dramabox-search"); + group.put("dramaboxSuggest", "dramabox-suggest"); + group.put("dramaboxTag", "dramabox-tag"); + group.put("dramaboxTheater", "dramabox-theater"); + group.put("dramaboxTrending", "dramabox-trending"); + g.put("dramaBox", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("duckduckgoImage", "duckduckgo-image"); @@ -58892,7 +60341,10 @@ private static Map> buildGroups() { group.put("category", "jumia-category"); group.put("countries", "jumia-countries"); group.put("product", "jumia-product"); + group.put("reviews", "jumia-reviews"); group.put("search", "jumia-search"); + group.put("sitemapUrls", "jumia-sitemap-urls"); + group.put("sitemaps", "jumia-sitemaps"); g.put("jumia", Map.copyOf(group)); } { @@ -58973,6 +60425,31 @@ private static Map> buildGroups() { group.put("khaleejtimesSections", "khaleejtimes-sections"); g.put("khaleejTimes", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("categories", "kick-categories"); + group.put("categoryClips", "kick-category-clips"); + group.put("channel", "kick-channel"); + group.put("channelChatroom", "kick-channel-chatroom"); + group.put("channelClips", "kick-channel-clips"); + group.put("channelEmotes", "kick-channel-emotes"); + group.put("channelLinks", "kick-channel-links"); + group.put("channelStreams", "kick-channel-streams"); + group.put("channelVideos", "kick-channel-videos"); + group.put("clip", "kick-clip"); + group.put("clips", "kick-clips"); + group.put("drops", "kick-drops"); + group.put("gifts", "kick-gifts"); + group.put("languages", "kick-languages"); + group.put("livestreams", "kick-livestreams"); + group.put("searchCategories", "kick-search-categories"); + group.put("searchChannels", "kick-search-channels"); + group.put("subcategories", "kick-subcategories"); + group.put("subcategory", "kick-subcategory"); + group.put("topChannels", "kick-top-channels"); + group.put("video", "kick-video"); + g.put("kick", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("comments", "kickstarter-comments"); @@ -60025,6 +61502,16 @@ private static Map> buildGroups() { group.put("suggest", "prada-suggest"); g.put("prada", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("pricechartingBigMovers", "pricecharting-big-movers"); + group.put("pricechartingCategories", "pricecharting-categories"); + group.put("pricechartingConsole", "pricecharting-console"); + group.put("pricechartingPriceHistory", "pricecharting-price-history"); + group.put("pricechartingProduct", "pricecharting-product"); + group.put("pricechartingSearch", "pricecharting-search"); + g.put("priceCharting", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("categories", "pristine-auction-categories"); @@ -60086,6 +61573,7 @@ private static Map> buildGroups() { group.put("priceGuideCategories", "psa-price-guide-categories"); group.put("priceGuideSearch", "psa-price-guide-search"); group.put("priceGuideSet", "psa-price-guide-set"); + group.put("priceGuideSets", "psa-price-guide-sets"); group.put("probatfactsCategories", "psa-probatfacts-categories"); group.put("probatfactsGallery", "psa-probatfacts-gallery"); group.put("probatfactsSubject", "psa-probatfacts-subject"); @@ -60214,6 +61702,21 @@ private static Map> buildGroups() { group.put("similar", "redfin-similar"); g.put("redfin", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("reelshortFandomCategories", "reelshort-fandom-categories"); + group.put("reelshortFandomPost", "reelshort-fandom-post"); + group.put("reelshortFandomPosts", "reelshort-fandom-posts"); + group.put("reelshortHome", "reelshort-home"); + group.put("reelshortMovie", "reelshort-movie"); + group.put("reelshortNewReleases", "reelshort-new-releases"); + group.put("reelshortSearch", "reelshort-search"); + group.put("reelshortShelf", "reelshort-shelf"); + group.put("reelshortTagBooks", "reelshort-tag-books"); + group.put("reelshortTagSearch", "reelshort-tag-search"); + group.put("reelshortTags", "reelshort-tags"); + g.put("reelShort", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("click", "referrals-click"); @@ -61118,6 +62621,19 @@ private static Map> buildGroups() { group.put("stores", "target-stores"); g.put("target", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("filters", "tcgplayer-filters"); + group.put("listings", "tcgplayer-listings"); + group.put("priceGuide", "tcgplayer-price-guide"); + group.put("priceHistory", "tcgplayer-price-history"); + group.put("product", "tcgplayer-product"); + group.put("productLines", "tcgplayer-product-lines"); + group.put("sales", "tcgplayer-sales"); + group.put("search", "tcgplayer-search"); + group.put("sets", "tcgplayer-sets"); + g.put("tcgplayer", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("techcrunchArticle", "techcrunch-article"); @@ -61136,6 +62652,15 @@ private static Map> buildGroups() { group.put("techradarSections", "techradar-sections"); g.put("techRadar", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("bot", "telegram-bot"); + group.put("channel", "telegram-channel"); + group.put("channelPosts", "telegram-channel-posts"); + group.put("group", "telegram-group"); + group.put("post", "telegram-post"); + g.put("telegram", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("telegraphArticle", "telegraph-article"); @@ -61762,6 +63287,15 @@ private static Map> buildGroups() { group.put("stores", "walgreens-stores"); g.put("walgreens", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("categories", "wallapop-categories"); + group.put("filterOptions", "wallapop-filter-options"); + group.put("filters", "wallapop-filters"); + group.put("itemDetail", "wallapop-item-detail"); + group.put("search", "wallapop-search"); + g.put("wallapop", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("product", "walmart-product"); @@ -61778,6 +63312,21 @@ private static Map> buildGroups() { group.put("wapoSections", "wapo-sections"); g.put("washingtonPost", Map.copyOf(group)); } + { + Map group = new LinkedHashMap<>(); + group.put("categories", "wattpad-categories"); + group.put("languages", "wattpad-languages"); + group.put("part", "wattpad-part"); + group.put("partComments", "wattpad-part-comments"); + group.put("search", "wattpad-search"); + group.put("searchUsers", "wattpad-search-users"); + group.put("story", "wattpad-story"); + group.put("storyParts", "wattpad-story-parts"); + group.put("storyRecommendations", "wattpad-story-recommendations"); + group.put("user", "wattpad-user"); + group.put("userStories", "wattpad-user-stories"); + g.put("wattpad", Map.copyOf(group)); + } { Map group = new LinkedHashMap<>(); group.put("categories", "wayfair-categories"); diff --git a/src/main/java/net/crawlora/Version.java b/src/main/java/net/crawlora/Version.java index 874f7aa..918990d 100644 --- a/src/main/java/net/crawlora/Version.java +++ b/src/main/java/net/crawlora/Version.java @@ -5,5 +5,5 @@ public final class Version { private Version() {} /** The released SDK version. */ - public static final String VERSION = "1.49.0-sdk.4"; + public static final String VERSION = "1.50.0-sdk.1"; } diff --git a/src/main/java/net/crawlora/groups/AliExpressGroup.java b/src/main/java/net/crawlora/groups/AliExpressGroup.java index 2e6b77a..cd694de 100644 --- a/src/main/java/net/crawlora/groups/AliExpressGroup.java +++ b/src/main/java/net/crawlora/groups/AliExpressGroup.java @@ -18,6 +18,90 @@ public AliExpressGroup(CrawloraClient client) { this.client = client; } + /** + * aliexpress-categories (GET /aliexpress/categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategories(Map params) { + return aliexpressCategories(params, null); + } + + /** + * aliexpress-categories (GET /aliexpress/categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategories(Map params, RequestOptions options) { + OperationGroup.checkParams("aliexpress-categories", params); + return client.request("aliexpress-categories", params, options); + } + + /** + * aliexpress-categories (GET /aliexpress/categories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategories() { + return aliexpressCategories(Map.of(), null); + } + + /** + * aliexpress-category-ids (GET /aliexpress/category-ids). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategoryIds(Map params) { + return aliexpressCategoryIds(params, null); + } + + /** + * aliexpress-category-ids (GET /aliexpress/category-ids). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategoryIds(Map params, RequestOptions options) { + OperationGroup.checkParams("aliexpress-category-ids", params); + return client.request("aliexpress-category-ids", params, options); + } + + /** + * aliexpress-category-ids (GET /aliexpress/category-ids). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategoryIds() { + return aliexpressCategoryIds(Map.of(), null); + } + + /** + * aliexpress-category-products (GET /aliexpress/category-products). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategoryProducts(Map params) { + return aliexpressCategoryProducts(params, null); + } + + /** + * aliexpress-category-products (GET /aliexpress/category-products). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressCategoryProducts(Map params, RequestOptions options) { + OperationGroup.checkParams("aliexpress-category-products", params); + return client.request("aliexpress-category-products", params, options); + } + /** * aliexpress-reviews (GET /aliexpress/reviews). * @@ -84,4 +168,57 @@ public Object aliexpressSearchFilters(Map params, RequestOptions return client.request("aliexpress-search-filters", params, options); } + /** + * aliexpress-suggest (GET /aliexpress/suggest). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressSuggest(Map params) { + return aliexpressSuggest(params, null); + } + + /** + * aliexpress-suggest (GET /aliexpress/suggest). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressSuggest(Map params, RequestOptions options) { + OperationGroup.checkParams("aliexpress-suggest", params); + return client.request("aliexpress-suggest", params, options); + } + + /** + * aliexpress-trending-searches (GET /aliexpress/trending-searches). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressTrendingSearches(Map params) { + return aliexpressTrendingSearches(params, null); + } + + /** + * aliexpress-trending-searches (GET /aliexpress/trending-searches). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressTrendingSearches(Map params, RequestOptions options) { + OperationGroup.checkParams("aliexpress-trending-searches", params); + return client.request("aliexpress-trending-searches", params, options); + } + + /** + * aliexpress-trending-searches (GET /aliexpress/trending-searches). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object aliexpressTrendingSearches() { + return aliexpressTrendingSearches(Map.of(), null); + } + } diff --git a/src/main/java/net/crawlora/groups/DatasetsGroup.java b/src/main/java/net/crawlora/groups/DatasetsGroup.java index 004d37f..73dad95 100644 --- a/src/main/java/net/crawlora/groups/DatasetsGroup.java +++ b/src/main/java/net/crawlora/groups/DatasetsGroup.java @@ -146,6 +146,103 @@ public Object airbnbMarketsSearch() { return airbnbMarketsSearch(Map.of(), null); } + /** + * datasets-apple-maps-places-facets (GET /datasets/apple-maps-places/facets). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesFacets(Map params) { + return appleMapsPlacesFacets(params, null); + } + + /** + * datasets-apple-maps-places-facets (GET /datasets/apple-maps-places/facets). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesFacets(Map params, RequestOptions options) { + OperationGroup.checkParams("datasets-apple-maps-places-facets", params); + return client.request("datasets-apple-maps-places-facets", params, options); + } + + /** + * datasets-apple-maps-places-item (GET /datasets/apple-maps-places/items/{place_id}). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesItem(Map params) { + return appleMapsPlacesItem(params, null); + } + + /** + * datasets-apple-maps-places-item (GET /datasets/apple-maps-places/items/{place_id}). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesItem(Map params, RequestOptions options) { + OperationGroup.checkParams("datasets-apple-maps-places-item", params); + return client.request("datasets-apple-maps-places-item", params, options); + } + + /** + * datasets-apple-maps-places-nearby (GET /datasets/apple-maps-places/nearby). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesNearby(Map params) { + return appleMapsPlacesNearby(params, null); + } + + /** + * datasets-apple-maps-places-nearby (GET /datasets/apple-maps-places/nearby). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesNearby(Map params, RequestOptions options) { + OperationGroup.checkParams("datasets-apple-maps-places-nearby", params); + return client.request("datasets-apple-maps-places-nearby", params, options); + } + + /** + * datasets-apple-maps-places-search (GET /datasets/apple-maps-places/search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesSearch(Map params) { + return appleMapsPlacesSearch(params, null); + } + + /** + * datasets-apple-maps-places-search (GET /datasets/apple-maps-places/search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesSearch(Map params, RequestOptions options) { + OperationGroup.checkParams("datasets-apple-maps-places-search", params); + return client.request("datasets-apple-maps-places-search", params, options); + } + + /** + * datasets-apple-maps-places-search (GET /datasets/apple-maps-places/search). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object appleMapsPlacesSearch() { + return appleMapsPlacesSearch(Map.of(), null); + } + /** * datasets-apple-podcasts-shows-facets (GET /datasets/apple-podcasts-shows/facets). * diff --git a/src/main/java/net/crawlora/groups/DramaBoxGroup.java b/src/main/java/net/crawlora/groups/DramaBoxGroup.java new file mode 100644 index 0000000..ed6582b --- /dev/null +++ b/src/main/java/net/crawlora/groups/DramaBoxGroup.java @@ -0,0 +1,454 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "dramaBox" operation group. + * Reach it via {@code client.dramaBox()}. + */ +public final class DramaBoxGroup { + private final CrawloraClient client; + + public DramaBoxGroup(CrawloraClient client) { + this.client = client; + } + + /** + * dramabox-browse (GET /dramabox/browse). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxBrowse(Map params) { + return dramaboxBrowse(params, null); + } + + /** + * dramabox-browse (GET /dramabox/browse). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxBrowse(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-browse", params); + return client.request("dramabox-browse", params, options); + } + + /** + * dramabox-browse (GET /dramabox/browse). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxBrowse() { + return dramaboxBrowse(Map.of(), null); + } + + /** + * dramabox-categories (GET /dramabox/categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxCategories(Map params) { + return dramaboxCategories(params, null); + } + + /** + * dramabox-categories (GET /dramabox/categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxCategories(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-categories", params); + return client.request("dramabox-categories", params, options); + } + + /** + * dramabox-categories (GET /dramabox/categories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxCategories() { + return dramaboxCategories(Map.of(), null); + } + + /** + * dramabox-category-books (GET /dramabox/category-books). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxCategoryBooks(Map params) { + return dramaboxCategoryBooks(params, null); + } + + /** + * dramabox-category-books (GET /dramabox/category-books). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxCategoryBooks(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-category-books", params); + return client.request("dramabox-category-books", params, options); + } + + /** + * dramabox-category-books (GET /dramabox/category-books). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxCategoryBooks() { + return dramaboxCategoryBooks(Map.of(), null); + } + + /** + * dramabox-channels (GET /dramabox/channels). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxChannels(Map params) { + return dramaboxChannels(params, null); + } + + /** + * dramabox-channels (GET /dramabox/channels). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxChannels(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-channels", params); + return client.request("dramabox-channels", params, options); + } + + /** + * dramabox-channels (GET /dramabox/channels). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxChannels() { + return dramaboxChannels(Map.of(), null); + } + + /** + * dramabox-drama (GET /dramabox/drama). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxDrama(Map params) { + return dramaboxDrama(params, null); + } + + /** + * dramabox-drama (GET /dramabox/drama). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxDrama(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-drama", params); + return client.request("dramabox-drama", params, options); + } + + /** + * dramabox-genres (GET /dramabox/genres). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxGenres(Map params) { + return dramaboxGenres(params, null); + } + + /** + * dramabox-genres (GET /dramabox/genres). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxGenres(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-genres", params); + return client.request("dramabox-genres", params, options); + } + + /** + * dramabox-genres (GET /dramabox/genres). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxGenres() { + return dramaboxGenres(Map.of(), null); + } + + /** + * dramabox-home (GET /dramabox/home). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxHome(Map params) { + return dramaboxHome(params, null); + } + + /** + * dramabox-home (GET /dramabox/home). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxHome(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-home", params); + return client.request("dramabox-home", params, options); + } + + /** + * dramabox-home (GET /dramabox/home). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxHome() { + return dramaboxHome(Map.of(), null); + } + + /** + * dramabox-more (GET /dramabox/more). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxMore(Map params) { + return dramaboxMore(params, null); + } + + /** + * dramabox-more (GET /dramabox/more). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxMore(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-more", params); + return client.request("dramabox-more", params, options); + } + + /** + * dramabox-performer (GET /dramabox/performer). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxPerformer(Map params) { + return dramaboxPerformer(params, null); + } + + /** + * dramabox-performer (GET /dramabox/performer). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxPerformer(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-performer", params); + return client.request("dramabox-performer", params, options); + } + + /** + * dramabox-rank (GET /dramabox/rank). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxRank(Map params) { + return dramaboxRank(params, null); + } + + /** + * dramabox-rank (GET /dramabox/rank). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxRank(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-rank", params); + return client.request("dramabox-rank", params, options); + } + + /** + * dramabox-rank (GET /dramabox/rank). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxRank() { + return dramaboxRank(Map.of(), null); + } + + /** + * dramabox-recommend (GET /dramabox/recommend). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxRecommend(Map params) { + return dramaboxRecommend(params, null); + } + + /** + * dramabox-recommend (GET /dramabox/recommend). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxRecommend(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-recommend", params); + return client.request("dramabox-recommend", params, options); + } + + /** + * dramabox-recommend (GET /dramabox/recommend). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxRecommend() { + return dramaboxRecommend(Map.of(), null); + } + + /** + * dramabox-search (GET /dramabox/search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxSearch(Map params) { + return dramaboxSearch(params, null); + } + + /** + * dramabox-search (GET /dramabox/search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxSearch(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-search", params); + return client.request("dramabox-search", params, options); + } + + /** + * dramabox-suggest (GET /dramabox/suggest). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxSuggest(Map params) { + return dramaboxSuggest(params, null); + } + + /** + * dramabox-suggest (GET /dramabox/suggest). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxSuggest(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-suggest", params); + return client.request("dramabox-suggest", params, options); + } + + /** + * dramabox-tag (GET /dramabox/tag). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxTag(Map params) { + return dramaboxTag(params, null); + } + + /** + * dramabox-tag (GET /dramabox/tag). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxTag(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-tag", params); + return client.request("dramabox-tag", params, options); + } + + /** + * dramabox-theater (GET /dramabox/theater). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxTheater(Map params) { + return dramaboxTheater(params, null); + } + + /** + * dramabox-theater (GET /dramabox/theater). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxTheater(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-theater", params); + return client.request("dramabox-theater", params, options); + } + + /** + * dramabox-trending (GET /dramabox/trending). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxTrending(Map params) { + return dramaboxTrending(params, null); + } + + /** + * dramabox-trending (GET /dramabox/trending). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxTrending(Map params, RequestOptions options) { + OperationGroup.checkParams("dramabox-trending", params); + return client.request("dramabox-trending", params, options); + } + + /** + * dramabox-trending (GET /dramabox/trending). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object dramaboxTrending() { + return dramaboxTrending(Map.of(), null); + } + +} diff --git a/src/main/java/net/crawlora/groups/JumiaGroup.java b/src/main/java/net/crawlora/groups/JumiaGroup.java index d410df8..b4e287c 100644 --- a/src/main/java/net/crawlora/groups/JumiaGroup.java +++ b/src/main/java/net/crawlora/groups/JumiaGroup.java @@ -115,6 +115,28 @@ public Object product(Map params, RequestOptions options) { return client.request("jumia-product", params, options); } + /** + * jumia-reviews (GET /jumia/reviews). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reviews(Map params) { + return reviews(params, null); + } + + /** + * jumia-reviews (GET /jumia/reviews). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reviews(Map params, RequestOptions options) { + OperationGroup.checkParams("jumia-reviews", params); + return client.request("jumia-reviews", params, options); + } + /** * jumia-search (GET /jumia/search). * @@ -137,4 +159,48 @@ public Object search(Map params, RequestOptions options) { return client.request("jumia-search", params, options); } + /** + * jumia-sitemap-urls (GET /jumia/sitemap-urls). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sitemapUrls(Map params) { + return sitemapUrls(params, null); + } + + /** + * jumia-sitemap-urls (GET /jumia/sitemap-urls). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sitemapUrls(Map params, RequestOptions options) { + OperationGroup.checkParams("jumia-sitemap-urls", params); + return client.request("jumia-sitemap-urls", params, options); + } + + /** + * jumia-sitemaps (GET /jumia/sitemaps). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sitemaps(Map params) { + return sitemaps(params, null); + } + + /** + * jumia-sitemaps (GET /jumia/sitemaps). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sitemaps(Map params, RequestOptions options) { + OperationGroup.checkParams("jumia-sitemaps", params); + return client.request("jumia-sitemaps", params, options); + } + } diff --git a/src/main/java/net/crawlora/groups/KickGroup.java b/src/main/java/net/crawlora/groups/KickGroup.java new file mode 100644 index 0000000..be7b515 --- /dev/null +++ b/src/main/java/net/crawlora/groups/KickGroup.java @@ -0,0 +1,555 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "kick" operation group. + * Reach it via {@code client.kick()}. + */ +public final class KickGroup { + private final CrawloraClient client; + + public KickGroup(CrawloraClient client) { + this.client = client; + } + + /** + * kick-categories (GET /kick/categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories(Map params) { + return categories(params, null); + } + + /** + * kick-categories (GET /kick/categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-categories", params); + return client.request("kick-categories", params, options); + } + + /** + * kick-categories (GET /kick/categories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories() { + return categories(Map.of(), null); + } + + /** + * kick-category-clips (GET /kick/category-clips). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categoryClips(Map params) { + return categoryClips(params, null); + } + + /** + * kick-category-clips (GET /kick/category-clips). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categoryClips(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-category-clips", params); + return client.request("kick-category-clips", params, options); + } + + /** + * kick-channel (GET /kick/channel). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channel(Map params) { + return channel(params, null); + } + + /** + * kick-channel (GET /kick/channel). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channel(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-channel", params); + return client.request("kick-channel", params, options); + } + + /** + * kick-channel-chatroom (GET /kick/channel-chatroom). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelChatroom(Map params) { + return channelChatroom(params, null); + } + + /** + * kick-channel-chatroom (GET /kick/channel-chatroom). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelChatroom(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-channel-chatroom", params); + return client.request("kick-channel-chatroom", params, options); + } + + /** + * kick-channel-clips (GET /kick/channel-clips). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelClips(Map params) { + return channelClips(params, null); + } + + /** + * kick-channel-clips (GET /kick/channel-clips). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelClips(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-channel-clips", params); + return client.request("kick-channel-clips", params, options); + } + + /** + * kick-channel-emotes (GET /kick/channel-emotes). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelEmotes(Map params) { + return channelEmotes(params, null); + } + + /** + * kick-channel-emotes (GET /kick/channel-emotes). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelEmotes(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-channel-emotes", params); + return client.request("kick-channel-emotes", params, options); + } + + /** + * kick-channel-links (GET /kick/channel-links). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelLinks(Map params) { + return channelLinks(params, null); + } + + /** + * kick-channel-links (GET /kick/channel-links). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelLinks(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-channel-links", params); + return client.request("kick-channel-links", params, options); + } + + /** + * kick-channel-streams (GET /kick/channel-streams). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelStreams(Map params) { + return channelStreams(params, null); + } + + /** + * kick-channel-streams (GET /kick/channel-streams). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelStreams(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-channel-streams", params); + return client.request("kick-channel-streams", params, options); + } + + /** + * kick-channel-videos (GET /kick/channel-videos). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelVideos(Map params) { + return channelVideos(params, null); + } + + /** + * kick-channel-videos (GET /kick/channel-videos). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelVideos(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-channel-videos", params); + return client.request("kick-channel-videos", params, options); + } + + /** + * kick-clip (GET /kick/clip). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object clip(Map params) { + return clip(params, null); + } + + /** + * kick-clip (GET /kick/clip). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object clip(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-clip", params); + return client.request("kick-clip", params, options); + } + + /** + * kick-clips (GET /kick/clips). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object clips(Map params) { + return clips(params, null); + } + + /** + * kick-clips (GET /kick/clips). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object clips(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-clips", params); + return client.request("kick-clips", params, options); + } + + /** + * kick-clips (GET /kick/clips). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object clips() { + return clips(Map.of(), null); + } + + /** + * kick-drops (GET /kick/drops). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object drops(Map params) { + return drops(params, null); + } + + /** + * kick-drops (GET /kick/drops). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object drops(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-drops", params); + return client.request("kick-drops", params, options); + } + + /** + * kick-drops (GET /kick/drops). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object drops() { + return drops(Map.of(), null); + } + + /** + * kick-gifts (GET /kick/gifts). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object gifts(Map params) { + return gifts(params, null); + } + + /** + * kick-gifts (GET /kick/gifts). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object gifts(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-gifts", params); + return client.request("kick-gifts", params, options); + } + + /** + * kick-gifts (GET /kick/gifts). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object gifts() { + return gifts(Map.of(), null); + } + + /** + * kick-languages (GET /kick/languages). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object languages(Map params) { + return languages(params, null); + } + + /** + * kick-languages (GET /kick/languages). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object languages(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-languages", params); + return client.request("kick-languages", params, options); + } + + /** + * kick-languages (GET /kick/languages). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object languages() { + return languages(Map.of(), null); + } + + /** + * kick-livestreams (GET /kick/livestreams). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object livestreams(Map params) { + return livestreams(params, null); + } + + /** + * kick-livestreams (GET /kick/livestreams). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object livestreams(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-livestreams", params); + return client.request("kick-livestreams", params, options); + } + + /** + * kick-livestreams (GET /kick/livestreams). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object livestreams() { + return livestreams(Map.of(), null); + } + + /** + * kick-search-categories (GET /kick/search-categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object searchCategories(Map params) { + return searchCategories(params, null); + } + + /** + * kick-search-categories (GET /kick/search-categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object searchCategories(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-search-categories", params); + return client.request("kick-search-categories", params, options); + } + + /** + * kick-search-channels (GET /kick/search-channels). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object searchChannels(Map params) { + return searchChannels(params, null); + } + + /** + * kick-search-channels (GET /kick/search-channels). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object searchChannels(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-search-channels", params); + return client.request("kick-search-channels", params, options); + } + + /** + * kick-subcategories (GET /kick/subcategories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object subcategories(Map params) { + return subcategories(params, null); + } + + /** + * kick-subcategories (GET /kick/subcategories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object subcategories(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-subcategories", params); + return client.request("kick-subcategories", params, options); + } + + /** + * kick-subcategories (GET /kick/subcategories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object subcategories() { + return subcategories(Map.of(), null); + } + + /** + * kick-subcategory (GET /kick/subcategory). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object subcategory(Map params) { + return subcategory(params, null); + } + + /** + * kick-subcategory (GET /kick/subcategory). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object subcategory(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-subcategory", params); + return client.request("kick-subcategory", params, options); + } + + /** + * kick-top-channels (GET /kick/top-channels). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object topChannels(Map params) { + return topChannels(params, null); + } + + /** + * kick-top-channels (GET /kick/top-channels). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object topChannels(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-top-channels", params); + return client.request("kick-top-channels", params, options); + } + + /** + * kick-top-channels (GET /kick/top-channels). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object topChannels() { + return topChannels(Map.of(), null); + } + + /** + * kick-video (GET /kick/video). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object video(Map params) { + return video(params, null); + } + + /** + * kick-video (GET /kick/video). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object video(Map params, RequestOptions options) { + OperationGroup.checkParams("kick-video", params); + return client.request("kick-video", params, options); + } + +} diff --git a/src/main/java/net/crawlora/groups/PriceChartingGroup.java b/src/main/java/net/crawlora/groups/PriceChartingGroup.java new file mode 100644 index 0000000..7cf0a0b --- /dev/null +++ b/src/main/java/net/crawlora/groups/PriceChartingGroup.java @@ -0,0 +1,189 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "priceCharting" operation group. + * Reach it via {@code client.priceCharting()}. + */ +public final class PriceChartingGroup { + private final CrawloraClient client; + + public PriceChartingGroup(CrawloraClient client) { + this.client = client; + } + + /** + * pricecharting-big-movers (GET /pricecharting/big-movers). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingBigMovers(Map params) { + return pricechartingBigMovers(params, null); + } + + /** + * pricecharting-big-movers (GET /pricecharting/big-movers). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingBigMovers(Map params, RequestOptions options) { + OperationGroup.checkParams("pricecharting-big-movers", params); + return client.request("pricecharting-big-movers", params, options); + } + + /** + * pricecharting-big-movers (GET /pricecharting/big-movers). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingBigMovers() { + return pricechartingBigMovers(Map.of(), null); + } + + /** + * pricecharting-categories (GET /pricecharting/categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingCategories(Map params) { + return pricechartingCategories(params, null); + } + + /** + * pricecharting-categories (GET /pricecharting/categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingCategories(Map params, RequestOptions options) { + OperationGroup.checkParams("pricecharting-categories", params); + return client.request("pricecharting-categories", params, options); + } + + /** + * pricecharting-categories (GET /pricecharting/categories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingCategories() { + return pricechartingCategories(Map.of(), null); + } + + /** + * pricecharting-console (GET /pricecharting/console). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingConsole(Map params) { + return pricechartingConsole(params, null); + } + + /** + * pricecharting-console (GET /pricecharting/console). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingConsole(Map params, RequestOptions options) { + OperationGroup.checkParams("pricecharting-console", params); + return client.request("pricecharting-console", params, options); + } + + /** + * pricecharting-price-history (GET /pricecharting/price-history). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingPriceHistory(Map params) { + return pricechartingPriceHistory(params, null); + } + + /** + * pricecharting-price-history (GET /pricecharting/price-history). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingPriceHistory(Map params, RequestOptions options) { + OperationGroup.checkParams("pricecharting-price-history", params); + return client.request("pricecharting-price-history", params, options); + } + + /** + * pricecharting-price-history (GET /pricecharting/price-history). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingPriceHistory() { + return pricechartingPriceHistory(Map.of(), null); + } + + /** + * pricecharting-product (GET /pricecharting/product). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingProduct(Map params) { + return pricechartingProduct(params, null); + } + + /** + * pricecharting-product (GET /pricecharting/product). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingProduct(Map params, RequestOptions options) { + OperationGroup.checkParams("pricecharting-product", params); + return client.request("pricecharting-product", params, options); + } + + /** + * pricecharting-product (GET /pricecharting/product). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingProduct() { + return pricechartingProduct(Map.of(), null); + } + + /** + * pricecharting-search (GET /pricecharting/search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingSearch(Map params) { + return pricechartingSearch(params, null); + } + + /** + * pricecharting-search (GET /pricecharting/search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object pricechartingSearch(Map params, RequestOptions options) { + OperationGroup.checkParams("pricecharting-search", params); + return client.request("pricecharting-search", params, options); + } + +} diff --git a/src/main/java/net/crawlora/groups/PsaGroup.java b/src/main/java/net/crawlora/groups/PsaGroup.java index 86d3ccf..07caa0d 100644 --- a/src/main/java/net/crawlora/groups/PsaGroup.java +++ b/src/main/java/net/crawlora/groups/PsaGroup.java @@ -287,6 +287,28 @@ public Object priceGuideSet(Map params, RequestOptions options) return client.request("psa-price-guide-set", params, options); } + /** + * psa-price-guide-sets (GET /psa/price-guide/sets). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object priceGuideSets(Map params) { + return priceGuideSets(params, null); + } + + /** + * psa-price-guide-sets (GET /psa/price-guide/sets). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object priceGuideSets(Map params, RequestOptions options) { + OperationGroup.checkParams("psa-price-guide-sets", params); + return client.request("psa-price-guide-sets", params, options); + } + /** * psa-probatfacts-categories (GET /psa/probatfacts/categories). * diff --git a/src/main/java/net/crawlora/groups/ReelShortGroup.java b/src/main/java/net/crawlora/groups/ReelShortGroup.java new file mode 100644 index 0000000..48fbd35 --- /dev/null +++ b/src/main/java/net/crawlora/groups/ReelShortGroup.java @@ -0,0 +1,290 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "reelShort" operation group. + * Reach it via {@code client.reelShort()}. + */ +public final class ReelShortGroup { + private final CrawloraClient client; + + public ReelShortGroup(CrawloraClient client) { + this.client = client; + } + + /** + * reelshort-fandom-categories (GET /reelshort/fandom-categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomCategories(Map params) { + return reelshortFandomCategories(params, null); + } + + /** + * reelshort-fandom-categories (GET /reelshort/fandom-categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomCategories(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-fandom-categories", params); + return client.request("reelshort-fandom-categories", params, options); + } + + /** + * reelshort-fandom-categories (GET /reelshort/fandom-categories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomCategories() { + return reelshortFandomCategories(Map.of(), null); + } + + /** + * reelshort-fandom-post (GET /reelshort/fandom-post). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomPost(Map params) { + return reelshortFandomPost(params, null); + } + + /** + * reelshort-fandom-post (GET /reelshort/fandom-post). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomPost(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-fandom-post", params); + return client.request("reelshort-fandom-post", params, options); + } + + /** + * reelshort-fandom-posts (GET /reelshort/fandom-posts). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomPosts(Map params) { + return reelshortFandomPosts(params, null); + } + + /** + * reelshort-fandom-posts (GET /reelshort/fandom-posts). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomPosts(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-fandom-posts", params); + return client.request("reelshort-fandom-posts", params, options); + } + + /** + * reelshort-fandom-posts (GET /reelshort/fandom-posts). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortFandomPosts() { + return reelshortFandomPosts(Map.of(), null); + } + + /** + * reelshort-home (GET /reelshort/home). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortHome(Map params) { + return reelshortHome(params, null); + } + + /** + * reelshort-home (GET /reelshort/home). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortHome(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-home", params); + return client.request("reelshort-home", params, options); + } + + /** + * reelshort-home (GET /reelshort/home). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortHome() { + return reelshortHome(Map.of(), null); + } + + /** + * reelshort-movie (GET /reelshort/movie). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortMovie(Map params) { + return reelshortMovie(params, null); + } + + /** + * reelshort-movie (GET /reelshort/movie). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortMovie(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-movie", params); + return client.request("reelshort-movie", params, options); + } + + /** + * reelshort-new-releases (GET /reelshort/new-releases). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortNewReleases(Map params) { + return reelshortNewReleases(params, null); + } + + /** + * reelshort-new-releases (GET /reelshort/new-releases). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortNewReleases(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-new-releases", params); + return client.request("reelshort-new-releases", params, options); + } + + /** + * reelshort-search (GET /reelshort/search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortSearch(Map params) { + return reelshortSearch(params, null); + } + + /** + * reelshort-search (GET /reelshort/search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortSearch(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-search", params); + return client.request("reelshort-search", params, options); + } + + /** + * reelshort-shelf (GET /reelshort/shelf). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortShelf(Map params) { + return reelshortShelf(params, null); + } + + /** + * reelshort-shelf (GET /reelshort/shelf). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortShelf(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-shelf", params); + return client.request("reelshort-shelf", params, options); + } + + /** + * reelshort-tag-books (GET /reelshort/tag-books). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortTagBooks(Map params) { + return reelshortTagBooks(params, null); + } + + /** + * reelshort-tag-books (GET /reelshort/tag-books). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortTagBooks(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-tag-books", params); + return client.request("reelshort-tag-books", params, options); + } + + /** + * reelshort-tag-search (GET /reelshort/tag-search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortTagSearch(Map params) { + return reelshortTagSearch(params, null); + } + + /** + * reelshort-tag-search (GET /reelshort/tag-search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortTagSearch(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-tag-search", params); + return client.request("reelshort-tag-search", params, options); + } + + /** + * reelshort-tags (GET /reelshort/tags). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortTags(Map params) { + return reelshortTags(params, null); + } + + /** + * reelshort-tags (GET /reelshort/tags). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object reelshortTags(Map params, RequestOptions options) { + OperationGroup.checkParams("reelshort-tags", params); + return client.request("reelshort-tags", params, options); + } + +} diff --git a/src/main/java/net/crawlora/groups/TcgplayerGroup.java b/src/main/java/net/crawlora/groups/TcgplayerGroup.java new file mode 100644 index 0000000..11ca30c --- /dev/null +++ b/src/main/java/net/crawlora/groups/TcgplayerGroup.java @@ -0,0 +1,246 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "tcgplayer" operation group. + * Reach it via {@code client.tcgplayer()}. + */ +public final class TcgplayerGroup { + private final CrawloraClient client; + + public TcgplayerGroup(CrawloraClient client) { + this.client = client; + } + + /** + * tcgplayer-filters (GET /tcgplayer/filters). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filters(Map params) { + return filters(params, null); + } + + /** + * tcgplayer-filters (GET /tcgplayer/filters). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filters(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-filters", params); + return client.request("tcgplayer-filters", params, options); + } + + /** + * tcgplayer-filters (GET /tcgplayer/filters). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filters() { + return filters(Map.of(), null); + } + + /** + * tcgplayer-listings (GET /tcgplayer/listings). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object listings(Map params) { + return listings(params, null); + } + + /** + * tcgplayer-listings (GET /tcgplayer/listings). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object listings(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-listings", params); + return client.request("tcgplayer-listings", params, options); + } + + /** + * tcgplayer-price-guide (GET /tcgplayer/price-guide). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object priceGuide(Map params) { + return priceGuide(params, null); + } + + /** + * tcgplayer-price-guide (GET /tcgplayer/price-guide). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object priceGuide(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-price-guide", params); + return client.request("tcgplayer-price-guide", params, options); + } + + /** + * tcgplayer-price-history (GET /tcgplayer/price-history). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object priceHistory(Map params) { + return priceHistory(params, null); + } + + /** + * tcgplayer-price-history (GET /tcgplayer/price-history). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object priceHistory(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-price-history", params); + return client.request("tcgplayer-price-history", params, options); + } + + /** + * tcgplayer-product (GET /tcgplayer/product). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object product(Map params) { + return product(params, null); + } + + /** + * tcgplayer-product (GET /tcgplayer/product). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object product(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-product", params); + return client.request("tcgplayer-product", params, options); + } + + /** + * tcgplayer-product-lines (GET /tcgplayer/product-lines). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object productLines(Map params) { + return productLines(params, null); + } + + /** + * tcgplayer-product-lines (GET /tcgplayer/product-lines). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object productLines(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-product-lines", params); + return client.request("tcgplayer-product-lines", params, options); + } + + /** + * tcgplayer-product-lines (GET /tcgplayer/product-lines). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object productLines() { + return productLines(Map.of(), null); + } + + /** + * tcgplayer-sales (GET /tcgplayer/sales). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sales(Map params) { + return sales(params, null); + } + + /** + * tcgplayer-sales (GET /tcgplayer/sales). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sales(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-sales", params); + return client.request("tcgplayer-sales", params, options); + } + + /** + * tcgplayer-search (GET /tcgplayer/search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search(Map params) { + return search(params, null); + } + + /** + * tcgplayer-search (GET /tcgplayer/search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-search", params); + return client.request("tcgplayer-search", params, options); + } + + /** + * tcgplayer-search (GET /tcgplayer/search). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search() { + return search(Map.of(), null); + } + + /** + * tcgplayer-sets (GET /tcgplayer/sets). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sets(Map params) { + return sets(params, null); + } + + /** + * tcgplayer-sets (GET /tcgplayer/sets). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object sets(Map params, RequestOptions options) { + OperationGroup.checkParams("tcgplayer-sets", params); + return client.request("tcgplayer-sets", params, options); + } + +} diff --git a/src/main/java/net/crawlora/groups/TelegramGroup.java b/src/main/java/net/crawlora/groups/TelegramGroup.java new file mode 100644 index 0000000..54acdcf --- /dev/null +++ b/src/main/java/net/crawlora/groups/TelegramGroup.java @@ -0,0 +1,131 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "telegram" operation group. + * Reach it via {@code client.telegram()}. + */ +public final class TelegramGroup { + private final CrawloraClient client; + + public TelegramGroup(CrawloraClient client) { + this.client = client; + } + + /** + * telegram-bot (GET /telegram/bot). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object bot(Map params) { + return bot(params, null); + } + + /** + * telegram-bot (GET /telegram/bot). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object bot(Map params, RequestOptions options) { + OperationGroup.checkParams("telegram-bot", params); + return client.request("telegram-bot", params, options); + } + + /** + * telegram-channel (GET /telegram/channel). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channel(Map params) { + return channel(params, null); + } + + /** + * telegram-channel (GET /telegram/channel). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channel(Map params, RequestOptions options) { + OperationGroup.checkParams("telegram-channel", params); + return client.request("telegram-channel", params, options); + } + + /** + * telegram-channel-posts (GET /telegram/channel-posts). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelPosts(Map params) { + return channelPosts(params, null); + } + + /** + * telegram-channel-posts (GET /telegram/channel-posts). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object channelPosts(Map params, RequestOptions options) { + OperationGroup.checkParams("telegram-channel-posts", params); + return client.request("telegram-channel-posts", params, options); + } + + /** + * telegram-group (GET /telegram/group). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object group(Map params) { + return group(params, null); + } + + /** + * telegram-group (GET /telegram/group). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object group(Map params, RequestOptions options) { + OperationGroup.checkParams("telegram-group", params); + return client.request("telegram-group", params, options); + } + + /** + * telegram-post (GET /telegram/post). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object post(Map params) { + return post(params, null); + } + + /** + * telegram-post (GET /telegram/post). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object post(Map params, RequestOptions options) { + OperationGroup.checkParams("telegram-post", params); + return client.request("telegram-post", params, options); + } + +} diff --git a/src/main/java/net/crawlora/groups/WallapopGroup.java b/src/main/java/net/crawlora/groups/WallapopGroup.java new file mode 100644 index 0000000..e3e90f4 --- /dev/null +++ b/src/main/java/net/crawlora/groups/WallapopGroup.java @@ -0,0 +1,149 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "wallapop" operation group. + * Reach it via {@code client.wallapop()}. + */ +public final class WallapopGroup { + private final CrawloraClient client; + + public WallapopGroup(CrawloraClient client) { + this.client = client; + } + + /** + * wallapop-categories (GET /wallapop/categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories(Map params) { + return categories(params, null); + } + + /** + * wallapop-categories (GET /wallapop/categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories(Map params, RequestOptions options) { + OperationGroup.checkParams("wallapop-categories", params); + return client.request("wallapop-categories", params, options); + } + + /** + * wallapop-categories (GET /wallapop/categories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories() { + return categories(Map.of(), null); + } + + /** + * wallapop-filter-options (GET /wallapop/filter-options). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filterOptions(Map params) { + return filterOptions(params, null); + } + + /** + * wallapop-filter-options (GET /wallapop/filter-options). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filterOptions(Map params, RequestOptions options) { + OperationGroup.checkParams("wallapop-filter-options", params); + return client.request("wallapop-filter-options", params, options); + } + + /** + * wallapop-filters (GET /wallapop/filters). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filters(Map params) { + return filters(params, null); + } + + /** + * wallapop-filters (GET /wallapop/filters). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filters(Map params, RequestOptions options) { + OperationGroup.checkParams("wallapop-filters", params); + return client.request("wallapop-filters", params, options); + } + + /** + * wallapop-filters (GET /wallapop/filters). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object filters() { + return filters(Map.of(), null); + } + + /** + * wallapop-item-detail (GET /wallapop/item). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object itemDetail(Map params) { + return itemDetail(params, null); + } + + /** + * wallapop-item-detail (GET /wallapop/item). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object itemDetail(Map params, RequestOptions options) { + OperationGroup.checkParams("wallapop-item-detail", params); + return client.request("wallapop-item-detail", params, options); + } + + /** + * wallapop-search (GET /wallapop/search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search(Map params) { + return search(params, null); + } + + /** + * wallapop-search (GET /wallapop/search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search(Map params, RequestOptions options) { + OperationGroup.checkParams("wallapop-search", params); + return client.request("wallapop-search", params, options); + } + +} diff --git a/src/main/java/net/crawlora/groups/WattpadGroup.java b/src/main/java/net/crawlora/groups/WattpadGroup.java new file mode 100644 index 0000000..08a8275 --- /dev/null +++ b/src/main/java/net/crawlora/groups/WattpadGroup.java @@ -0,0 +1,290 @@ +package net.crawlora.groups; + +// Generated by scripts/generate.py. Do not edit manually. + +import java.util.Map; +import net.crawlora.CrawloraClient; +import net.crawlora.OperationGroup; +import net.crawlora.RequestOptions; + +/** + * Generated typed accessor for the "wattpad" operation group. + * Reach it via {@code client.wattpad()}. + */ +public final class WattpadGroup { + private final CrawloraClient client; + + public WattpadGroup(CrawloraClient client) { + this.client = client; + } + + /** + * wattpad-categories (GET /wattpad/categories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories(Map params) { + return categories(params, null); + } + + /** + * wattpad-categories (GET /wattpad/categories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-categories", params); + return client.request("wattpad-categories", params, options); + } + + /** + * wattpad-categories (GET /wattpad/categories). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object categories() { + return categories(Map.of(), null); + } + + /** + * wattpad-languages (GET /wattpad/languages). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object languages(Map params) { + return languages(params, null); + } + + /** + * wattpad-languages (GET /wattpad/languages). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object languages(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-languages", params); + return client.request("wattpad-languages", params, options); + } + + /** + * wattpad-languages (GET /wattpad/languages). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object languages() { + return languages(Map.of(), null); + } + + /** + * wattpad-part (GET /wattpad/part). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object part(Map params) { + return part(params, null); + } + + /** + * wattpad-part (GET /wattpad/part). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object part(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-part", params); + return client.request("wattpad-part", params, options); + } + + /** + * wattpad-part-comments (GET /wattpad/part-comments). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object partComments(Map params) { + return partComments(params, null); + } + + /** + * wattpad-part-comments (GET /wattpad/part-comments). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object partComments(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-part-comments", params); + return client.request("wattpad-part-comments", params, options); + } + + /** + * wattpad-search (GET /wattpad/search). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search(Map params) { + return search(params, null); + } + + /** + * wattpad-search (GET /wattpad/search). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-search", params); + return client.request("wattpad-search", params, options); + } + + /** + * wattpad-search (GET /wattpad/search). with no parameters. + * + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object search() { + return search(Map.of(), null); + } + + /** + * wattpad-search-users (GET /wattpad/search-users). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object searchUsers(Map params) { + return searchUsers(params, null); + } + + /** + * wattpad-search-users (GET /wattpad/search-users). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object searchUsers(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-search-users", params); + return client.request("wattpad-search-users", params, options); + } + + /** + * wattpad-story (GET /wattpad/story). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object story(Map params) { + return story(params, null); + } + + /** + * wattpad-story (GET /wattpad/story). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object story(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-story", params); + return client.request("wattpad-story", params, options); + } + + /** + * wattpad-story-parts (GET /wattpad/story-parts). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object storyParts(Map params) { + return storyParts(params, null); + } + + /** + * wattpad-story-parts (GET /wattpad/story-parts). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object storyParts(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-story-parts", params); + return client.request("wattpad-story-parts", params, options); + } + + /** + * wattpad-story-recommendations (GET /wattpad/story-recommendations). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object storyRecommendations(Map params) { + return storyRecommendations(params, null); + } + + /** + * wattpad-story-recommendations (GET /wattpad/story-recommendations). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object storyRecommendations(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-story-recommendations", params); + return client.request("wattpad-story-recommendations", params, options); + } + + /** + * wattpad-user (GET /wattpad/user). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object user(Map params) { + return user(params, null); + } + + /** + * wattpad-user (GET /wattpad/user). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object user(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-user", params); + return client.request("wattpad-user", params, options); + } + + /** + * wattpad-user-stories (GET /wattpad/user-stories). + * + * @param params operation parameters + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object userStories(Map params) { + return userStories(params, null); + } + + /** + * wattpad-user-stories (GET /wattpad/user-stories). with explicit request options. + * + * @param params operation parameters + * @param options per-request options, or {@code null} for defaults + * @return the parsed JSON response (Map/List/String/Number/Boolean), or an InputStream in stream mode + */ + public Object userStories(Map params, RequestOptions options) { + OperationGroup.checkParams("wattpad-user-stories", params); + return client.request("wattpad-user-stories", params, options); + } + +}