diff --git a/CHANGELOG.md b/CHANGELOG.md index f7eebea..ed6ce2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## v1.27.0-sdk.1 + +- Regenerated from the public API contract (837 to 848 operations). Adds public + job search and detail groups for Amazon, Apple, Google, Meta, and Tesla. +- Google Maps business responses now distinguish a missing `review_count` + (`null`) from a confirmed zero, and document locale-specific category labels. + ## v1.26.0-sdk.1 - Regenerated from the public API contract (832 to 837 operations). Adds Google Play ratings, Instagram user dataset search/item/facets, and Reddit trending dataset search. diff --git a/README.md b/README.md index 074e4cf..7f2834f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Python client for the public Crawlora API. Use it to call Crawlora scraping, search, social, developer, marketplace, datasets, reviews, travel, media, books, -maps, finance, prediction-market, brand, and usage endpoints +maps, jobs, finance, prediction-market, brand, and usage endpoints with generated type stubs for editor and type-checker support. - Runtime: Python 3.10+ diff --git a/crawlora/client.py b/crawlora/client.py index 23645c4..57dd1d5 100644 --- a/crawlora/client.py +++ b/crawlora/client.py @@ -20,7 +20,7 @@ from .operations import GROUPS, OPERATIONS DEFAULT_BASE_URL = "https://api.crawlora.net/api/v1" -VERSION = "1.26.0-sdk.1" +VERSION = "1.27.0-sdk.1" DEFAULT_USER_AGENT = f"crawlora-python-sdk/{VERSION}" DEFAULT_MAX_RETRY_DELAY = 30.0 DEFAULT_RETRY_STATUSES = (408, 409, 425, 429) diff --git a/crawlora/client.pyi b/crawlora/client.pyi index 16731a1..47b561e 100644 --- a/crawlora/client.pyi +++ b/crawlora/client.pyi @@ -253,6 +253,47 @@ ModelAmazonSuggestResponseDoc = TypedDict('ModelAmazonSuggestResponseDoc', { 'msg': NotRequired[str], }, total=False) +ModelAmazonjobsAmazonJob = TypedDict('ModelAmazonjobsAmazonJob', { + 'apply_url': NotRequired[str], + 'basic_qualifications': NotRequired[str], + 'category': NotRequired[str], + 'city': NotRequired[str], + 'company': NotRequired[str], + 'country': NotRequired[str], + 'description': NotRequired[str], + 'id': NotRequired[str], + 'location': NotRequired[str], + 'posted_at': NotRequired[str], + 'preferred_qualifications': NotRequired[str], + 'schedule_type': NotRequired[str], + 'state': NotRequired[str], + 'title': NotRequired[str], + 'url': NotRequired[str], +}, total=False) + +ModelAmazonjobsSearchResponse = TypedDict('ModelAmazonjobsSearchResponse', { + 'category': NotRequired[str], + 'country': NotRequired[str], + 'jobs': NotRequired[list[ModelAmazonjobsAmazonJob]], + 'limit': NotRequired[int], + 'page': NotRequired[int], + 'query': NotRequired[str], + 'source_url': NotRequired[str], + 'total': NotRequired[int], +}, total=False) + +ModelAmazonjobsJobResponseDoc = TypedDict('ModelAmazonjobsJobResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelAmazonjobsAmazonJob], + 'msg': NotRequired[str], +}, total=False) + +ModelAmazonjobsSearchResponseDoc = TypedDict('ModelAmazonjobsSearchResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelAmazonjobsSearchResponse], + 'msg': NotRequired[str], +}, total=False) + ModelAnimeAiringEntry = TypedDict('ModelAnimeAiringEntry', { 'airing_at': NotRequired[int], 'episode': NotRequired[int], @@ -763,6 +804,44 @@ ModelApplebooksSimilarResponseDoc = TypedDict('ModelApplebooksSimilarResponseDoc 'msg': NotRequired[str], }, total=False) +ModelApplejobsAppleJob = TypedDict('ModelApplejobsAppleJob', { + 'country': NotRequired[str], + 'description': NotRequired[str], + 'employment_type': NotRequired[str], + 'id': NotRequired[str], + 'location': NotRequired[str], + 'locations': NotRequired[list[str]], + 'minimum_qualifications': NotRequired[str], + 'position_id': NotRequired[str], + 'posted_at': NotRequired[str], + 'preferred_qualifications': NotRequired[str], + 'responsibilities': NotRequired[str], + 'team': NotRequired[str], + 'title': NotRequired[str], + 'url': NotRequired[str], +}, total=False) + +ModelApplejobsSearchResponse = TypedDict('ModelApplejobsSearchResponse', { + 'jobs': NotRequired[list[ModelApplejobsAppleJob]], + 'location': NotRequired[str], + 'page': NotRequired[int], + 'query': NotRequired[str], + 'source_url': NotRequired[str], + 'total': NotRequired[int], +}, total=False) + +ModelApplejobsJobResponseDoc = TypedDict('ModelApplejobsJobResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelApplejobsAppleJob], + 'msg': NotRequired[str], +}, total=False) + +ModelApplejobsSearchResponseDoc = TypedDict('ModelApplejobsSearchResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelApplejobsSearchResponse], + 'msg': NotRequired[str], +}, total=False) + ModelApplepodcastsChartRankingItem = TypedDict('ModelApplepodcastsChartRankingItem', { 'artist_name': NotRequired[str], 'artwork_url': NotRequired[str], @@ -5766,8 +5845,8 @@ ModelEsGoogleBusiness = TypedDict('ModelEsGoogleBusiness', { 'name': NotRequired[str], 'phone': NotRequired[str], 'place_id': NotRequired[str], - 'rating': NotRequired[float], - 'review_count': NotRequired[int], + 'rating': NotRequired[float | None], + 'review_count': NotRequired[int | None], 'similarweb': NotRequired[ModelSimilarwebSimilarWebResp], 'state': NotRequired[str], 'town': NotRequired[str], @@ -5802,8 +5881,8 @@ ModelEsGoogleBusinessDatasetItem = TypedDict('ModelEsGoogleBusinessDatasetItem', 'name': NotRequired[str], 'phone': NotRequired[str], 'place_id': NotRequired[str], - 'rating': NotRequired[float], - 'review_count': NotRequired[int], + 'rating': NotRequired[float | None], + 'review_count': NotRequired[int | None], 'similarweb': NotRequired[ModelSimilarwebSimilarWebResp], 'state': NotRequired[str], 'town': NotRequired[str], @@ -7842,7 +7921,7 @@ ModelGooglePlace = TypedDict('ModelGooglePlace', { 'name': NotRequired[str], 'phone': NotRequired[str], 'place_id': NotRequired[str], - 'rating': NotRequired[float], + 'rating': NotRequired[float | None], 'review_count': NotRequired[int], 'url': NotRequired[str], 'website': NotRequired[str], @@ -7975,6 +8054,43 @@ ModelGoogleVideosResponseDoc = TypedDict('ModelGoogleVideosResponseDoc', { 'msg': NotRequired[str], }, total=False) +ModelGooglejobsGoogleJob = TypedDict('ModelGooglejobsGoogleJob', { + 'apply_url': NotRequired[str], + 'company': NotRequired[str], + 'country': NotRequired[str], + 'description': NotRequired[str], + 'id': NotRequired[str], + 'location': NotRequired[str], + 'locations': NotRequired[list[str]], + 'minimum_qualifications': NotRequired[str], + 'posted_at': NotRequired[str], + 'preferred_qualifications': NotRequired[str], + 'responsibilities': NotRequired[str], + 'title': NotRequired[str], + 'url': NotRequired[str], +}, total=False) + +ModelGooglejobsSearchResponse = TypedDict('ModelGooglejobsSearchResponse', { + 'jobs': NotRequired[list[ModelGooglejobsGoogleJob]], + 'location': NotRequired[str], + 'page': NotRequired[int], + 'query': NotRequired[str], + 'source_url': NotRequired[str], + 'total': NotRequired[int], +}, total=False) + +ModelGooglejobsJobResponseDoc = TypedDict('ModelGooglejobsJobResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelGooglejobsGoogleJob], + 'msg': NotRequired[str], +}, total=False) + +ModelGooglejobsSearchResponseDoc = TypedDict('ModelGooglejobsSearchResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelGooglejobsSearchResponse], + 'msg': NotRequired[str], +}, total=False) + ModelGoogleplayApp = TypedDict('ModelGoogleplayApp', { 'ad_supported': NotRequired[bool], 'android_max_version': NotRequired[str], @@ -10372,6 +10488,68 @@ ModelMetaculusQuestionsResponseDoc = TypedDict('ModelMetaculusQuestionsResponseD 'msg': NotRequired[str], }, total=False) +ModelMetajobsListResponse = TypedDict('ModelMetajobsListResponse', { + 'listings': NotRequired[list[ModelMetajobsMetaJobListing]], + 'page': NotRequired[int], + 'page_size': NotRequired[int], + 'source_url': NotRequired[str], + 'total': NotRequired[int], +}, total=False) + +ModelMetajobsMetaJob = TypedDict('ModelMetajobsMetaJob', { + 'compensation_country': NotRequired[str], + 'compensation_max': NotRequired[str], + 'compensation_min': NotRequired[str], + 'departments': NotRequired[list[str]], + 'description': NotRequired[str], + 'id': NotRequired[str], + 'locations': NotRequired[list[str]], + 'minimum_qualifications': NotRequired[list[str]], + 'preferred_qualifications': NotRequired[list[str]], + 'responsibilities': NotRequired[list[str]], + 'title': NotRequired[str], + 'url': NotRequired[str], +}, total=False) + +ModelMetajobsMetaJobListing = TypedDict('ModelMetajobsMetaJobListing', { + 'id': NotRequired[str], + 'last_modified': NotRequired[str], + 'url': NotRequired[str], +}, total=False) + +ModelMetajobsMetaJobSearchResult = TypedDict('ModelMetajobsMetaJobSearchResult', { + 'id': NotRequired[str], + 'locations': NotRequired[list[str]], + 'sub_teams': NotRequired[list[str]], + 'teams': NotRequired[list[str]], + 'title': NotRequired[str], + 'url': NotRequired[str], +}, total=False) + +ModelMetajobsSearchResponse = TypedDict('ModelMetajobsSearchResponse', { + 'jobs': NotRequired[list[ModelMetajobsMetaJobSearchResult]], + 'source_url': NotRequired[str], + 'total': NotRequired[int], +}, total=False) + +ModelMetajobsJobResponseDoc = TypedDict('ModelMetajobsJobResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelMetajobsMetaJob], + 'msg': NotRequired[str], +}, total=False) + +ModelMetajobsListResponseDoc = TypedDict('ModelMetajobsListResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelMetajobsListResponse], + 'msg': NotRequired[str], +}, total=False) + +ModelMetajobsSearchResponseDoc = TypedDict('ModelMetajobsSearchResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelMetajobsSearchResponse], + 'msg': NotRequired[str], +}, total=False) + ModelNumbeoCityIndexEntry = TypedDict('ModelNumbeoCityIndexEntry', { 'city': NotRequired[str], 'city_slug': NotRequired[str], @@ -16301,6 +16479,51 @@ ModelTechstackTechnology = TypedDict('ModelTechstackTechnology', { 'version': NotRequired[str], }, total=False) +ModelTeslajobsListResponse = TypedDict('ModelTeslajobsListResponse', { + 'jobs': NotRequired[list[ModelTeslajobsTeslaJobListing]], + 'location': NotRequired[str], + 'page': NotRequired[int], + 'page_size': NotRequired[int], + 'query': NotRequired[str], + 'total': NotRequired[int], +}, total=False) + +ModelTeslajobsTeslaJob = TypedDict('ModelTeslajobsTeslaJob', { + 'apply_url': NotRequired[str], + 'compensation_text': NotRequired[str], + 'country': NotRequired[str], + 'department': NotRequired[str], + 'description': NotRequired[str], + 'employment_type': NotRequired[str], + 'id': NotRequired[str], + 'job_family': NotRequired[str], + 'location': NotRequired[str], + 'requirements': NotRequired[str], + 'responsibilities': NotRequired[str], + 'state': NotRequired[str], + 'title': NotRequired[str], + 'url': NotRequired[str], +}, total=False) + +ModelTeslajobsTeslaJobListing = TypedDict('ModelTeslajobsTeslaJobListing', { + 'department': NotRequired[str], + 'id': NotRequired[str], + 'location': NotRequired[str], + 'title': NotRequired[str], +}, total=False) + +ModelTeslajobsJobResponseDoc = TypedDict('ModelTeslajobsJobResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelTeslajobsTeslaJob], + 'msg': NotRequired[str], +}, total=False) + +ModelTeslajobsListResponseDoc = TypedDict('ModelTeslajobsListResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelTeslajobsListResponse], + 'msg': NotRequired[str], +}, total=False) + ModelThreadsAuthor = TypedDict('ModelThreadsAuthor', { 'id': NotRequired[str], 'name': NotRequired[str], @@ -19510,6 +19733,27 @@ AirbnbSearchParams = TypedDict('AirbnbSearchParams', { 'zoom': NotRequired[int], }, total=False) +AmazonJobsJobResponse = ModelAmazonjobsJobResponseDoc +AmazonJobsJobParams = TypedDict('AmazonJobsJobParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'id': Required[str], +}, total=False) + +AmazonJobsSearchResponse = ModelAmazonjobsSearchResponseDoc +AmazonJobsSearchParams = TypedDict('AmazonJobsSearchParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'q': NotRequired[str], + 'category': NotRequired[Literal['administrative-support', 'applied-science', 'audio-video-photography-production', 'business-intelligence-data-engineering', 'business-merchant-development', 'buying-planning-instock-management', 'customer-service', 'data-science', 'database-administration', 'design', 'economics', 'editorial-writing-content-management', 'facilities-maintenance-real-estate', 'fgbs', 'fulfillment-center-warehouse-associate', 'fulfillment-operations-management', 'hardware-development', 'human-resources', 'investigation-loss-prevention', 'leadership-development-training', 'legal', 'marketing', 'medical-health-safety', 'operations-it-support-engineering', 'project-program-product-management-non-tech', 'project-program-product-management-technical', 'public-policy', 'public-relations-communications', 'research-science', 'sales-advertising-account-management', 'software-development', 'solutions-architecture', 'supply-chain-transportation-management', 'systems-quality-security-engineering']], + 'country': NotRequired[str], + 'page': NotRequired[int], + 'limit': NotRequired[int], + 'sort': NotRequired[Literal['relevant', 'recent']], +}, total=False) + AmazonProductResponse = ModelAmazonProductResponseDoc AmazonProductParams = TypedDict('AmazonProductParams', { '_response_type': NotRequired[ResponseType], @@ -19759,6 +20003,24 @@ AppleBooksSeriesParams = TypedDict('AppleBooksSeriesParams', { 'lang': NotRequired[str], }, total=False) +AppleJobsJobResponse = ModelApplejobsJobResponseDoc +AppleJobsJobParams = TypedDict('AppleJobsJobParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'id': Required[str], +}, total=False) + +AppleJobsSearchResponse = ModelApplejobsSearchResponseDoc +AppleJobsSearchParams = TypedDict('AppleJobsSearchParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'q': Required[str], + 'location': NotRequired[str], + 'page': NotRequired[int], +}, total=False) + ApplePodcastsChartsResponse = ModelApplepodcastsChartsResponseDoc ApplePodcastsChartsParams = TypedDict('ApplePodcastsChartsParams', { '_response_type': NotRequired[ResponseType], @@ -23050,6 +23312,24 @@ GoodreadsSearchParams = TypedDict('GoodreadsSearchParams', { 'limit': NotRequired[int], }, total=False) +GoogleJobsJobResponse = ModelGooglejobsJobResponseDoc +GoogleJobsJobParams = TypedDict('GoogleJobsJobParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'id': Required[str], +}, total=False) + +GoogleJobsSearchResponse = ModelGooglejobsSearchResponseDoc +GoogleJobsSearchParams = TypedDict('GoogleJobsSearchParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'q': Required[str], + 'location': NotRequired[str], + 'page': NotRequired[int], +}, total=False) + GoogleFinanceAnalystArticlesResponse = ModelFinanceArticlesResponseDoc GoogleFinanceAnalystArticlesParams = TypedDict('GoogleFinanceAnalystArticlesParams', { '_response_type': NotRequired[ResponseType], @@ -24579,6 +24859,37 @@ MangaTitleParams = TypedDict('MangaTitleParams', { 'mal': NotRequired[bool], }, total=False) +MetaJobsJobResponse = ModelMetajobsJobResponseDoc +MetaJobsJobParams = TypedDict('MetaJobsJobParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'id': Required[str], +}, total=False) + +MetaJobsListResponse = ModelMetajobsListResponseDoc +MetaJobsListParams = TypedDict('MetaJobsListParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'page': NotRequired[int], + 'page_size': NotRequired[int], +}, total=False) + +MetaJobsSearchResponse = ModelMetajobsSearchResponseDoc +MetaJobsSearchParams = TypedDict('MetaJobsSearchParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'q': NotRequired[str], + 'teams': NotRequired[list[str]], + 'roles': NotRequired[list[str]], + 'offices': NotRequired[list[str]], + 'is_remote_only': NotRequired[bool], + 'sort_by_new': NotRequired[bool], + 'results_per_page': NotRequired[Literal['all', 'five', 'ten']], +}, total=False) + MetacriticBrowseResponse = ModelMetacriticBrowseResponseDoc MetacriticBrowseParams = TypedDict('MetacriticBrowseParams', { '_response_type': NotRequired[ResponseType], @@ -27206,6 +27517,25 @@ SteamTopSellersParams = TypedDict('SteamTopSellersParams', { 'l': NotRequired[str], }, total=False) +TeslaJobsJobResponse = ModelTeslajobsJobResponseDoc +TeslaJobsJobParams = TypedDict('TeslaJobsJobParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'id': Required[str], +}, total=False) + +TeslaJobsListResponse = ModelTeslajobsListResponseDoc +TeslaJobsListParams = TypedDict('TeslaJobsListParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'query': NotRequired[str], + 'location': NotRequired[str], + 'page': NotRequired[int], + 'page_size': NotRequired[int], +}, total=False) + ThreadsPostResponse = ModelThreadsPostResponseDoc ThreadsPostParams = TypedDict('ThreadsPostParams', { '_response_type': NotRequired[ResponseType], @@ -28414,6 +28744,10 @@ class AirbnbGroup: def room_reviews(self, **params: Unpack[AirbnbRoomReviewsParams]) -> AirbnbRoomReviewsResponse: ... def search(self, **params: Unpack[AirbnbSearchParams]) -> AirbnbSearchResponse: ... +class AmazonJobsGroup: + def job(self, **params: Unpack[AmazonJobsJobParams]) -> AmazonJobsJobResponse: ... + def search(self, **params: Unpack[AmazonJobsSearchParams]) -> AmazonJobsSearchResponse: ... + class AmazonGroup: def product(self, **params: Unpack[AmazonProductParams]) -> AmazonProductResponse: ... def search(self, **params: Unpack[AmazonSearchParams]) -> AmazonSearchResponse: ... @@ -28444,6 +28778,10 @@ class AppleBooksGroup: def search(self, **params: Unpack[AppleBooksSearchParams]) -> AppleBooksSearchResponse: ... def series(self, **params: Unpack[AppleBooksSeriesParams]) -> AppleBooksSeriesResponse: ... +class AppleJobsGroup: + def job(self, **params: Unpack[AppleJobsJobParams]) -> AppleJobsJobResponse: ... + def search(self, **params: Unpack[AppleJobsSearchParams]) -> AppleJobsSearchResponse: ... + class ApplePodcastsGroup: def charts(self, **params: Unpack[ApplePodcastsChartsParams]) -> ApplePodcastsChartsResponse: ... def charts_rankings(self, **params: Unpack[ApplePodcastsChartsRankingsParams]) -> ApplePodcastsChartsRankingsResponse: ... @@ -28742,6 +29080,10 @@ class GoodreadsGroup: def lists(self, **params: Unpack[GoodreadsListsParams]) -> GoodreadsListsResponse: ... def search(self, **params: Unpack[GoodreadsSearchParams]) -> GoodreadsSearchResponse: ... +class GoogleJobsGroup: + def job(self, **params: Unpack[GoogleJobsJobParams]) -> GoogleJobsJobResponse: ... + def search(self, **params: Unpack[GoogleJobsSearchParams]) -> GoogleJobsSearchResponse: ... + class GoogleGroup: def finance_analyst_articles(self, **params: Unpack[GoogleFinanceAnalystArticlesParams]) -> GoogleFinanceAnalystArticlesResponse: ... def finance_chart(self, **params: Unpack[GoogleFinanceChartParams]) -> GoogleFinanceChartResponse: ... @@ -28919,6 +29261,11 @@ class MangaGroup: def search(self, **params: Unpack[MangaSearchParams]) -> MangaSearchResponse: ... def title(self, **params: Unpack[MangaTitleParams]) -> MangaTitleResponse: ... +class MetaJobsGroup: + def job(self, **params: Unpack[MetaJobsJobParams]) -> MetaJobsJobResponse: ... + def list(self, **params: Unpack[MetaJobsListParams]) -> MetaJobsListResponse: ... + def search(self, **params: Unpack[MetaJobsSearchParams]) -> MetaJobsSearchResponse: ... + class MetacriticGroup: def browse(self, **params: Unpack[MetacriticBrowseParams]) -> MetacriticBrowseResponse: ... def game(self, **params: Unpack[MetacriticGameParams]) -> MetacriticGameResponse: ... @@ -29220,6 +29567,10 @@ class SteamGroup: def tags_list(self, **params: Unpack[SteamTagsListParams]) -> SteamTagsListResponse: ... def top_sellers(self, **params: Unpack[SteamTopSellersParams]) -> SteamTopSellersResponse: ... +class TeslaJobsGroup: + def job(self, **params: Unpack[TeslaJobsJobParams]) -> TeslaJobsJobResponse: ... + def list(self, **params: Unpack[TeslaJobsListParams]) -> TeslaJobsListResponse: ... + class ThreadsGroup: def post(self, **params: Unpack[ThreadsPostParams]) -> ThreadsPostResponse: ... def post_replies(self, **params: Unpack[ThreadsPostRepliesParams]) -> ThreadsPostRepliesResponse: ... @@ -29382,6 +29733,8 @@ OperationId = Literal[ 'airbnb-room-calendar', 'airbnb-room-reviews', 'airbnb-search', + 'amazon-jobs-job', + 'amazon-jobs-search', 'amazon-product', 'amazon-search', 'amazon-suggest', @@ -29406,6 +29759,8 @@ OperationId = Literal[ 'apple-books-charts', 'apple-books-search', 'apple-books-series', + 'apple-jobs-job', + 'apple-jobs-search', 'apple-podcasts-charts', 'apple-podcasts-charts-rankings', 'apple-podcasts-episodes-search', @@ -29666,6 +30021,8 @@ OperationId = Literal[ 'goodreads-list', 'goodreads-lists', 'goodreads-search', + 'google-jobs-job', + 'google-jobs-search', 'google-finance-analyst-articles', 'google-finance-chart', 'google-finance-classification', @@ -29823,6 +30180,9 @@ OperationId = Literal[ 'manga-rankings', 'manga-search', 'manga-title', + 'meta-jobs-job', + 'meta-jobs-list', + 'meta-jobs-search', 'metacritic-browse', 'metacritic-game', 'metacritic-game-critic-reviews', @@ -30084,6 +30444,8 @@ OperationId = Literal[ 'steam-tags', 'steam-tags-list', 'steam-top-sellers', + 'tesla-jobs-job', + 'tesla-jobs-list', 'threads-post', 'threads-post-replies', 'threads-profile', @@ -30216,9 +30578,11 @@ OperationId = Literal[ class CrawloraClient: airbnb: AirbnbGroup + amazon_jobs: AmazonJobsGroup amazon: AmazonGroup anime: AnimeGroup apple_books: AppleBooksGroup + apple_jobs: AppleJobsGroup apple_podcasts: ApplePodcastsGroup app_store: AppStoreGroup billing: BillingGroup @@ -30237,6 +30601,7 @@ class CrawloraClient: geocoding: GeocodingGroup git_hub: GitHubGroup goodreads: GoodreadsGroup + google_jobs: GoogleJobsGroup google: GoogleGroup google_play: GooglePlayGroup imdb: ImdbGroup @@ -30247,6 +30612,7 @@ class CrawloraClient: letterboxd: LetterboxdGroup linked_in: LinkedInGroup manga: MangaGroup + meta_jobs: MetaJobsGroup metacritic: MetacriticGroup metaculus: MetaculusGroup numbeo: NumbeoGroup @@ -30267,6 +30633,7 @@ class CrawloraClient: spotify_podcasts: SpotifyPodcastsGroup spotify: SpotifyGroup steam: SteamGroup + tesla_jobs: TeslaJobsGroup threads: ThreadsGroup tiktok: TiktokGroup tmdb: TmdbGroup @@ -30446,6 +30813,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> AirbnbSearchResponse: ... @overload + def operation( + self, + operation_id: Literal['amazon-jobs-job'], + params: AmazonJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AmazonJobsJobResponse: ... + @overload + def operation( + self, + operation_id: Literal['amazon-jobs-search'], + params: AmazonJobsSearchParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AmazonJobsSearchResponse: ... + @overload def operation( self, operation_id: Literal['amazon-product'], @@ -30734,6 +31125,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> AppleBooksSeriesResponse: ... @overload + def operation( + self, + operation_id: Literal['apple-jobs-job'], + params: AppleJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AppleJobsJobResponse: ... + @overload + def operation( + self, + operation_id: Literal['apple-jobs-search'], + params: AppleJobsSearchParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AppleJobsSearchResponse: ... + @overload def operation( self, operation_id: Literal['apple-podcasts-charts'], @@ -33854,6 +34269,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> GoodreadsSearchResponse: ... @overload + def operation( + self, + operation_id: Literal['google-jobs-job'], + params: GoogleJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> GoogleJobsJobResponse: ... + @overload + def operation( + self, + operation_id: Literal['google-jobs-search'], + params: GoogleJobsSearchParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> GoogleJobsSearchResponse: ... + @overload def operation( self, operation_id: Literal['google-finance-analyst-articles'], @@ -35738,6 +36177,42 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> MangaTitleResponse: ... @overload + def operation( + self, + operation_id: Literal['meta-jobs-job'], + params: MetaJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> MetaJobsJobResponse: ... + @overload + def operation( + self, + operation_id: Literal['meta-jobs-list'], + params: MetaJobsListParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> MetaJobsListResponse: ... + @overload + def operation( + self, + operation_id: Literal['meta-jobs-search'], + params: MetaJobsSearchParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> MetaJobsSearchResponse: ... + @overload def operation( self, operation_id: Literal['metacritic-browse'], @@ -38870,6 +39345,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> SteamTopSellersResponse: ... @overload + def operation( + self, + operation_id: Literal['tesla-jobs-job'], + params: TeslaJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> TeslaJobsJobResponse: ... + @overload + def operation( + self, + operation_id: Literal['tesla-jobs-list'], + params: TeslaJobsListParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> TeslaJobsListResponse: ... + @overload def operation( self, operation_id: Literal['threads-post'], @@ -40502,6 +41001,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> AirbnbSearchResponse: ... @overload + def request( + self, + operation_id: Literal['amazon-jobs-job'], + params: AmazonJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AmazonJobsJobResponse: ... + @overload + def request( + self, + operation_id: Literal['amazon-jobs-search'], + params: AmazonJobsSearchParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AmazonJobsSearchResponse: ... + @overload def request( self, operation_id: Literal['amazon-product'], @@ -40790,6 +41313,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> AppleBooksSeriesResponse: ... @overload + def request( + self, + operation_id: Literal['apple-jobs-job'], + params: AppleJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AppleJobsJobResponse: ... + @overload + def request( + self, + operation_id: Literal['apple-jobs-search'], + params: AppleJobsSearchParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> AppleJobsSearchResponse: ... + @overload def request( self, operation_id: Literal['apple-podcasts-charts'], @@ -43910,6 +44457,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> GoodreadsSearchResponse: ... @overload + def request( + self, + operation_id: Literal['google-jobs-job'], + params: GoogleJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> GoogleJobsJobResponse: ... + @overload + def request( + self, + operation_id: Literal['google-jobs-search'], + params: GoogleJobsSearchParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> GoogleJobsSearchResponse: ... + @overload def request( self, operation_id: Literal['google-finance-analyst-articles'], @@ -45794,6 +46365,42 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> MangaTitleResponse: ... @overload + def request( + self, + operation_id: Literal['meta-jobs-job'], + params: MetaJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> MetaJobsJobResponse: ... + @overload + def request( + self, + operation_id: Literal['meta-jobs-list'], + params: MetaJobsListParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> MetaJobsListResponse: ... + @overload + def request( + self, + operation_id: Literal['meta-jobs-search'], + params: MetaJobsSearchParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> MetaJobsSearchResponse: ... + @overload def request( self, operation_id: Literal['metacritic-browse'], @@ -48926,6 +49533,30 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> SteamTopSellersResponse: ... @overload + def request( + self, + operation_id: Literal['tesla-jobs-job'], + params: TeslaJobsJobParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> TeslaJobsJobResponse: ... + @overload + def request( + self, + operation_id: Literal['tesla-jobs-list'], + params: TeslaJobsListParams = ..., + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> TeslaJobsListResponse: ... + @overload def request( self, operation_id: Literal['threads-post'], diff --git a/crawlora/operations.py b/crawlora/operations.py index 5de3800..7f34755 100644 --- a/crawlora/operations.py +++ b/crawlora/operations.py @@ -90,6 +90,73 @@ {'in': 'query', 'name': 'sw_lng', 'type': 'number'}, {'in': 'query', 'name': 'zoom', 'type': 'integer'}], 'security': ['ApiKeyAuth']}, + 'amazon-jobs-job': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'amazon-jobs-job', + 'method': 'GET', + 'path': '/amazon-jobs/job', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'id', 'required': True, 'type': 'string'}], + 'security': ['ApiKeyAuth']}, + 'amazon-jobs-search': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'amazon-jobs-search', + 'method': 'GET', + 'paginatable': True, + 'path': '/amazon-jobs/search', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'q', 'type': 'string'}, + {'enum': ['administrative-support', + 'applied-science', + 'audio-video-photography-production', + 'business-intelligence-data-engineering', + 'business-merchant-development', + 'buying-planning-instock-management', + 'customer-service', + 'data-science', + 'database-administration', + 'design', + 'economics', + 'editorial-writing-content-management', + 'facilities-maintenance-real-estate', + 'fgbs', + 'fulfillment-center-warehouse-associate', + 'fulfillment-operations-management', + 'hardware-development', + 'human-resources', + 'investigation-loss-prevention', + 'leadership-development-training', + 'legal', + 'marketing', + 'medical-health-safety', + 'operations-it-support-engineering', + 'project-program-product-management-non-tech', + 'project-program-product-management-technical', + 'public-policy', + 'public-relations-communications', + 'research-science', + 'sales-advertising-account-management', + 'software-development', + 'solutions-architecture', + 'supply-chain-transportation-management', + 'systems-quality-security-engineering'], + 'in': 'query', + 'name': 'category', + 'type': 'string'}, + {'in': 'query', 'name': 'country', 'type': 'string'}, + {'in': 'query', 'name': 'page', 'type': 'integer'}, + {'in': 'query', 'name': 'limit', 'type': 'integer'}, + {'enum': ['relevant', 'recent'], + 'in': 'query', + 'name': 'sort', + 'type': 'string'}], + 'security': ['ApiKeyAuth']}, 'amazon-product': {'bodyParam': None, 'bodyRequired': False, 'consumes': ['application/json'], @@ -448,6 +515,31 @@ 'queryParams': [{'in': 'query', 'name': 'country', 'type': 'string'}, {'in': 'query', 'name': 'lang', 'type': 'string'}], 'security': ['ApiKeyAuth']}, + 'apple-jobs-job': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'apple-jobs-job', + 'method': 'GET', + 'path': '/apple-jobs/job', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'id', 'required': True, 'type': 'string'}], + 'security': ['ApiKeyAuth']}, + 'apple-jobs-search': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'apple-jobs-search', + 'method': 'GET', + 'paginatable': True, + 'path': '/apple-jobs/search', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'q', 'required': True, 'type': 'string'}, + {'in': 'query', 'name': 'location', 'type': 'string'}, + {'in': 'query', 'name': 'page', 'type': 'integer'}], + 'security': ['ApiKeyAuth']}, 'apple-podcasts-charts': {'bodyParam': None, 'bodyRequired': False, 'consumes': ['application/json'], @@ -7388,6 +7480,31 @@ 'produces': ['application/json'], 'queryParams': [], 'security': ['ApiKeyAuth']}, + 'google-jobs-job': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'google-jobs-job', + 'method': 'GET', + 'path': '/google-jobs/job', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'id', 'required': True, 'type': 'string'}], + 'security': ['ApiKeyAuth']}, + 'google-jobs-search': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'google-jobs-search', + 'method': 'GET', + 'paginatable': True, + 'path': '/google-jobs/search', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'q', 'required': True, 'type': 'string'}, + {'in': 'query', 'name': 'location', 'type': 'string'}, + {'in': 'query', 'name': 'page', 'type': 'integer'}], + 'security': ['ApiKeyAuth']}, 'google-map-place': {'bodyParam': None, 'bodyRequired': False, 'consumes': ['application/json'], @@ -9548,6 +9665,50 @@ 'produces': ['application/json'], 'queryParams': [{'in': 'query', 'name': 'mal', 'type': 'boolean'}], 'security': ['ApiKeyAuth']}, + 'meta-jobs-job': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'meta-jobs-job', + 'method': 'GET', + 'path': '/meta-jobs/job', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'id', 'required': True, 'type': 'string'}], + 'security': ['ApiKeyAuth']}, + 'meta-jobs-list': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'meta-jobs-list', + 'method': 'GET', + 'paginatable': True, + 'path': '/meta-jobs/list', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'page', 'type': 'integer'}, + {'in': 'query', 'name': 'page_size', 'type': 'integer'}], + 'security': ['ApiKeyAuth']}, + 'meta-jobs-search': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'meta-jobs-search', + 'method': 'GET', + 'path': '/meta-jobs/search', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'q', 'type': 'string'}, + {'collectionFormat': 'csv', 'in': 'query', 'name': 'teams', 'type': 'array'}, + {'collectionFormat': 'csv', 'in': 'query', 'name': 'roles', 'type': 'array'}, + {'collectionFormat': 'csv', 'in': 'query', 'name': 'offices', 'type': 'array'}, + {'in': 'query', 'name': 'is_remote_only', 'type': 'boolean'}, + {'in': 'query', 'name': 'sort_by_new', 'type': 'boolean'}, + {'enum': ['all', 'five', 'ten'], + 'in': 'query', + 'name': 'results_per_page', + 'type': 'string'}], + 'security': ['ApiKeyAuth']}, 'metacritic-browse': {'bodyParam': None, 'bodyRequired': False, 'consumes': ['application/json'], @@ -13461,6 +13622,32 @@ 'queryParams': [{'in': 'query', 'name': 'cc', 'type': 'string'}, {'in': 'query', 'name': 'l', 'type': 'string'}], 'security': ['ApiKeyAuth']}, + 'tesla-jobs-job': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'tesla-jobs-job', + 'method': 'GET', + 'path': '/tesla-jobs/job', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'id', 'required': True, 'type': 'string'}], + 'security': ['ApiKeyAuth']}, + 'tesla-jobs-list': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'tesla-jobs-list', + 'method': 'GET', + 'paginatable': True, + 'path': '/tesla-jobs/list', + 'pathParams': [], + 'produces': ['application/json'], + 'queryParams': [{'in': 'query', 'name': 'query', 'type': 'string'}, + {'in': 'query', 'name': 'location', 'type': 'string'}, + {'in': 'query', 'name': 'page', 'type': 'integer'}, + {'in': 'query', 'name': 'page_size', 'type': 'integer'}], + 'security': ['ApiKeyAuth']}, 'threads-post': {'bodyParam': None, 'bodyRequired': False, 'consumes': [], @@ -15211,6 +15398,7 @@ 'room_reviews': 'airbnb-room-reviews', 'search': 'airbnb-search'}, 'amazon': {'product': 'amazon-product', 'search': 'amazon-search', 'suggest': 'amazon-suggest'}, + 'amazon_jobs': {'job': 'amazon-jobs-job', 'search': 'amazon-jobs-search'}, 'anime': {'airing_schedule': 'anime-airing-schedule', 'character': 'anime-character', 'character_search': 'anime-character-search', @@ -15244,6 +15432,7 @@ 'charts': 'apple-books-charts', 'search': 'apple-books-search', 'series': 'apple-books-series'}, + 'apple_jobs': {'job': 'apple-jobs-job', 'search': 'apple-jobs-search'}, 'apple_podcasts': {'charts': 'apple-podcasts-charts', 'charts_rankings': 'apple-podcasts-charts-rankings', 'episodes_search': 'apple-podcasts-episodes-search', @@ -15525,6 +15714,7 @@ 'trends_trending': 'google-trends-trending', 'trends_trending_detail': 'google-trends-trending-detail', 'videos': 'google-videos'}, + 'google_jobs': {'job': 'google-jobs-job', 'search': 'google-jobs-search'}, 'google_play': {'app': 'googleplay-app', 'categories': 'googleplay-categories', 'datasafety': 'googleplay-datasafety', @@ -15639,6 +15829,7 @@ 'linkedin_showcase': 'linkedin-showcase'}, 'manga': {'rankings': 'manga-rankings', 'search': 'manga-search', 'title': 'manga-title'}, 'meta': {'ping': 'ping', 'ready': 'ready'}, + 'meta_jobs': {'job': 'meta-jobs-job', 'list': 'meta-jobs-list', 'search': 'meta-jobs-search'}, 'metacritic': {'browse': 'metacritic-browse', 'game': 'metacritic-game', 'game_critic_reviews': 'metacritic-game-critic-reviews', @@ -15895,6 +16086,7 @@ 'tags': 'steam-tags', 'tags_list': 'steam-tags-list', 'top_sellers': 'steam-top-sellers'}, + 'tesla_jobs': {'job': 'tesla-jobs-job', 'list': 'tesla-jobs-list'}, 'threads': {'post': 'threads-post', 'post_replies': 'threads-post-replies', 'profile': 'threads-profile', @@ -16021,7 +16213,7 @@ 'video': 'youtube-video'}, 'zillow': {'autocomplete': 'zillow-autocomplete', 'property': 'zillow-property', 'search': 'zillow-search'}} -OPERATION_COUNT = 837 +OPERATION_COUNT = 848 class OperationId: AIRBNB_HOST = 'airbnb-host' @@ -16031,6 +16223,8 @@ class OperationId: AIRBNB_ROOM_CALENDAR = 'airbnb-room-calendar' AIRBNB_ROOM_REVIEWS = 'airbnb-room-reviews' AIRBNB_SEARCH = 'airbnb-search' + AMAZON_JOBS_JOB = 'amazon-jobs-job' + AMAZON_JOBS_SEARCH = 'amazon-jobs-search' AMAZON_PRODUCT = 'amazon-product' AMAZON_SEARCH = 'amazon-search' AMAZON_SUGGEST = 'amazon-suggest' @@ -16067,6 +16261,8 @@ class OperationId: APPLE_BOOKS_CHARTS = 'apple-books-charts' APPLE_BOOKS_SEARCH = 'apple-books-search' APPLE_BOOKS_SERIES = 'apple-books-series' + APPLE_JOBS_JOB = 'apple-jobs-job' + APPLE_JOBS_SEARCH = 'apple-jobs-search' APPLE_PODCASTS_CHARTS = 'apple-podcasts-charts' APPLE_PODCASTS_CHARTS_RANKINGS = 'apple-podcasts-charts-rankings' APPLE_PODCASTS_EPISODES_SEARCH = 'apple-podcasts-episodes-search' @@ -16333,6 +16529,8 @@ class OperationId: GOOGLE_FINANCE_SEARCH = 'google-finance-search' GOOGLE_FINANCE_TICKER = 'google-finance-ticker' GOOGLE_JOBS = 'google-jobs' + GOOGLE_JOBS_JOB = 'google-jobs-job' + GOOGLE_JOBS_SEARCH = 'google-jobs-search' GOOGLE_MAP_PLACE = 'google-map-place' GOOGLE_MAP_PLACE_PHOTOS = 'google-map-place-photos' GOOGLE_MAP_PLACE_REVIEWS = 'google-map-place-reviews' @@ -16469,6 +16667,9 @@ class OperationId: MANGA_RANKINGS = 'manga-rankings' MANGA_SEARCH = 'manga-search' MANGA_TITLE = 'manga-title' + META_JOBS_JOB = 'meta-jobs-job' + META_JOBS_LIST = 'meta-jobs-list' + META_JOBS_SEARCH = 'meta-jobs-search' META_PING = 'ping' META_READY = 'ready' METACRITIC_BROWSE = 'metacritic-browse' @@ -16730,6 +16931,8 @@ class OperationId: STEAM_TAGS = 'steam-tags' STEAM_TAGS_LIST = 'steam-tags-list' STEAM_TOP_SELLERS = 'steam-top-sellers' + TESLA_JOBS_JOB = 'tesla-jobs-job' + TESLA_JOBS_LIST = 'tesla-jobs-list' THREADS_POST = 'threads-post' THREADS_POST_REPLIES = 'threads-post-replies' THREADS_PROFILE = 'threads-profile' diff --git a/docs/operations.md b/docs/operations.md index 3c75c8d..a4ae68a 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: `837` +Total operations: `848` | Group | SDK method | Operation ID | HTTP | Params | Auth | Response | Notes | | --- | --- | --- | --- | --- | --- | --- | --- | @@ -13,6 +13,8 @@ Total operations: `837` | airbnb | `airbnb.room_calendar` | `airbnb-room-calendar` | `GET /airbnb/room/{id}/calendar` | `id` (path str required) | `ApiKeyAuth` | `AirbnbRoomCalendarResponse` | | | airbnb | `airbnb.room_reviews` | `airbnb-room-reviews` | `GET /airbnb/room/{id}/reviews` | `id` (path str required)
`page` (query int) | `ApiKeyAuth` | `AirbnbRoomReviewsResponse` | | | airbnb | `airbnb.search` | `airbnb-search` | `GET /airbnb/search` | `location` (query str required)
`check_in` (query str)
`check_out` (query str)
`adults` (query int)
`page` (query int)
`currency` (query str)
`ne_lat` (query float)
`ne_lng` (query float)
`sw_lat` (query float)
`sw_lng` (query float)
`zoom` (query int) | `ApiKeyAuth` | `AirbnbSearchResponse` | | +| amazon_jobs | `amazon_jobs.job` | `amazon-jobs-job` | `GET /amazon-jobs/job` | `id` (query str required) | `ApiKeyAuth` | `AmazonJobsJobResponse` | | +| amazon_jobs | `amazon_jobs.search` | `amazon-jobs-search` | `GET /amazon-jobs/search` | `q` (query str)
`category` (query Literal['administrative-support', 'applied-science', 'audio-video-photography-production', 'business-intelligence-data-engineering', 'business-merchant-development', 'buying-planning-instock-management', 'customer-service', 'data-science', 'database-administration', 'design', 'economics', 'editorial-writing-content-management', 'facilities-maintenance-real-estate', 'fgbs', 'fulfillment-center-warehouse-associate', 'fulfillment-operations-management', 'hardware-development', 'human-resources', 'investigation-loss-prevention', 'leadership-development-training', 'legal', 'marketing', 'medical-health-safety', 'operations-it-support-engineering', 'project-program-product-management-non-tech', 'project-program-product-management-technical', 'public-policy', 'public-relations-communications', 'research-science', 'sales-advertising-account-management', 'software-development', 'solutions-architecture', 'supply-chain-transportation-management', 'systems-quality-security-engineering'])
`country` (query str)
`page` (query int)
`limit` (query int)
`sort` (query Literal['relevant', 'recent']) | `ApiKeyAuth` | `AmazonJobsSearchResponse` | | | amazon | `amazon.product` | `amazon-product` | `GET /amazon/product/{asin}` | `asin` (path str required)
`language` (query Literal['en_US'])
`currency` (query Literal['USD']) | `ApiKeyAuth` | `AmazonProductResponse` | | | amazon | `amazon.search` | `amazon-search` | `GET /amazon/search` | `k` (query str required)
`s` (query str)
`page` (query int) | `ApiKeyAuth` | `AmazonSearchResponse` | | | amazon | `amazon.suggest` | `amazon-suggest` | `GET /amazon/suggest/{keyword}` | `keyword` (path str required) | `ApiKeyAuth` | `AmazonSuggestResponse` | | @@ -37,6 +39,8 @@ Total operations: `837` | apple_books | `apple_books.charts` | `apple-books-charts` | `GET /apple-books/charts` | `collection` (query Literal['top-free', 'top-paid'])
`genre` (query int)
`country` (query str)
`limit` (query int) | `ApiKeyAuth` | `AppleBooksChartsResponse` | | | apple_books | `apple_books.search` | `apple-books-search` | `GET /apple-books/search` | `term` (query str required)
`country` (query str)
`lang` (query str)
`limit` (query int)
`page` (query int) | `ApiKeyAuth` | `AppleBooksSearchResponse` | | | apple_books | `apple_books.series` | `apple-books-series` | `GET /apple-books/series/{id}` | `id` (path str required)
`country` (query str)
`lang` (query str) | `ApiKeyAuth` | `AppleBooksSeriesResponse` | | +| apple_jobs | `apple_jobs.job` | `apple-jobs-job` | `GET /apple-jobs/job` | `id` (query str required) | `ApiKeyAuth` | `AppleJobsJobResponse` | | +| apple_jobs | `apple_jobs.search` | `apple-jobs-search` | `GET /apple-jobs/search` | `q` (query str required)
`location` (query str)
`page` (query int) | `ApiKeyAuth` | `AppleJobsSearchResponse` | | | apple_podcasts | `apple_podcasts.charts` | `apple-podcasts-charts` | `GET /apple-podcasts/charts` | `collection` (query str)
`category` (query int)
`country` (query str)
`limit` (query int) | `ApiKeyAuth` | `ApplePodcastsChartsResponse` | | | apple_podcasts | `apple_podcasts.charts_rankings` | `apple-podcasts-charts-rankings` | `GET /apple-podcasts/charts/rankings` | `chart` (query str)
`type` (query str)
`genre` (query int)
`country` (query str)
`limit` (query int) | `ApiKeyAuth` | `ApplePodcastsChartsRankingsResponse` | | | apple_podcasts | `apple_podcasts.episodes_search` | `apple-podcasts-episodes-search` | `GET /apple-podcasts/episodes/search` | `term` (query str required)
`country` (query str)
`lang` (query str)
`limit` (query int)
`page` (query int) | `ApiKeyAuth` | `ApplePodcastsEpisodesSearchResponse` | | @@ -299,6 +303,8 @@ Total operations: `837` | goodreads | `goodreads.list` | `goodreads-list` | `GET /goodreads/list/{id}` | `id` (path str required)
`page` (query int) | `ApiKeyAuth` | `GoodreadsListResponse` | | | goodreads | `goodreads.lists` | `goodreads-lists` | `GET /goodreads/lists` | none | `ApiKeyAuth` | `GoodreadsListsResponse` | | | goodreads | `goodreads.search` | `goodreads-search` | `GET /goodreads/search` | `q` (query str required)
`limit` (query int) | `ApiKeyAuth` | `GoodreadsSearchResponse` | | +| google_jobs | `google_jobs.job` | `google-jobs-job` | `GET /google-jobs/job` | `id` (query str required) | `ApiKeyAuth` | `GoogleJobsJobResponse` | | +| google_jobs | `google_jobs.search` | `google-jobs-search` | `GET /google-jobs/search` | `q` (query str required)
`location` (query str)
`page` (query int) | `ApiKeyAuth` | `GoogleJobsSearchResponse` | | | google | `google.finance_analyst_articles` | `google-finance-analyst-articles` | `GET /google/finance/analyst-articles/{quote}` | `quote` (path str required) | `ApiKeyAuth` | `GoogleFinanceAnalystArticlesResponse` | | | google | `google.finance_chart` | `google-finance-chart` | `GET /google/finance/chart/{quote}` | `quote` (path str required)
`window` (query str) | `ApiKeyAuth` | `GoogleFinanceChartResponse` | | | google | `google.finance_classification` | `google-finance-classification` | `GET /google/finance/classification/{quote}` | `quote` (path str required) | `ApiKeyAuth` | `GoogleFinanceClassificationResponse` | | @@ -456,6 +462,9 @@ Total operations: `837` | manga | `manga.rankings` | `manga-rankings` | `GET /manga/rankings` | `sort` (query Literal['TRENDING_DESC', 'POPULARITY_DESC', 'SCORE_DESC', 'FAVOURITES_DESC', 'START_DATE_DESC', 'UPDATED_AT_DESC'])
`format` (query Literal['MANGA', 'NOVEL', 'ONE_SHOT'])
`genre` (query str)
`status` (query Literal['FINISHED', 'RELEASING', 'NOT_YET_RELEASED', 'CANCELLED', 'HIATUS'])
`page` (query int)
`per_page` (query int) | `ApiKeyAuth` | `MangaRankingsResponse` | | | manga | `manga.search` | `manga-search` | `GET /manga/search` | `query` (query str required)
`sort` (query Literal['SEARCH_MATCH', 'POPULARITY_DESC', 'SCORE_DESC', 'TRENDING_DESC', 'FAVOURITES_DESC', 'START_DATE_DESC'])
`page` (query int)
`per_page` (query int) | `ApiKeyAuth` | `MangaSearchResponse` | | | manga | `manga.title` | `manga-title` | `GET /manga/title/{id}` | `id` (path str required)
`mal` (query bool) | `ApiKeyAuth` | `MangaTitleResponse` | | +| meta_jobs | `meta_jobs.job` | `meta-jobs-job` | `GET /meta-jobs/job` | `id` (query str required) | `ApiKeyAuth` | `MetaJobsJobResponse` | | +| meta_jobs | `meta_jobs.list` | `meta-jobs-list` | `GET /meta-jobs/list` | `page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `MetaJobsListResponse` | | +| meta_jobs | `meta_jobs.search` | `meta-jobs-search` | `GET /meta-jobs/search` | `q` (query str)
`teams` (query list[str])
`roles` (query list[str])
`offices` (query list[str])
`is_remote_only` (query bool)
`sort_by_new` (query bool)
`results_per_page` (query Literal['all', 'five', 'ten']) | `ApiKeyAuth` | `MetaJobsSearchResponse` | | | metacritic | `metacritic.browse` | `metacritic-browse` | `GET /metacritic/browse` | `type` (query Literal['game', 'movie', 'tv'] required)
`genre` (query str)
`sort` (query Literal['score', 'popularity', 'release_date', 'oldest'])
`page` (query int)
`per_page` (query int) | `ApiKeyAuth` | `MetacriticBrowseResponse` | | | metacritic | `metacritic.game` | `metacritic-game` | `GET /metacritic/game/{slug}` | `slug` (path str required) | `ApiKeyAuth` | `MetacriticGameResponse` | | | metacritic | `metacritic.game_critic_reviews` | `metacritic-game-critic-reviews` | `GET /metacritic/game/{slug}/critic-reviews` | `slug` (path str required)
`page` (query int)
`per_page` (query int)
`sort` (query Literal['date', 'score', 'publication']) | `ApiKeyAuth` | `MetacriticGameCriticReviewsResponse` | | @@ -717,6 +726,8 @@ Total operations: `837` | steam | `steam.tags` | `steam-tags` | `GET /steam/tags` | `tags` (query str)
`untags` (query str)
`category1` (query str)
`category2` (query str)
`category3` (query str)
`os` (query str)
`maxprice` (query str)
`specials` (query bool)
`hidef2p` (query bool)
`deck_compatibility` (query Literal['1', '2', '3'])
`vrsupport` (query str)
`filter` (query Literal['globaltopsellers', 'topsellers', 'popularnew', 'comingsoon'])
`supportedlang` (query str)
`sort_by` (query Literal['Relevance', 'Released_DESC', 'Name_ASC', 'Price_ASC', 'Price_DESC', 'Reviews_DESC'])
`start` (query int)
`count` (query int)
`cc` (query str)
`l` (query str) | `ApiKeyAuth` | `SteamTagsResponse` | | | steam | `steam.tags_list` | `steam-tags-list` | `GET /steam/tags/list` | `l` (query str) | `ApiKeyAuth` | `SteamTagsListResponse` | | | steam | `steam.top_sellers` | `steam-top-sellers` | `GET /steam/top-sellers` | `cc` (query str)
`l` (query str) | `ApiKeyAuth` | `SteamTopSellersResponse` | | +| tesla_jobs | `tesla_jobs.job` | `tesla-jobs-job` | `GET /tesla-jobs/job` | `id` (query str required) | `ApiKeyAuth` | `TeslaJobsJobResponse` | | +| tesla_jobs | `tesla_jobs.list` | `tesla-jobs-list` | `GET /tesla-jobs/list` | `query` (query str)
`location` (query str)
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `TeslaJobsListResponse` | | | threads | `threads.post` | `threads-post` | `GET /threads/post/{username}/{code}` | `username` (path str required)
`code` (path str required) | `ApiKeyAuth` | `ThreadsPostResponse` | | | threads | `threads.post_replies` | `threads-post-replies` | `GET /threads/post/{username}/{code}/replies` | `username` (path str required)
`code` (path str required) | `ApiKeyAuth` | `ThreadsPostRepliesResponse` | | | threads | `threads.profile` | `threads-profile` | `GET /threads/profile/{username}` | `username` (path str required) | `ApiKeyAuth` | `ThreadsProfileResponse` | | diff --git a/docs/recipes.md b/docs/recipes.md index 75f167c..97f053a 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -44,6 +44,18 @@ brand = crawlora.brand.retrieve(domain="stripe.com") Omit `include_metrics` for the 1-credit feed mode. Set it to `True` for the 3-credit anonymous HTML mode with public post and comment engagement metrics. +## Company Job Searches + +Search public job listings directly from employer career sites: + +```python +amazon = crawlora.amazon_jobs.search(q="software engineer", country="US") +apple = crawlora.apple_jobs.search(q="machine learning", location="United States") +google = crawlora.google_jobs.search(q="data scientist", location="Singapore") +meta = crawlora.meta_jobs.search(q="product manager", is_remote_only=True) +tesla = crawlora.tesla_jobs.list(query="manufacturing", location="Texas") +``` + ## Threads Public Lookups ```python diff --git a/openapi/public.json b/openapi/public.json index b6ca113..058abd4 100644 --- a/openapi/public.json +++ b/openapi/public.json @@ -725,6 +725,138 @@ }, "type": "object" }, + "amazonjobs.AmazonJob": { + "properties": { + "apply_url": { + "example": "https://account.amazon.com/jobs/10386857/apply", + "type": "string" + }, + "basic_qualifications": { + "type": "string" + }, + "category": { + "example": "Software Development", + "type": "string" + }, + "city": { + "example": "Sydney", + "type": "string" + }, + "company": { + "example": "Amazon Web Services Australia Pty Ltd", + "type": "string" + }, + "country": { + "example": "AUS", + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "example": "10386857", + "type": "string" + }, + "location": { + "example": "Sydney, New South Wales, AUS", + "type": "string" + }, + "posted_at": { + "example": "2026-04-09T00:00:00Z", + "type": "string" + }, + "preferred_qualifications": { + "type": "string" + }, + "schedule_type": { + "example": "full-time", + "type": "string" + }, + "state": { + "example": "NSW", + "type": "string" + }, + "title": { + "example": "Software Engineer", + "type": "string" + }, + "url": { + "example": "https://www.amazon.jobs/en/jobs/10386857/software-engineer", + "type": "string" + } + }, + "type": "object" + }, + "amazonjobs.SearchResponse": { + "properties": { + "category": { + "example": "software-development", + "type": "string" + }, + "country": { + "example": "USA", + "type": "string" + }, + "jobs": { + "items": { + "$ref": "#/definitions/amazonjobs.AmazonJob" + }, + "type": "array" + }, + "limit": { + "example": 20, + "type": "integer" + }, + "page": { + "example": 1, + "type": "integer" + }, + "query": { + "example": "software engineer", + "type": "string" + }, + "source_url": { + "type": "string" + }, + "total": { + "example": 2027, + "type": "integer" + } + }, + "type": "object" + }, + "amazonjobs.jobResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/amazonjobs.AmazonJob" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "amazonjobs.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/amazonjobs.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "anime.AiringEntry": { "properties": { "airing_at": { @@ -2330,6 +2462,127 @@ }, "type": "object" }, + "applejobs.AppleJob": { + "properties": { + "country": { + "example": "United States", + "type": "string" + }, + "description": { + "type": "string" + }, + "employment_type": { + "example": "Standard", + "type": "string" + }, + "id": { + "example": "200674676-0836", + "type": "string" + }, + "location": { + "example": "Cupertino, California, United States", + "type": "string" + }, + "locations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "minimum_qualifications": { + "type": "string" + }, + "position_id": { + "example": "200674676", + "type": "string" + }, + "posted_at": { + "example": "2026-07-29T04:08:46Z", + "type": "string" + }, + "preferred_qualifications": { + "type": "string" + }, + "responsibilities": { + "type": "string" + }, + "team": { + "example": "Hardware", + "type": "string" + }, + "title": { + "example": "Optical Software Engineer", + "type": "string" + }, + "url": { + "example": "https://jobs.apple.com/en-us/details/200674676-0836/optical-software-engineer", + "type": "string" + } + }, + "type": "object" + }, + "applejobs.SearchResponse": { + "properties": { + "jobs": { + "items": { + "$ref": "#/definitions/applejobs.AppleJob" + }, + "type": "array" + }, + "location": { + "example": "united-states-USA", + "type": "string" + }, + "page": { + "example": 1, + "type": "integer" + }, + "query": { + "example": "software engineer", + "type": "string" + }, + "source_url": { + "type": "string" + }, + "total": { + "example": 4342, + "type": "integer" + } + }, + "type": "object" + }, + "applejobs.jobResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/applejobs.AppleJob" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "applejobs.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/applejobs.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "applepodcasts.ChartRankingItem": { "properties": { "artist_name": { @@ -18048,8 +18301,10 @@ "x-nullable": true }, "review_count": { + "description": "ReviewCount is the aggregate Google review count. A null value means Google\ndid not return a count; numeric zero means Google confirmed zero reviews.", "example": 3213, - "type": "integer" + "type": "integer", + "x-nullable": true }, "similarweb": { "$ref": "#/definitions/similarweb.SimilarWebResp" @@ -18196,8 +18451,10 @@ "x-nullable": true }, "review_count": { + "description": "ReviewCount is the aggregate Google review count. A null value means Google\ndid not return a count; numeric zero means Google confirmed zero reviews.", "example": 3213, - "type": "integer" + "type": "integer", + "x-nullable": true }, "similarweb": { "$ref": "#/definitions/similarweb.SimilarWebResp" @@ -24917,6 +25174,122 @@ }, "type": "object" }, + "googlejobs.GoogleJob": { + "properties": { + "apply_url": { + "type": "string" + }, + "company": { + "example": "Google", + "type": "string" + }, + "country": { + "example": "TW", + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "example": "85207000467546822", + "type": "string" + }, + "location": { + "example": "New Taipei, Banqiao District, New Taipei City, Taiwan", + "type": "string" + }, + "locations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "minimum_qualifications": { + "type": "string" + }, + "posted_at": { + "example": "2026-07-22T14:10:44Z", + "type": "string" + }, + "preferred_qualifications": { + "type": "string" + }, + "responsibilities": { + "type": "string" + }, + "title": { + "example": "Software Engineer, Embedded Software, Silicon", + "type": "string" + }, + "url": { + "example": "https://www.google.com/about/careers/applications/jobs/results/85207000467546822-software-engineer-embedded-software-silicon", + "type": "string" + } + }, + "type": "object" + }, + "googlejobs.SearchResponse": { + "properties": { + "jobs": { + "items": { + "$ref": "#/definitions/googlejobs.GoogleJob" + }, + "type": "array" + }, + "location": { + "example": "Singapore", + "type": "string" + }, + "page": { + "example": 1, + "type": "integer" + }, + "query": { + "example": "software engineer", + "type": "string" + }, + "source_url": { + "type": "string" + }, + "total": { + "example": 1722, + "type": "integer" + } + }, + "type": "object" + }, + "googlejobs.jobResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/googlejobs.GoogleJob" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "googlejobs.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/googlejobs.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "googleplay.App": { "properties": { "ad_supported": { @@ -32500,6 +32873,229 @@ }, "type": "object" }, + "metajobs.ListResponse": { + "properties": { + "listings": { + "items": { + "$ref": "#/definitions/metajobs.MetaJobListing" + }, + "type": "array" + }, + "page": { + "example": 1, + "type": "integer" + }, + "page_size": { + "example": 50, + "type": "integer" + }, + "source_url": { + "type": "string" + }, + "total": { + "example": 754, + "type": "integer" + } + }, + "type": "object" + }, + "metajobs.MetaJob": { + "properties": { + "compensation_country": { + "example": "US", + "type": "string" + }, + "compensation_max": { + "example": "$241,000/year", + "type": "string" + }, + "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" + }, + "metajobs.MetaJobListing": { + "properties": { + "id": { + "example": "1238249364564427", + "type": "string" + }, + "last_modified": { + "example": "2026-07-29T01:17:34-07:00", + "type": "string" + }, + "url": { + "example": "https://www.metacareers.com/profile/job_details/1238249364564427/", + "type": "string" + } + }, + "type": "object" + }, + "metajobs.MetaJobSearchResult": { + "properties": { + "id": { + "example": "1010234865172301", + "type": "string" + }, + "locations": { + "example": [ + "Sunnyvale", + " CA" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "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" + }, + "metajobs.SearchResponse": { + "properties": { + "jobs": { + "items": { + "$ref": "#/definitions/metajobs.MetaJobSearchResult" + }, + "type": "array" + }, + "source_url": { + "type": "string" + }, + "total": { + "example": 58, + "type": "integer" + } + }, + "type": "object" + }, + "metajobs.jobResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/metajobs.MetaJob" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "metajobs.listResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/metajobs.ListResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "metajobs.searchResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/metajobs.SearchResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "numbeo.CityIndexEntry": { "properties": { "city": { @@ -50984,6 +51580,146 @@ }, "type": "object" }, + "teslajobs.ListResponse": { + "properties": { + "jobs": { + "items": { + "$ref": "#/definitions/teslajobs.TeslaJobListing" + }, + "type": "array" + }, + "location": { + "example": "Palo Alto", + "type": "string" + }, + "page": { + "example": 1, + "type": "integer" + }, + "page_size": { + "example": 20, + "type": "integer" + }, + "query": { + "example": "software engineer", + "type": "string" + }, + "total": { + "example": 302, + "type": "integer" + } + }, + "type": "object" + }, + "teslajobs.TeslaJob": { + "properties": { + "apply_url": { + "type": "string" + }, + "compensation_text": { + "type": "string" + }, + "country": { + "example": "US", + "type": "string" + }, + "department": { + "example": "Tesla AI", + "type": "string" + }, + "description": { + "type": "string" + }, + "employment_type": { + "example": "fulltime", + "type": "string" + }, + "id": { + "example": "224501", + "type": "string" + }, + "job_family": { + "example": "AI", + "type": "string" + }, + "location": { + "example": "Palo Alto, California", + "type": "string" + }, + "requirements": { + "type": "string" + }, + "responsibilities": { + "type": "string" + }, + "state": { + "example": "CA", + "type": "string" + }, + "title": { + "example": "AI Engineer, Manipulation, Optimus", + "type": "string" + }, + "url": { + "example": "https://www.tesla.com/careers/search/job/ai-engineer-manipulation-optimus-224501", + "type": "string" + } + }, + "type": "object" + }, + "teslajobs.TeslaJobListing": { + "properties": { + "department": { + "example": "Tesla AI", + "type": "string" + }, + "id": { + "example": "224501", + "type": "string" + }, + "location": { + "example": "Palo Alto, California", + "type": "string" + }, + "title": { + "example": "AI Engineer, Manipulation, Optimus", + "type": "string" + } + }, + "type": "object" + }, + "teslajobs.jobResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/teslajobs.TeslaJob" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, + "teslajobs.listResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/teslajobs.ListResponse" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "threads.Author": { "properties": { "id": { @@ -61979,86 +62715,280 @@ "ApiKeyAuth": [] } ], - "summary": "Get Airbnb room reviews", + "summary": "Get Airbnb room reviews", + "tags": [ + "Airbnb" + ] + } + }, + "/airbnb/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns normalized Airbnb public web search results.", + "operationId": "airbnb-search", + "parameters": [ + { + "description": "Location", + "in": "query", + "name": "location", + "required": true, + "type": "string" + }, + { + "description": "Check-in date", + "in": "query", + "name": "check_in", + "type": "string" + }, + { + "description": "Check-out date", + "in": "query", + "name": "check_out", + "type": "string" + }, + { + "description": "Adult guests", + "in": "query", + "name": "adults", + "type": "integer" + }, + { + "description": "1-based page", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Currency for bounded map search", + "in": "query", + "name": "currency", + "type": "string" + }, + { + "description": "Northeast latitude for bounded map search", + "in": "query", + "name": "ne_lat", + "type": "number" + }, + { + "description": "Northeast longitude for bounded map search", + "in": "query", + "name": "ne_lng", + "type": "number" + }, + { + "description": "Southwest latitude for bounded map search", + "in": "query", + "name": "sw_lat", + "type": "number" + }, + { + "description": "Southwest longitude for bounded map search", + "in": "query", + "name": "sw_lng", + "type": "number" + }, + { + "description": "Map zoom for bounded map search", + "in": "query", + "name": "zoom", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/airbnb.SearchResponse" + } + }, + "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 Airbnb stays", "tags": [ "Airbnb" ] } }, - "/airbnb/search": { + "/amazon-jobs/job": { "get": { "consumes": [ "application/json" ], - "description": "Returns normalized Airbnb public web search results.", - "operationId": "airbnb-search", + "description": "Returns one Amazon.jobs posting by its numeric job id (the `id` field returned by search). Parsed from amazon.jobs's stable server-rendered job detail page — there is no separate JSON detail endpoint upstream.", + "operationId": "amazon-jobs-job", "parameters": [ { - "description": "Location", + "description": "Numeric Amazon job id", "in": "query", - "name": "location", + "name": "id", "required": true, - "type": "string" + "type": "string", + "x-example": "10386857" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/amazonjobs.jobResponseDoc" + } }, - { - "description": "Check-in date", - "in": "query", - "name": "check_in", - "type": "string" + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/app.Response" + } }, - { - "description": "Check-out date", - "in": "query", - "name": "check_out", - "type": "string" + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/app.Response" + } }, - { - "description": "Adult guests", - "in": "query", - "name": "adults", - "type": "integer" + "429": { + "description": "Too Many Requests", + "schema": { + "$ref": "#/definitions/app.Response" + } }, + "503": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ { - "description": "1-based page", - "in": "query", - "name": "page", - "type": "integer" - }, + "ApiKeyAuth": [] + } + ], + "summary": "Amazon Jobs single posting", + "tags": [ + "Amazon Jobs" + ] + } + }, + "/amazon-jobs/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches Amazon's public careers site (amazon.jobs) via its credential-free search JSON. Each result includes the full description and qualifications inline. `sort` accepts `relevant` (default, upstream relevance ranking) or `recent` (newest posted first). Either `q` or `category` (or both) must be given -- `category` filters by Amazon's own job-category taxonomy and works with no text query at all.", + "operationId": "amazon-jobs-search", + "parameters": [ { - "description": "Currency for bounded map search", + "description": "Search query. Either q or category is required", "in": "query", - "name": "currency", - "type": "string" + "name": "q", + "type": "string", + "x-example": "software engineer" }, { - "description": "Northeast latitude for bounded map search", + "description": "Amazon's own job-category taxonomy slug. Either q or category is required", + "enum": [ + "administrative-support", + "applied-science", + "audio-video-photography-production", + "business-intelligence-data-engineering", + "business-merchant-development", + "buying-planning-instock-management", + "customer-service", + "data-science", + "database-administration", + "design", + "economics", + "editorial-writing-content-management", + "facilities-maintenance-real-estate", + "fgbs", + "fulfillment-center-warehouse-associate", + "fulfillment-operations-management", + "hardware-development", + "human-resources", + "investigation-loss-prevention", + "leadership-development-training", + "legal", + "marketing", + "medical-health-safety", + "operations-it-support-engineering", + "project-program-product-management-non-tech", + "project-program-product-management-technical", + "public-policy", + "public-relations-communications", + "research-science", + "sales-advertising-account-management", + "software-development", + "solutions-architecture", + "supply-chain-transportation-management", + "systems-quality-security-engineering" + ], "in": "query", - "name": "ne_lat", - "type": "number" + "name": "category", + "type": "string", + "x-example": "software-development" }, { - "description": "Northeast longitude for bounded map search", + "description": "ISO 3166-1 alpha-3 country code filter", "in": "query", - "name": "ne_lng", - "type": "number" + "name": "country", + "type": "string", + "x-example": "USA" }, { - "description": "Southwest latitude for bounded map search", + "description": "Page number, 1-based", "in": "query", - "name": "sw_lat", - "type": "number" + "name": "page", + "type": "integer", + "x-example": 1 }, { - "description": "Southwest longitude for bounded map search", + "description": "Results per page, max 100 (default 20)", "in": "query", - "name": "sw_lng", - "type": "number" + "name": "limit", + "type": "integer", + "x-example": 20 }, { - "description": "Map zoom for bounded map search", + "description": "Sort order", + "enum": [ + "relevant", + "recent" + ], "in": "query", - "name": "zoom", - "type": "integer" + "name": "sort", + "type": "string", + "x-example": "relevant" } ], "produces": [ @@ -62068,7 +62998,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/airbnb.SearchResponse" + "$ref": "#/definitions/amazonjobs.searchResponseDoc" } }, "400": { @@ -62095,9 +63025,9 @@ "ApiKeyAuth": [] } ], - "summary": "Search Airbnb stays", + "summary": "Amazon Jobs search", "tags": [ - "Airbnb" + "Amazon Jobs" ] } }, @@ -63440,27 +64370,181 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve \"Customers Also Bought\" audiobooks", + "summary": "Retrieve \"Customers Also Bought\" audiobooks", + "tags": [ + "AppleBooks" + ] + } + }, + "/apple-books/author/{id}": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.", + "operationId": "apple-books-author", + "parameters": [ + { + "description": "Apple Books numeric author ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "79595314" + }, + { + "description": "Two-letter storefront country code", + "in": "query", + "name": "country", + "type": "string", + "x-example": "us" + }, + { + "description": "Result language tag", + "in": "query", + "name": "lang", + "type": "string", + "x-example": "en-us" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/applebooks.authorResponseDoc" + } + }, + "400": { + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Author 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" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Retrieve an Apple Books author's bibliography", + "tags": [ + "AppleBooks" + ] + } + }, + "/apple-books/book/{id}": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.", + "operationId": "apple-books-book", + "parameters": [ + { + "description": "Apple Books numeric book ID", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "1037193578" + }, + { + "description": "Two-letter storefront country code", + "in": "query", + "name": "country", + "type": "string", + "x-example": "us" + }, + { + "description": "Result language tag", + "in": "query", + "name": "lang", + "type": "string", + "x-example": "en-us" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/applebooks.bookResponseDoc" + } + }, + "400": { + "description": "Missing or invalid parameters", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Book 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" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Retrieve Apple Books book details", "tags": [ "AppleBooks" ] } }, - "/apple-books/author/{id}": { + "/apple-books/book/{id}/reviews": { "get": { "consumes": [ "application/json" ], - "description": "Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.", - "operationId": "apple-books-author", + "description": "Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.", + "operationId": "apple-books-book-reviews", "parameters": [ { - "description": "Apple Books numeric author ID", + "description": "Apple Books numeric book ID", "in": "path", "name": "id", "required": true, "type": "string", - "x-example": "79595314" + "x-example": "1037193578" }, { "description": "Two-letter storefront country code", @@ -63475,6 +64559,20 @@ "name": "lang", "type": "string", "x-example": "en-us" + }, + { + "description": "Review page number, default 1", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + }, + { + "description": "Reviews per page, default 10, max 20", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 10 } ], "produces": [ @@ -63484,7 +64582,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/applebooks.authorResponseDoc" + "$ref": "#/definitions/applebooks.reviewsResponseDoc" } }, "400": { @@ -63494,7 +64592,7 @@ } }, "404": { - "description": "Author not found", + "description": "Book not found", "schema": { "$ref": "#/definitions/app.Response" } @@ -63517,19 +64615,19 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve an Apple Books author's bibliography", + "summary": "Retrieve Apple Books customer reviews", "tags": [ "AppleBooks" ] } }, - "/apple-books/book/{id}": { + "/apple-books/book/{id}/similar": { "get": { "consumes": [ "application/json" ], - "description": "Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.", - "operationId": "apple-books-book", + "description": "Returns the related books shown on the Apple Books catalog page.", + "operationId": "apple-books-book-similar", "parameters": [ { "description": "Apple Books numeric book ID", @@ -63561,7 +64659,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/applebooks.bookResponseDoc" + "$ref": "#/definitions/applebooks.similarResponseDoc" } }, "400": { @@ -63594,55 +64692,51 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Apple Books book details", + "summary": "Retrieve \"Customers Also Bought\" books", "tags": [ "AppleBooks" ] } }, - "/apple-books/book/{id}/reviews": { + "/apple-books/charts": { "get": { "consumes": [ "application/json" ], - "description": "Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.", - "operationId": "apple-books-book-reviews", + "description": "Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.", + "operationId": "apple-books-charts", "parameters": [ { - "description": "Apple Books numeric book ID", - "in": "path", - "name": "id", - "required": true, - "type": "string", - "x-example": "1037193578" - }, - { - "description": "Two-letter storefront country code", + "description": "Chart collection. Allowed values: top-free, top-paid", + "enum": [ + "top-free", + "top-paid" + ], "in": "query", - "name": "country", + "name": "collection", "type": "string", - "x-example": "us" + "x-example": "top-free" }, { - "description": "Result language tag", + "description": "Optional Apple Books genre ID to filter the chart", "in": "query", - "name": "lang", - "type": "string", - "x-example": "en-us" + "name": "genre", + "type": "integer", + "x-example": 9031 }, { - "description": "Review page number, default 1", + "description": "Two-letter storefront country code", "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "name": "country", + "type": "string", + "x-example": "us" }, { - "description": "Reviews per page, default 10, max 20", + "description": "Number of chart items to return", "in": "query", "name": "limit", "type": "integer", - "x-example": 10 + "x-example": 50 } ], "produces": [ @@ -63652,7 +64746,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/applebooks.reviewsResponseDoc" + "$ref": "#/definitions/applebooks.chartsResponseDoc" } }, "400": { @@ -63661,12 +64755,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Book not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Rate limit exceeded", "schema": { @@ -63685,27 +64773,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Apple Books customer reviews", + "summary": "Retrieve Apple Books chart rankings", "tags": [ "AppleBooks" ] } }, - "/apple-books/book/{id}/similar": { + "/apple-books/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns the related books shown on the Apple Books catalog page.", - "operationId": "apple-books-book-similar", + "description": "Returns normalized Apple Books ebooks from Apple's public iTunes Search API.", + "operationId": "apple-books-search", "parameters": [ { - "description": "Apple Books numeric book ID", - "in": "path", - "name": "id", + "description": "Search term", + "in": "query", + "name": "term", "required": true, "type": "string", - "x-example": "1037193578" + "x-example": "harry potter" }, { "description": "Two-letter storefront country code", @@ -63720,6 +64808,20 @@ "name": "lang", "type": "string", "x-example": "en-us" + }, + { + "description": "Number of books per page", + "in": "query", + "name": "limit", + "type": "integer", + "x-example": 50 + }, + { + "description": "Search page number (1-based)", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -63729,7 +64831,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/applebooks.similarResponseDoc" + "$ref": "#/definitions/applebooks.searchResponseDoc" } }, "400": { @@ -63738,12 +64840,6 @@ "$ref": "#/definitions/app.Response" } }, - "404": { - "description": "Book not found", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, "429": { "description": "Rate limit exceeded", "schema": { @@ -63762,37 +64858,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve \"Customers Also Bought\" books", + "summary": "Search Apple Books titles", "tags": [ "AppleBooks" ] } }, - "/apple-books/charts": { + "/apple-books/series/{id}": { "get": { "consumes": [ "application/json" ], - "description": "Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.", - "operationId": "apple-books-charts", + "description": "Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.", + "operationId": "apple-books-series", "parameters": [ { - "description": "Chart collection. Allowed values: top-free, top-paid", - "enum": [ - "top-free", - "top-paid" - ], - "in": "query", - "name": "collection", + "description": "Apple Books numeric series ID", + "in": "path", + "name": "id", + "required": true, "type": "string", - "x-example": "top-free" - }, - { - "description": "Optional Apple Books genre ID to filter the chart", - "in": "query", - "name": "genre", - "type": "integer", - "x-example": 9031 + "x-example": "1044374793" }, { "description": "Two-letter storefront country code", @@ -63802,11 +64888,11 @@ "x-example": "us" }, { - "description": "Number of chart items to return", + "description": "Result language tag", "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 + "name": "lang", + "type": "string", + "x-example": "en-us" } ], "produces": [ @@ -63816,7 +64902,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/applebooks.chartsResponseDoc" + "$ref": "#/definitions/applebooks.seriesResponseDoc" } }, "400": { @@ -63825,6 +64911,12 @@ "$ref": "#/definitions/app.Response" } }, + "404": { + "description": "Series not found", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, "429": { "description": "Rate limit exceeded", "schema": { @@ -63843,55 +64935,27 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve Apple Books chart rankings", + "summary": "Retrieve an Apple Books series and its full book list", "tags": [ "AppleBooks" ] } }, - "/apple-books/search": { + "/apple-jobs/job": { "get": { "consumes": [ "application/json" ], - "description": "Returns normalized Apple Books ebooks from Apple's public iTunes Search API.", - "operationId": "apple-books-search", + "description": "Returns one Apple Careers posting by its job id (the `id` field returned by search, e.g. `200674676-0836` for a specific requisition or `PIPE-200314122` for an evergreen/pipeline retail role). Parsed from jobs.apple.com's server-rendered job detail page.", + "operationId": "apple-jobs-job", "parameters": [ { - "description": "Search term", + "description": "Apple job id", "in": "query", - "name": "term", + "name": "id", "required": true, "type": "string", - "x-example": "harry potter" - }, - { - "description": "Two-letter storefront country code", - "in": "query", - "name": "country", - "type": "string", - "x-example": "us" - }, - { - "description": "Result language tag", - "in": "query", - "name": "lang", - "type": "string", - "x-example": "en-us" - }, - { - "description": "Number of books per page", - "in": "query", - "name": "limit", - "type": "integer", - "x-example": 50 - }, - { - "description": "Search page number (1-based)", - "in": "query", - "name": "page", - "type": "integer", - "x-example": 1 + "x-example": "200674676-0836" } ], "produces": [ @@ -63901,23 +64965,29 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/applebooks.searchResponseDoc" + "$ref": "#/definitions/applejobs.jobResponseDoc" } }, "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" } }, - "500": { - "description": "Internal server error", + "503": { + "description": "Service Unavailable", "schema": { "$ref": "#/definitions/app.Response" } @@ -63928,41 +64998,41 @@ "ApiKeyAuth": [] } ], - "summary": "Search Apple Books titles", + "summary": "Apple Jobs single posting", "tags": [ - "AppleBooks" + "Apple Jobs" ] } }, - "/apple-books/series/{id}": { + "/apple-jobs/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.", - "operationId": "apple-books-series", + "description": "Searches Apple's public careers site (jobs.apple.com) via its server-rendered search page's embedded job data. Page size is fixed by Apple at 20 results. Search results carry identity/location/team metadata only — call the job endpoint for the full description and qualifications.", + "operationId": "apple-jobs-search", "parameters": [ { - "description": "Apple Books numeric series ID", - "in": "path", - "name": "id", + "description": "Search query", + "in": "query", + "name": "q", "required": true, "type": "string", - "x-example": "1044374793" + "x-example": "software engineer" }, { - "description": "Two-letter storefront country code", + "description": "Location filter in Apple's own slug format, e.g. united-states-USA or singapore-SGP", "in": "query", - "name": "country", + "name": "location", "type": "string", - "x-example": "us" + "x-example": "united-states-USA" }, { - "description": "Result language tag", + "description": "Page number, 1-based", "in": "query", - "name": "lang", - "type": "string", - "x-example": "en-us" + "name": "page", + "type": "integer", + "x-example": 1 } ], "produces": [ @@ -63972,29 +65042,23 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/applebooks.seriesResponseDoc" + "$ref": "#/definitions/applejobs.searchResponseDoc" } }, "400": { - "description": "Missing or invalid parameters", - "schema": { - "$ref": "#/definitions/app.Response" - } - }, - "404": { - "description": "Series 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" } @@ -64005,9 +65069,9 @@ "ApiKeyAuth": [] } ], - "summary": "Retrieve an Apple Books series and its full book list", + "summary": "Apple Jobs search", "tags": [ - "AppleBooks" + "Apple Jobs" ] } }, @@ -76572,7 +77636,7 @@ "consumes": [ "application/json" ], - "description": "Returns terms aggregation counts for Google Maps businesses. Facet enum: `category`, `country`, `state`, `county`, `city`, `town`, `website_status`. `category` values (as a facet or filter) are Google Maps type tokens in lower-case snake_case (e.g. `dentist`, `bus_stop`, `atm`).", + "description": "Returns terms aggregation counts for Google Maps businesses. Facet enum: `category`, `country`, `state`, `county`, `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.", "operationId": "datasets-google-map-businesses-facets", "parameters": [ { @@ -76598,7 +77662,7 @@ "type": "string" }, { - "description": "Exact category filter: a Google Maps type token in lower-case snake_case (e.g. dentist, bus_stop), max 128 characters", + "description": "Exact locale-specific Google Maps category label; use the category facet to discover values, max 128 characters", "in": "query", "name": "category", "type": "string" @@ -76740,7 +77804,7 @@ "consumes": [ "application/json" ], - "description": "Returns one stored Google Maps business by Google place_id from dataset id enum value `google-map-businesses`. The `category` field is a Google Maps type token in lower-case snake_case (e.g. `dentist`, `bus_stop`, `atm`). A `rating` of `null` means no aggregate rating is available for that business; read it together with `review_count`. Locationless service-area businesses (online/mobile/home-based) have a `null` `geo`.", + "description": "Returns one stored Google Maps business by Google place_id from dataset id enum value `google-map-businesses`. The `category` field contains the exact Google Maps category label returned for the business locale and can be localized, non-ASCII, or contain punctuation. A `rating` of `null` means no aggregate rating is available. A `review_count` of `null` means Google did not return a count; numeric `0` means Google confirmed zero reviews. Locationless service-area businesses (online/mobile/home-based) have a `null` `geo`.", "operationId": "datasets-google-map-businesses-item", "parameters": [ { @@ -76802,7 +77866,7 @@ "consumes": [ "application/json" ], - "description": "Searches stored Google Maps businesses near a coordinate in dataset id enum value `google-map-businesses`. `category` is a Google Maps type token in lower-case snake_case (e.g. `dentist`, `bus_stop`, `atm`), both as the `category` filter and in each result's `category` field. A `rating` of `0` means no aggregate rating is available for that business (not a literal zero-star score); read it together with `review_count`, and note that `min_rating` above 0 excludes unrated businesses.", + "description": "Searches stored Google Maps businesses near a coordinate in dataset id enum value `google-map-businesses`. `category` is the exact Google Maps category label returned for the business locale; it can be localized, non-ASCII, or contain punctuation, so use the category facet to discover exact filter values. A `rating` of `null` means no aggregate rating is available. A `review_count` of `null` means Google did not return a count; numeric `0` means Google confirmed zero reviews. `min_rating` above 0 excludes unrated businesses.", "operationId": "datasets-google-map-businesses-nearby", "parameters": [ { @@ -76827,7 +77891,7 @@ "type": "integer" }, { - "description": "Exact category filter: a Google Maps type token in lower-case snake_case (e.g. dentist, bus_stop), max 128 characters", + "description": "Exact locale-specific Google Maps category label; use the category facet to discover values, max 128 characters", "in": "query", "name": "category", "type": "string" @@ -76902,7 +77966,7 @@ "consumes": [ "application/json" ], - "description": "Searches Google Maps business records stored in a search index. Sort enum: `relevance`, `updated_at_desc`, `rating_desc`, `review_count_desc`, `distance_asc`. `category` is a Google Maps type token in lower-case snake_case (e.g. `dentist`, `bus_stop`, `atm`), both as the `category` filter and in each result's `category` field. A `rating` of `null` means no aggregate rating is available for that business (too few reviews, or a place type Google does not rate) — it is never a literal zero-star score; read it together with `review_count`, and note that `rating_desc` sorts unrated businesses last and `min_rating` above 0 excludes them. Use `has_geo=false` to isolate locationless service-area businesses (which have a `null` `geo`).", + "description": "Searches Google Maps business records stored in a search index. Sort enum: `relevance`, `updated_at_desc`, `rating_desc`, `review_count_desc`, `distance_asc`. `category` is the exact Google Maps category label returned for the business locale; it can be localized, non-ASCII, or contain punctuation, so use the category facet to discover exact filter values. A `rating` of `null` means no aggregate rating is available. A `review_count` of `null` means Google did not return a count; numeric `0` means Google confirmed zero reviews. `rating_desc` sorts unrated businesses last, and `min_rating` above 0 excludes them. Use `has_geo=false` to isolate locationless service-area businesses (which have a `null` `geo`).", "operationId": "datasets-google-map-businesses-search", "parameters": [ { @@ -76912,7 +77976,7 @@ "type": "string" }, { - "description": "Exact category filter: a Google Maps type token in lower-case snake_case (e.g. dentist, bus_stop), max 128 characters", + "description": "Exact locale-specific Google Maps category label; use the category facet to discover values, max 128 characters", "in": "query", "name": "category", "type": "string" @@ -89447,6 +90511,140 @@ ] } }, + "/google-jobs/job": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one Google Careers posting by its numeric job id (the `id` field returned by search). Parsed from careers.google.com's server-rendered job detail page.", + "operationId": "google-jobs-job", + "parameters": [ + { + "description": "Numeric Google job id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "85207000467546822" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/googlejobs.jobResponseDoc" + } + }, + "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": "Google Jobs single posting", + "tags": [ + "Google Jobs" + ] + } + }, + "/google-jobs/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches Google's public careers site (careers.google.com) via its server-rendered search page's embedded job data. Each result includes the description, responsibilities, and qualifications inline. Page size is fixed by Google at 20 results.", + "operationId": "google-jobs-search", + "parameters": [ + { + "description": "Search query", + "in": "query", + "name": "q", + "required": true, + "type": "string", + "x-example": "software engineer" + }, + { + "description": "Location filter (free text)", + "in": "query", + "name": "location", + "type": "string", + "x-example": "Singapore" + }, + { + "description": "Page number, 1-based", + "in": "query", + "name": "page", + "type": "integer", + "x-example": 1 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/googlejobs.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": "Google Jobs search", + "tags": [ + "Google Jobs" + ] + } + }, "/google/finance/analyst-articles/{quote}": { "get": { "consumes": [ @@ -101069,53 +102267,248 @@ "ApiKeyAuth": [] } ], - "summary": "Rank manga", + "summary": "Rank manga", + "tags": [ + "Manga" + ] + } + }, + "/manga/search": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Searches manga by free-text query. Credential-free public manga data from AniList. Returns normalized entries: titles, scores, popularity, format, status, chapters, volumes, genres, and tags.", + "operationId": "manga-search", + "parameters": [ + { + "description": "Search text", + "in": "query", + "name": "query", + "required": true, + "type": "string", + "x-example": "Berserk" + }, + { + "description": "Ordering: SEARCH_MATCH, POPULARITY_DESC, SCORE_DESC, TRENDING_DESC, FAVOURITES_DESC, START_DATE_DESC. Default SEARCH_MATCH.", + "enum": [ + "SEARCH_MATCH", + "POPULARITY_DESC", + "SCORE_DESC", + "TRENDING_DESC", + "FAVOURITES_DESC", + "START_DATE_DESC" + ], + "in": "query", + "name": "sort", + "type": "string" + }, + { + "description": "1-based page number, default 1", + "in": "query", + "name": "page", + "type": "integer" + }, + { + "description": "Results per page, default 10, max 50", + "in": "query", + "name": "per_page", + "type": "integer" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/anime.searchResponseDoc" + } + }, + "400": { + "description": "Bad Request", + "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 manga", + "tags": [ + "Manga" + ] + } + }, + "/manga/title/{id}": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns a normalized manga by AniList id: titles, MyAnimeList id, scores, popularity, favourites, format, status, chapters, volumes, genres, ranked tags, dates, description, and images. Pass mal=true to additionally enrich the response with the MyAnimeList community score (mal block: score on a 0-10 scale, plus scored-by count), scraped credential-free from the public MAL page. Credential-free public AniList data.", + "operationId": "manga-title", + "parameters": [ + { + "description": "AniList manga id", + "in": "path", + "name": "id", + "required": true, + "type": "string", + "x-example": "30002" + }, + { + "description": "Enrich with the MyAnimeList community score (adds one fetch; omitted when the title has no MAL id)", + "in": "query", + "name": "mal", + "type": "boolean" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/anime.mediaResponseDoc" + } + }, + "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": { + "description": "Service Unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get a manga", "tags": [ "Manga" ] } }, - "/manga/search": { + "/meta-jobs/job": { "get": { "consumes": [ "application/json" ], - "description": "Searches manga by free-text query. Credential-free public manga data from AniList. Returns normalized entries: titles, scores, popularity, format, status, chapters, volumes, genres, and tags.", - "operationId": "manga-search", + "description": "Returns one Meta Careers posting by its numeric job id (the `id` field returned by search or list). Parsed from metacareers.com's server-rendered job detail page.", + "operationId": "meta-jobs-job", "parameters": [ { - "description": "Search text", + "description": "Meta job id", "in": "query", - "name": "query", + "name": "id", "required": true, "type": "string", - "x-example": "Berserk" + "x-example": "1238249364564427" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/metajobs.jobResponseDoc" + } }, - { - "description": "Ordering: SEARCH_MATCH, POPULARITY_DESC, SCORE_DESC, TRENDING_DESC, FAVOURITES_DESC, START_DATE_DESC. Default SEARCH_MATCH.", - "enum": [ - "SEARCH_MATCH", - "POPULARITY_DESC", - "SCORE_DESC", - "TRENDING_DESC", - "FAVOURITES_DESC", - "START_DATE_DESC" - ], - "in": "query", - "name": "sort", - "type": "string" + "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": [ { - "description": "1-based page number, default 1", + "ApiKeyAuth": [] + } + ], + "summary": "Meta Jobs single posting", + "tags": [ + "Meta Jobs" + ] + } + }, + "/meta-jobs/list": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns a page of Meta's own public job sitemap -- every open requisition's id, canonical URL, and last-modified timestamp, with no team/location/keyword filtering. Use this for full-catalog enumeration or change tracking via last_modified; use search when you need to filter by team, technology, location, employment type, or keyword.", + "operationId": "meta-jobs-list", + "parameters": [ + { + "description": "Page number, 1-based, defaults to 1", "in": "query", "name": "page", - "type": "integer" + "type": "integer", + "x-example": 1 }, { - "description": "Results per page, default 10, max 50", + "description": "Page size, defaults to 50, maxes at 200", "in": "query", - "name": "per_page", - "type": "integer" + "name": "page_size", + "type": "integer", + "x-example": 50 } ], "produces": [ @@ -101125,7 +102518,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/anime.searchResponseDoc" + "$ref": "#/definitions/metajobs.listResponseDoc" } }, "400": { @@ -101134,8 +102527,8 @@ "$ref": "#/definitions/app.Response" } }, - "500": { - "description": "Internal Server Error", + "429": { + "description": "Too Many Requests", "schema": { "$ref": "#/definitions/app.Response" } @@ -101152,33 +102545,82 @@ "ApiKeyAuth": [] } ], - "summary": "Search manga", + "summary": "Meta Jobs catalog listing", "tags": [ - "Manga" + "Meta Jobs" ] } }, - "/manga/title/{id}": { + "/meta-jobs/search": { "get": { "consumes": [ "application/json" ], - "description": "Returns a normalized manga by AniList id: titles, MyAnimeList id, scores, popularity, favourites, format, status, chapters, volumes, genres, ranked tags, dates, description, and images. Pass mal=true to additionally enrich the response with the MyAnimeList community score (mal block: score on a 0-10 scale, plus scored-by count), scraped credential-free from the public MAL page. Credential-free public AniList data.", - "operationId": "manga-title", + "description": "Searches Meta's public careers site (metacareers.com) via its own anonymous jobsearch GraphQL endpoint, with the same team/technology/location/employment-type/keyword/remote/sort filters the live search page offers. All filters are optional and combine with AND semantics; an empty request returns Meta's entire open-requisition catalog in one response. `q` matches team, technology, location, or ref/req-code names -- it is NOT a free-text search over job titles or descriptions. `teams` enum (org teams + technologies, both use the same field): `Advertising Technology`, `AR/VR`, `Artificial Intelligence`, `Business Development & Partnerships`, `Communications & Public Policy`, `Creative`, `Data & Analytics`, `Data Center`, `Design & User Experience`, `Enterprise Engineering`, `Global Operations`, `Infrastructure`, `Internship - Business`, `Internship - Engineering, Tech & Design`, `Internship - PhD`, `Legal, Finance, Facilities & Admin`, `People & Recruiting`, `Product Management`, `Research`, `Sales & Marketing`, `Security`, `Software Engineering`, `Technical Program Management`, `University Grad - Business`, `University Grad - Engineering, Tech & Design`, `University Grad - PhD & Postdoc`, `Facebook`, `Messenger`, `Instagram`, `WhatsApp`, `Meta Quest`. `roles` enum: `Full time employment`, `Internship`, `Short term employment`. `results_per_page` enum: `all`, `five`, `ten`.", + "operationId": "meta-jobs-search", "parameters": [ { - "description": "AniList manga id", - "in": "path", - "name": "id", - "required": true, + "description": "Facet-name keyword: matches team, technology, location, or ref/req-code -- not a title/description search", + "in": "query", + "name": "q", "type": "string", - "x-example": "30002" + "x-example": "Instagram" }, { - "description": "Enrich with the MyAnimeList community score (adds one fetch; omitted when the title has no MAL id)", + "collectionFormat": "csv", + "description": "Repeatable team-or-technology filter (OR); see teams enum above", "in": "query", - "name": "mal", + "items": { + "type": "string" + }, + "name": "teams", + "type": "array", + "x-example": "Software Engineering" + }, + { + "collectionFormat": "csv", + "description": "Repeatable employment-type filter (OR); see roles enum above", + "in": "query", + "items": { + "type": "string" + }, + "name": "roles", + "type": "array", + "x-example": "Full time employment" + }, + { + "collectionFormat": "csv", + "description": "Repeatable location-id filter (OR) in Meta's own id format, e.g. menlo-park, london -- not a closed enum", + "in": "query", + "items": { + "type": "string" + }, + "name": "offices", + "type": "array", + "x-example": "menlo-park" + }, + { + "description": "Restrict to remote-only postings", + "in": "query", + "name": "is_remote_only", + "type": "boolean" + }, + { + "description": "Sort newest-first instead of relevance", + "in": "query", + "name": "sort_by_new", "type": "boolean" + }, + { + "description": "Response size cap: all, five, ten", + "enum": [ + "all", + "five", + "ten" + ], + "in": "query", + "name": "results_per_page", + "type": "string" } ], "produces": [ @@ -101188,7 +102630,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/anime.mediaResponseDoc" + "$ref": "#/definitions/metajobs.searchResponseDoc" } }, "400": { @@ -101197,14 +102639,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" } @@ -101221,9 +102657,9 @@ "ApiKeyAuth": [] } ], - "summary": "Get a manga", + "summary": "Meta Jobs search", "tags": [ - "Manga" + "Meta Jobs" ] } }, @@ -120930,6 +122366,146 @@ ] } }, + "/tesla-jobs/job": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Returns one Tesla Careers posting by its numeric job id (the `id` field returned by the list endpoint). Parsed from tesla.com's own job detail JSON endpoint.", + "operationId": "tesla-jobs-job", + "parameters": [ + { + "description": "Tesla job id", + "in": "query", + "name": "id", + "required": true, + "type": "string", + "x-example": "224501" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/teslajobs.jobResponseDoc" + } + }, + "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": "Tesla Jobs single posting", + "tags": [ + "Tesla Jobs" + ] + } + }, + "/tesla-jobs/list": { + "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 + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/teslajobs.listResponseDoc" + } + }, + "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": "Tesla Jobs listing", + "tags": [ + "Tesla Jobs" + ] + } + }, "/threads/post/{username}/{code}": { "get": { "description": "Returns the public text, author, canonical URL, and preview image for a Threads post.", diff --git a/pyproject.toml b/pyproject.toml index 458d562..e839a5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "crawlora" -version = "1.26.0.dev1" +version = "1.27.0.dev1" description = "Official Python SDK for the Crawlora web-scraping API: typed grouped and dynamic operation calls for every public endpoint, with retries, pagination, hooks, and an async client." readme = "README.md" requires-python = ">=3.10" diff --git a/scripts/generate.py b/scripts/generate.py index 6f220a1..c6bd227 100644 --- a/scripts/generate.py +++ b/scripts/generate.py @@ -47,7 +47,7 @@ def schema_ref_name(schema): return ref.rsplit("/", 1)[-1] if ref else "" -def py_schema_type(schema): +def _py_schema_type(schema): if not schema: return "Any" if "$ref" in schema: @@ -79,6 +79,13 @@ def py_schema_type(schema): return "Any" +def py_schema_type(schema): + rendered = _py_schema_type(schema) + if schema and schema.get("x-nullable") and rendered != "Any": + return f"{rendered} | None" + return rendered + + def py_type(param): enum_values = param.get("enum") or [] if enum_values: diff --git a/tests/test_client.py b/tests/test_client.py index 908dd53..1a20c79 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -267,7 +267,7 @@ def transport(_request, _timeout): self.assertIs(raised.exception.__cause__, cause) def test_operation_metadata_count(self): - self.assertEqual(OPERATION_COUNT, 837) + self.assertEqual(OPERATION_COUNT, 848) def test_deprecated_endpoints_are_not_generated(self): self.assertFalse(hasattr(CrawloraClient(api_key="api_test", base_url=self.base_url).google, "lens")) @@ -283,6 +283,7 @@ def test_generated_stub_includes_typed_endpoint_groups(self): self.assertIn("'q': Required[str]", stub) self.assertIn("'count': NotRequired[int]", stub) self.assertIn("GoogleSearchBody = ModelGoogleSearchOption", stub) + self.assertIn("'review_count': NotRequired[int | None]", stub) self.assertIn("def search(self, **params: Unpack[BingSearchParams]) -> BingSearchResponse: ...", stub) self.assertIn("OperationId = Literal[", stub) self.assertIn("operation_id: Literal['bing-search']", stub) @@ -296,7 +297,7 @@ def test_docs_cover_operations_and_recipes(self): recipes_doc = root.joinpath("docs", "recipes.md").read_text() for expected in [ - "Total operations: `837`", + "Total operations: `848`", "`bing-search`", "`GET /bing/search`", "`bing.search`",