getanyapi 0.70.2__tar.gz → 0.71.0__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 (106) hide show
  1. {getanyapi-0.70.2 → getanyapi-0.71.0}/PKG-INFO +1 -1
  2. {getanyapi-0.70.2 → getanyapi-0.71.0}/pyproject.toml +1 -1
  3. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/__init__.py +1 -1
  4. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/amazon.py +5 -4
  5. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/ebay.py +10 -4
  6. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/pinterest.py +27 -2
  7. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/tiktok.py +12 -4
  8. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/tiktok_shop.py +5 -2
  9. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/trustpilot.py +11 -13
  10. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/youtube.py +9 -4
  11. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/zillow.py +12 -4
  12. {getanyapi-0.70.2 → getanyapi-0.71.0}/.gitignore +0 -0
  13. {getanyapi-0.70.2 → getanyapi-0.71.0}/README.md +0 -0
  14. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/_account.py +0 -0
  15. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/_async_client.py +0 -0
  16. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/_client.py +0 -0
  17. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/_errors.py +0 -0
  18. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/_idempotency.py +0 -0
  19. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/_pagination.py +0 -0
  20. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/_transport.py +0 -0
  21. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/discovery_types.py +0 -0
  22. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/__init__.py +0 -0
  23. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/ahrefs.py +0 -0
  24. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/airbnb.py +0 -0
  25. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/alibaba.py +0 -0
  26. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/apollo.py +0 -0
  27. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/appstore.py +0 -0
  28. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/bluesky.py +0 -0
  29. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/booking.py +0 -0
  30. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/capterra.py +0 -0
  31. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/chatgpt.py +0 -0
  32. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
  33. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/company.py +0 -0
  34. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
  35. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/company_identify.py +0 -0
  36. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/company_search.py +0 -0
  37. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/congress.py +0 -0
  38. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
  39. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/douyin.py +0 -0
  40. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/email.py +0 -0
  41. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/email_finding.py +0 -0
  42. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/email_verification.py +0 -0
  43. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/facebook.py +0 -0
  44. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/fiverr.py +0 -0
  45. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/g2.py +0 -0
  46. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/gemini.py +0 -0
  47. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/github.py +0 -0
  48. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/glassdoor.py +0 -0
  49. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/google.py +0 -0
  50. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/google_ads.py +0 -0
  51. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/google_finance.py +0 -0
  52. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/google_shopping.py +0 -0
  53. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/hackernews.py +0 -0
  54. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/indeed.py +0 -0
  55. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/instagram.py +0 -0
  56. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/job_search.py +0 -0
  57. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/linkedin.py +0 -0
  58. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/maps.py +0 -0
  59. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
  60. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/naver.py +0 -0
  61. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/nextdoor.py +0 -0
  62. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/people_search.py +0 -0
  63. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/perplexity.py +0 -0
  64. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/person.py +0 -0
  65. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
  66. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/playstore.py +0 -0
  67. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/polymarket.py +0 -0
  68. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/property_records.py +0 -0
  69. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/realtor.py +0 -0
  70. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/reddit.py +0 -0
  71. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/redfin.py +0 -0
  72. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/rednote.py +0 -0
  73. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/sec.py +0 -0
  74. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/semrush.py +0 -0
  75. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/seo.py +0 -0
  76. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/similarweb.py +0 -0
  77. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/snapchat.py +0 -0
  78. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/social.py +0 -0
  79. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/spotify.py +0 -0
  80. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/substack.py +0 -0
  81. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/technographics.py +0 -0
  82. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/threads.py +0 -0
  83. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
  84. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/truthsocial.py +0 -0
  85. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/twitter.py +0 -0
  86. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/upwork.py +0 -0
  87. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/walmart.py +0 -0
  88. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/web.py +0 -0
  89. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/weibo.py +0 -0
  90. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
  91. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/yelp.py +0 -0
  92. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/platforms/zhihu.py +0 -0
  93. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/py.typed +0 -0
  94. {getanyapi-0.70.2 → getanyapi-0.71.0}/src/getanyapi/types.py +0 -0
  95. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/conftest.py +0 -0
  96. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_account.py +0 -0
  97. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_client.py +0 -0
  98. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_durable_requests.py +0 -0
  99. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_envelope.py +0 -0
  100. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_errors.py +0 -0
  101. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_fixture_roundtrip.py +0 -0
  102. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_fixture_sweep.py +0 -0
  103. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_not_found_reason.py +0 -0
  104. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_pagination.py +0 -0
  105. {getanyapi-0.70.2 → getanyapi-0.71.0}/tests/test_transport.py +0 -0
  106. {getanyapi-0.70.2 → getanyapi-0.71.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: getanyapi
3
- Version: 0.70.2
3
+ Version: 0.71.0
4
4
  Summary: Official typed Python SDK for AnyAPI: any API, one wallet, USD, no subscriptions.
5
5
  Project-URL: Homepage, https://getanyapi.com
6
6
  Project-URL: Documentation, https://getanyapi.com/docs
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "getanyapi"
7
- version = "0.70.2"
7
+ version = "0.71.0"
8
8
  description = "Official typed Python SDK for AnyAPI: any API, one wallet, USD, no subscriptions."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -55,7 +55,7 @@ from .types import (
55
55
  unwrap,
56
56
  )
57
57
 
58
- __version__ = "0.70.2"
58
+ __version__ = "0.71.0"
59
59
 
60
60
  __all__ = [
61
61
  # clients + top-level functions
@@ -398,7 +398,7 @@ class AmazonSearchItem(BaseModel):
398
398
  list_price: float | None = Field(
399
399
  default=None,
400
400
  alias="listPrice",
401
- description="Pre-discount list price when on sale, 0 when not discounted, or null when the serving source does not publish it.",
401
+ description="Pre-discount list price when on sale, or null when the product is not discounted or the serving source does not publish it.",
402
402
  )
403
403
  offers_count: int | None = Field(
404
404
  default=None,
@@ -410,15 +410,16 @@ class AmazonSearchItem(BaseModel):
410
410
  )
411
411
  price: float | None = Field(
412
412
  default=None,
413
- description="Current price as a numeric amount; 0 when no offer is available.",
413
+ description="Current price as a numeric amount, or null when the result shows no current price (no offer, or only a secondary offer).",
414
414
  )
415
415
  rating: float | None = Field(
416
- default=None, description="Average star rating, 0-5; 0 when unrated."
416
+ default=None,
417
+ description="Average star rating, 0-5, or null when the product is unrated.",
417
418
  )
418
419
  reviews_count: int | None = Field(
419
420
  default=None,
420
421
  alias="reviewsCount",
421
- description="Number of customer reviews; 0 when none.",
422
+ description="Number of customer reviews, or null when the product has none.",
422
423
  )
423
424
  title: str = Field(
424
425
  description="Product title. Populated whenever the provider has data for the entity."
@@ -466,20 +466,26 @@ class EbaySearchItem(BaseModel):
466
466
  description="eBay item identifier. Populated whenever the provider has data for the entity.",
467
467
  )
468
468
  listing_type: str | None = Field(
469
- default=None, alias="listingType", description="Auction, FixedPrice, etc."
469
+ default=None,
470
+ alias="listingType",
471
+ description="Auction, FixedPrice, etc. Null when the serving source does not publish the listing format.",
470
472
  )
471
473
  price: float | None = Field(default=None, description="Listing price.")
472
474
  seller_feedback_count: float | None = Field(
473
475
  default=None,
474
476
  alias="sellerFeedbackCount",
475
- description="Seller's lifetime feedback count.",
477
+ description="Seller's lifetime feedback count, or null when the serving source does not publish it.",
476
478
  )
477
479
  seller_feedback_percent: float | None = Field(
478
480
  default=None,
479
481
  alias="sellerFeedbackPercent",
480
- description="Seller positive-feedback percentage.",
482
+ description="Seller positive-feedback percentage, or null when the serving source does not publish it.",
483
+ )
484
+ seller_name: str | None = Field(
485
+ default=None,
486
+ alias="sellerName",
487
+ description="Seller username, or null when the serving source does not publish the seller.",
481
488
  )
482
- seller_name: str | None = Field(default=None, alias="sellerName")
483
489
  shipping_cost: str | None = Field(
484
490
  default=None,
485
491
  alias="shippingCost",
@@ -36,6 +36,8 @@ class PinterestSearchInput(TypedDict, total=False):
36
36
  """Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint's lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted. Minimum: 1."""
37
37
  query: Required[str]
38
38
  """Keyword, topic, brand, or theme to search Pinterest for (e.g. mid-century living room)."""
39
+ requireFields: NotRequired[list[Literal["description", "videoUrl"]]]
40
+ """Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `description` or `videoUrl`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be null on a pin that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
39
41
  source: NotRequired[list[str]]
40
42
  """Optional. Source ids to prefer, in order, taken from this endpoint's `lanes[].source.id` in /catalog or /apis. Omit it and the cheapest source serves, with automatic failover. Listed sources are tried first in the order given, then the others, unless `allowFallbacks` is false. A single source with `allowFallbacks` false is served only by that source at its price, quoted and charged exactly, with no failover. The price is that of the dearest source that may serve. An id that does not serve this endpoint is rejected as invalid input with no charge; a listed source that is not serving right now is refused with no charge, so omit `source` to be served by another. On a paginated walk, later pages must include the source that served page one, or omit `source`."""
41
43
  type: NotRequired[Literal["all-pins", "videos", "boards", "profiles"]]
@@ -56,13 +58,36 @@ class PinterestSearchData(BaseModel):
56
58
 
57
59
 
58
60
  class PinterestSearchItem(BaseModel):
59
- model_config = ConfigDict(extra="allow")
61
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
60
62
 
63
+ author: str | None = Field(
64
+ default=None, description="Username (handle) of the account that saved the pin."
65
+ )
66
+ author_name: str | None = Field(
67
+ default=None,
68
+ alias="authorName",
69
+ description="Display name of the account that saved the pin.",
70
+ )
71
+ description: str | None = Field(
72
+ default=None,
73
+ description="The pin's full description text, or null when the source does not provide it.",
74
+ )
61
75
  id: str
62
- title: str
76
+ image: str | None = Field(
77
+ default=None,
78
+ description="URL of the pin's full-size image; for a video pin, its cover image.",
79
+ )
80
+ title: str = Field(
81
+ description="Pin title, or the pin's description when the pin has no title."
82
+ )
63
83
  url: str = Field(
64
84
  description="Populated whenever the provider has data for the entity."
65
85
  )
86
+ video_url: str | None = Field(
87
+ default=None,
88
+ alias="videoUrl",
89
+ description="Streaming (HLS) URL of the pin's video, or null when the pin is not a video or the source does not provide it.",
90
+ )
66
91
 
67
92
 
68
93
  class PinterestNamespace:
@@ -173,6 +173,10 @@ class TiktokHashtagVideosInput(TypedDict, total=False):
173
173
  """Maximum number of results to return (1-20, default 20). Range: 1 to 20."""
174
174
  preferLatencyUnderMs: NotRequired[int]
175
175
  """Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint's lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted. Minimum: 1."""
176
+ requireFields: NotRequired[
177
+ list[Literal["commentCount", "likeCount", "playCount", "shareCount"]]
178
+ ]
179
+ """Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `playCount`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a video that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. A source that returns only a rounded or shortened value for a field does not count as returning it."""
176
180
  source: NotRequired[list[str]]
177
181
  """Optional. Source ids to prefer, in order, taken from this endpoint's `lanes[].source.id` in /catalog or /apis. Omit it and the cheapest source serves, with automatic failover. Listed sources are tried first in the order given, then the others, unless `allowFallbacks` is false. A single source with `allowFallbacks` false is served only by that source at its price, quoted and charged exactly, with no failover. The price is that of the dearest source that may serve. An id that does not serve this endpoint is rejected as invalid input with no charge; a listed source that is not serving right now is refused with no charge, so omit `source` to be served by another. On a paginated walk, later pages must include the source that served page one, or omit `source`."""
178
182
 
@@ -1085,7 +1089,7 @@ class TiktokHashtagVideosItem(BaseModel):
1085
1089
  comment_count: int | None = Field(
1086
1090
  default=None,
1087
1091
  alias="commentCount",
1088
- description="Number of comments on the video.",
1092
+ description="Number of comments on the video. Some sources round large counts (27.7M instead of 27,712,408); name the field in requireFields to be served only by a source that returns the exact count.",
1089
1093
  )
1090
1094
  created_utc: float = Field(
1091
1095
  alias="createdUtc",
@@ -1102,15 +1106,19 @@ class TiktokHashtagVideosItem(BaseModel):
1102
1106
  description="URL of the video's cover/thumbnail image, with tracking query params stripped. Empty when the upstream omits it.",
1103
1107
  )
1104
1108
  like_count: int | None = Field(
1105
- default=None, alias="likeCount", description="Number of likes on the video."
1109
+ default=None,
1110
+ alias="likeCount",
1111
+ description="Number of likes on the video. Some sources round large counts (27.7M instead of 27,712,408); name the field in requireFields to be served only by a source that returns the exact count.",
1106
1112
  )
1107
1113
  play_count: int | None = Field(
1108
1114
  default=None,
1109
1115
  alias="playCount",
1110
- description="Number of views/plays of the video.",
1116
+ description="Number of views/plays of the video. Some sources round large counts (27.7M instead of 27,712,408); name the field in requireFields to be served only by a source that returns the exact count.",
1111
1117
  )
1112
1118
  share_count: int | None = Field(
1113
- default=None, alias="shareCount", description="Number of shares of the video."
1119
+ default=None,
1120
+ alias="shareCount",
1121
+ description="Number of shares of the video. Some sources round large counts (27.7M instead of 27,712,408); name the field in requireFields to be served only by a source that returns the exact count.",
1114
1122
  )
1115
1123
  text: str | None = Field(
1116
1124
  default=None,
@@ -481,14 +481,17 @@ class TiktokShopSearchItem(BaseModel):
481
481
  original_price: float | None = Field(
482
482
  default=None,
483
483
  alias="originalPrice",
484
- description="Pre-discount list price (0 when not on sale).",
484
+ description="Pre-discount list price. Omitted when the product is not on sale.",
485
485
  )
486
486
  price: float | None = Field(default=None, description="Current sale price.")
487
487
  product_id: str = Field(
488
488
  alias="productId",
489
489
  description="TikTok Shop product id. Populated whenever the provider has data for the entity.",
490
490
  )
491
- rating: float | None = Field(default=None, description="Average review score.")
491
+ rating: float | None = Field(
492
+ default=None,
493
+ description="Average review score. Omitted when the product has no rating yet.",
494
+ )
492
495
  review_count: int | None = Field(
493
496
  default=None,
494
497
  alias="reviewCount",
@@ -32,18 +32,6 @@ class TrustpilotReviewsInput(TypedDict, total=False):
32
32
  """Maximum number of results to return (1-200, default 200). Trustpilot serves at most 200 reviews per company. Range: 1 to 200. Default: 200."""
33
33
  preferLatencyUnderMs: NotRequired[int]
34
34
  """Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint's lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted. Minimum: 1."""
35
- requireFields: NotRequired[
36
- list[
37
- Literal[
38
- "author",
39
- "authorCountry",
40
- "avatarUrl",
41
- "language",
42
- "reviewerReviewsCount",
43
- ]
44
- ]
45
- ]
46
- """Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `avatarUrl`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a review that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
47
35
  sortBy: NotRequired[Literal["auto", "relevancy", "recent"]]
48
36
  """Review ordering: auto, relevancy, or recent (e.g. recent). Default: auto."""
49
37
  source: NotRequired[list[str]]
@@ -76,7 +64,7 @@ class TrustpilotReviewsItem(BaseModel):
76
64
  avatar_url: str | None = Field(
77
65
  default=None,
78
66
  alias="avatarUrl",
79
- description="URL of the reviewer's avatar image.",
67
+ description="URL of the reviewer's avatar image, or null when the reviewer has no photo.",
80
68
  )
81
69
  created_utc: float | None = Field(
82
70
  default=None,
@@ -86,6 +74,16 @@ class TrustpilotReviewsItem(BaseModel):
86
74
  language: str | None = Field(
87
75
  default=None, description="Language code of the review text, e.g. en."
88
76
  )
77
+ owner_response_text: str | None = Field(
78
+ default=None,
79
+ alias="ownerResponseText",
80
+ description="The company's public reply to the review. Absent when the company has not replied.",
81
+ )
82
+ owner_response_utc: float | None = Field(
83
+ default=None,
84
+ alias="ownerResponseUtc",
85
+ description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. When the company replied; absent when it has not.",
86
+ )
89
87
  rating: float = Field(description="Star rating (1-5).")
90
88
  reviewer_reviews_count: int | None = Field(
91
89
  default=None,
@@ -288,8 +288,10 @@ class YoutubeVideoInput(TypedDict, total=False):
288
288
  """Optional. Source ids to skip for this request, taken from this endpoint's `lanes[].source.id`. The cheapest remaining source serves and the price is that of the dearest remaining source. An id that does not serve this endpoint, or that is also in `source`, is rejected as invalid input with no charge; skipping every source is rejected the same way."""
289
289
  preferLatencyUnderMs: NotRequired[int]
290
290
  """Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint's lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted. Minimum: 1."""
291
- requireFields: NotRequired[list[Literal["authorAvatarUrl"]]]
292
- """Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `authorAvatarUrl`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a video that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
291
+ requireFields: NotRequired[
292
+ list[Literal["authorAvatarUrl", "comments", "description"]]
293
+ ]
294
+ """Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `authorAvatarUrl`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a video that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. A source that returns only a rounded or shortened value for a field does not count as returning it."""
293
295
  source: NotRequired[list[str]]
294
296
  """Optional. Source ids to prefer, in order, taken from this endpoint's `lanes[].source.id` in /catalog or /apis. Omit it and the cheapest source serves, with automatic failover. Listed sources are tried first in the order given, then the others, unless `allowFallbacks` is false. A single source with `allowFallbacks` false is served only by that source at its price, quoted and charged exactly, with no failover. The price is that of the dearest source that may serve. An id that does not serve this endpoint is rejected as invalid input with no charge; a listed source that is not serving right now is refused with no charge, so omit `source` to be served by another. On a paginated walk, later pages must include the source that served page one, or omit `source`."""
295
297
  url: NotRequired[str]
@@ -1028,13 +1030,16 @@ class YoutubeVideoData(BaseModel):
1028
1030
  channel: str = Field(
1029
1031
  description="Name of the channel that published the video. Populated whenever the provider has data for the entity."
1030
1032
  )
1031
- comments: int = Field(description="Number of comments.")
1033
+ comments: int = Field(
1034
+ description="Number of comments. Some sources round large counts (2.4M instead of 2,457,538); name `comments` in requireFields to be served only by a source that returns the exact count."
1035
+ )
1032
1036
  created_utc: float = Field(
1033
1037
  alias="createdUtc",
1034
1038
  description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Populated whenever the provider has data for the entity.",
1035
1039
  )
1036
1040
  description: str | None = Field(
1037
- default=None, description="Full video description text."
1041
+ default=None,
1042
+ description="Video description text. Some sources return it as YouTube displays it, with long links shortened (https://colab.research.google.com/dri...) and YouTube or social links replaced by their titles; name `description` in requireFields to be served only by a source that returns every link intact.",
1038
1043
  )
1039
1044
  duration_ms: int = Field(
1040
1045
  alias="durationMs", description="Duration of the video in milliseconds."
@@ -348,7 +348,14 @@ class ZillowSearchItem(BaseModel):
348
348
  )
349
349
  longitude: float | None = None
350
350
  lot_size: float | None = Field(
351
- default=None, alias="lotSize", description="Lot size in square feet."
351
+ default=None,
352
+ alias="lotSize",
353
+ description="Lot size as Zillow states it, in the unit named by lotSizeUnit (square feet or acres), or null when the listing has no lot size.",
354
+ )
355
+ lot_size_unit: str | None = Field(
356
+ default=None,
357
+ alias="lotSizeUnit",
358
+ description="Unit of lotSize: sqft or acres. Null when the listing has no lot size or the serving source does not name the unit.",
352
359
  )
353
360
  price: float | None = Field(
354
361
  default=None, description="List price in the listing currency."
@@ -361,7 +368,7 @@ class ZillowSearchItem(BaseModel):
361
368
  rent_zestimate: float | None = Field(
362
369
  default=None,
363
370
  alias="rentZestimate",
364
- description="Zillow estimated monthly rent.",
371
+ description="Zillow estimated monthly rent, or null when Zillow shows no rent Zestimate for the listing.",
365
372
  )
366
373
  state: str | None = Field(default=None, description="Two-letter state code.")
367
374
  status: str | None = Field(
@@ -375,7 +382,7 @@ class ZillowSearchItem(BaseModel):
375
382
  tax_assessed_value: float | None = Field(
376
383
  default=None,
377
384
  alias="taxAssessedValue",
378
- description="Assessed value the county tax authority carries for the property.",
385
+ description="Assessed value the county tax authority carries for the property, or null when none is published.",
379
386
  )
380
387
  url: str = Field(
381
388
  description="Absolute Zillow listing URL. Populated whenever the provider has data for the entity."
@@ -386,7 +393,8 @@ class ZillowSearchItem(BaseModel):
386
393
  description="Year the home was built, or null when the serving source does not publish it.",
387
394
  )
388
395
  zestimate: float | None = Field(
389
- default=None, description="Zillow estimated market value."
396
+ default=None,
397
+ description="Zillow estimated market value, or null when Zillow shows no Zestimate for the listing.",
390
398
  )
391
399
  zipcode: str | None = None
392
400
  zpid: str = Field(
File without changes
File without changes
File without changes
File without changes