diff --git a/CHANGELOG.md b/CHANGELOG.md index ed6ce2a..e4045c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v1.28.0-sdk.1 + +- Regenerated from the public API contract (848 to 849 operations), adding + Facebook public page lookup. +- Jobs company search now accepts `sponsors_visa`; company detail responses can + include recent public LCA filing evidence. Job response types also include the + latest skills, AI-tool, benefits, education, and security-clearance fields. + ## v1.27.0-sdk.1 - Regenerated from the public API contract (837 to 848 operations). Adds public diff --git a/crawlora/client.py b/crawlora/client.py index 57dd1d5..5f56f50 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.27.0-sdk.1" +VERSION = "1.28.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 47b561e..b4dccc7 100644 --- a/crawlora/client.pyi +++ b/crawlora/client.pyi @@ -6000,10 +6000,15 @@ ModelEsInstagramUserRecord = TypedDict('ModelEsInstagramUserRecord', { }, total=False) ModelEsJobPostingFacets = TypedDict('ModelEsJobPostingFacets', { + 'by_ai_tool': NotRequired[list[ModelEsFacetItem]], + 'by_benefit': NotRequired[list[ModelEsFacetItem]], 'by_department': NotRequired[list[ModelEsFacetItem]], + 'by_education_level': NotRequired[list[ModelEsFacetItem]], 'by_employment_type': NotRequired[list[ModelEsFacetItem]], 'by_location': NotRequired[list[ModelEsFacetItem]], 'by_provider': NotRequired[list[ModelEsFacetItem]], + 'by_security_clearance': NotRequired[list[ModelEsFacetItem]], + 'by_skill': NotRequired[list[ModelEsFacetItem]], 'remote_open': NotRequired[int], 'top_companies': NotRequired[list[ModelEsFacetItem]], 'total_open': NotRequired[int], @@ -7163,6 +7168,35 @@ ModelExtractResponseDoc = TypedDict('ModelExtractResponseDoc', { 'msg': NotRequired[str], }, total=False) +ModelFacebookPage = TypedDict('ModelFacebookPage', { + 'address': NotRequired[str], + 'category': NotRequired[str], + 'company': NotRequired[str], + 'email': NotRequired[str], + 'emails': NotRequired[list[str]], + 'hours': NotRequired[str], + 'intro': NotRequired[str], + 'latestPostAt': NotRequired[str], + 'og': NotRequired[dict[str, Any]], + 'pageId': NotRequired[str], + 'phones': NotRequired[list[str]], + 'priceRange': NotRequired[str], + 'reviewCount': NotRequired[int], + 'sourceUrl': NotRequired[str], + 'stats': NotRequired[dict[str, Any]], + 'talking': NotRequired[int], + 'title': NotRequired[str], + 'website': NotRequired[str], + 'wereHere': NotRequired[int], + 'whatsapp': NotRequired[str], +}, total=False) + +ModelFacebookPageResponseDoc = TypedDict('ModelFacebookPageResponseDoc', { + 'code': NotRequired[int], + 'data': NotRequired[ModelFacebookPage], + 'msg': NotRequired[str], +}, total=False) + ModelFinanceAbout = TypedDict('ModelFinanceAbout', { 'about': NotRequired[str], 'ceo': NotRequired[str], @@ -8976,7 +9010,9 @@ ModelJobsHiringSignals = TypedDict('ModelJobsHiringSignals', { }, total=False) ModelJobsJob = TypedDict('ModelJobsJob', { + 'ai_tools_mentioned': NotRequired[list[str]], 'apply_url': NotRequired[str], + 'benefits_mentioned': NotRequired[list[str]], 'company': NotRequired[str], 'company_logo_url': NotRequired[str], 'compensation': NotRequired[str], @@ -8987,6 +9023,7 @@ ModelJobsJob = TypedDict('ModelJobsJob', { 'department': NotRequired[str], 'description_html': NotRequired[str], 'description_text': NotRequired[str], + 'education_level_required': NotRequired[list[str]], 'employment_type': NotRequired[str], 'id': NotRequired[str], 'location': NotRequired[str], @@ -8999,6 +9036,8 @@ ModelJobsJob = TypedDict('ModelJobsJob', { 'provider': NotRequired[str], 'remote': NotRequired[bool], 'req_id': NotRequired[str], + 'security_clearance_required': NotRequired[list[str]], + 'skills_mentioned': NotRequired[list[str]], 'team': NotRequired[str], 'title': NotRequired[str], 'url': NotRequired[str], @@ -21757,9 +21796,10 @@ DatasetsJobsCompaniesParams = TypedDict('DatasetsJobsCompaniesParams', { '_timeout': NotRequired[float], '_headers': NotRequired[Mapping[str, str]], 'q': NotRequired[str], - 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint']], + 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint', 'amazon-jobs', 'apple-jobs', 'google-jobs', 'meta-jobs', 'tesla-jobs']], 'status': NotRequired[Literal['active', 'empty', 'gone', 'blocked', 'pending', 'invalid']], 'min_open_roles': NotRequired[int], + 'sponsors_visa': NotRequired[bool], 'sort': NotRequired[Literal['open_desc', 'company_asc', 'crawled_desc']], 'page': NotRequired[int], 'page_size': NotRequired[int], @@ -21797,7 +21837,7 @@ DatasetsJobsNearbyParams = TypedDict('DatasetsJobsNearbyParams', { 'lat': Required[float], 'lon': Required[float], 'radius_km': NotRequired[float], - 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint']], + 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint', 'amazon-jobs', 'apple-jobs', 'google-jobs', 'meta-jobs', 'tesla-jobs']], 'include_closed': NotRequired[bool], 'page': NotRequired[int], 'page_size': NotRequired[int], @@ -21810,7 +21850,7 @@ DatasetsJobsSearchParams = TypedDict('DatasetsJobsSearchParams', { '_headers': NotRequired[Mapping[str, str]], 'q': NotRequired[str], 'company': NotRequired[str], - 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint']], + 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint', 'amazon-jobs', 'apple-jobs', 'google-jobs', 'meta-jobs', 'tesla-jobs']], 'department': NotRequired[str], 'location': NotRequired[str], 'city': NotRequired[str], @@ -23007,6 +23047,14 @@ WebExtractParams = TypedDict('WebExtractParams', { 'extractOption': Required[WebExtractBody], }, total=False) +FacebookPageResponse = ModelFacebookPageResponseDoc +FacebookPageParams = TypedDict('FacebookPageParams', { + '_response_type': NotRequired[ResponseType], + '_timeout': NotRequired[float], + '_headers': NotRequired[Mapping[str, str]], + 'page': Required[str], +}, total=False) + GeocodingLookupResponse = ModelGeocodingLookupResponseDoc GeocodingLookupParams = TypedDict('GeocodingLookupParams', { '_response_type': NotRequired[ResponseType], @@ -29044,6 +29092,9 @@ class EspnGroup: def team_roster(self, **params: Unpack[EspnTeamRosterParams]) -> EspnTeamRosterResponse: ... def teams(self, **params: Unpack[EspnTeamsParams]) -> EspnTeamsResponse: ... +class FacebookGroup: + def page(self, **params: Unpack[FacebookPageParams]) -> FacebookPageResponse: ... + class GeocodingGroup: def lookup(self, **params: Unpack[GeocodingLookupParams]) -> GeocodingLookupResponse: ... def reverse(self, **params: Unpack[GeocodingReverseParams]) -> GeocodingReverseResponse: ... @@ -29991,6 +30042,7 @@ OperationId = Literal[ 'espn-team-roster', 'espn-teams', 'extract', + 'facebook-page', 'geocoding-lookup', 'geocoding-reverse', 'geocoding-search', @@ -30598,6 +30650,7 @@ class CrawloraClient: discogs: DiscogsGroup e_bay: EBayGroup espn: EspnGroup + facebook: FacebookGroup geocoding: GeocodingGroup git_hub: GitHubGroup goodreads: GoodreadsGroup @@ -33909,6 +33962,18 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> WebExtractResponse: ... @overload + def operation( + self, + operation_id: Literal['facebook-page'], + params: FacebookPageParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> FacebookPageResponse: ... + @overload def operation( self, operation_id: Literal['geocoding-lookup'], @@ -44097,6 +44162,18 @@ class CrawloraClient: retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., ) -> WebExtractResponse: ... @overload + def request( + self, + operation_id: Literal['facebook-page'], + params: FacebookPageParams, + *, + response_type: ResponseType = ..., + timeout: float | None = ..., + headers: Mapping[str, str] | None = ..., + retries: int | None = ..., + retry_predicate: Callable[[int, BaseException | None], bool] | None = ..., + ) -> FacebookPageResponse: ... + @overload def request( self, operation_id: Literal['geocoding-lookup'], diff --git a/crawlora/operations.py b/crawlora/operations.py index 7f34755..d2571af 100644 --- a/crawlora/operations.py +++ b/crawlora/operations.py @@ -4489,7 +4489,12 @@ 'icims', 'eightfold', 'gem', - 'pinpoint'], + 'pinpoint', + 'amazon-jobs', + 'apple-jobs', + 'google-jobs', + 'meta-jobs', + 'tesla-jobs'], 'in': 'query', 'name': 'provider', 'type': 'string'}, @@ -4498,6 +4503,7 @@ 'name': 'status', 'type': 'string'}, {'in': 'query', 'name': 'min_open_roles', 'type': 'integer'}, + {'in': 'query', 'name': 'sponsors_visa', 'type': 'boolean'}, {'enum': ['open_desc', 'company_asc', 'crawled_desc'], 'in': 'query', 'name': 'sort', @@ -4566,7 +4572,12 @@ 'icims', 'eightfold', 'gem', - 'pinpoint'], + 'pinpoint', + 'amazon-jobs', + 'apple-jobs', + 'google-jobs', + 'meta-jobs', + 'tesla-jobs'], 'in': 'query', 'name': 'provider', 'type': 'string'}, @@ -4601,7 +4612,12 @@ 'icims', 'eightfold', 'gem', - 'pinpoint'], + 'pinpoint', + 'amazon-jobs', + 'apple-jobs', + 'google-jobs', + 'meta-jobs', + 'tesla-jobs'], 'in': 'query', 'name': 'provider', 'type': 'string'}, @@ -6820,6 +6836,17 @@ 'produces': ['application/json'], 'queryParams': [], 'security': ['ApiKeyAuth']}, + 'facebook-page': {'bodyParam': None, + 'bodyRequired': False, + 'consumes': ['application/json'], + 'formParams': [], + 'id': 'facebook-page', + 'method': 'GET', + 'path': '/facebook/{page}', + 'pathParams': ['page'], + 'produces': ['application/json'], + 'queryParams': [], + 'security': ['ApiKeyAuth']}, 'geocoding-lookup': {'bodyParam': None, 'bodyRequired': False, 'consumes': ['application/json'], @@ -15646,6 +15673,7 @@ 'team': 'espn-team', 'team_roster': 'espn-team-roster', 'teams': 'espn-teams'}, + 'facebook': {'page': 'facebook-page'}, 'geocoding': {'lookup': 'geocoding-lookup', 'reverse': 'geocoding-reverse', 'search': 'geocoding-search'}, 'git_hub': {'github_org': 'github-org', 'github_org_repos': 'github-org-repos', @@ -16213,7 +16241,7 @@ 'video': 'youtube-video'}, 'zillow': {'autocomplete': 'zillow-autocomplete', 'property': 'zillow-property', 'search': 'zillow-search'}} -OPERATION_COUNT = 848 +OPERATION_COUNT = 849 class OperationId: AIRBNB_HOST = 'airbnb-host' @@ -16478,6 +16506,7 @@ class OperationId: ESPN_TEAM = 'espn-team' ESPN_TEAM_ROSTER = 'espn-team-roster' ESPN_TEAMS = 'espn-teams' + FACEBOOK_PAGE = 'facebook-page' GEOCODING_LOOKUP = 'geocoding-lookup' GEOCODING_REVERSE = 'geocoding-reverse' GEOCODING_SEARCH = 'geocoding-search' diff --git a/docs/operations.md b/docs/operations.md index a4ae68a..35a37b8 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: `848` +Total operations: `849` | Group | SDK method | Operation ID | HTTP | Params | Auth | Response | Notes | | --- | --- | --- | --- | --- | --- | --- | --- | @@ -184,12 +184,12 @@ Total operations: `848` | datasets | `datasets.instagram_users_facets` | `datasets-instagram-users-facets` | `GET /datasets/instagram-users/facets` | `facet` (query Literal['is_verified', 'is_business_account', 'has_bio', 'has_external_url', 'category_name', 'source_tier'] required)
`q` (query str)
`username` (query str)
`category_name` (query str)
`source_tier` (query str)
`is_verified` (query bool)
`is_business_account` (query bool)
`has_bio` (query bool)
`has_external_url` (query bool)
`min_followers` (query int)
`max_followers` (query int)
`min_ratio` (query float)
`max_ratio` (query float)
`created_after` (query str)
`created_before` (query str)
`crawled_after` (query str)
`crawled_before` (query str)
`sort` (query Literal['relevance', 'followers_desc', 'followers_asc', 'crawled_at_desc', 'crawled_at_asc', 'created_at_desc', 'created_at_asc'])
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsInstagramUsersFacetsResponse` | | | datasets | `datasets.instagram_users_item` | `datasets-instagram-users-item` | `GET /datasets/instagram-users/items/{username}` | `username` (path str required) | `ApiKeyAuth` | `DatasetsInstagramUsersItemResponse` | | | datasets | `datasets.instagram_users_search` | `datasets-instagram-users-search` | `GET /datasets/instagram-users/search` | `q` (query str)
`username` (query str)
`category_name` (query str)
`source_tier` (query str)
`is_verified` (query bool)
`is_business_account` (query bool)
`has_bio` (query bool)
`has_external_url` (query bool)
`min_followers` (query int)
`max_followers` (query int)
`min_ratio` (query float)
`max_ratio` (query float)
`created_after` (query str)
`created_before` (query str)
`crawled_after` (query str)
`crawled_before` (query str)
`sort` (query Literal['relevance', 'followers_desc', 'followers_asc', 'crawled_at_desc', 'crawled_at_asc', 'created_at_desc', 'created_at_asc'])
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsInstagramUsersSearchResponse` | | -| datasets | `datasets.jobs_companies` | `datasets-jobs-companies` | `GET /datasets/jobs/companies` | `q` (query str)
`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint'])
`status` (query Literal['active', 'empty', 'gone', 'blocked', 'pending', 'invalid'])
`min_open_roles` (query int)
`sort` (query Literal['open_desc', 'company_asc', 'crawled_desc'])
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsCompaniesResponse` | | +| datasets | `datasets.jobs_companies` | `datasets-jobs-companies` | `GET /datasets/jobs/companies` | `q` (query str)
`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint', 'amazon-jobs', 'apple-jobs', 'google-jobs', 'meta-jobs', 'tesla-jobs'])
`status` (query Literal['active', 'empty', 'gone', 'blocked', 'pending', 'invalid'])
`min_open_roles` (query int)
`sponsors_visa` (query bool)
`sort` (query Literal['open_desc', 'company_asc', 'crawled_desc'])
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsCompaniesResponse` | | | datasets | `datasets.jobs_company_item` | `datasets-jobs-company-item` | `GET /datasets/jobs/companies/{id}` | `id` (path str required) | `ApiKeyAuth` | `DatasetsJobsCompanyItemResponse` | | | datasets | `datasets.jobs_facets` | `datasets-jobs-facets` | `GET /datasets/jobs/facets` | `size` (query int) | `ApiKeyAuth` | `DatasetsJobsFacetsResponse` | | | datasets | `datasets.jobs_item` | `datasets-jobs-item` | `GET /datasets/jobs/items/{id}` | `id` (path str required) | `ApiKeyAuth` | `DatasetsJobsItemResponse` | | -| datasets | `datasets.jobs_nearby` | `datasets-jobs-nearby` | `GET /datasets/jobs/nearby` | `lat` (query float required)
`lon` (query float required)
`radius_km` (query float)
`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint'])
`include_closed` (query bool)
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsNearbyResponse` | | -| datasets | `datasets.jobs_search` | `datasets-jobs-search` | `GET /datasets/jobs/search` | `q` (query str)
`company` (query str)
`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint'])
`department` (query str)
`location` (query str)
`city` (query str)
`state` (query str)
`country` (query str)
`employment_type` (query str)
`remote` (query bool)
`workplace_type` (query Literal['onsite', 'hybrid', 'remote'])
`include_closed` (query bool)
`min_salary` (query float)
`max_salary` (query float)
`salary_currency` (query str)
`sort` (query Literal['relevance', 'posted_desc', 'company_asc'])
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsSearchResponse` | | +| datasets | `datasets.jobs_nearby` | `datasets-jobs-nearby` | `GET /datasets/jobs/nearby` | `lat` (query float required)
`lon` (query float required)
`radius_km` (query float)
`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint', 'amazon-jobs', 'apple-jobs', 'google-jobs', 'meta-jobs', 'tesla-jobs'])
`include_closed` (query bool)
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsNearbyResponse` | | +| datasets | `datasets.jobs_search` | `datasets-jobs-search` | `GET /datasets/jobs/search` | `q` (query str)
`company` (query str)
`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold', 'gem', 'pinpoint', 'amazon-jobs', 'apple-jobs', 'google-jobs', 'meta-jobs', 'tesla-jobs'])
`department` (query str)
`location` (query str)
`city` (query str)
`state` (query str)
`country` (query str)
`employment_type` (query str)
`remote` (query bool)
`workplace_type` (query Literal['onsite', 'hybrid', 'remote'])
`include_closed` (query bool)
`min_salary` (query float)
`max_salary` (query float)
`salary_currency` (query str)
`sort` (query Literal['relevance', 'posted_desc', 'company_asc'])
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsSearchResponse` | | | datasets | `datasets.journalists_facets` | `datasets-journalists-facets` | `GET /datasets/journalists/facets` | `facet` (query Literal['outlet', 'vertical', 'topic', 'contact_type'] required)
`q` (query str)
`outlet` (query str)
`vertical` (query Literal['tech', 'crypto', 'marketing', 'consumer_tech', 'consumer_policy', 'cybersecurity', 'health', 'gaming', 'climate', 'business', 'entertainment', 'sports', 'legal', 'science', 'politics', 'real_estate', 'automotive', 'travel', 'food', 'education', 'design', 'film_tv', 'fashion', 'music', 'personal_finance', 'tech_independent', 'culture_independent', 'local_news', 'construction', 'banking', 'retail', 'aerospace_defense', 'energy', 'agriculture', 'local_business'])
`topic` (query str)
`contact_type` (query Literal['email', 'social', 'none']) | `ApiKeyAuth` | `DatasetsJournalistsFacetsResponse` | | | datasets | `datasets.journalists_item` | `datasets-journalists-item` | `GET /datasets/journalists/items/{outlet}/{slug}` | `outlet` (path str required)
`slug` (path str required) | `ApiKeyAuth` | `DatasetsJournalistsItemResponse` | | | datasets | `datasets.journalists_search` | `datasets-journalists-search` | `GET /datasets/journalists/search` | `q` (query str)
`outlet` (query str)
`vertical` (query Literal['tech', 'crypto', 'marketing', 'consumer_tech', 'consumer_policy', 'cybersecurity', 'health', 'gaming', 'climate', 'business', 'entertainment', 'sports', 'legal', 'science', 'politics', 'real_estate', 'automotive', 'travel', 'food', 'education', 'design', 'film_tv', 'fashion', 'music', 'personal_finance', 'tech_independent', 'culture_independent', 'local_news', 'construction', 'banking', 'retail', 'aerospace_defense', 'energy', 'agriculture', 'local_business'])
`topic` (query str)
`contact_type` (query Literal['email', 'social', 'none'])
`sort` (query Literal['relevance', 'name_asc', 'outlet_asc', 'crawled_desc'])
`page` (query int)
`page_size` (query int) | `ApiKeyAuth` | `DatasetsJournalistsSearchResponse` | | @@ -273,6 +273,7 @@ Total operations: `848` | espn | `espn.team` | `espn-team` | `GET /espn/team` | `sport` (query Literal['football', 'basketball', 'baseball', 'hockey', 'soccer'] required)
`league` (query Literal['nfl', 'college-football', 'nba', 'wnba', 'mens-college-basketball', 'womens-college-basketball', 'mlb', 'nhl', 'eng.1', 'esp.1', 'ita.1', 'ger.1', 'fra.1', 'usa.1', 'uefa.champions'] required)
`team` (query str required) | `ApiKeyAuth` | `EspnTeamResponse` | | | espn | `espn.team_roster` | `espn-team-roster` | `GET /espn/team-roster` | `sport` (query Literal['football', 'basketball', 'baseball', 'hockey', 'soccer'] required)
`league` (query Literal['nfl', 'college-football', 'nba', 'wnba', 'mens-college-basketball', 'womens-college-basketball', 'mlb', 'nhl', 'eng.1', 'esp.1', 'ita.1', 'ger.1', 'fra.1', 'usa.1', 'uefa.champions'] required)
`team` (query str required) | `ApiKeyAuth` | `EspnTeamRosterResponse` | | | espn | `espn.teams` | `espn-teams` | `GET /espn/teams` | `sport` (query Literal['football', 'basketball', 'baseball', 'hockey', 'soccer'] required)
`league` (query Literal['nfl', 'college-football', 'nba', 'wnba', 'mens-college-basketball', 'womens-college-basketball', 'mlb', 'nhl', 'eng.1', 'esp.1', 'ita.1', 'ger.1', 'fra.1', 'usa.1', 'uefa.champions'] required) | `ApiKeyAuth` | `EspnTeamsResponse` | | +| facebook | `facebook.page` | `facebook-page` | `GET /facebook/{page}` | `page` (path str required) | `ApiKeyAuth` | `FacebookPageResponse` | | | geocoding | `geocoding.lookup` | `geocoding-lookup` | `GET /geocoding/lookup` | `osm_ids` (query str required)
`accept_language` (query str)
`addressdetails` (query bool)
`extratags` (query bool)
`namedetails` (query bool) | `ApiKeyAuth` | `GeocodingLookupResponse` | | | geocoding | `geocoding.reverse` | `geocoding-reverse` | `GET /geocoding/reverse` | `lat` (query float required)
`lon` (query float required)
`zoom` (query int)
`accept_language` (query str)
`addressdetails` (query bool)
`extratags` (query bool)
`namedetails` (query bool) | `ApiKeyAuth` | `GeocodingReverseResponse` | | | geocoding | `geocoding.search` | `geocoding-search` | `GET /geocoding/search` | `q` (query str)
`street` (query str)
`city` (query str)
`county` (query str)
`state` (query str)
`country` (query str)
`postalcode` (query str)
`limit` (query int)
`countrycodes` (query str)
`accept_language` (query str)
`addressdetails` (query bool)
`extratags` (query bool)
`namedetails` (query bool) | `ApiKeyAuth` | `GeocodingSearchResponse` | | diff --git a/openapi/public.json b/openapi/public.json index 058abd4..75a1739 100644 --- a/openapi/public.json +++ b/openapi/public.json @@ -18792,12 +18792,32 @@ }, "es.JobPostingFacets": { "properties": { + "by_ai_tool": { + "description": "ByAITool counts canonical AI tool and platform names mentioned in open\njob postings.", + "items": { + "$ref": "#/definitions/es.FacetItem" + }, + "type": "array" + }, + "by_benefit": { + "description": "ByBenefit, BySecurityClearance, and ByEducationLevel count canonical\nrequirements and offerings mentioned in open job postings.", + "items": { + "$ref": "#/definitions/es.FacetItem" + }, + "type": "array" + }, "by_department": { "items": { "$ref": "#/definitions/es.FacetItem" }, "type": "array" }, + "by_education_level": { + "items": { + "$ref": "#/definitions/es.FacetItem" + }, + "type": "array" + }, "by_employment_type": { "items": { "$ref": "#/definitions/es.FacetItem" @@ -18816,6 +18836,19 @@ }, "type": "array" }, + "by_security_clearance": { + "items": { + "$ref": "#/definitions/es.FacetItem" + }, + "type": "array" + }, + "by_skill": { + "description": "BySkill counts canonical ESCO skill labels mentioned in open job\npostings.", + "items": { + "$ref": "#/definitions/es.FacetItem" + }, + "type": "array" + }, "remote_open": { "type": "integer" }, @@ -22267,6 +22300,144 @@ }, "type": "object" }, + "facebook.Page": { + "properties": { + "address": { + "example": "9985 Arthur Hills CT, Sacramento, CA, United States, California", + "type": "string" + }, + "category": { + "example": "Marketing Agency", + "type": "string" + }, + "company": { + "example": "Seo Marketing Wiz", + "type": "string" + }, + "email": { + "example": "contact@seomarketingwiz.com", + "type": "string" + }, + "emails": { + "description": "Fields populated by the Go-native browser-rendered extractor (parse.go).", + "example": [ + "[\"contact@seomarketingwiz.com\"]" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "hours": { + "description": "Hours is the About panel's business-hours summary text (e.g. \"Open now\",\n\"Closes at 9 PM\", \"Opening soon\"), when the Page publishes one. Not a\nstructured weekly schedule.", + "example": "Open now", + "type": "string" + }, + "intro": { + "example": "Marketing professionals with 20 years of experience wanting to provide digital marketing services to", + "type": "string" + }, + "latestPostAt": { + "example": "2020-11-26T00:00:00.000Z", + "type": "string" + }, + "og": { + "properties": { + "description": { + "example": "SEO Marketing Wiz, Sacramento, California. 521 likes. Marketing professionals with 20 years of experience wanting to provide digital marketing services to", + "type": "string" + }, + "image": { + "example": "https://scontent-dfw5-2.xx.fbcdn.net/v/t39.30808-1/279690292_375554114584870_8657447943866659854_n.png?cstp=mx200x200&ctp=s200x200&_nc_cat=100&ccb=1-7&_nc_sid=3ab345&_nc_ohc=cJ5c41eGYbkQ7kNvwFpyUu7&_nc_oc=AdmE_uznxjhjbFVzL_VatcILSjMcv56Yft-_-icARncJRyR5i3CLrlh-9ZnkTHvyQWg&_nc_zt=24&_nc_ht=scontent-dfw5-2.xx&_nc_gid=JfTmimRDWsc3S1tfuZSW1A&oh=00_AfIjr4QtVdPoXb42NKwayq1Ud-aqW3G8YNoQ8Q9d2eDFEQ&oe=6827F32E", + "type": "string" + }, + "title": { + "example": "SEO Marketing Wiz | Sacramento CA", + "type": "string" + } + }, + "type": "object" + }, + "pageId": { + "description": "PageID is Facebook's stable numeric Page identifier -- unlike the vanity\nname/handle, it never changes even if the Page is renamed.", + "example": "100063763354867", + "type": "string" + }, + "phones": { + "example": [ + "[\"+1 555 123 4567\"]" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "priceRange": { + "description": "PriceRange is the About panel's price-tier text (e.g. \"Price range · $$\"),\nwhen the Page publishes one.", + "example": "Price range · $$", + "type": "string" + }, + "reviewCount": { + "example": 0, + "type": "integer" + }, + "sourceUrl": { + "example": "https://www.facebook.com/nike/about", + "type": "string" + }, + "stats": { + "properties": { + "followers": { + "example": 526, + "type": "integer" + }, + "likes": { + "example": 521, + "type": "integer" + } + }, + "type": "object" + }, + "talking": { + "example": 12, + "type": "integer" + }, + "title": { + "example": "SEO Marketing Wiz", + "type": "string" + }, + "website": { + "example": "http://www.seomarketingwiz.com/", + "type": "string" + }, + "wereHere": { + "example": 3, + "type": "integer" + }, + "whatsapp": { + "description": "WhatsApp is the Page's configured WhatsApp Business \"Message us\" number,\nwhen set up. See ParsePage's field_type extraction.", + "example": "+1 800-242-8478", + "type": "string" + } + }, + "type": "object" + }, + "facebook.pageResponseDoc": { + "properties": { + "code": { + "example": 200, + "type": "integer" + }, + "data": { + "$ref": "#/definitions/facebook.Page" + }, + "msg": { + "example": "OK", + "type": "string" + } + }, + "type": "object" + }, "finance.About": { "properties": { "about": { @@ -28130,9 +28301,23 @@ }, "jobs.Job": { "properties": { + "ai_tools_mentioned": { + "description": "AITools lists canonical AI tool and platform names mentioned in the job\ntitle or description, such as \"ChatGPT\" or \"GitHub Copilot\".", + "items": { + "type": "string" + }, + "type": "array" + }, "apply_url": { "type": "string" }, + "benefits_mentioned": { + "description": "Benefits, Clearance, and Education contain canonical requirements and\nofferings mentioned in the job title or description.", + "items": { + "type": "string" + }, + "type": "array" + }, "company": { "type": "string" }, @@ -28164,6 +28349,12 @@ "description_text": { "type": "string" }, + "education_level_required": { + "items": { + "type": "string" + }, + "type": "array" + }, "employment_type": { "type": "string" }, @@ -28206,6 +28397,19 @@ "req_id": { "type": "string" }, + "security_clearance_required": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skills_mentioned": { + "description": "Skills lists canonical ESCO skill labels mentioned in the job title or\ndescription.", + "items": { + "type": "string" + }, + "type": "array" + }, "team": { "type": "string" }, @@ -79060,7 +79264,7 @@ "consumes": [ "application/json" ], - "description": "Searches the discovered company board registry — which companies are hiring, on which ATS, with how many open roles. provider enum: `greenhouse`, `lever`, `ashby`, `workday`, `smartrecruiters`, `workable`, `recruitee`, `rippling`, `personio`, `teamtailor`, `oracle`, `ukg`, `icims`, `eightfold`, `gem`, `pinpoint`. status enum: `active`, `empty`, `gone`, `blocked`, `pending`, `invalid`. sort enum: `open_desc`, `company_asc`, `crawled_desc`.", + "description": "Searches the discovered company board registry — which companies are hiring, on which ATS (or, for the 5 single-company big-tech providers, which platform), with how many open roles. Set sponsors_visa=true to keep companies with certified employer filings in recent public U.S. Department of Labor LCA disclosure data. This is company-level historical evidence, not a guarantee for a specific role or candidate. provider enum: `greenhouse`, `lever`, `ashby`, `workday`, `smartrecruiters`, `workable`, `recruitee`, `rippling`, `personio`, `teamtailor`, `oracle`, `ukg`, `icims`, `eightfold`, `gem`, `pinpoint`, `amazon-jobs`, `apple-jobs`, `google-jobs`, `meta-jobs`, `tesla-jobs`. status enum: `active`, `empty`, `gone`, `blocked`, `pending`, `invalid`. sort enum: `open_desc`, `company_asc`, `crawled_desc`.", "operationId": "datasets-jobs-companies", "parameters": [ { @@ -79070,7 +79274,7 @@ "type": "string" }, { - "description": "ATS provider filter", + "description": "Provider filter", "enum": [ "greenhouse", "lever", @@ -79087,7 +79291,12 @@ "icims", "eightfold", "gem", - "pinpoint" + "pinpoint", + "amazon-jobs", + "apple-jobs", + "google-jobs", + "meta-jobs", + "tesla-jobs" ], "in": "query", "name": "provider", @@ -79113,6 +79322,12 @@ "name": "min_open_roles", "type": "integer" }, + { + "description": "Keep companies with recent certified DOL LCA filings (default false)", + "in": "query", + "name": "sponsors_visa", + "type": "boolean" + }, { "description": "Sort enum: open_desc, company_asc, crawled_desc", "enum": [ @@ -79176,7 +79391,7 @@ "consumes": [ "application/json" ], - "description": "Returns one discovered company board by its dataset board id. When the board carries a known domain (currently populated for iCIMS and Eightfold boards; most Common-Crawl-discovered boards do not), the response also includes a `tech_stack` field joined from the website tech-stack dataset -- a firmographic hint, not a guess: it is only attached when a structural domain signal exists. Returns 404 when the board id is not in the registry.", + "description": "Returns one discovered company board by its dataset board id. When the company name matches recent public U.S. Department of Labor LCA disclosure data, the response includes `lca_sponsorship` with filing counts and observed fiscal-quarter range; this is company-level historical evidence, not a guarantee for a specific role or candidate. When the board carries a known domain, the response also includes a `tech_stack` firmographic hint. Returns 404 when the board id is not in the registry.", "operationId": "datasets-jobs-company-item", "parameters": [ { @@ -79232,7 +79447,7 @@ "consumes": [ "application/json" ], - "description": "Aggregations over all open postings: top companies hiring, breakdown by ATS provider, department, location, employment type, and the remote share — a live hiring-market snapshot.", + "description": "Aggregations over all open postings: top companies hiring, breakdown by provider (every provider filterable via /datasets/jobs/search's `provider` param), department, location, employment type, and the remote share — a live hiring-market snapshot.", "operationId": "datasets-jobs-facets", "parameters": [ { @@ -79337,7 +79552,7 @@ "consumes": [ "application/json" ], - "description": "Finds crawled job postings within `radius_km` of a `lat`/`lon`, nearest first. Only geocoded postings participate (the geo-enrich worker back-fills coordinates from each posting's location). Open roles only by default. provider enum: `greenhouse`, `lever`, `ashby`, `workday`, `smartrecruiters`, `workable`, `recruitee`, `rippling`, `personio`, `teamtailor`, `oracle`, `ukg`, `icims`, `eightfold`, `gem`, `pinpoint`.", + "description": "Finds crawled job postings within `radius_km` of a `lat`/`lon`, nearest first. Only geocoded postings participate (the geo-enrich worker back-fills coordinates from each posting's location). Open roles only by default. provider enum: `greenhouse`, `lever`, `ashby`, `workday`, `smartrecruiters`, `workable`, `recruitee`, `rippling`, `personio`, `teamtailor`, `oracle`, `ukg`, `icims`, `eightfold`, `gem`, `pinpoint`, `amazon-jobs`, `apple-jobs`, `google-jobs`, `meta-jobs`, `tesla-jobs`.", "operationId": "datasets-jobs-nearby", "parameters": [ { @@ -79361,7 +79576,7 @@ "type": "number" }, { - "description": "ATS provider filter", + "description": "Provider filter", "enum": [ "greenhouse", "lever", @@ -79378,7 +79593,12 @@ "icims", "eightfold", "gem", - "pinpoint" + "pinpoint", + "amazon-jobs", + "apple-jobs", + "google-jobs", + "meta-jobs", + "tesla-jobs" ], "in": "query", "name": "provider", @@ -79442,7 +79662,7 @@ "consumes": [ "application/json" ], - "description": "Full-text + faceted search over every job posting crawled from every discovered company ATS board (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Rippling, Personio, Teamtailor, Oracle, UKG, iCIMS, Eightfold, Gem, Pinpoint). Open roles only by default (set include_closed=true for historical/filled roles). Salary is parsed from a structured field when the provider has one, or from an explicit pay figure stated in the description otherwise, so coverage varies by posting rather than by provider; min_salary/max_salary filter on it and require salary_currency, since comparing raw compensation numbers across currencies is meaningless. Location is also exposed as structured city/state/country fields alongside the free-text location string, so city/state/country filter on an exact match of those parsed components rather than substring-matching the display string. provider enum: `greenhouse`, `lever`, `ashby`, `workday`, `smartrecruiters`, `workable`, `recruitee`, `rippling`, `personio`, `teamtailor`, `oracle`, `ukg`, `icims`, `eightfold`, `gem`, `pinpoint`. workplace_type enum: `onsite`, `hybrid`, `remote`. sort enum: `relevance`, `posted_desc`, `company_asc`.", + "description": "Full-text + faceted search over every job posting crawled from every discovered company ATS board (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Rippling, Personio, Teamtailor, Oracle, UKG, iCIMS, Eightfold, Gem, Pinpoint) plus 5 single-company big-tech careers platforms (Amazon, Apple, Google, Meta, Tesla). Open roles only by default (set include_closed=true for historical/filled roles). Salary is parsed from a structured field when the provider has one, or from an explicit pay figure stated in the description otherwise, so coverage varies by posting rather than by provider; min_salary/max_salary filter on it and require salary_currency, since comparing raw compensation numbers across currencies is meaningless. Location is also exposed as structured city/state/country fields alongside the free-text location string, so city/state/country filter on an exact match of those parsed components rather than substring-matching the display string. employment_type is never populated for google-jobs/meta-jobs, and posted_at (so sort=posted_desc) is never populated for meta-jobs/tesla-jobs -- their upstream APIs expose no such field. provider enum: `greenhouse`, `lever`, `ashby`, `workday`, `smartrecruiters`, `workable`, `recruitee`, `rippling`, `personio`, `teamtailor`, `oracle`, `ukg`, `icims`, `eightfold`, `gem`, `pinpoint`, `amazon-jobs`, `apple-jobs`, `google-jobs`, `meta-jobs`, `tesla-jobs`. workplace_type enum: `onsite`, `hybrid`, `remote`. sort enum: `relevance`, `posted_desc`, `company_asc`.", "operationId": "datasets-jobs-search", "parameters": [ { @@ -79458,7 +79678,7 @@ "type": "string" }, { - "description": "ATS provider filter", + "description": "Provider filter", "enum": [ "greenhouse", "lever", @@ -79475,7 +79695,12 @@ "icims", "eightfold", "gem", - "pinpoint" + "pinpoint", + "amazon-jobs", + "apple-jobs", + "google-jobs", + "meta-jobs", + "tesla-jobs" ], "in": "query", "name": "provider", @@ -88389,6 +88614,63 @@ ] } }, + "/facebook/{page}": { + "get": { + "consumes": [ + "application/json" + ], + "description": "Fetches public data about a Facebook Page given its page ID, vanity name, or full page URL: name, follower/like counts, intro, category, business hours/price range, review count, and any public contact details (email, phone, address, website, WhatsApp number) exposed on the Page's About tab.", + "operationId": "facebook-page", + "parameters": [ + { + "description": "Facebook Page reference: vanity name, handle, profile.php id, or full Facebook URL", + "in": "path", + "name": "page", + "required": true, + "type": "string", + "x-example": "nike" + } + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/facebook.pageResponseDoc" + } + }, + "400": { + "description": "Bad request — missing or invalid page reference", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "404": { + "description": "Page not found or unavailable", + "schema": { + "$ref": "#/definitions/app.Response" + } + }, + "500": { + "description": "Internal server error while fetching page data", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "summary": "Get Facebook page details", + "tags": [ + "Facebook" + ] + } + }, "/geocoding/lookup": { "get": { "consumes": [ diff --git a/pyproject.toml b/pyproject.toml index e839a5d..d2ffbfb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "crawlora" -version = "1.27.0.dev1" +version = "1.28.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/tests/test_client.py b/tests/test_client.py index 1a20c79..4f735ea 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, 848) + self.assertEqual(OPERATION_COUNT, 849) def test_deprecated_endpoints_are_not_generated(self): self.assertFalse(hasattr(CrawloraClient(api_key="api_test", base_url=self.base_url).google, "lens")) @@ -297,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: `848`", + "Total operations: `849`", "`bing-search`", "`GET /bing/search`", "`bing.search`",