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`",