crawlora 1.5.0.dev2__tar.gz → 1.6.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.5.0.dev2/crawlora.egg-info → crawlora-1.6.0.dev1}/PKG-INFO +7 -7
  2. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/README.md +6 -6
  3. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/client.py +1 -1
  4. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/client.pyi +446 -0
  5. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/operations.py +127 -5
  6. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1/crawlora.egg-info}/PKG-INFO +7 -7
  7. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/docs/operations.md +11 -5
  8. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/docs/recipes.md +9 -0
  9. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/pyproject.toml +1 -1
  10. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/tests/test_client.py +2 -2
  11. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/LICENSE +0 -0
  12. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/MANIFEST.in +0 -0
  13. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/__init__.py +0 -0
  14. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/_pagination.py +0 -0
  15. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/_transport_sync.py +0 -0
  16. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/async_client.py +0 -0
  17. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora/py.typed +0 -0
  18. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora.egg-info/SOURCES.txt +0 -0
  19. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora.egg-info/dependency_links.txt +0 -0
  20. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora.egg-info/requires.txt +0 -0
  21. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/crawlora.egg-info/top_level.txt +0 -0
  22. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/examples/async_search.py +0 -0
  23. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/examples/bing_search.py +0 -0
  24. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/examples/paginate.py +0 -0
  25. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/examples/youtube_transcript.py +0 -0
  26. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/setup.cfg +0 -0
  27. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/tests/test_async_httpx.py +0 -0
  28. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/tests/test_examples.py +0 -0
  29. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/tests/test_v14_features.py +0 -0
  30. {crawlora-1.5.0.dev2 → crawlora-1.6.0.dev1}/tests/test_v15_features.py +0 -0
  31. {crawlora-1.5.0.dev2 → crawlora-1.6.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.5.0.dev2
3
+ Version: 1.6.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
@@ -27,8 +27,8 @@ Dynamic: license-file
27
27
  # Crawlora Python SDK
28
28
 
29
29
  Python client for the public Crawlora API. Use it to call Crawlora scraping,
30
- search, marketplace, media, maps, finance, and usage endpoints with generated
31
- type stubs for editor and type-checker support.
30
+ search, social, marketplace, media, maps, finance, brand, and usage endpoints
31
+ with generated type stubs for editor and type-checker support.
32
32
 
33
33
  - Runtime: Python 3.10+
34
34
  - Auth: `x-api-key`
@@ -38,7 +38,7 @@ type stubs for editor and type-checker support.
38
38
  ## Install
39
39
 
40
40
  Published on [PyPI](https://pypi.org/project/crawlora/). The current release is a
41
- prerelease (`1.5.0.dev1`), so install it with `--pre`:
41
+ prerelease (`1.5.0.dev3`), so install it with `--pre`:
42
42
 
43
43
  ```sh
44
44
  pip install --pre crawlora
@@ -207,6 +207,6 @@ The import name is `crawlora`:
207
207
  from crawlora import CrawloraClient
208
208
  ```
209
209
 
210
- The future PyPI package target is also `crawlora`, but registry publication is
211
- not enabled yet. Until then, install from an explicit Git beta tag or the
212
- moving `latest` tag as shown above.
210
+ The package is published on [PyPI](https://pypi.org/project/crawlora/) as
211
+ `crawlora` (a prerelease `pip install --pre crawlora`). Git beta tags and the
212
+ moving `latest` tag also work, as shown above.
@@ -1,8 +1,8 @@
1
1
  # Crawlora Python SDK
2
2
 
3
3
  Python client for the public Crawlora API. Use it to call Crawlora scraping,
4
- search, marketplace, media, maps, finance, and usage endpoints with generated
5
- type stubs for editor and type-checker support.
4
+ search, social, marketplace, media, maps, finance, brand, and usage endpoints
5
+ with generated type stubs for editor and type-checker support.
6
6
 
7
7
  - Runtime: Python 3.10+
8
8
  - Auth: `x-api-key`
@@ -12,7 +12,7 @@ type stubs for editor and type-checker support.
12
12
  ## Install
13
13
 
14
14
  Published on [PyPI](https://pypi.org/project/crawlora/). The current release is a
15
- prerelease (`1.5.0.dev1`), so install it with `--pre`:
15
+ prerelease (`1.5.0.dev3`), so install it with `--pre`:
16
16
 
17
17
  ```sh
18
18
  pip install --pre crawlora
@@ -181,6 +181,6 @@ The import name is `crawlora`:
181
181
  from crawlora import CrawloraClient
182
182
  ```
183
183
 
184
- The future PyPI package target is also `crawlora`, but registry publication is
185
- not enabled yet. Until then, install from an explicit Git beta tag or the
186
- moving `latest` tag as shown above.
184
+ The package is published on [PyPI](https://pypi.org/project/crawlora/) as
185
+ `crawlora` (a prerelease `pip install --pre crawlora`). Git beta tags and the
186
+ moving `latest` tag also work, as shown above.
@@ -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.5.0-sdk.2"
23
+ VERSION = "1.6.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)
@@ -968,6 +968,100 @@ ModelBingVideosResponseDoc = TypedDict('ModelBingVideosResponseDoc', {
968
968
  'msg': NotRequired[str],
969
969
  }, total=False)
970
970
 
971
+ ModelBrandAddress = TypedDict('ModelBrandAddress', {
972
+ 'city': NotRequired[str],
973
+ 'country': NotRequired[str],
974
+ 'country_code': NotRequired[str],
975
+ 'postal_code': NotRequired[str],
976
+ 'state_code': NotRequired[str],
977
+ 'state_province': NotRequired[str],
978
+ 'street': NotRequired[str],
979
+ }, total=False)
980
+
981
+ ModelBrandBackdrop = TypedDict('ModelBrandBackdrop', {
982
+ 'colors': NotRequired[list[ModelBrandColor]],
983
+ 'resolution': NotRequired[ModelBrandResolution],
984
+ 'url': NotRequired[str],
985
+ }, total=False)
986
+
987
+ ModelBrandBrandResponse = TypedDict('ModelBrandBrandResponse', {
988
+ 'address': NotRequired[ModelBrandAddress],
989
+ 'backdrops': NotRequired[list[ModelBrandBackdrop]],
990
+ 'colors': NotRequired[list[ModelBrandColor]],
991
+ 'description': NotRequired[str],
992
+ 'domain': NotRequired[str],
993
+ 'email': NotRequired[str],
994
+ 'industries': NotRequired[ModelBrandIndustries],
995
+ 'is_nsfw': NotRequired[bool],
996
+ 'links': NotRequired[ModelBrandLinks],
997
+ 'logos': NotRequired[list[ModelBrandLogo]],
998
+ 'phone': NotRequired[str],
999
+ 'primary_language': NotRequired[str],
1000
+ 'slogan': NotRequired[str],
1001
+ 'socials': NotRequired[list[ModelBrandSocial]],
1002
+ 'source': NotRequired[ModelBrandSourceDetail],
1003
+ 'stock': NotRequired[ModelBrandStock],
1004
+ 'title': NotRequired[str],
1005
+ }, total=False)
1006
+
1007
+ ModelBrandColor = TypedDict('ModelBrandColor', {
1008
+ 'hex': NotRequired[str],
1009
+ 'name': NotRequired[str],
1010
+ }, total=False)
1011
+
1012
+ ModelBrandEic = TypedDict('ModelBrandEic', {
1013
+ 'industry': NotRequired[str],
1014
+ 'subindustry': NotRequired[str],
1015
+ }, total=False)
1016
+
1017
+ ModelBrandIndustries = TypedDict('ModelBrandIndustries', {
1018
+ 'eic': NotRequired[list[ModelBrandEic]],
1019
+ }, total=False)
1020
+
1021
+ ModelBrandLinks = TypedDict('ModelBrandLinks', {
1022
+ 'blog': NotRequired[str],
1023
+ 'careers': NotRequired[str],
1024
+ 'contact': NotRequired[str],
1025
+ 'pricing': NotRequired[str],
1026
+ 'privacy': NotRequired[str],
1027
+ 'terms': NotRequired[str],
1028
+ }, total=False)
1029
+
1030
+ ModelBrandLogo = TypedDict('ModelBrandLogo', {
1031
+ 'colors': NotRequired[list[ModelBrandColor]],
1032
+ 'mode': NotRequired[str],
1033
+ 'resolution': NotRequired[ModelBrandResolution],
1034
+ 'type': NotRequired[str],
1035
+ 'url': NotRequired[str],
1036
+ }, total=False)
1037
+
1038
+ ModelBrandResolution = TypedDict('ModelBrandResolution', {
1039
+ 'aspect_ratio': NotRequired[float],
1040
+ 'height': NotRequired[int],
1041
+ 'width': NotRequired[int],
1042
+ }, total=False)
1043
+
1044
+ ModelBrandSocial = TypedDict('ModelBrandSocial', {
1045
+ 'type': NotRequired[str],
1046
+ 'url': NotRequired[str],
1047
+ }, total=False)
1048
+
1049
+ ModelBrandSourceDetail = TypedDict('ModelBrandSourceDetail', {
1050
+ 'type': NotRequired[str],
1051
+ 'url': NotRequired[str],
1052
+ }, total=False)
1053
+
1054
+ ModelBrandStock = TypedDict('ModelBrandStock', {
1055
+ 'exchange': NotRequired[str],
1056
+ 'ticker': NotRequired[str],
1057
+ }, total=False)
1058
+
1059
+ ModelBrandRetrieveResponseDoc = TypedDict('ModelBrandRetrieveResponseDoc', {
1060
+ 'code': NotRequired[int],
1061
+ 'data': NotRequired[ModelBrandBrandResponse],
1062
+ 'msg': NotRequired[str],
1063
+ }, total=False)
1064
+
971
1065
  ModelBraveDiscussion = TypedDict('ModelBraveDiscussion', {
972
1066
  'age': NotRequired[str],
973
1067
  'comment_count': NotRequired[int],
@@ -4811,6 +4905,114 @@ ModelProducthuntSearchTopicDoc = TypedDict('ModelProducthuntSearchTopicDoc', {
4811
4905
  'topic': NotRequired[dict[str, Any]],
4812
4906
  }, total=False)
4813
4907
 
4908
+ ModelRedditAuthor = TypedDict('ModelRedditAuthor', {
4909
+ 'name': NotRequired[str],
4910
+ 'profile_url': NotRequired[str],
4911
+ }, total=False)
4912
+
4913
+ ModelRedditComment = TypedDict('ModelRedditComment', {
4914
+ 'author': NotRequired[ModelRedditAuthor],
4915
+ 'body': NotRequired[str],
4916
+ 'created': NotRequired[str],
4917
+ 'created_utc': NotRequired[int],
4918
+ 'depth': NotRequired[int],
4919
+ 'id': NotRequired[str],
4920
+ 'name': NotRequired[str],
4921
+ 'parent_id': NotRequired[str],
4922
+ 'permalink': NotRequired[str],
4923
+ 'replies': NotRequired[list[ModelRedditComment]],
4924
+ 'score': NotRequired[int],
4925
+ }, total=False)
4926
+
4927
+ ModelRedditCommentsResponse = TypedDict('ModelRedditCommentsResponse', {
4928
+ 'comments': NotRequired[list[ModelRedditComment]],
4929
+ 'post': NotRequired[ModelRedditPost],
4930
+ 'source': NotRequired[ModelRedditSourceDetail],
4931
+ }, total=False)
4932
+
4933
+ ModelRedditPagination = TypedDict('ModelRedditPagination', {
4934
+ 'after': NotRequired[str],
4935
+ 'limit': NotRequired[int],
4936
+ }, total=False)
4937
+
4938
+ ModelRedditPost = TypedDict('ModelRedditPost', {
4939
+ 'author': NotRequired[ModelRedditAuthor],
4940
+ 'comment_count': NotRequired[int],
4941
+ 'created': NotRequired[str],
4942
+ 'created_utc': NotRequired[int],
4943
+ 'domain': NotRequired[str],
4944
+ 'flair': NotRequired[str],
4945
+ 'id': NotRequired[str],
4946
+ 'is_self': NotRequired[bool],
4947
+ 'is_video': NotRequired[bool],
4948
+ 'locked': NotRequired[bool],
4949
+ 'name': NotRequired[str],
4950
+ 'over_18': NotRequired[bool],
4951
+ 'permalink': NotRequired[str],
4952
+ 'score': NotRequired[int],
4953
+ 'selftext': NotRequired[str],
4954
+ 'source_feed_url': NotRequired[str],
4955
+ 'stickied': NotRequired[bool],
4956
+ 'subreddit': NotRequired[str],
4957
+ 'thumbnail': NotRequired[str],
4958
+ 'title': NotRequired[str],
4959
+ 'upvote_ratio': NotRequired[float],
4960
+ 'url': NotRequired[str],
4961
+ }, total=False)
4962
+
4963
+ ModelRedditPostResponse = TypedDict('ModelRedditPostResponse', {
4964
+ 'post': NotRequired[ModelRedditPost],
4965
+ 'source': NotRequired[ModelRedditSourceDetail],
4966
+ }, total=False)
4967
+
4968
+ ModelRedditSearchResponse = TypedDict('ModelRedditSearchResponse', {
4969
+ 'pagination': NotRequired[ModelRedditPagination],
4970
+ 'posts': NotRequired[list[ModelRedditPost]],
4971
+ 'query': NotRequired[str],
4972
+ 'sort': NotRequired[str],
4973
+ 'source': NotRequired[ModelRedditSourceDetail],
4974
+ 'subreddit': NotRequired[str],
4975
+ 'time': NotRequired[str],
4976
+ }, total=False)
4977
+
4978
+ ModelRedditSourceDetail = TypedDict('ModelRedditSourceDetail', {
4979
+ 'type': NotRequired[str],
4980
+ 'url': NotRequired[str],
4981
+ }, total=False)
4982
+
4983
+ ModelRedditSubredditPostsResponse = TypedDict('ModelRedditSubredditPostsResponse', {
4984
+ 'pagination': NotRequired[ModelRedditPagination],
4985
+ 'posts': NotRequired[list[ModelRedditPost]],
4986
+ 'sort': NotRequired[str],
4987
+ 'source': NotRequired[ModelRedditSourceDetail],
4988
+ 'subreddit': NotRequired[str],
4989
+ 'time': NotRequired[str],
4990
+ }, total=False)
4991
+
4992
+ ModelRedditCommentsResponseDoc = TypedDict('ModelRedditCommentsResponseDoc', {
4993
+ 'code': NotRequired[int],
4994
+ 'data': NotRequired[ModelRedditCommentsResponse],
4995
+ 'msg': NotRequired[str],
4996
+ }, total=False)
4997
+
4998
+ ModelRedditPostResponseDoc = TypedDict('ModelRedditPostResponseDoc', {
4999
+ 'code': NotRequired[int],
5000
+ 'data': NotRequired[ModelRedditPostResponse],
5001
+ 'msg': NotRequired[str],
5002
+ }, total=False)
5003
+
5004
+ ModelRedditSearchResponseDoc = TypedDict('ModelRedditSearchResponseDoc', {
5005
+ 'code': NotRequired[int],
5006
+ 'data': NotRequired[ModelRedditSearchResponse],
5007
+ 'msg': NotRequired[str],
5008
+ }, total=False)
5009
+
5010
+ ModelRedditSubredditPostsResponseDoc = TypedDict('ModelRedditSubredditPostsResponseDoc', {
5011
+ 'code': NotRequired[int],
5012
+ 'data': NotRequired[ModelRedditSubredditPostsResponse],
5013
+ 'msg': NotRequired[str],
5014
+ }, total=False)
5015
+
4814
5016
  ModelReferralsReferralAttributionDoc = TypedDict('ModelReferralsReferralAttributionDoc', {
4815
5017
  'campaign': NotRequired[str],
4816
5018
  'code': NotRequired[str],
@@ -7780,6 +7982,15 @@ ModelYahoofinanceInfoResponse = TypedDict('ModelYahoofinanceInfoResponse', {
7780
7982
  'symbol': NotRequired[str],
7781
7983
  }, total=False)
7782
7984
 
7985
+ ModelYahoofinanceLookupResponse = TypedDict('ModelYahoofinanceLookupResponse', {
7986
+ 'count': NotRequired[int],
7987
+ 'documents': NotRequired[list[dict[str, Any]]],
7988
+ 'query': NotRequired[str],
7989
+ 'start': NotRequired[int],
7990
+ 'total': NotRequired[int],
7991
+ 'type': NotRequired[str],
7992
+ }, total=False)
7993
+
7783
7994
  ModelYahoofinanceMarketStatusResponse = TypedDict('ModelYahoofinanceMarketStatusResponse', {
7784
7995
  'market': NotRequired[str],
7785
7996
  'status': NotRequired[dict[str, Any]],
@@ -7964,6 +8175,12 @@ ModelYahoofinanceIsinResponseDoc = TypedDict('ModelYahoofinanceIsinResponseDoc',
7964
8175
  'msg': NotRequired[str],
7965
8176
  }, total=False)
7966
8177
 
8178
+ ModelYahoofinanceLookupResponseDoc = TypedDict('ModelYahoofinanceLookupResponseDoc', {
8179
+ 'code': NotRequired[int],
8180
+ 'data': NotRequired[ModelYahoofinanceLookupResponse],
8181
+ 'msg': NotRequired[str],
8182
+ }, total=False)
8183
+
7967
8184
  ModelYahoofinanceMarketStatusResponseDoc = TypedDict('ModelYahoofinanceMarketStatusResponseDoc', {
7968
8185
  'code': NotRequired[int],
7969
8186
  'data': NotRequired[ModelYahoofinanceMarketStatusResponse],
@@ -8952,6 +9169,18 @@ BingVideosParams = TypedDict('BingVideosParams', {
8952
9169
  'lang': NotRequired[str],
8953
9170
  }, total=False)
8954
9171
 
9172
+ BrandRetrieveResponse = ModelBrandRetrieveResponseDoc
9173
+ BrandRetrieveParams = TypedDict('BrandRetrieveParams', {
9174
+ '_response_type': NotRequired[ResponseType],
9175
+ '_timeout': NotRequired[float],
9176
+ '_headers': NotRequired[Mapping[str, str]],
9177
+ 'domain': Required[str],
9178
+ 'force_language': NotRequired[str],
9179
+ 'maxSpeed': NotRequired[bool],
9180
+ 'maxAgeMs': NotRequired[int],
9181
+ 'timeoutMS': NotRequired[int],
9182
+ }, total=False)
9183
+
8955
9184
  BraveImagesResponse = ModelBraveImagesResponseDoc
8956
9185
  BraveImagesParams = TypedDict('BraveImagesParams', {
8957
9186
  '_response_type': NotRequired[ResponseType],
@@ -10216,6 +10445,50 @@ MetaReadyParams = TypedDict('MetaReadyParams', {
10216
10445
  '_headers': NotRequired[Mapping[str, str]],
10217
10446
  }, total=False)
10218
10447
 
10448
+ RedditCommentsResponse = ModelRedditCommentsResponseDoc
10449
+ RedditCommentsParams = TypedDict('RedditCommentsParams', {
10450
+ '_response_type': NotRequired[ResponseType],
10451
+ '_timeout': NotRequired[float],
10452
+ '_headers': NotRequired[Mapping[str, str]],
10453
+ 'id': Required[str],
10454
+ 'sort': NotRequired[Literal['confidence', 'top', 'new', 'controversial', 'old', 'qa']],
10455
+ 'limit': NotRequired[int],
10456
+ 'depth': NotRequired[int],
10457
+ }, total=False)
10458
+
10459
+ RedditPostResponse = ModelRedditPostResponseDoc
10460
+ RedditPostParams = TypedDict('RedditPostParams', {
10461
+ '_response_type': NotRequired[ResponseType],
10462
+ '_timeout': NotRequired[float],
10463
+ '_headers': NotRequired[Mapping[str, str]],
10464
+ 'id': Required[str],
10465
+ }, total=False)
10466
+
10467
+ RedditSearchResponse = ModelRedditSearchResponseDoc
10468
+ RedditSearchParams = TypedDict('RedditSearchParams', {
10469
+ '_response_type': NotRequired[ResponseType],
10470
+ '_timeout': NotRequired[float],
10471
+ '_headers': NotRequired[Mapping[str, str]],
10472
+ 'q': Required[str],
10473
+ 'subreddit': NotRequired[str],
10474
+ 'sort': NotRequired[Literal['relevance', 'hot', 'new', 'top', 'comments']],
10475
+ 'time': NotRequired[Literal['hour', 'day', 'week', 'month', 'year', 'all']],
10476
+ 'limit': NotRequired[int],
10477
+ 'after': NotRequired[str],
10478
+ }, total=False)
10479
+
10480
+ RedditSubredditPostsResponse = ModelRedditSubredditPostsResponseDoc
10481
+ RedditSubredditPostsParams = TypedDict('RedditSubredditPostsParams', {
10482
+ '_response_type': NotRequired[ResponseType],
10483
+ '_timeout': NotRequired[float],
10484
+ '_headers': NotRequired[Mapping[str, str]],
10485
+ 'subreddit': Required[str],
10486
+ 'sort': NotRequired[Literal['hot', 'new', 'top', 'rising']],
10487
+ 'time': NotRequired[Literal['hour', 'day', 'week', 'month', 'year', 'all']],
10488
+ 'limit': NotRequired[int],
10489
+ 'after': NotRequired[str],
10490
+ }, total=False)
10491
+
10219
10492
  ReferralsClickBody = ModelReferralsReferralClickRequestDoc
10220
10493
  ReferralsClickResponse = ModelReferralsReferralClickResponseDoc
10221
10494
  ReferralsClickParams = TypedDict('ReferralsClickParams', {
@@ -11458,6 +11731,17 @@ YahooFinanceIndustryParams = TypedDict('YahooFinanceIndustryParams', {
11458
11731
  'key': Required[str],
11459
11732
  }, total=False)
11460
11733
 
11734
+ YahooFinanceLookupResponse = ModelYahoofinanceLookupResponseDoc
11735
+ YahooFinanceLookupParams = TypedDict('YahooFinanceLookupParams', {
11736
+ '_response_type': NotRequired[ResponseType],
11737
+ '_timeout': NotRequired[float],
11738
+ '_headers': NotRequired[Mapping[str, str]],
11739
+ 'query': Required[str],
11740
+ 'type': NotRequired[Literal['all', 'equity', 'etf', 'mutualfund', 'index', 'future', 'currency', 'cryptocurrency']],
11741
+ 'count': NotRequired[int],
11742
+ 'start': NotRequired[int],
11743
+ }, total=False)
11744
+
11461
11745
  YahooFinanceMarketStatusResponse = ModelYahoofinanceMarketStatusResponseDoc
11462
11746
  YahooFinanceMarketStatusParams = TypedDict('YahooFinanceMarketStatusParams', {
11463
11747
  '_response_type': NotRequired[ResponseType],
@@ -11956,6 +12240,9 @@ class BingGroup:
11956
12240
  def suggest(self, **params: Unpack[BingSuggestParams]) -> BingSuggestResponse: ...
11957
12241
  def videos(self, **params: Unpack[BingVideosParams]) -> BingVideosResponse: ...
11958
12242
 
12243
+ class BrandGroup:
12244
+ def retrieve(self, **params: Unpack[BrandRetrieveParams]) -> BrandRetrieveResponse: ...
12245
+
11959
12246
  class BraveGroup:
11960
12247
  def images(self, **params: Unpack[BraveImagesParams]) -> BraveImagesResponse: ...
11961
12248
  def news(self, **params: Unpack[BraveNewsParams]) -> BraveNewsResponse: ...
@@ -12106,6 +12393,12 @@ class ProductHuntGroup:
12106
12393
  def reviews(self, **params: Unpack[ProductHuntReviewsParams]) -> ProductHuntReviewsResponse: ...
12107
12394
  def search(self, **params: Unpack[ProductHuntSearchParams]) -> ProductHuntSearchResponse: ...
12108
12395
 
12396
+ class RedditGroup:
12397
+ def comments(self, **params: Unpack[RedditCommentsParams]) -> RedditCommentsResponse: ...
12398
+ def post(self, **params: Unpack[RedditPostParams]) -> RedditPostResponse: ...
12399
+ def search(self, **params: Unpack[RedditSearchParams]) -> RedditSearchResponse: ...
12400
+ def subreddit_posts(self, **params: Unpack[RedditSubredditPostsParams]) -> RedditSubredditPostsResponse: ...
12401
+
12109
12402
  class ReferralsGroup:
12110
12403
  def click(self, **params: Unpack[ReferralsClickParams]) -> ReferralsClickResponse: ...
12111
12404
  def me(self, **params: Unpack[ReferralsMeParams]) -> ReferralsMeResponse: ...
@@ -12249,6 +12542,7 @@ class YahooFinanceGroup:
12249
12542
  def download(self, **params: Unpack[YahooFinanceDownloadParams]) -> YahooFinanceDownloadResponse: ...
12250
12543
  def industries(self, **params: Unpack[YahooFinanceIndustriesParams]) -> YahooFinanceIndustriesResponse: ...
12251
12544
  def industry(self, **params: Unpack[YahooFinanceIndustryParams]) -> YahooFinanceIndustryResponse: ...
12545
+ def lookup(self, **params: Unpack[YahooFinanceLookupParams]) -> YahooFinanceLookupResponse: ...
12252
12546
  def market_status(self, **params: Unpack[YahooFinanceMarketStatusParams]) -> YahooFinanceMarketStatusResponse: ...
12253
12547
  def market_summary(self, **params: Unpack[YahooFinanceMarketSummaryParams]) -> YahooFinanceMarketSummaryResponse: ...
12254
12548
  def screener_custom(self, **params: Unpack[YahooFinanceScreenerCustomParams]) -> YahooFinanceScreenerCustomResponse: ...
@@ -12339,6 +12633,7 @@ OperationId = Literal[
12339
12633
  'bing-search',
12340
12634
  'bing-suggest',
12341
12635
  'bing-videos',
12636
+ 'brand-retrieve',
12342
12637
  'brave-images',
12343
12638
  'brave-news',
12344
12639
  'brave-search',
@@ -12465,6 +12760,10 @@ OperationId = Literal[
12465
12760
  'producthunt-reviews',
12466
12761
  'producthunt-search',
12467
12762
  'ready',
12763
+ 'reddit-comments',
12764
+ 'reddit-post',
12765
+ 'reddit-search',
12766
+ 'reddit-subreddit-posts',
12468
12767
  'referrals-click',
12469
12768
  'referrals-me',
12470
12769
  'referrals-me-events',
@@ -12585,6 +12884,7 @@ OperationId = Literal[
12585
12884
  'yahoo-finance-download',
12586
12885
  'yahoo-finance-industries',
12587
12886
  'yahoo-finance-industry',
12887
+ 'yahoo-finance-lookup',
12588
12888
  'yahoo-finance-market-status',
12589
12889
  'yahoo-finance-market-summary',
12590
12890
  'yahoo-finance-screener-custom',
@@ -12643,6 +12943,7 @@ class CrawloraClient:
12643
12943
  app_store: AppStoreGroup
12644
12944
  billing: BillingGroup
12645
12945
  bing: BingGroup
12946
+ brand: BrandGroup
12646
12947
  brave: BraveGroup
12647
12948
  coin_gecko: CoinGeckoGroup
12648
12949
  datasets: DatasetsGroup
@@ -12655,6 +12956,7 @@ class CrawloraClient:
12655
12956
  linked_in: LinkedInGroup
12656
12957
  meta: MetaGroup
12657
12958
  product_hunt: ProductHuntGroup
12959
+ reddit: RedditGroup
12658
12960
  referrals: ReferralsGroup
12659
12961
  shop_app: ShopAppGroup
12660
12962
  shopify: ShopifyGroup
@@ -13170,6 +13472,18 @@ class CrawloraClient:
13170
13472
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
13171
13473
  ) -> BingVideosResponse: ...
13172
13474
  @overload
13475
+ def operation(
13476
+ self,
13477
+ operation_id: Literal['brand-retrieve'],
13478
+ params: BrandRetrieveParams,
13479
+ *,
13480
+ response_type: ResponseType = ...,
13481
+ timeout: float | None = ...,
13482
+ headers: Mapping[str, str] | None = ...,
13483
+ retries: int | None = ...,
13484
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
13485
+ ) -> BrandRetrieveResponse: ...
13486
+ @overload
13173
13487
  def operation(
13174
13488
  self,
13175
13489
  operation_id: Literal['brave-images'],
@@ -14682,6 +14996,54 @@ class CrawloraClient:
14682
14996
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
14683
14997
  ) -> MetaReadyResponse: ...
14684
14998
  @overload
14999
+ def operation(
15000
+ self,
15001
+ operation_id: Literal['reddit-comments'],
15002
+ params: RedditCommentsParams,
15003
+ *,
15004
+ response_type: ResponseType = ...,
15005
+ timeout: float | None = ...,
15006
+ headers: Mapping[str, str] | None = ...,
15007
+ retries: int | None = ...,
15008
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
15009
+ ) -> RedditCommentsResponse: ...
15010
+ @overload
15011
+ def operation(
15012
+ self,
15013
+ operation_id: Literal['reddit-post'],
15014
+ params: RedditPostParams,
15015
+ *,
15016
+ response_type: ResponseType = ...,
15017
+ timeout: float | None = ...,
15018
+ headers: Mapping[str, str] | None = ...,
15019
+ retries: int | None = ...,
15020
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
15021
+ ) -> RedditPostResponse: ...
15022
+ @overload
15023
+ def operation(
15024
+ self,
15025
+ operation_id: Literal['reddit-search'],
15026
+ params: RedditSearchParams,
15027
+ *,
15028
+ response_type: ResponseType = ...,
15029
+ timeout: float | None = ...,
15030
+ headers: Mapping[str, str] | None = ...,
15031
+ retries: int | None = ...,
15032
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
15033
+ ) -> RedditSearchResponse: ...
15034
+ @overload
15035
+ def operation(
15036
+ self,
15037
+ operation_id: Literal['reddit-subreddit-posts'],
15038
+ params: RedditSubredditPostsParams,
15039
+ *,
15040
+ response_type: ResponseType = ...,
15041
+ timeout: float | None = ...,
15042
+ headers: Mapping[str, str] | None = ...,
15043
+ retries: int | None = ...,
15044
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
15045
+ ) -> RedditSubredditPostsResponse: ...
15046
+ @overload
14685
15047
  def operation(
14686
15048
  self,
14687
15049
  operation_id: Literal['referrals-click'],
@@ -16122,6 +16484,18 @@ class CrawloraClient:
16122
16484
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
16123
16485
  ) -> YahooFinanceIndustryResponse: ...
16124
16486
  @overload
16487
+ def operation(
16488
+ self,
16489
+ operation_id: Literal['yahoo-finance-lookup'],
16490
+ params: YahooFinanceLookupParams,
16491
+ *,
16492
+ response_type: ResponseType = ...,
16493
+ timeout: float | None = ...,
16494
+ headers: Mapping[str, str] | None = ...,
16495
+ retries: int | None = ...,
16496
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
16497
+ ) -> YahooFinanceLookupResponse: ...
16498
+ @overload
16125
16499
  def operation(
16126
16500
  self,
16127
16501
  operation_id: Literal['yahoo-finance-market-status'],
@@ -17142,6 +17516,18 @@ class CrawloraClient:
17142
17516
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
17143
17517
  ) -> BingVideosResponse: ...
17144
17518
  @overload
17519
+ def request(
17520
+ self,
17521
+ operation_id: Literal['brand-retrieve'],
17522
+ params: BrandRetrieveParams,
17523
+ *,
17524
+ response_type: ResponseType = ...,
17525
+ timeout: float | None = ...,
17526
+ headers: Mapping[str, str] | None = ...,
17527
+ retries: int | None = ...,
17528
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
17529
+ ) -> BrandRetrieveResponse: ...
17530
+ @overload
17145
17531
  def request(
17146
17532
  self,
17147
17533
  operation_id: Literal['brave-images'],
@@ -18654,6 +19040,54 @@ class CrawloraClient:
18654
19040
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
18655
19041
  ) -> MetaReadyResponse: ...
18656
19042
  @overload
19043
+ def request(
19044
+ self,
19045
+ operation_id: Literal['reddit-comments'],
19046
+ params: RedditCommentsParams,
19047
+ *,
19048
+ response_type: ResponseType = ...,
19049
+ timeout: float | None = ...,
19050
+ headers: Mapping[str, str] | None = ...,
19051
+ retries: int | None = ...,
19052
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
19053
+ ) -> RedditCommentsResponse: ...
19054
+ @overload
19055
+ def request(
19056
+ self,
19057
+ operation_id: Literal['reddit-post'],
19058
+ params: RedditPostParams,
19059
+ *,
19060
+ response_type: ResponseType = ...,
19061
+ timeout: float | None = ...,
19062
+ headers: Mapping[str, str] | None = ...,
19063
+ retries: int | None = ...,
19064
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
19065
+ ) -> RedditPostResponse: ...
19066
+ @overload
19067
+ def request(
19068
+ self,
19069
+ operation_id: Literal['reddit-search'],
19070
+ params: RedditSearchParams,
19071
+ *,
19072
+ response_type: ResponseType = ...,
19073
+ timeout: float | None = ...,
19074
+ headers: Mapping[str, str] | None = ...,
19075
+ retries: int | None = ...,
19076
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
19077
+ ) -> RedditSearchResponse: ...
19078
+ @overload
19079
+ def request(
19080
+ self,
19081
+ operation_id: Literal['reddit-subreddit-posts'],
19082
+ params: RedditSubredditPostsParams,
19083
+ *,
19084
+ response_type: ResponseType = ...,
19085
+ timeout: float | None = ...,
19086
+ headers: Mapping[str, str] | None = ...,
19087
+ retries: int | None = ...,
19088
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
19089
+ ) -> RedditSubredditPostsResponse: ...
19090
+ @overload
18657
19091
  def request(
18658
19092
  self,
18659
19093
  operation_id: Literal['referrals-click'],
@@ -20094,6 +20528,18 @@ class CrawloraClient:
20094
20528
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
20095
20529
  ) -> YahooFinanceIndustryResponse: ...
20096
20530
  @overload
20531
+ def request(
20532
+ self,
20533
+ operation_id: Literal['yahoo-finance-lookup'],
20534
+ params: YahooFinanceLookupParams,
20535
+ *,
20536
+ response_type: ResponseType = ...,
20537
+ timeout: float | None = ...,
20538
+ headers: Mapping[str, str] | None = ...,
20539
+ retries: int | None = ...,
20540
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
20541
+ ) -> YahooFinanceLookupResponse: ...
20542
+ @overload
20097
20543
  def request(
20098
20544
  self,
20099
20545
  operation_id: Literal['yahoo-finance-market-status'],
@@ -482,6 +482,21 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
482
482
  {'in': 'query', 'name': 'country', 'type': 'string'},
483
483
  {'in': 'query', 'name': 'lang', 'type': 'string'}],
484
484
  'security': ['ApiKeyAuth']},
485
+ 'brand-retrieve': {'bodyParam': None,
486
+ 'bodyRequired': False,
487
+ 'consumes': ['application/json'],
488
+ 'formParams': [],
489
+ 'id': 'brand-retrieve',
490
+ 'method': 'GET',
491
+ 'path': '/brand/retrieve',
492
+ 'pathParams': [],
493
+ 'produces': ['application/json'],
494
+ 'queryParams': [{'in': 'query', 'name': 'domain', 'required': True, 'type': 'string'},
495
+ {'in': 'query', 'name': 'force_language', 'type': 'string'},
496
+ {'in': 'query', 'name': 'maxSpeed', 'type': 'boolean'},
497
+ {'in': 'query', 'name': 'maxAgeMs', 'type': 'integer'},
498
+ {'in': 'query', 'name': 'timeoutMS', 'type': 'integer'}],
499
+ 'security': ['ApiKeyAuth']},
485
500
  'brave-images': {'bodyParam': None,
486
501
  'bodyRequired': False,
487
502
  'consumes': ['application/json'],
@@ -3767,6 +3782,75 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
3767
3782
  'produces': ['application/json'],
3768
3783
  'queryParams': [],
3769
3784
  'security': []},
3785
+ 'reddit-comments': {'bodyParam': None,
3786
+ 'bodyRequired': False,
3787
+ 'consumes': ['application/json'],
3788
+ 'formParams': [],
3789
+ 'id': 'reddit-comments',
3790
+ 'method': 'GET',
3791
+ 'path': '/reddit/comments/{id}',
3792
+ 'pathParams': ['id'],
3793
+ 'produces': ['application/json'],
3794
+ 'queryParams': [{'enum': ['confidence', 'top', 'new', 'controversial', 'old', 'qa'],
3795
+ 'in': 'query',
3796
+ 'name': 'sort',
3797
+ 'type': 'string'},
3798
+ {'in': 'query', 'name': 'limit', 'type': 'integer'},
3799
+ {'in': 'query', 'name': 'depth', 'type': 'integer'}],
3800
+ 'security': ['ApiKeyAuth']},
3801
+ 'reddit-post': {'bodyParam': None,
3802
+ 'bodyRequired': False,
3803
+ 'consumes': ['application/json'],
3804
+ 'formParams': [],
3805
+ 'id': 'reddit-post',
3806
+ 'method': 'GET',
3807
+ 'path': '/reddit/post/{id}',
3808
+ 'pathParams': ['id'],
3809
+ 'produces': ['application/json'],
3810
+ 'queryParams': [],
3811
+ 'security': ['ApiKeyAuth']},
3812
+ 'reddit-search': {'bodyParam': None,
3813
+ 'bodyRequired': False,
3814
+ 'consumes': ['application/json'],
3815
+ 'formParams': [],
3816
+ 'id': 'reddit-search',
3817
+ 'method': 'GET',
3818
+ 'path': '/reddit/search',
3819
+ 'pathParams': [],
3820
+ 'produces': ['application/json'],
3821
+ 'queryParams': [{'in': 'query', 'name': 'q', 'required': True, 'type': 'string'},
3822
+ {'in': 'query', 'name': 'subreddit', 'type': 'string'},
3823
+ {'enum': ['relevance', 'hot', 'new', 'top', 'comments'],
3824
+ 'in': 'query',
3825
+ 'name': 'sort',
3826
+ 'type': 'string'},
3827
+ {'enum': ['hour', 'day', 'week', 'month', 'year', 'all'],
3828
+ 'in': 'query',
3829
+ 'name': 'time',
3830
+ 'type': 'string'},
3831
+ {'in': 'query', 'name': 'limit', 'type': 'integer'},
3832
+ {'in': 'query', 'name': 'after', 'type': 'string'}],
3833
+ 'security': ['ApiKeyAuth']},
3834
+ 'reddit-subreddit-posts': {'bodyParam': None,
3835
+ 'bodyRequired': False,
3836
+ 'consumes': ['application/json'],
3837
+ 'formParams': [],
3838
+ 'id': 'reddit-subreddit-posts',
3839
+ 'method': 'GET',
3840
+ 'path': '/reddit/subreddit/{subreddit}/posts',
3841
+ 'pathParams': ['subreddit'],
3842
+ 'produces': ['application/json'],
3843
+ 'queryParams': [{'enum': ['hot', 'new', 'top', 'rising'],
3844
+ 'in': 'query',
3845
+ 'name': 'sort',
3846
+ 'type': 'string'},
3847
+ {'enum': ['hour', 'day', 'week', 'month', 'year', 'all'],
3848
+ 'in': 'query',
3849
+ 'name': 'time',
3850
+ 'type': 'string'},
3851
+ {'in': 'query', 'name': 'limit', 'type': 'integer'},
3852
+ {'in': 'query', 'name': 'after', 'type': 'string'}],
3853
+ 'security': ['ApiKeyAuth']},
3770
3854
  'referrals-click': {'bodyParam': 'request',
3771
3855
  'bodyRequired': True,
3772
3856
  'consumes': ['application/json'],
@@ -5366,7 +5450,7 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
5366
5450
  {'in': 'query', 'name': 'limit', 'type': 'integer'},
5367
5451
  {'in': 'query', 'name': 'from', 'type': 'string'},
5368
5452
  {'in': 'query', 'name': 'to', 'type': 'string'}],
5369
- 'security': ['JWTAuth']},
5453
+ 'security': ['ApiKeyAuth']},
5370
5454
  'usage-me-overview': {'bodyParam': None,
5371
5455
  'bodyRequired': False,
5372
5456
  'consumes': ['application/json'],
@@ -5382,7 +5466,7 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
5382
5466
  'type': 'string'},
5383
5467
  {'in': 'query', 'name': 'from', 'type': 'string'},
5384
5468
  {'in': 'query', 'name': 'to', 'type': 'string'}],
5385
- 'security': ['JWTAuth']},
5469
+ 'security': ['ApiKeyAuth']},
5386
5470
  'usage-me-recent-ips': {'bodyParam': None,
5387
5471
  'bodyRequired': False,
5388
5472
  'consumes': ['application/json'],
@@ -5399,7 +5483,7 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
5399
5483
  {'in': 'query', 'name': 'limit', 'type': 'integer'},
5400
5484
  {'in': 'query', 'name': 'from', 'type': 'string'},
5401
5485
  {'in': 'query', 'name': 'to', 'type': 'string'}],
5402
- 'security': ['JWTAuth']},
5486
+ 'security': ['ApiKeyAuth']},
5403
5487
  'usage-me-timeseries': {'bodyParam': None,
5404
5488
  'bodyRequired': False,
5405
5489
  'consumes': ['application/json'],
@@ -5417,7 +5501,7 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
5417
5501
  {'in': 'query', 'name': 'endpoint', 'type': 'string'},
5418
5502
  {'in': 'query', 'name': 'from', 'type': 'string'},
5419
5503
  {'in': 'query', 'name': 'to', 'type': 'string'}],
5420
- 'security': ['JWTAuth']},
5504
+ 'security': ['ApiKeyAuth']},
5421
5505
  'user-me': {'bodyParam': None,
5422
5506
  'bodyRequired': False,
5423
5507
  'consumes': ['application/json'],
@@ -5524,6 +5608,32 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
5524
5608
  'produces': ['application/json'],
5525
5609
  'queryParams': [],
5526
5610
  'security': ['ApiKeyAuth']},
5611
+ 'yahoo-finance-lookup': {'bodyParam': None,
5612
+ 'bodyRequired': False,
5613
+ 'consumes': ['application/json'],
5614
+ 'cursorParams': ['start'],
5615
+ 'formParams': [],
5616
+ 'id': 'yahoo-finance-lookup',
5617
+ 'method': 'GET',
5618
+ 'paginatable': True,
5619
+ 'path': '/yahoo-finance/lookup',
5620
+ 'pathParams': [],
5621
+ 'produces': ['application/json'],
5622
+ 'queryParams': [{'in': 'query', 'name': 'query', 'required': True, 'type': 'string'},
5623
+ {'enum': ['all',
5624
+ 'equity',
5625
+ 'etf',
5626
+ 'mutualfund',
5627
+ 'index',
5628
+ 'future',
5629
+ 'currency',
5630
+ 'cryptocurrency'],
5631
+ 'in': 'query',
5632
+ 'name': 'type',
5633
+ 'type': 'string'},
5634
+ {'in': 'query', 'name': 'count', 'type': 'integer'},
5635
+ {'in': 'query', 'name': 'start', 'type': 'integer'}],
5636
+ 'security': ['ApiKeyAuth']},
5527
5637
  'yahoo-finance-market-status': {'bodyParam': None,
5528
5638
  'bodyRequired': False,
5529
5639
  'consumes': ['application/json'],
@@ -6163,6 +6273,7 @@ GROUPS = {'airbnb': {'room': 'airbnb-room',
6163
6273
  'search': 'bing-search',
6164
6274
  'suggest': 'bing-suggest',
6165
6275
  'videos': 'bing-videos'},
6276
+ 'brand': {'retrieve': 'brand-retrieve'},
6166
6277
  'brave': {'images': 'brave-images',
6167
6278
  'news': 'brave-news',
6168
6279
  'search': 'brave-search',
@@ -6284,6 +6395,10 @@ GROUPS = {'airbnb': {'room': 'airbnb-room',
6284
6395
  'product': 'producthunt-product',
6285
6396
  'reviews': 'producthunt-reviews',
6286
6397
  'search': 'producthunt-search'},
6398
+ 'reddit': {'comments': 'reddit-comments',
6399
+ 'post': 'reddit-post',
6400
+ 'search': 'reddit-search',
6401
+ 'subreddit_posts': 'reddit-subreddit-posts'},
6287
6402
  'referrals': {'click': 'referrals-click', 'me': 'referrals-me', 'me_events': 'referrals-me-events'},
6288
6403
  'shop_app': {'analysis': 'shop-app-analysis',
6289
6404
  'categories': 'shop-app-categories',
@@ -6401,6 +6516,7 @@ GROUPS = {'airbnb': {'room': 'airbnb-room',
6401
6516
  'download': 'yahoo-finance-download',
6402
6517
  'industries': 'yahoo-finance-industries',
6403
6518
  'industry': 'yahoo-finance-industry',
6519
+ 'lookup': 'yahoo-finance-lookup',
6404
6520
  'market_status': 'yahoo-finance-market-status',
6405
6521
  'market_summary': 'yahoo-finance-market-summary',
6406
6522
  'screener': 'yahoo-finance-screener',
@@ -6449,7 +6565,7 @@ GROUPS = {'airbnb': {'room': 'airbnb-room',
6449
6565
  'video': 'youtube-video'},
6450
6566
  'zillow': {'autocomplete': 'zillow-autocomplete', 'property': 'zillow-property', 'search': 'zillow-search'}}
6451
6567
 
6452
- OPERATION_COUNT = 330
6568
+ OPERATION_COUNT = 336
6453
6569
 
6454
6570
  class OperationId:
6455
6571
  AIRBNB_ROOM = 'airbnb-room'
@@ -6487,6 +6603,7 @@ class OperationId:
6487
6603
  BING_SEARCH = 'bing-search'
6488
6604
  BING_SUGGEST = 'bing-suggest'
6489
6605
  BING_VIDEOS = 'bing-videos'
6606
+ BRAND_RETRIEVE = 'brand-retrieve'
6490
6607
  BRAVE_IMAGES = 'brave-images'
6491
6608
  BRAVE_NEWS = 'brave-news'
6492
6609
  BRAVE_SEARCH = 'brave-search'
@@ -6613,6 +6730,10 @@ class OperationId:
6613
6730
  PRODUCT_HUNT_PRODUCT = 'producthunt-product'
6614
6731
  PRODUCT_HUNT_REVIEWS = 'producthunt-reviews'
6615
6732
  PRODUCT_HUNT_SEARCH = 'producthunt-search'
6733
+ REDDIT_COMMENTS = 'reddit-comments'
6734
+ REDDIT_POST = 'reddit-post'
6735
+ REDDIT_SEARCH = 'reddit-search'
6736
+ REDDIT_SUBREDDIT_POSTS = 'reddit-subreddit-posts'
6616
6737
  REFERRALS_CLICK = 'referrals-click'
6617
6738
  REFERRALS_ME = 'referrals-me'
6618
6739
  REFERRALS_ME_EVENTS = 'referrals-me-events'
@@ -6733,6 +6854,7 @@ class OperationId:
6733
6854
  YAHOO_FINANCE_DOWNLOAD = 'yahoo-finance-download'
6734
6855
  YAHOO_FINANCE_INDUSTRIES = 'yahoo-finance-industries'
6735
6856
  YAHOO_FINANCE_INDUSTRY = 'yahoo-finance-industry'
6857
+ YAHOO_FINANCE_LOOKUP = 'yahoo-finance-lookup'
6736
6858
  YAHOO_FINANCE_MARKET_STATUS = 'yahoo-finance-market-status'
6737
6859
  YAHOO_FINANCE_MARKET_SUMMARY = 'yahoo-finance-market-summary'
6738
6860
  YAHOO_FINANCE_SCREENER = 'yahoo-finance-screener'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crawlora
3
- Version: 1.5.0.dev2
3
+ Version: 1.6.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
@@ -27,8 +27,8 @@ Dynamic: license-file
27
27
  # Crawlora Python SDK
28
28
 
29
29
  Python client for the public Crawlora API. Use it to call Crawlora scraping,
30
- search, marketplace, media, maps, finance, and usage endpoints with generated
31
- type stubs for editor and type-checker support.
30
+ search, social, marketplace, media, maps, finance, brand, and usage endpoints
31
+ with generated type stubs for editor and type-checker support.
32
32
 
33
33
  - Runtime: Python 3.10+
34
34
  - Auth: `x-api-key`
@@ -38,7 +38,7 @@ type stubs for editor and type-checker support.
38
38
  ## Install
39
39
 
40
40
  Published on [PyPI](https://pypi.org/project/crawlora/). The current release is a
41
- prerelease (`1.5.0.dev1`), so install it with `--pre`:
41
+ prerelease (`1.5.0.dev3`), so install it with `--pre`:
42
42
 
43
43
  ```sh
44
44
  pip install --pre crawlora
@@ -207,6 +207,6 @@ The import name is `crawlora`:
207
207
  from crawlora import CrawloraClient
208
208
  ```
209
209
 
210
- The future PyPI package target is also `crawlora`, but registry publication is
211
- not enabled yet. Until then, install from an explicit Git beta tag or the
212
- moving `latest` tag as shown above.
210
+ The package is published on [PyPI](https://pypi.org/project/crawlora/) as
211
+ `crawlora` (a prerelease `pip install --pre crawlora`). Git beta tags and the
212
+ moving `latest` tag also work, as shown above.
@@ -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: `330`
5
+ Total operations: `336`
6
6
 
7
7
  | Group | SDK method | Operation ID | HTTP | Params | Auth | Response | Notes |
8
8
  | --- | --- | --- | --- | --- | --- | --- | --- |
@@ -41,6 +41,7 @@ Total operations: `330`
41
41
  | bing | `bing.search` | `bing-search` | `GET /bing/search` | `q` (query str required)<br>`page` (query int)<br>`count` (query int)<br>`country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `BingSearchResponse` | |
42
42
  | bing | `bing.suggest` | `bing-suggest` | `GET /bing/suggest` | `q` (query str required)<br>`count` (query int)<br>`country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `BingSuggestResponse` | |
43
43
  | bing | `bing.videos` | `bing-videos` | `GET /bing/videos` | `q` (query str required)<br>`page` (query int)<br>`count` (query int)<br>`country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `BingVideosResponse` | |
44
+ | brand | `brand.retrieve` | `brand-retrieve` | `GET /brand/retrieve` | `domain` (query str required)<br>`force_language` (query str)<br>`maxSpeed` (query bool)<br>`maxAgeMs` (query int)<br>`timeoutMS` (query int) | `ApiKeyAuth` | `BrandRetrieveResponse` | |
44
45
  | brave | `brave.images` | `brave-images` | `GET /brave/images` | `q` (query str required)<br>`offset` (query int)<br>`count` (query int)<br>`country` (query Literal['all', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'cn', 'de', 'dk', 'es', 'fi', 'fr', 'gb', 'gr', 'hk', 'id', 'in', 'it', 'jp', 'kr', 'mx', 'my', 'nl', 'no', 'nz', 'ph', 'pl', 'pt', 'ru', 'sa', 'se', 'sg', 'tr', 'tw', 'us', 'za'])<br>`lang` (query Literal['de-de', 'en-ca', 'en-gb', 'en-in', 'en-us', 'fi-fi', 'fr-ca', 'fr-fr', 'ja-jp', 'pt-br', 'sq-al', 'sw-ke', 'zh-tw']) | `ApiKeyAuth` | `BraveImagesResponse` | |
45
46
  | brave | `brave.news` | `brave-news` | `GET /brave/news` | `q` (query str required)<br>`offset` (query int)<br>`count` (query int)<br>`country` (query Literal['all', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'cn', 'de', 'dk', 'es', 'fi', 'fr', 'gb', 'gr', 'hk', 'id', 'in', 'it', 'jp', 'kr', 'mx', 'my', 'nl', 'no', 'nz', 'ph', 'pl', 'pt', 'ru', 'sa', 'se', 'sg', 'tr', 'tw', 'us', 'za'])<br>`lang` (query Literal['de-de', 'en-ca', 'en-gb', 'en-in', 'en-us', 'fi-fi', 'fr-ca', 'fr-fr', 'ja-jp', 'pt-br', 'sq-al', 'sw-ke', 'zh-tw'])<br>`time_range` (query Literal['any', 'day', 'week', 'month', 'year', 'custom'])<br>`date_from` (query str)<br>`date_to` (query str) | `ApiKeyAuth` | `BraveNewsResponse` | |
46
47
  | brave | `brave.search` | `brave-search` | `GET /brave/search` | `q` (query str required)<br>`offset` (query int)<br>`country` (query Literal['all', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'cn', 'de', 'dk', 'es', 'fi', 'fr', 'gb', 'gr', 'hk', 'id', 'in', 'it', 'jp', 'kr', 'mx', 'my', 'nl', 'no', 'nz', 'ph', 'pl', 'pt', 'ru', 'sa', 'se', 'sg', 'tr', 'tw', 'us', 'za'])<br>`lang` (query Literal['de-de', 'en-ca', 'en-gb', 'en-in', 'en-us', 'fi-fi', 'fr-ca', 'fr-fr', 'ja-jp', 'pt-br', 'sq-al', 'sw-ke', 'zh-tw'])<br>`time_range` (query Literal['any', 'day', 'week', 'month', 'year', 'custom'])<br>`date_from` (query str)<br>`date_to` (query str) | `ApiKeyAuth` | `BraveSearchResponse` | |
@@ -167,6 +168,10 @@ Total operations: `330`
167
168
  | product_hunt | `product_hunt.makers` | `producthunt-makers` | `GET /producthunt/product/{id}/makers` | `id` (path str required)<br>`cursor` (query str) | `ApiKeyAuth` | `ProductHuntMakersResponse` | |
168
169
  | product_hunt | `product_hunt.reviews` | `producthunt-reviews` | `GET /producthunt/product/{id}/reviews` | `id` (path str required) | `ApiKeyAuth` | `ProductHuntReviewsResponse` | |
169
170
  | product_hunt | `product_hunt.search` | `producthunt-search` | `GET /producthunt/search` | `query` (query str required)<br>`type` (query Literal['product', 'user', 'launch'])<br>`page` (query int)<br>`featured` (query bool)<br>`topics` (query str) | `ApiKeyAuth` | `ProductHuntSearchResponse` | |
171
+ | reddit | `reddit.comments` | `reddit-comments` | `GET /reddit/comments/{id}` | `id` (path str required)<br>`sort` (query Literal['confidence', 'top', 'new', 'controversial', 'old', 'qa'])<br>`limit` (query int)<br>`depth` (query int) | `ApiKeyAuth` | `RedditCommentsResponse` | |
172
+ | reddit | `reddit.post` | `reddit-post` | `GET /reddit/post/{id}` | `id` (path str required) | `ApiKeyAuth` | `RedditPostResponse` | |
173
+ | reddit | `reddit.search` | `reddit-search` | `GET /reddit/search` | `q` (query str required)<br>`subreddit` (query str)<br>`sort` (query Literal['relevance', 'hot', 'new', 'top', 'comments'])<br>`time` (query Literal['hour', 'day', 'week', 'month', 'year', 'all'])<br>`limit` (query int)<br>`after` (query str) | `ApiKeyAuth` | `RedditSearchResponse` | |
174
+ | reddit | `reddit.subreddit_posts` | `reddit-subreddit-posts` | `GET /reddit/subreddit/{subreddit}/posts` | `subreddit` (path str required)<br>`sort` (query Literal['hot', 'new', 'top', 'rising'])<br>`time` (query Literal['hour', 'day', 'week', 'month', 'year', 'all'])<br>`limit` (query int)<br>`after` (query str) | `ApiKeyAuth` | `RedditSubredditPostsResponse` | |
170
175
  | referrals | `referrals.click` | `referrals-click` | `POST /referrals/click` | `request` (body str required) | none | `ReferralsClickResponse` | |
171
176
  | referrals | `referrals.me` | `referrals-me` | `GET /referrals/me` | none | `JWTAuth` | `ReferralsMeResponse` | |
172
177
  | referrals | `referrals.me_events` | `referrals-me-events` | `GET /referrals/me/events` | `limit` (query int) | `JWTAuth` | `ReferralsMeEventsResponse` | |
@@ -274,10 +279,10 @@ Total operations: `330`
274
279
  | trustpilot | `trustpilot.categories` | `trustpilot-categories` | `GET /trustpilot/categories` | none | `ApiKeyAuth` | `TrustpilotCategoriesResponse` | |
275
280
  | trustpilot | `trustpilot.category_search` | `trustpilot-category-search` | `GET /trustpilot/categories/search` | `q` (query str required)<br>`country` (query str)<br>`locale` (query str)<br>`size` (query int) | `ApiKeyAuth` | `TrustpilotCategorySearchResponse` | |
276
281
  | trustpilot | `trustpilot.category` | `trustpilot-category` | `GET /trustpilot/category/{slug}` | `slug` (path str required)<br>`page` (query int) | `ApiKeyAuth` | `TrustpilotCategoryResponse` | |
277
- | usage | `usage.me_endpoints` | `usage-me-endpoints` | `GET /usage/me/endpoints` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`limit` (query int)<br>`from` (query str)<br>`to` (query str) | `JWTAuth` | `UsageMeEndpointsResponse` | |
278
- | usage | `usage.me_overview` | `usage-me-overview` | `GET /usage/me/overview` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`from` (query str)<br>`to` (query str) | `JWTAuth` | `UsageMeOverviewResponse` | |
279
- | usage | `usage.me_recent_ips` | `usage-me-recent-ips` | `GET /usage/me/recent-ips` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`limit` (query int)<br>`from` (query str)<br>`to` (query str) | `JWTAuth` | `UsageMeRecentIpsResponse` | |
280
- | usage | `usage.me_timeseries` | `usage-me-timeseries` | `GET /usage/me/timeseries` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`bucket` (query Literal['hour', 'day'])<br>`endpoint` (query str)<br>`from` (query str)<br>`to` (query str) | `JWTAuth` | `UsageMeTimeseriesResponse` | |
282
+ | usage | `usage.me_endpoints` | `usage-me-endpoints` | `GET /usage/me/endpoints` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`limit` (query int)<br>`from` (query str)<br>`to` (query str) | `ApiKeyAuth` | `UsageMeEndpointsResponse` | |
283
+ | usage | `usage.me_overview` | `usage-me-overview` | `GET /usage/me/overview` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`from` (query str)<br>`to` (query str) | `ApiKeyAuth` | `UsageMeOverviewResponse` | |
284
+ | usage | `usage.me_recent_ips` | `usage-me-recent-ips` | `GET /usage/me/recent-ips` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`limit` (query int)<br>`from` (query str)<br>`to` (query str) | `ApiKeyAuth` | `UsageMeRecentIpsResponse` | |
285
+ | usage | `usage.me_timeseries` | `usage-me-timeseries` | `GET /usage/me/timeseries` | `range` (query Literal['period', 'day', 'week', 'month', 'custom'])<br>`bucket` (query Literal['hour', 'day'])<br>`endpoint` (query str)<br>`from` (query str)<br>`to` (query str) | `ApiKeyAuth` | `UsageMeTimeseriesResponse` | |
281
286
  | user | `user.me` | `user-me` | `GET /user/me` | none | `JWTAuth` | `UserMeResponse` | |
282
287
  | user | `user.me_api_keys` | `user-me-api-keys` | `GET /user/me/api-keys` | none | `JWTAuth` | `UserMeApiKeysResponse` | |
283
288
  | user | `user.me_api_keys_rotate` | `user-me-api-keys-rotate` | `POST /user/me/api-keys/rotate` | none | `JWTAuth` | `UserMeApiKeysRotateResponse` | |
@@ -287,6 +292,7 @@ Total operations: `330`
287
292
  | yahoo_finance | `yahoo_finance.download` | `yahoo-finance-download` | `POST /yahoo-finance/download` | `request` (body str required) | `ApiKeyAuth` | `YahooFinanceDownloadResponse` | |
288
293
  | yahoo_finance | `yahoo_finance.industries` | `yahoo-finance-industries` | `GET /yahoo-finance/industries` | none | `ApiKeyAuth` | `YahooFinanceIndustriesResponse` | |
289
294
  | yahoo_finance | `yahoo_finance.industry` | `yahoo-finance-industry` | `GET /yahoo-finance/industries/{key}` | `key` (path str required) | `ApiKeyAuth` | `YahooFinanceIndustryResponse` | |
295
+ | yahoo_finance | `yahoo_finance.lookup` | `yahoo-finance-lookup` | `GET /yahoo-finance/lookup` | `query` (query str required)<br>`type` (query Literal['all', 'equity', 'etf', 'mutualfund', 'index', 'future', 'currency', 'cryptocurrency'])<br>`count` (query int)<br>`start` (query int) | `ApiKeyAuth` | `YahooFinanceLookupResponse` | |
290
296
  | yahoo_finance | `yahoo_finance.market_status` | `yahoo-finance-market-status` | `GET /yahoo-finance/market/{market}/status` | `market` (path str required) | `ApiKeyAuth` | `YahooFinanceMarketStatusResponse` | |
291
297
  | yahoo_finance | `yahoo_finance.market_summary` | `yahoo-finance-market-summary` | `GET /yahoo-finance/market/{market}/summary` | `market` (path str required) | `ApiKeyAuth` | `YahooFinanceMarketSummaryResponse` | |
292
298
  | yahoo_finance | `yahoo_finance.screener_custom` | `yahoo-finance-screener-custom` | `POST /yahoo-finance/screener` | `request` (body str required) | `ApiKeyAuth` | `YahooFinanceScreenerCustomResponse` | |
@@ -30,6 +30,15 @@ Literal operation ids infer response aliases in type checkers. Use grouped
30
30
  endpoint methods for ordinary app code and dynamic operation calls when your app
31
31
  stores operation ids in configuration, queues, or jobs.
32
32
 
33
+ ## Reddit And Brand
34
+
35
+ Newer platforms are grouped like every other endpoint:
36
+
37
+ ```python
38
+ posts = crawlora.reddit.search(q="python", subreddit="programming")
39
+ brand = crawlora.brand.retrieve(domain="stripe.com")
40
+ ```
41
+
33
42
  ## Retries, Timeouts, And Headers
34
43
 
35
44
  ```python
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "crawlora"
7
- version = "1.5.0.dev2"
7
+ version = "1.6.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, 330)
270
+ self.assertEqual(OPERATION_COUNT, 336)
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: `330`",
299
+ "Total operations: `336`",
300
300
  "`bing-search`",
301
301
  "`GET /bing/search`",
302
302
  "`bing.search`",
File without changes
File without changes
File without changes