crawlora 1.20.0.dev1__tar.gz → 1.22.0.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. {crawlora-1.20.0.dev1/crawlora.egg-info → crawlora-1.22.0.dev1}/PKG-INFO +1 -1
  2. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/client.py +1 -1
  3. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/client.pyi +274 -3
  4. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/operations.py +119 -4
  5. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1/crawlora.egg-info}/PKG-INFO +1 -1
  6. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/docs/operations.md +9 -4
  7. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/docs/recipes.md +10 -0
  8. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/pyproject.toml +1 -1
  9. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/tests/test_client.py +2 -2
  10. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/LICENSE +0 -0
  11. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/MANIFEST.in +0 -0
  12. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/README.md +0 -0
  13. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/__init__.py +0 -0
  14. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/_pagination.py +0 -0
  15. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/_transport_sync.py +0 -0
  16. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/async_client.py +0 -0
  17. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora/py.typed +0 -0
  18. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora.egg-info/SOURCES.txt +0 -0
  19. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora.egg-info/dependency_links.txt +0 -0
  20. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora.egg-info/requires.txt +0 -0
  21. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/crawlora.egg-info/top_level.txt +0 -0
  22. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/examples/async_search.py +0 -0
  23. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/examples/bing_search.py +0 -0
  24. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/examples/paginate.py +0 -0
  25. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/examples/youtube_transcript.py +0 -0
  26. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/setup.cfg +0 -0
  27. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/tests/test_async_httpx.py +0 -0
  28. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/tests/test_examples.py +0 -0
  29. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/tests/test_v14_features.py +0 -0
  30. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/tests/test_v15_features.py +0 -0
  31. {crawlora-1.20.0.dev1 → crawlora-1.22.0.dev1}/tests/test_w2_features.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crawlora
3
- Version: 1.20.0.dev1
3
+ Version: 1.22.0.dev1
4
4
  Summary: 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.
5
5
  Author: Crawlora
6
6
  License-Expression: MIT
@@ -20,7 +20,7 @@ from ._transport_sync import KeepAliveTransport
20
20
  from .operations import GROUPS, OPERATIONS
21
21
 
22
22
  DEFAULT_BASE_URL = "https://api.crawlora.net/api/v1"
23
- VERSION = "1.20.0-sdk.1"
23
+ VERSION = "1.22.0-sdk.1"
24
24
  DEFAULT_USER_AGENT = f"crawlora-python-sdk/{VERSION}"
25
25
  DEFAULT_MAX_RETRY_DELAY = 30.0
26
26
  DEFAULT_RETRY_STATUSES = (408, 409, 425, 429)
@@ -15420,6 +15420,100 @@ ModelTechstackTechnology = TypedDict('ModelTechstackTechnology', {
15420
15420
  'version': NotRequired[str],
15421
15421
  }, total=False)
15422
15422
 
