getanyapi 0.70.2__tar.gz → 0.72.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.
- {getanyapi-0.70.2 → getanyapi-0.72.0}/PKG-INFO +1 -1
- {getanyapi-0.70.2 → getanyapi-0.72.0}/pyproject.toml +1 -1
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/__init__.py +1 -1
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/amazon.py +5 -4
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/ebay.py +10 -4
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/pinterest.py +27 -2
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/realtor.py +1 -1
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/redfin.py +3 -1
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/tiktok.py +26 -8
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/tiktok_shop.py +19 -6
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/trustpilot.py +11 -13
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/youtube.py +17 -7
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/zillow.py +15 -6
- {getanyapi-0.70.2 → getanyapi-0.72.0}/.gitignore +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/README.md +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/_account.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/_async_client.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/_client.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/_errors.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/_idempotency.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/_pagination.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/_transport.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/discovery_types.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/__init__.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/ahrefs.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/airbnb.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/alibaba.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/apollo.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/appstore.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/bluesky.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/booking.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/capterra.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/chatgpt.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/company.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/company_identify.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/company_search.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/congress.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/douyin.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/email.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/email_finding.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/email_verification.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/facebook.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/fiverr.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/g2.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/gemini.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/github.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/glassdoor.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/google.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/google_ads.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/google_finance.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/google_shopping.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/hackernews.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/indeed.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/instagram.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/job_search.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/linkedin.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/maps.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/naver.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/nextdoor.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/people_search.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/perplexity.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/person.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/playstore.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/polymarket.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/property_records.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/reddit.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/rednote.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/sec.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/semrush.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/seo.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/similarweb.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/snapchat.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/social.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/spotify.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/substack.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/technographics.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/threads.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/truthsocial.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/twitter.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/upwork.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/walmart.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/web.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/weibo.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/yelp.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/platforms/zhihu.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/py.typed +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/src/getanyapi/types.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/conftest.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_account.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_client.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_durable_requests.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_envelope.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_errors.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_fixture_roundtrip.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_fixture_sweep.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_not_found_reason.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_pagination.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/tests/test_transport.py +0 -0
- {getanyapi-0.70.2 → getanyapi-0.72.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: getanyapi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.72.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
|
|
@@ -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,
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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
|
-
|
|
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:
|
|
@@ -217,7 +217,7 @@ class RealtorSearchItem(BaseModel):
|
|
|
217
217
|
tax_assessed_value: float | None = Field(
|
|
218
218
|
default=None,
|
|
219
219
|
alias="taxAssessedValue",
|
|
220
|
-
description="Most recent assessed value from the county tax authority, in US dollars.",
|
|
220
|
+
description="Most recent assessed value from the county tax authority, in US dollars, or null when none is published (common on new construction).",
|
|
221
221
|
)
|
|
222
222
|
title: str | None = Field(
|
|
223
223
|
default=None,
|
|
@@ -221,7 +221,9 @@ class RedfinSearchItem(BaseModel):
|
|
|
221
221
|
default=None, description="Longitude of the home in decimal degrees."
|
|
222
222
|
)
|
|
223
223
|
lot_size: float | None = Field(
|
|
224
|
-
default=None,
|
|
224
|
+
default=None,
|
|
225
|
+
alias="lotSize",
|
|
226
|
+
description="Lot size in square feet, or null when the listing has no lot size (common on condos).",
|
|
225
227
|
)
|
|
226
228
|
mls_id: str | None = Field(
|
|
227
229
|
default=None, alias="mlsId", description="MLS number for the listing."
|
|
@@ -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
|
|
|
@@ -635,6 +639,8 @@ class TiktokVideoInput(TypedDict, total=False):
|
|
|
635
639
|
"""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."""
|
|
636
640
|
preferLatencyUnderMs: NotRequired[int]
|
|
637
641
|
"""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."""
|
|
642
|
+
requireFields: NotRequired[list[Literal["comments", "likes", "shares", "views"]]]
|
|
643
|
+
"""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 `views`, 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."""
|
|
638
644
|
source: NotRequired[list[str]]
|
|
639
645
|
"""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`."""
|
|
640
646
|
url: NotRequired[str]
|
|
@@ -1085,7 +1091,7 @@ class TiktokHashtagVideosItem(BaseModel):
|
|
|
1085
1091
|
comment_count: int | None = Field(
|
|
1086
1092
|
default=None,
|
|
1087
1093
|
alias="commentCount",
|
|
1088
|
-
description="Number of comments on the video.",
|
|
1094
|
+
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
1095
|
)
|
|
1090
1096
|
created_utc: float = Field(
|
|
1091
1097
|
alias="createdUtc",
|
|
@@ -1102,15 +1108,19 @@ class TiktokHashtagVideosItem(BaseModel):
|
|
|
1102
1108
|
description="URL of the video's cover/thumbnail image, with tracking query params stripped. Empty when the upstream omits it.",
|
|
1103
1109
|
)
|
|
1104
1110
|
like_count: int | None = Field(
|
|
1105
|
-
default=None,
|
|
1111
|
+
default=None,
|
|
1112
|
+
alias="likeCount",
|
|
1113
|
+
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
1114
|
)
|
|
1107
1115
|
play_count: int | None = Field(
|
|
1108
1116
|
default=None,
|
|
1109
1117
|
alias="playCount",
|
|
1110
|
-
description="Number of views/plays of the video.",
|
|
1118
|
+
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
1119
|
)
|
|
1112
1120
|
share_count: int | None = Field(
|
|
1113
|
-
default=None,
|
|
1121
|
+
default=None,
|
|
1122
|
+
alias="shareCount",
|
|
1123
|
+
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
1124
|
)
|
|
1115
1125
|
text: str | None = Field(
|
|
1116
1126
|
default=None,
|
|
@@ -2310,7 +2320,9 @@ class TiktokVideoData(BaseModel):
|
|
|
2310
2320
|
caption: str = Field(
|
|
2311
2321
|
description="Populated whenever the provider has data for the entity."
|
|
2312
2322
|
)
|
|
2313
|
-
comments: int
|
|
2323
|
+
comments: int = Field(
|
|
2324
|
+
description="Number of comments. Some sources round large counts (48.5K instead of 48,536); name `comments` in requireFields to be served only by a source that returns the exact count."
|
|
2325
|
+
)
|
|
2314
2326
|
created_utc: float | None = Field(
|
|
2315
2327
|
default=None,
|
|
2316
2328
|
alias="createdUtc",
|
|
@@ -2326,10 +2338,14 @@ class TiktokVideoData(BaseModel):
|
|
|
2326
2338
|
default=None,
|
|
2327
2339
|
description="URL of the video's cover/thumbnail image. A signed, short-lived TikTok CDN URL (typically expires within about a day; query params are load-bearing and kept intact), often served as HEIC rather than JPEG, so fetch it promptly and transcode if you need broad browser support. Absent when the upstream provides no cover.",
|
|
2328
2340
|
)
|
|
2329
|
-
likes: int
|
|
2341
|
+
likes: int = Field(
|
|
2342
|
+
description="Number of likes. Some sources round large counts (2.9M instead of 2,884,604); name `likes` in requireFields to be served only by a source that returns the exact count."
|
|
2343
|
+
)
|
|
2330
2344
|
region: str
|
|
2331
2345
|
saves: int
|
|
2332
|
-
shares: int
|
|
2346
|
+
shares: int = Field(
|
|
2347
|
+
description="Number of shares. Some sources round large counts (35.9K instead of 35,923); name `shares` in requireFields to be served only by a source that returns the exact count."
|
|
2348
|
+
)
|
|
2333
2349
|
url: str | None = Field(
|
|
2334
2350
|
default=None, description="Canonical TikTok URL of the video."
|
|
2335
2351
|
)
|
|
@@ -2338,7 +2354,9 @@ class TiktokVideoData(BaseModel):
|
|
|
2338
2354
|
alias="videoUrl",
|
|
2339
2355
|
description="Playable video URL. Signed and short-lived, so the query string is load-bearing and kept intact.",
|
|
2340
2356
|
)
|
|
2341
|
-
views: int
|
|
2357
|
+
views: int = Field(
|
|
2358
|
+
description="Number of plays. Some sources round large counts (32.7M instead of 32,736,400); name `views` in requireFields to be served only by a source that returns the exact count."
|
|
2359
|
+
)
|
|
2342
2360
|
|
|
2343
2361
|
|
|
2344
2362
|
class TiktokVideoCommentsData(BaseModel):
|
|
@@ -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
|
|
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(
|
|
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",
|
|
@@ -547,13 +550,18 @@ class TiktokShopShopProductsProduct(BaseModel):
|
|
|
547
550
|
|
|
548
551
|
currency: str
|
|
549
552
|
image: str | None = Field(default=None, description="Product image URL.")
|
|
550
|
-
original_price: float = Field(
|
|
553
|
+
original_price: float | None = Field(
|
|
554
|
+
alias="originalPrice",
|
|
555
|
+
description="Pre-discount list price, or null when the product is not on sale.",
|
|
556
|
+
)
|
|
551
557
|
price: float
|
|
552
558
|
product_id: str = Field(
|
|
553
559
|
alias="productId",
|
|
554
560
|
description="Populated whenever the provider has data for the entity.",
|
|
555
561
|
)
|
|
556
|
-
rating: float
|
|
562
|
+
rating: float | None = Field(
|
|
563
|
+
description="Average review score out of 5, or null when the product has no rating yet."
|
|
564
|
+
)
|
|
557
565
|
review_count: int = Field(alias="reviewCount")
|
|
558
566
|
sold_count: int = Field(alias="soldCount")
|
|
559
567
|
title: str = Field(
|
|
@@ -584,13 +592,18 @@ class TiktokShopUserShowcaseProduct(BaseModel):
|
|
|
584
592
|
alias="imageUrl",
|
|
585
593
|
description="Populated whenever the provider has data for the entity.",
|
|
586
594
|
)
|
|
587
|
-
original_price: str = Field(
|
|
595
|
+
original_price: str | None = Field(
|
|
596
|
+
alias="originalPrice",
|
|
597
|
+
description="Pre-discount list price, or null when the product is not on sale.",
|
|
598
|
+
)
|
|
588
599
|
price: str
|
|
589
600
|
product_id: str = Field(
|
|
590
601
|
alias="productId",
|
|
591
602
|
description="Populated whenever the provider has data for the entity.",
|
|
592
603
|
)
|
|
593
|
-
rating: float
|
|
604
|
+
rating: float | None = Field(
|
|
605
|
+
description="Average review score out of 5, or null when the product has no rating yet."
|
|
606
|
+
)
|
|
594
607
|
review_count: int = Field(alias="reviewCount")
|
|
595
608
|
seller_id: str | None = Field(
|
|
596
609
|
default=None,
|
|
@@ -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,
|
|
@@ -148,6 +148,8 @@ class YoutubeChannelVideosInput(TypedDict, total=False):
|
|
|
148
148
|
"""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."""
|
|
149
149
|
preferLatencyUnderMs: NotRequired[int]
|
|
150
150
|
"""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."""
|
|
151
|
+
requireFields: NotRequired[list[Literal["views"]]]
|
|
152
|
+
"""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 `views`, 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. 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. A source that returns only a rounded or shortened value for a field does not count as returning it."""
|
|
151
153
|
sort: NotRequired[Literal["latest", "popular"]]
|
|
152
154
|
"""Sort order."""
|
|
153
155
|
source: NotRequired[list[str]]
|
|
@@ -288,8 +290,10 @@ class YoutubeVideoInput(TypedDict, total=False):
|
|
|
288
290
|
"""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
291
|
preferLatencyUnderMs: NotRequired[int]
|
|
290
292
|
"""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[
|
|
292
|
-
|
|
293
|
+
requireFields: NotRequired[
|
|
294
|
+
list[Literal["authorAvatarUrl", "comments", "description"]]
|
|
295
|
+
]
|
|
296
|
+
"""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
297
|
source: NotRequired[list[str]]
|
|
294
298
|
"""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
299
|
url: NotRequired[str]
|
|
@@ -629,7 +633,9 @@ class YoutubeChannelVideosVideo(BaseModel):
|
|
|
629
633
|
url: str = Field(
|
|
630
634
|
description="Populated whenever the provider has data for the entity."
|
|
631
635
|
)
|
|
632
|
-
views: int
|
|
636
|
+
views: int = Field(
|
|
637
|
+
description="Number of views. Some sources round large counts (6.4M instead of 6,474,059); name `views` in requireFields to be served only by a source that returns the exact count."
|
|
638
|
+
)
|
|
633
639
|
|
|
634
640
|
|
|
635
641
|
class YoutubeCommentRepliesData(BaseModel):
|
|
@@ -931,7 +937,7 @@ class YoutubeSearchShortsShort(BaseModel):
|
|
|
931
937
|
description="Watch URL for the Short. Populated whenever the provider has data for the entity."
|
|
932
938
|
)
|
|
933
939
|
views: int = Field(
|
|
934
|
-
description="View count, or 0 when the source did not publish one. Read viewsAvailable before trusting a 0."
|
|
940
|
+
description="View count, or 0 when the source did not publish one. Read viewsAvailable before trusting a 0. Rounded as YouTube shows it on Shorts (8.9M, 875K), so counts of 1,000 or more are approximate."
|
|
935
941
|
)
|
|
936
942
|
views_available: bool = Field(
|
|
937
943
|
alias="viewsAvailable",
|
|
@@ -971,7 +977,8 @@ class YoutubeTrendingShortsShort(BaseModel):
|
|
|
971
977
|
description="Populated whenever the provider has data for the entity.",
|
|
972
978
|
)
|
|
973
979
|
comments: int | None = Field(
|
|
974
|
-
default=None,
|
|
980
|
+
default=None,
|
|
981
|
+
description="Number of comments on the short. Rounded as YouTube shows it on Shorts (1.2K, 15K), so counts of 1,000 or more are approximate.",
|
|
975
982
|
)
|
|
976
983
|
created_utc: float | None = Field(
|
|
977
984
|
default=None,
|
|
@@ -1028,13 +1035,16 @@ class YoutubeVideoData(BaseModel):
|
|
|
1028
1035
|
channel: str = Field(
|
|
1029
1036
|
description="Name of the channel that published the video. Populated whenever the provider has data for the entity."
|
|
1030
1037
|
)
|
|
1031
|
-
comments: int = Field(
|
|
1038
|
+
comments: int = Field(
|
|
1039
|
+
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."
|
|
1040
|
+
)
|
|
1032
1041
|
created_utc: float = Field(
|
|
1033
1042
|
alias="createdUtc",
|
|
1034
1043
|
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
1044
|
)
|
|
1036
1045
|
description: str | None = Field(
|
|
1037
|
-
default=None,
|
|
1046
|
+
default=None,
|
|
1047
|
+
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
1048
|
)
|
|
1039
1049
|
duration_ms: int = Field(
|
|
1040
1050
|
alias="durationMs", description="Duration of the video in milliseconds."
|
|
@@ -279,7 +279,7 @@ class ZillowPropertyItem(BaseModel):
|
|
|
279
279
|
rent_zestimate: float | None = Field(
|
|
280
280
|
default=None,
|
|
281
281
|
alias="rentZestimate",
|
|
282
|
-
description="Zillow estimated monthly rent.",
|
|
282
|
+
description="Zillow estimated monthly rent, or null when Zillow shows no rent Zestimate for the property.",
|
|
283
283
|
)
|
|
284
284
|
sqft: float | None = Field(
|
|
285
285
|
default=None, description="Interior living area in square feet."
|
|
@@ -294,7 +294,8 @@ class ZillowPropertyItem(BaseModel):
|
|
|
294
294
|
description="Canonical Zillow property detail page URL. Populated whenever the provider has data for the entity."
|
|
295
295
|
)
|
|
296
296
|
zestimate: float | None = Field(
|
|
297
|
-
default=None,
|
|
297
|
+
default=None,
|
|
298
|
+
description="Zillow estimated market value, or null when Zillow shows no Zestimate for the property.",
|
|
298
299
|
)
|
|
299
300
|
zpid: str = Field(
|
|
300
301
|
description="Zillow property id (zpid), the stable identifier for the property. Populated whenever the provider has data for the entity."
|
|
@@ -348,7 +349,14 @@ class ZillowSearchItem(BaseModel):
|
|
|
348
349
|
)
|
|
349
350
|
longitude: float | None = None
|
|
350
351
|
lot_size: float | None = Field(
|
|
351
|
-
default=None,
|
|
352
|
+
default=None,
|
|
353
|
+
alias="lotSize",
|
|
354
|
+
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.",
|
|
355
|
+
)
|
|
356
|
+
lot_size_unit: str | None = Field(
|
|
357
|
+
default=None,
|
|
358
|
+
alias="lotSizeUnit",
|
|
359
|
+
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
360
|
)
|
|
353
361
|
price: float | None = Field(
|
|
354
362
|
default=None, description="List price in the listing currency."
|
|
@@ -361,7 +369,7 @@ class ZillowSearchItem(BaseModel):
|
|
|
361
369
|
rent_zestimate: float | None = Field(
|
|
362
370
|
default=None,
|
|
363
371
|
alias="rentZestimate",
|
|
364
|
-
description="Zillow estimated monthly rent.",
|
|
372
|
+
description="Zillow estimated monthly rent, or null when Zillow shows no rent Zestimate for the listing.",
|
|
365
373
|
)
|
|
366
374
|
state: str | None = Field(default=None, description="Two-letter state code.")
|
|
367
375
|
status: str | None = Field(
|
|
@@ -375,7 +383,7 @@ class ZillowSearchItem(BaseModel):
|
|
|
375
383
|
tax_assessed_value: float | None = Field(
|
|
376
384
|
default=None,
|
|
377
385
|
alias="taxAssessedValue",
|
|
378
|
-
description="Assessed value the county tax authority carries for the property.",
|
|
386
|
+
description="Assessed value the county tax authority carries for the property, or null when none is published.",
|
|
379
387
|
)
|
|
380
388
|
url: str = Field(
|
|
381
389
|
description="Absolute Zillow listing URL. Populated whenever the provider has data for the entity."
|
|
@@ -386,7 +394,8 @@ class ZillowSearchItem(BaseModel):
|
|
|
386
394
|
description="Year the home was built, or null when the serving source does not publish it.",
|
|
387
395
|
)
|
|
388
396
|
zestimate: float | None = Field(
|
|
389
|
-
default=None,
|
|
397
|
+
default=None,
|
|
398
|
+
description="Zillow estimated market value, or null when Zillow shows no Zestimate for the listing.",
|
|
390
399
|
)
|
|
391
400
|
zipcode: str | None = None
|
|
392
401
|
zpid: str = Field(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|