15423
+ ModelThreadsAuthor = TypedDict('ModelThreadsAuthor', {
15424
+ 'id': NotRequired[str],
15425
+ 'name': NotRequired[str],
15426
+ 'username': NotRequired[str],
15427
+ }, total=False)
15428
+
15429
+ ModelThreadsPost = TypedDict('ModelThreadsPost', {
15430
+ 'author': NotRequired[ModelThreadsAuthor],
15431
+ 'code': NotRequired[str],
15432
+ 'image_url': NotRequired[str],
15433
+ 'text': NotRequired[str],
15434
+ 'url': NotRequired[str],
15435
+ }, total=False)
15436
+
15437
+ ModelThreadsProfile = TypedDict('ModelThreadsProfile', {
15438
+ 'avatar_url': NotRequired[str],
15439
+ 'biography': NotRequired[str],
15440
+ 'followers_count': NotRequired[int],
15441
+ 'name': NotRequired[str],
15442
+ 'threads_count': NotRequired[int],
15443
+ 'url': NotRequired[str],
15444
+ 'username': NotRequired[str],
15445
+ }, total=False)
15446
+
15447
+ ModelThreadsProfilePostsResult = TypedDict('ModelThreadsProfilePostsResult', {
15448
+ 'has_more': NotRequired[bool],
15449
+ 'items': NotRequired[list[ModelThreadsThread]],
15450
+ 'next_cursor': NotRequired[str],
15451
+ 'username': NotRequired[str],
15452
+ }, total=False)
15453
+
15454
+ ModelThreadsRepliesResult = TypedDict('ModelThreadsRepliesResult', {
15455
+ 'code': NotRequired[str],
15456
+ 'has_more': NotRequired[bool],
15457
+ 'items': NotRequired[list[ModelThreadsThread]],
15458
+ 'next_cursor': NotRequired[str],
15459
+ 'pagination_limited': NotRequired[bool],
15460
+ 'username': NotRequired[str],
15461
+ }, total=False)
15462
+
15463
+ ModelThreadsSearchResult = TypedDict('ModelThreadsSearchResult', {
15464
+ 'has_more': NotRequired[bool],
15465
+ 'items': NotRequired[list[ModelThreadsThread]],
15466
+ 'next_cursor': NotRequired[str],
15467
+ 'query': NotRequired[str],
15468
+ }, total=False)
15469
+
15470
+ ModelThreadsThread = TypedDict('ModelThreadsThread', {
15471
+ 'author': NotRequired[ModelThreadsAuthor],
15472
+ 'code': NotRequired[str],
15473
+ 'created_at': NotRequired[str],
15474
+ 'id': NotRequired[str],
15475
+ 'image_urls': NotRequired[list[str]],
15476
+ 'is_reply': NotRequired[bool],
15477
+ 'like_count': NotRequired[int],
15478
+ 'quote_count': NotRequired[int],
15479
+ 'reply_count': NotRequired[int],
15480
+ 'reply_to': NotRequired[str],
15481
+ 'repost_count': NotRequired[int],
15482
+ 'text': NotRequired[str],
15483
+ 'url': NotRequired[str],
15484
+ 'video_urls': NotRequired[list[str]],
15485
+ }, total=False)
15486
+
15487
+ ModelThreadsPostResponseDoc = TypedDict('ModelThreadsPostResponseDoc', {
15488
+ 'code': NotRequired[int],
15489
+ 'data': NotRequired[ModelThreadsPost],
15490
+ 'msg': NotRequired[str],
15491
+ }, total=False)
15492
+
15493
+ ModelThreadsProfilePostsResponseDoc = TypedDict('ModelThreadsProfilePostsResponseDoc', {
15494
+ 'code': NotRequired[int],
15495
+ 'data': NotRequired[ModelThreadsProfilePostsResult],
15496
+ 'msg': NotRequired[str],
15497
+ }, total=False)
15498
+
15499
+ ModelThreadsProfileResponseDoc = TypedDict('ModelThreadsProfileResponseDoc', {
15500
+ 'code': NotRequired[int],
15501
+ 'data': NotRequired[ModelThreadsProfile],
15502
+ 'msg': NotRequired[str],
15503
+ }, total=False)
15504
+
15505
+ ModelThreadsRepliesResponseDoc = TypedDict('ModelThreadsRepliesResponseDoc', {
15506
+ 'code': NotRequired[int],
15507
+ 'data': NotRequired[ModelThreadsRepliesResult],
15508
+ 'msg': NotRequired[str],
15509
+ }, total=False)
15510
+
15511
+ ModelThreadsSearchResponseDoc = TypedDict('ModelThreadsSearchResponseDoc', {
15512
+ 'code': NotRequired[int],
15513
+ 'data': NotRequired[ModelThreadsSearchResult],
15514
+ 'msg': NotRequired[str],
15515
+ }, total=False)
15516
+
15423
15517
  ModelTiktokCategory = TypedDict('ModelTiktokCategory', {
15424
15518
  'name': NotRequired[str],
15425
15519
  'type': NotRequired[str],
@@ -17383,6 +17477,7 @@ ModelXPostQuote = TypedDict('ModelXPostQuote', {
17383
17477
  }, total=False)
17384
17478
 
17385
17479
  ModelXProfile = TypedDict('ModelXProfile', {
17480
+ 'affiliate_label': NotRequired[str],
17386
17481
  'avatar_url': NotRequired[str],
17387
17482
  'banner_url': NotRequired[str],
17388
17483
  'bio_urls': NotRequired[list[str]],
@@ -19962,7 +20057,7 @@ DatasetsJobsCompaniesParams = TypedDict('DatasetsJobsCompaniesParams', {
19962
20057
  '_timeout': NotRequired[float],
19963
20058
  '_headers': NotRequired[Mapping[str, str]],
19964
20059
  'q': NotRequired[str],
19965
- 'provider': NotRequired[str],
20060
+ 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold']],
19966
20061
  'status': NotRequired[str],
19967
20062
  'min_open_roles': NotRequired[int],
19968
20063
  'sort': NotRequired[str],
@@ -20002,7 +20097,7 @@ DatasetsJobsNearbyParams = TypedDict('DatasetsJobsNearbyParams', {
20002
20097
  'lat': Required[float],
20003
20098
  'lon': Required[float],
20004
20099
  'radius_km': NotRequired[float],
20005
- 'provider': NotRequired[str],
20100
+ 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold']],
20006
20101
  'include_closed': NotRequired[bool],
20007
20102
  'page': NotRequired[int],
20008
20103
  'page_size': NotRequired[int],
@@ -20015,7 +20110,7 @@ DatasetsJobsSearchParams = TypedDict('DatasetsJobsSearchParams', {
20015
20110
  '_headers': NotRequired[Mapping[str, str]],
20016
20111
  'q': NotRequired[str],
20017
20112
  'company': NotRequired[str],
20018
- 'provider': NotRequired[str],
20113
+ 'provider': NotRequired[Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold']],
20019
20114
  'department': NotRequired[str],
20020
20115
  'location': NotRequired[str],
20021
20116
  'employment_type': NotRequired[str],
@@ -25467,6 +25562,49 @@ TcdbTopSetsParams = TypedDict('TcdbTopSetsParams', {
25467
25562
  'limit': NotRequired[int],
25468
25563
  }, total=False)
25469
25564
 
25565
+ ThreadsPostResponse = ModelThreadsPostResponseDoc
25566
+ ThreadsPostParams = TypedDict('ThreadsPostParams', {
25567
+ '_response_type': NotRequired[ResponseType],
25568
+ '_timeout': NotRequired[float],
25569
+ '_headers': NotRequired[Mapping[str, str]],
25570
+ 'username': Required[str],
25571
+ 'code': Required[str],
25572
+ }, total=False)
25573
+
25574
+ ThreadsPostRepliesResponse = ModelThreadsRepliesResponseDoc
25575
+ ThreadsPostRepliesParams = TypedDict('ThreadsPostRepliesParams', {
25576
+ '_response_type': NotRequired[ResponseType],
25577
+ '_timeout': NotRequired[float],
25578
+ '_headers': NotRequired[Mapping[str, str]],
25579
+ 'username': Required[str],
25580
+ 'code': Required[str],
25581
+ }, total=False)
25582
+
25583
+ ThreadsProfileResponse = ModelThreadsProfileResponseDoc
25584
+ ThreadsProfileParams = TypedDict('ThreadsProfileParams', {
25585
+ '_response_type': NotRequired[ResponseType],
25586
+ '_timeout': NotRequired[float],
25587
+ '_headers': NotRequired[Mapping[str, str]],
25588
+ 'username': Required[str],
25589
+ }, total=False)
25590
+
25591
+ ThreadsProfilePostsResponse = ModelThreadsProfilePostsResponseDoc
25592
+ ThreadsProfilePostsParams = TypedDict('ThreadsProfilePostsParams', {
25593
+ '_response_type': NotRequired[ResponseType],
25594
+ '_timeout': NotRequired[float],
25595
+ '_headers': NotRequired[Mapping[str, str]],
25596
+ 'username': Required[str],
25597
+ 'cursor': NotRequired[str],
25598
+ }, total=False)
25599
+
25600
+ ThreadsSearchResponse = ModelThreadsSearchResponseDoc
25601
+ ThreadsSearchParams = TypedDict('ThreadsSearchParams', {
25602
+ '_response_type': NotRequired[ResponseType],
25603
+ '_timeout': NotRequired[float],
25604
+ '_headers': NotRequired[Mapping[str, str]],
25605
+ 'q': Required[str],
25606
+ }, total=False)
25607
+
25470
25608
  TiktokCategoryResponse = ModelTiktokCategoryResponseDoc
25471
25609
  TiktokCategoryParams = TypedDict('TiktokCategoryParams', {
25472
25610
  '_response_type': NotRequired[ResponseType],
@@ -27362,6 +27500,13 @@ class TcdbGroup:
27362
27500
  def team(self, **params: Unpack[TcdbTeamParams]) -> TcdbTeamResponse: ...
27363
27501
  def top_sets(self, **params: Unpack[TcdbTopSetsParams]) -> TcdbTopSetsResponse: ...
27364
27502
 
27503
+ class ThreadsGroup:
27504
+ def post(self, **params: Unpack[ThreadsPostParams]) -> ThreadsPostResponse: ...
27505
+ def post_replies(self, **params: Unpack[ThreadsPostRepliesParams]) -> ThreadsPostRepliesResponse: ...
27506
+ def profile(self, **params: Unpack[ThreadsProfileParams]) -> ThreadsProfileResponse: ...
27507
+ def profile_posts(self, **params: Unpack[ThreadsProfilePostsParams]) -> ThreadsProfilePostsResponse: ...
27508
+ def search(self, **params: Unpack[ThreadsSearchParams]) -> ThreadsSearchResponse: ...
27509
+
27365
27510
  class TiktokGroup:
27366
27511
  def category(self, **params: Unpack[TiktokCategoryParams]) -> TiktokCategoryResponse: ...
27367
27512
  def video_comments(self, **params: Unpack[TiktokVideoCommentsParams]) -> TiktokVideoCommentsResponse: ...
@@ -28167,6 +28312,11 @@ OperationId = Literal[
28167
28312
  'tcdb-tagged',
28168
28313
  'tcdb-team',
28169
28314
  'tcdb-top-sets',
28315
+ 'threads-post',
28316
+ 'threads-post-replies',
28317
+ 'threads-profile',
28318
+ 'threads-profile-posts',
28319
+ 'threads-search',
28170
28320
  'tiktok-category',
28171
28321
  'tiktok-video-comments',
28172
28322
  'tiktok-explore',
@@ -28342,6 +28492,7 @@ class CrawloraClient:
28342
28492
  spotify: SpotifyGroup
28343
28493
  steam: SteamGroup
28344
28494
  tcdb: TcdbGroup
28495
+ threads: ThreadsGroup
28345
28496
  tiktok: TiktokGroup
28346
28497
  tmdb: TmdbGroup
28347
28498
  trip_advisor: TripAdvisorGroup
@@ -36379,6 +36530,66 @@ class CrawloraClient:
36379
36530
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
36380
36531
  ) -> TcdbTopSetsResponse: ...
36381
36532
  @overload
36533
+ def operation(
36534
+ self,
36535
+ operation_id: Literal['threads-post'],
36536
+ params: ThreadsPostParams,
36537
+ *,
36538
+ response_type: ResponseType = ...,
36539
+ timeout: float | None = ...,
36540
+ headers: Mapping[str, str] | None = ...,
36541
+ retries: int | None = ...,
36542
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
36543
+ ) -> ThreadsPostResponse: ...
36544
+ @overload
36545
+ def operation(
36546
+ self,
36547
+ operation_id: Literal['threads-post-replies'],
36548
+ params: ThreadsPostRepliesParams,
36549
+ *,
36550
+ response_type: ResponseType = ...,
36551
+ timeout: float | None = ...,
36552
+ headers: Mapping[str, str] | None = ...,
36553
+ retries: int | None = ...,
36554
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
36555
+ ) -> ThreadsPostRepliesResponse: ...
36556
+ @overload
36557
+ def operation(
36558
+ self,
36559
+ operation_id: Literal['threads-profile'],
36560
+ params: ThreadsProfileParams,
36561
+ *,
36562
+ response_type: ResponseType = ...,
36563
+ timeout: float | None = ...,
36564
+ headers: Mapping[str, str] | None = ...,
36565
+ retries: int | None = ...,
36566
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
36567
+ ) -> ThreadsProfileResponse: ...
36568
+ @overload
36569
+ def operation(
36570
+ self,
36571
+ operation_id: Literal['threads-profile-posts'],
36572
+ params: ThreadsProfilePostsParams,
36573
+ *,
36574
+ response_type: ResponseType = ...,
36575
+ timeout: float | None = ...,
36576
+ headers: Mapping[str, str] | None = ...,
36577
+ retries: int | None = ...,
36578
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
36579
+ ) -> ThreadsProfilePostsResponse: ...
36580
+ @overload
36581
+ def operation(
36582
+ self,
36583
+ operation_id: Literal['threads-search'],
36584
+ params: ThreadsSearchParams,
36585
+ *,
36586
+ response_type: ResponseType = ...,
36587
+ timeout: float | None = ...,
36588
+ headers: Mapping[str, str] | None = ...,
36589
+ retries: int | None = ...,
36590
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
36591
+ ) -> ThreadsSearchResponse: ...
36592
+ @overload
36382
36593
  def operation(
36383
36594
  self,
36384
36595
  operation_id: Literal['tiktok-category'],
@@ -45775,6 +45986,66 @@ class CrawloraClient:
45775
45986
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
45776
45987
  ) -> TcdbTopSetsResponse: ...
45777
45988
  @overload
45989
+ def request(
45990
+ self,
45991
+ operation_id: Literal['threads-post'],
45992
+ params: ThreadsPostParams,
45993
+ *,
45994
+ response_type: ResponseType = ...,
45995
+ timeout: float | None = ...,
45996
+ headers: Mapping[str, str] | None = ...,
45997
+ retries: int | None = ...,
45998
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
45999
+ ) -> ThreadsPostResponse: ...
46000
+ @overload
46001
+ def request(
46002
+ self,
46003
+ operation_id: Literal['threads-post-replies'],
46004
+ params: ThreadsPostRepliesParams,
46005
+ *,
46006
+ response_type: ResponseType = ...,
46007
+ timeout: float | None = ...,
46008
+ headers: Mapping[str, str] | None = ...,
46009
+ retries: int | None = ...,
46010
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
46011
+ ) -> ThreadsPostRepliesResponse: ...
46012
+ @overload
46013
+ def request(
46014
+ self,
46015
+ operation_id: Literal['threads-profile'],
46016
+ params: ThreadsProfileParams,
46017
+ *,
46018
+ response_type: ResponseType = ...,
46019
+ timeout: float | None = ...,
46020
+ headers: Mapping[str, str] | None = ...,
46021
+ retries: int | None = ...,
46022
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
46023
+ ) -> ThreadsProfileResponse: ...
46024
+ @overload
46025
+ def request(
46026
+ self,
46027
+ operation_id: Literal['threads-profile-posts'],
46028
+ params: ThreadsProfilePostsParams,
46029
+ *,
46030
+ response_type: ResponseType = ...,
46031
+ timeout: float | None = ...,
46032
+ headers: Mapping[str, str] | None = ...,
46033
+ retries: int | None = ...,
46034
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
46035
+ ) -> ThreadsProfilePostsResponse: ...
46036
+ @overload
46037
+ def request(
46038
+ self,
46039
+ operation_id: Literal['threads-search'],
46040
+ params: ThreadsSearchParams,
46041
+ *,
46042
+ response_type: ResponseType = ...,
46043
+ timeout: float | None = ...,
46044
+ headers: Mapping[str, str] | None = ...,
46045
+ retries: int | None = ...,
46046
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
46047
+ ) -> ThreadsSearchResponse: ...
46048
+ @overload
45778
46049
  def request(
45779
46050
  self,
45780
46051
  operation_id: Literal['tiktok-category'],
@@ -3408,7 +3408,23 @@ OPERATIONS = {'airbnb-host': {'bodyParam': None,
3408
3408
  'pathParams': [],
3409
3409
  'produces': ['application/json'],
3410
3410
  'queryParams': [{'in': 'query', 'name': 'q', 'type': 'string'},
3411
- {'in': 'query', 'name': 'provider', 'type': 'string'},
3411
+ {'enum': ['greenhouse',
3412
+ 'lever',
3413
+ 'ashby',
3414
+ 'workday',
3415
+ 'smartrecruiters',
3416
+ 'workable',
3417
+ 'recruitee',
3418
+ 'rippling',
3419
+ 'personio',
3420
+ 'teamtailor',
3421
+ 'oracle',
3422
+ 'ukg',
3423
+ 'icims',
3424
+ 'eightfold'],
3425
+ 'in': 'query',
3426
+ 'name': 'provider',
3427
+ 'type': 'string'},
3412
3428
  {'in': 'query', 'name': 'status', 'type': 'string'},
3413
3429
  {'in': 'query', 'name': 'min_open_roles', 'type': 'integer'},
3414
3430
  {'in': 'query', 'name': 'sort', 'type': 'string'},
@@ -3461,7 +3477,23 @@ OPERATIONS = {'airbnb-host': {'bodyParam': None,
3461
3477
  'queryParams': [{'in': 'query', 'name': 'lat', 'required': True, 'type': 'number'},
3462
3478
  {'in': 'query', 'name': 'lon', 'required': True, 'type': 'number'},
3463
3479
  {'in': 'query', 'name': 'radius_km', 'type': 'number'},
3464
- {'in': 'query', 'name': 'provider', 'type': 'string'},
3480
+ {'enum': ['greenhouse',
3481
+ 'lever',
3482
+ 'ashby',
3483
+ 'workday',
3484
+ 'smartrecruiters',
3485
+ 'workable',
3486
+ 'recruitee',
3487
+ 'rippling',
3488
+ 'personio',
3489
+ 'teamtailor',
3490
+ 'oracle',
3491
+ 'ukg',
3492
+ 'icims',
3493
+ 'eightfold'],
3494
+ 'in': 'query',
3495
+ 'name': 'provider',
3496
+ 'type': 'string'},
3465
3497
  {'in': 'query', 'name': 'include_closed', 'type': 'boolean'},
3466
3498
  {'in': 'query', 'name': 'page', 'type': 'integer'},
3467
3499
  {'in': 'query', 'name': 'page_size', 'type': 'integer'}],
@@ -3478,7 +3510,23 @@ OPERATIONS = {'airbnb-host': {'bodyParam': None,
3478
3510
  'produces': ['application/json'],
3479
3511
  'queryParams': [{'in': 'query', 'name': 'q', 'type': 'string'},
3480
3512
  {'in': 'query', 'name': 'company', 'type': 'string'},
3481
- {'in': 'query', 'name': 'provider', 'type': 'string'},
3513
+ {'enum': ['greenhouse',
3514
+ 'lever',
3515
+ 'ashby',
3516
+ 'workday',
3517
+ 'smartrecruiters',
3518
+ 'workable',
3519
+ 'recruitee',
3520
+ 'rippling',
3521
+ 'personio',
3522
+ 'teamtailor',
3523
+ 'oracle',
3524
+ 'ukg',
3525
+ 'icims',
3526
+ 'eightfold'],
3527
+ 'in': 'query',
3528
+ 'name': 'provider',
3529
+ 'type': 'string'},
3482
3530
  {'in': 'query', 'name': 'department', 'type': 'string'},
3483
3531
  {'in': 'query', 'name': 'location', 'type': 'string'},
3484
3532
  {'in': 'query', 'name': 'employment_type', 'type': 'string'},
@@ -11649,6 +11697,63 @@ OPERATIONS = {'airbnb-host': {'bodyParam': None,
11649
11697
  'produces': ['application/json'],
11650
11698
  'queryParams': [{'in': 'query', 'name': 'limit', 'type': 'integer'}],
11651
11699
  'security': ['ApiKeyAuth']},
11700
+ 'threads-post': {'bodyParam': None,
11701
+ 'bodyRequired': False,
11702
+ 'consumes': [],
11703
+ 'formParams': [],
11704
+ 'id': 'threads-post',
11705
+ 'method': 'GET',
11706
+ 'path': '/threads/post/{username}/{code}',
11707
+ 'pathParams': ['username', 'code'],
11708
+ 'produces': ['application/json'],
11709
+ 'queryParams': [],
11710
+ 'security': ['ApiKeyAuth']},
11711
+ 'threads-post-replies': {'bodyParam': None,
11712
+ 'bodyRequired': False,
11713
+ 'consumes': [],
11714
+ 'formParams': [],
11715
+ 'id': 'threads-post-replies',
11716
+ 'method': 'GET',
11717
+ 'path': '/threads/post/{username}/{code}/replies',
11718
+ 'pathParams': ['username', 'code'],
11719
+ 'produces': ['application/json'],
11720
+ 'queryParams': [],
11721
+ 'security': ['ApiKeyAuth']},
11722
+ 'threads-profile': {'bodyParam': None,
11723
+ 'bodyRequired': False,
11724
+ 'consumes': [],
11725
+ 'formParams': [],
11726
+ 'id': 'threads-profile',
11727
+ 'method': 'GET',
11728
+ 'path': '/threads/profile/{username}',
11729
+ 'pathParams': ['username'],
11730
+ 'produces': ['application/json'],
11731
+ 'queryParams': [],
11732
+ 'security': ['ApiKeyAuth']},
11733
+ 'threads-profile-posts': {'bodyParam': None,
11734
+ 'bodyRequired': False,
11735
+ 'consumes': [],
11736
+ 'cursorParams': ['cursor'],
11737
+ 'formParams': [],
11738
+ 'id': 'threads-profile-posts',
11739
+ 'method': 'GET',
11740
+ 'paginatable': True,
11741
+ 'path': '/threads/profile/{username}/posts',
11742
+ 'pathParams': ['username'],
11743
+ 'produces': ['application/json'],
11744
+ 'queryParams': [{'in': 'query', 'name': 'cursor', 'type': 'string'}],
11745
+ 'security': ['ApiKeyAuth']},
11746
+ 'threads-search': {'bodyParam': None,
11747
+ 'bodyRequired': False,
11748
+ 'consumes': [],
11749
+ 'formParams': [],
11750
+ 'id': 'threads-search',
11751
+ 'method': 'GET',
11752
+ 'path': '/threads/search',
11753
+ 'pathParams': [],
11754
+ 'produces': ['application/json'],
11755
+ 'queryParams': [{'in': 'query', 'name': 'q', 'required': True, 'type': 'string'}],
11756
+ 'security': ['ApiKeyAuth']},
11652
11757
  'tiktok-category': {'bodyParam': None,
11653
11758
  'bodyRequired': False,
11654
11759
  'consumes': ['application/json'],
@@ -13916,6 +14021,11 @@ GROUPS = {'airbnb': {'host': 'airbnb-host',
13916
14021
  'tagged': 'tcdb-tagged',
13917
14022
  'team': 'tcdb-team',
13918
14023
  'top_sets': 'tcdb-top-sets'},
14024
+ 'threads': {'post': 'threads-post',
14025
+ 'post_replies': 'threads-post-replies',
14026
+ 'profile': 'threads-profile',
14027
+ 'profile_posts': 'threads-profile-posts',
14028
+ 'search': 'threads-search'},
13919
14029
  'tiktok': {'category': 'tiktok-category',
13920
14030
  'challenge': 'tiktok-challenge',
13921
14031
  'challenge_list': 'tiktok-challenge-list',
@@ -14034,7 +14144,7 @@ GROUPS = {'airbnb': {'host': 'airbnb-host',
14034
14144
  'video': 'youtube-video'},
14035
14145
  'zillow': {'autocomplete': 'zillow-autocomplete', 'property': 'zillow-property', 'search': 'zillow-search'}}
14036
14146
 
14037
- OPERATION_COUNT = 782
14147
+ OPERATION_COUNT = 787
14038
14148
 
14039
14149
  class OperationId:
14040
14150
  AIRBNB_HOST = 'airbnb-host'
@@ -14696,6 +14806,11 @@ class OperationId:
14696
14806
  TCDB_TAGGED = 'tcdb-tagged'
14697
14807
  TCDB_TEAM = 'tcdb-team'
14698
14808
  TCDB_TOP_SETS = 'tcdb-top-sets'
14809
+ THREADS_POST = 'threads-post'
14810
+ THREADS_POST_REPLIES = 'threads-post-replies'
14811
+ THREADS_PROFILE = 'threads-profile'
14812
+ THREADS_PROFILE_POSTS = 'threads-profile-posts'
14813
+ THREADS_SEARCH = 'threads-search'
14699
14814
  TIKTOK_CATEGORY = 'tiktok-category'
14700
14815
  TIKTOK_CHALLENGE = 'tiktok-challenge'
14701
14816
  TIKTOK_CHALLENGE_LIST = 'tiktok-challenge-list'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crawlora
3
- Version: 1.20.0.dev1
3
+ Version: 1.22.0.dev1
4
4
  Summary: 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.
5
5
  Author: Crawlora
6
6
  License-Expression: MIT
@@ -2,7 +2,7 @@
2
2
 
3
3
  Generated from `openapi/public.json`. Deprecated, admin, and internal operations are excluded from this SDK contract.
4
4
 
5
- Total operations: `782`
5
+ Total operations: `787`
6
6
 
7
7
  | Group | SDK method | Operation ID | HTTP | Params | Auth | Response | Notes |
8
8
  | --- | --- | --- | --- | --- | --- | --- | --- |
@@ -148,12 +148,12 @@ Total operations: `782`
148
148
  | datasets | `datasets.housing_markets_facets` | `datasets-housing-markets-facets` | `GET /datasets/housing-markets/facets` | `facet` (query str required)<br>`q` (query str)<br>`region_type` (query str)<br>`state_code` (query str)<br>`property_type` (query str)<br>`parent_metro_code` (query str)<br>`zip_code` (query str)<br>`period` (query str)<br>`latest` (query bool)<br>`min_median_sale_price` (query float)<br>`max_median_sale_price` (query float)<br>`min_median_list_price` (query float)<br>`max_median_list_price` (query float)<br>`min_price_to_income` (query float)<br>`max_price_to_income` (query float)<br>`min_salary_to_buy` (query int)<br>`max_salary_to_buy` (query int)<br>`min_median_dom` (query float)<br>`max_median_dom` (query float)<br>`min_inventory` (query int)<br>`max_inventory` (query int)<br>`min_homes_sold` (query int) | `ApiKeyAuth` | `DatasetsHousingMarketsFacetsResponse` | |
149
149
  | datasets | `datasets.housing_markets_item` | `datasets-housing-markets-item` | `GET /datasets/housing-markets/items/{region_type}/{table_id}` | `region_type` (path str required)<br>`table_id` (path int required)<br>`period` (query str)<br>`property_type` (query str)<br>`history` (query bool) | `ApiKeyAuth` | `DatasetsHousingMarketsItemResponse` | |
150
150
  | datasets | `datasets.housing_markets_search` | `datasets-housing-markets-search` | `GET /datasets/housing-markets/search` | `q` (query str)<br>`region_type` (query str)<br>`state_code` (query str)<br>`property_type` (query str)<br>`parent_metro_code` (query str)<br>`zip_code` (query str)<br>`period` (query str)<br>`latest` (query bool)<br>`min_median_sale_price` (query float)<br>`max_median_sale_price` (query float)<br>`min_median_list_price` (query float)<br>`max_median_list_price` (query float)<br>`min_price_to_income` (query float)<br>`max_price_to_income` (query float)<br>`min_salary_to_buy` (query int)<br>`max_salary_to_buy` (query int)<br>`min_median_dom` (query float)<br>`max_median_dom` (query float)<br>`min_inventory` (query int)<br>`max_inventory` (query int)<br>`min_homes_sold` (query int)<br>`sort` (query str)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsHousingMarketsSearchResponse` | |
151
- | datasets | `datasets.jobs_companies` | `datasets-jobs-companies` | `GET /datasets/jobs/companies` | `q` (query str)<br>`provider` (query str)<br>`status` (query str)<br>`min_open_roles` (query int)<br>`sort` (query str)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsCompaniesResponse` | |
151
+ | datasets | `datasets.jobs_companies` | `datasets-jobs-companies` | `GET /datasets/jobs/companies` | `q` (query str)<br>`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold'])<br>`status` (query str)<br>`min_open_roles` (query int)<br>`sort` (query str)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsCompaniesResponse` | |
152
152
  | datasets | `datasets.jobs_company_item` | `datasets-jobs-company-item` | `GET /datasets/jobs/companies/{id}` | `id` (path str required) | `ApiKeyAuth` | `DatasetsJobsCompanyItemResponse` | |
153
153
  | datasets | `datasets.jobs_facets` | `datasets-jobs-facets` | `GET /datasets/jobs/facets` | `size` (query int) | `ApiKeyAuth` | `DatasetsJobsFacetsResponse` | |
154
154
  | datasets | `datasets.jobs_item` | `datasets-jobs-item` | `GET /datasets/jobs/items/{id}` | `id` (path str required) | `ApiKeyAuth` | `DatasetsJobsItemResponse` | |
155
- | datasets | `datasets.jobs_nearby` | `datasets-jobs-nearby` | `GET /datasets/jobs/nearby` | `lat` (query float required)<br>`lon` (query float required)<br>`radius_km` (query float)<br>`provider` (query str)<br>`include_closed` (query bool)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsNearbyResponse` | |
156
- | datasets | `datasets.jobs_search` | `datasets-jobs-search` | `GET /datasets/jobs/search` | `q` (query str)<br>`company` (query str)<br>`provider` (query str)<br>`department` (query str)<br>`location` (query str)<br>`employment_type` (query str)<br>`remote` (query bool)<br>`include_closed` (query bool)<br>`sort` (query str)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsSearchResponse` | |
155
+ | datasets | `datasets.jobs_nearby` | `datasets-jobs-nearby` | `GET /datasets/jobs/nearby` | `lat` (query float required)<br>`lon` (query float required)<br>`radius_km` (query float)<br>`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold'])<br>`include_closed` (query bool)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsNearbyResponse` | |
156
+ | datasets | `datasets.jobs_search` | `datasets-jobs-search` | `GET /datasets/jobs/search` | `q` (query str)<br>`company` (query str)<br>`provider` (query Literal['greenhouse', 'lever', 'ashby', 'workday', 'smartrecruiters', 'workable', 'recruitee', 'rippling', 'personio', 'teamtailor', 'oracle', 'ukg', 'icims', 'eightfold'])<br>`department` (query str)<br>`location` (query str)<br>`employment_type` (query str)<br>`remote` (query bool)<br>`include_closed` (query bool)<br>`sort` (query str)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsJobsSearchResponse` | |
157
157
  | datasets | `datasets.journalists_facets` | `datasets-journalists-facets` | `GET /datasets/journalists/facets` | `facet` (query str required)<br>`q` (query str)<br>`outlet` (query str)<br>`vertical` (query str)<br>`topic` (query str)<br>`contact_type` (query str) | `ApiKeyAuth` | `DatasetsJournalistsFacetsResponse` | |
158
158
  | datasets | `datasets.journalists_item` | `datasets-journalists-item` | `GET /datasets/journalists/items/{outlet}/{slug}` | `outlet` (path str required)<br>`slug` (path str required) | `ApiKeyAuth` | `DatasetsJournalistsItemResponse` | |
159
159
  | datasets | `datasets.journalists_search` | `datasets-journalists-search` | `GET /datasets/journalists/search` | `q` (query str)<br>`outlet` (query str)<br>`vertical` (query str)<br>`topic` (query str)<br>`contact_type` (query str)<br>`sort` (query str)<br>`page` (query int)<br>`page_size` (query int) | `ApiKeyAuth` | `DatasetsJournalistsSearchResponse` | |
@@ -670,6 +670,11 @@ Total operations: `782`
670
670
  | tcdb | `tcdb.tagged` | `tcdb-tagged` | `GET /tcdb/tagged` | `id` (query str)<br>`path` (query str)<br>`url` (query str)<br>`sport` (query Literal['Baseball', 'Basketball', 'Boxing', 'Cricket', 'Football', 'Gaming', 'Golf', 'Hockey', 'Misc Sports', 'MMA', 'Multi-Sport', 'Non-Sport', 'Racing', 'Soccer', 'Tennis', 'Wrestling'])<br>`page` (query int)<br>`limit` (query int) | `ApiKeyAuth` | `TcdbTaggedResponse` | |
671
671
  | tcdb | `tcdb.team` | `tcdb-team` | `GET /tcdb/team` | `id` (query str)<br>`path` (query str)<br>`url` (query str)<br>`limit` (query int) | `ApiKeyAuth` | `TcdbTeamResponse` | |
672
672
  | tcdb | `tcdb.top_sets` | `tcdb-top-sets` | `GET /tcdb/top-sets` | `limit` (query int) | `ApiKeyAuth` | `TcdbTopSetsResponse` | |
673
+ | threads | `threads.post` | `threads-post` | `GET /threads/post/{username}/{code}` | `username` (path str required)<br>`code` (path str required) | `ApiKeyAuth` | `ThreadsPostResponse` | |
674
+ | threads | `threads.post_replies` | `threads-post-replies` | `GET /threads/post/{username}/{code}/replies` | `username` (path str required)<br>`code` (path str required) | `ApiKeyAuth` | `ThreadsPostRepliesResponse` | |
675
+ | threads | `threads.profile` | `threads-profile` | `GET /threads/profile/{username}` | `username` (path str required) | `ApiKeyAuth` | `ThreadsProfileResponse` | |
676
+ | threads | `threads.profile_posts` | `threads-profile-posts` | `GET /threads/profile/{username}/posts` | `username` (path str required)<br>`cursor` (query str) | `ApiKeyAuth` | `ThreadsProfilePostsResponse` | |
677
+ | threads | `threads.search` | `threads-search` | `GET /threads/search` | `q` (query str required) | `ApiKeyAuth` | `ThreadsSearchResponse` | |
673
678
  | tiktok | `tiktok.category` | `tiktok-category` | `GET /tiktok/category` | none | `ApiKeyAuth` | `TiktokCategoryResponse` | |
674
679
  | tiktok | `tiktok.video_comments` | `tiktok-video-comments` | `GET /tiktok/comments` | `aweme_id` (query str required)<br>`cursor` (query int) | `ApiKeyAuth` | `TiktokVideoCommentsResponse` | |
675
680
  | tiktok | `tiktok.explore` | `tiktok-explore` | `GET /tiktok/explore/{id}` | `id` (path int required) | `ApiKeyAuth` | `TiktokExploreResponse` | |
@@ -39,6 +39,16 @@ posts = crawlora.reddit.search(q="python", subreddit="programming")
39
39
  brand = crawlora.brand.retrieve(domain="stripe.com")
40
40
  ```
41
41
 
42
+ ## Threads Public Lookups
43
+
44
+ ```python
45
+ profile = crawlora.threads.profile(username="zuck")
46
+ post = crawlora.threads.post(username="zuck", code="DakyAavlKLZ")
47
+ results = crawlora.threads.search(q="openai")
48
+ posts = crawlora.threads.profile_posts(username="zuck")
49
+ replies = crawlora.threads.post_replies(username="zuck", code="DakyAavlKLZ")
50
+ ```
51
+
42
52
  ## Software, Reviews, And Market Datasets
43
53
 
44
54
  Build a Chrome extension competitive-intelligence view without downloading the
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "crawlora"
7
- version = "1.20.0.dev1"
7
+ version = "1.22.0.dev1"
8
8
  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."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -267,7 +267,7 @@ class CrawloraClientTest(unittest.TestCase):
267
267
  self.assertIs(raised.exception.__cause__, cause)
268
268
 
269
269
  def test_operation_metadata_count(self):
270
- self.assertEqual(OPERATION_COUNT, 782)
270
+ self.assertEqual(OPERATION_COUNT, 787)
271
271
 
272
272
  def test_deprecated_endpoints_are_not_generated(self):
273
273
  self.assertFalse(hasattr(CrawloraClient(api_key="api_test", base_url=self.base_url).google, "lens"))
@@ -296,7 +296,7 @@ class CrawloraClientTest(unittest.TestCase):
296
296
  recipes_doc = root.joinpath("docs", "recipes.md").read_text()
297
297
 
298
298
  for expected in [
299
- "Total operations: `782`",
299
+ "Total operations: `787`",
300
300
  "`bing-search`",
301
301
  "`GET /bing/search`",
302
302
  "`bing.search`",
File without changes
File without changes
File without changes