getanyapi 0.46.2__tar.gz → 0.48.1__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.46.2 → getanyapi-0.48.1}/PKG-INFO +1 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/pyproject.toml +1 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/__init__.py +3 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/__init__.py +15 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/ahrefs.py +72 -8
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/airbnb.py +62 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/alibaba.py +32 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/amazon.py +62 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/apollo.py +230 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/appstore.py +14 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/bluesky.py +52 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/booking.py +50 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/capterra.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/chatgpt.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/coinmarketcap.py +83 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/company.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/company_enrichment.py +24 -0
- getanyapi-0.48.1/src/getanyapi/platforms/company_identify.py +160 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/company_search.py +42 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/congress.py +14 -0
- getanyapi-0.48.1/src/getanyapi/platforms/contact_enrichment.py +130 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/douyin.py +100 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/ebay.py +88 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/email.py +31 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/email_finding.py +62 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/email_verification.py +30 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/facebook.py +872 -13
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/fiverr.py +11 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/g2.py +23 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/gemini.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/github.py +155 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/glassdoor.py +60 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google.py +85 -4
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google_ads.py +30 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google_finance.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google_shopping.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/hackernews.py +41 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/indeed.py +69 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/instagram.py +801 -82
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/job_search.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/linkedin.py +733 -2
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/maps.py +84 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/mobile_phone.py +12 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/naver.py +10 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/nextdoor.py +22 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/people_search.py +227 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/perplexity.py +15 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/person.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/person_enrichment.py +530 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/pinterest.py +70 -3
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/playstore.py +17 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/polymarket.py +81 -0
- getanyapi-0.48.1/src/getanyapi/platforms/property_records.py +279 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/realtor.py +78 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/reddit.py +264 -17
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/redfin.py +36 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/rednote.py +68 -5
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/sec.py +14 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/semrush.py +16 -4
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/seo.py +252 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/snapchat.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/social.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/spotify.py +152 -3
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/substack.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/technographics.py +6 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/threads.py +64 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/tiktok.py +1554 -204
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/tiktok_shop.py +73 -113
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/tripadvisor.py +68 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/trustpilot.py +38 -4
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/truthsocial.py +115 -2
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/twitter.py +419 -6
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/upwork.py +25 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/walmart.py +24 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/web.py +28 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/weibo.py +78 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/yahoo_finance.py +22 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/yelp.py +8 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/youtube.py +444 -5
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/zhihu.py +76 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/zillow.py +58 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/types.py +16 -1
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_envelope.py +24 -0
- getanyapi-0.48.1/tests/test_not_found_reason.py +49 -0
- getanyapi-0.46.2/src/getanyapi/platforms/dexscreener.py +0 -189
- {getanyapi-0.46.2 → getanyapi-0.48.1}/.gitignore +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/README.md +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_account.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_async_client.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_client.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_errors.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_idempotency.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_pagination.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_transport.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/discovery_types.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/py.typed +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/conftest.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_account.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_client.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_durable_requests.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_errors.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_fixture_roundtrip.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_fixture_sweep.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_pagination.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_transport.py +0 -0
- {getanyapi-0.46.2 → getanyapi-0.48.1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: getanyapi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.48.1
|
|
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
|
|
@@ -44,6 +44,7 @@ from .types import (
|
|
|
44
44
|
HighlightField,
|
|
45
45
|
LaneHealth,
|
|
46
46
|
LinearPricingOffer,
|
|
47
|
+
NotFoundReason,
|
|
47
48
|
Output,
|
|
48
49
|
OutputFound,
|
|
49
50
|
OutputNotFound,
|
|
@@ -54,7 +55,7 @@ from .types import (
|
|
|
54
55
|
unwrap,
|
|
55
56
|
)
|
|
56
57
|
|
|
57
|
-
__version__ = "0.
|
|
58
|
+
__version__ = "0.48.1"
|
|
58
59
|
|
|
59
60
|
__all__ = [
|
|
60
61
|
# clients + top-level functions
|
|
@@ -68,6 +69,7 @@ __all__ = [
|
|
|
68
69
|
"Output",
|
|
69
70
|
"OutputFound",
|
|
70
71
|
"OutputNotFound",
|
|
72
|
+
"NotFoundReason",
|
|
71
73
|
"Balance",
|
|
72
74
|
"AccountProfile",
|
|
73
75
|
"CatalogEntry",
|
|
@@ -30,13 +30,22 @@ REGISTRY: dict[str, tuple[str, str, str]] = {
|
|
|
30
30
|
"CompanyEnrichmentNamespace",
|
|
31
31
|
"AsyncCompanyEnrichmentNamespace",
|
|
32
32
|
),
|
|
33
|
+
"company_identify": (
|
|
34
|
+
"company_identify",
|
|
35
|
+
"CompanyIdentifyNamespace",
|
|
36
|
+
"AsyncCompanyIdentifyNamespace",
|
|
37
|
+
),
|
|
33
38
|
"company_search": (
|
|
34
39
|
"company_search",
|
|
35
40
|
"CompanySearchNamespace",
|
|
36
41
|
"AsyncCompanySearchNamespace",
|
|
37
42
|
),
|
|
38
43
|
"congress": ("congress", "CongressNamespace", "AsyncCongressNamespace"),
|
|
39
|
-
"
|
|
44
|
+
"contact_enrichment": (
|
|
45
|
+
"contact_enrichment",
|
|
46
|
+
"ContactEnrichmentNamespace",
|
|
47
|
+
"AsyncContactEnrichmentNamespace",
|
|
48
|
+
),
|
|
40
49
|
"douyin": ("douyin", "DouyinNamespace", "AsyncDouyinNamespace"),
|
|
41
50
|
"ebay": ("ebay", "EbayNamespace", "AsyncEbayNamespace"),
|
|
42
51
|
"email": ("email", "EmailNamespace", "AsyncEmailNamespace"),
|
|
@@ -96,6 +105,11 @@ REGISTRY: dict[str, tuple[str, str, str]] = {
|
|
|
96
105
|
"pinterest": ("pinterest", "PinterestNamespace", "AsyncPinterestNamespace"),
|
|
97
106
|
"playstore": ("playstore", "PlaystoreNamespace", "AsyncPlaystoreNamespace"),
|
|
98
107
|
"polymarket": ("polymarket", "PolymarketNamespace", "AsyncPolymarketNamespace"),
|
|
108
|
+
"property_records": (
|
|
109
|
+
"property_records",
|
|
110
|
+
"PropertyRecordsNamespace",
|
|
111
|
+
"AsyncPropertyRecordsNamespace",
|
|
112
|
+
),
|
|
99
113
|
"realtor": ("realtor", "RealtorNamespace", "AsyncRealtorNamespace"),
|
|
100
114
|
"reddit": ("reddit", "RedditNamespace", "AsyncRedditNamespace"),
|
|
101
115
|
"redfin": ("redfin", "RedfinNamespace", "AsyncRedfinNamespace"),
|
|
@@ -18,10 +18,16 @@ if TYPE_CHECKING:
|
|
|
18
18
|
class AhrefsBacklinksInput(TypedDict, total=False):
|
|
19
19
|
"""Input for Ahrefs Backlinks."""
|
|
20
20
|
|
|
21
|
+
allowFallbacks: NotRequired[bool]
|
|
22
|
+
"""Optional, default true. When false, only the sources listed in `source` may serve; the request is refused with no charge if none of them can. When true, the listed sources are tried first and any other source may serve after them, at the normal price. Default: true."""
|
|
23
|
+
ignoreSources: NotRequired[list[str]]
|
|
24
|
+
"""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."""
|
|
21
25
|
mode: NotRequired[Literal["exact", "subdomains"]]
|
|
22
26
|
"""Match scope: "exact" for the given URL only, or "subdomains" to include the domain and its subdomains. Default: subdomains."""
|
|
23
27
|
preferLatencyUnderMs: NotRequired[int]
|
|
24
28
|
"""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."""
|
|
29
|
+
source: NotRequired[list[str]]
|
|
30
|
+
"""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`."""
|
|
25
31
|
url: Required[str]
|
|
26
32
|
"""The domain or page URL to find backlinks for (e.g. "ahrefs.com")."""
|
|
27
33
|
|
|
@@ -29,32 +35,50 @@ class AhrefsBacklinksInput(TypedDict, total=False):
|
|
|
29
35
|
class AhrefsKeywordIdeasInput(TypedDict, total=False):
|
|
30
36
|
"""Input for Ahrefs Keyword Ideas."""
|
|
31
37
|
|
|
38
|
+
allowFallbacks: NotRequired[bool]
|
|
39
|
+
"""Optional, default true. When false, only the sources listed in `source` may serve; the request is refused with no charge if none of them can. When true, the listed sources are tried first and any other source may serve after them, at the normal price. Default: true."""
|
|
32
40
|
country: NotRequired[str]
|
|
33
41
|
"""Two-letter country code that scopes the suggestions (e.g. us, gb, de). Default: us."""
|
|
42
|
+
ignoreSources: NotRequired[list[str]]
|
|
43
|
+
"""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."""
|
|
34
44
|
keyword: Required[str]
|
|
35
45
|
"""The seed keyword to expand into related suggestions (e.g. "coffee")."""
|
|
36
46
|
preferLatencyUnderMs: NotRequired[int]
|
|
37
47
|
"""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."""
|
|
48
|
+
source: NotRequired[list[str]]
|
|
49
|
+
"""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`."""
|
|
38
50
|
|
|
39
51
|
|
|
40
52
|
class AhrefsKeywordsInput(TypedDict, total=False):
|
|
41
53
|
"""Input for Ahrefs Keyword Difficulty."""
|
|
42
54
|
|
|
55
|
+
allowFallbacks: NotRequired[bool]
|
|
56
|
+
"""Optional, default true. When false, only the sources listed in `source` may serve; the request is refused with no charge if none of them can. When true, the listed sources are tried first and any other source may serve after them, at the normal price. Default: true."""
|
|
43
57
|
country: NotRequired[str]
|
|
44
58
|
"""Two-letter country code that scopes volume and difficulty (e.g. us, gb, de). Default: us."""
|
|
59
|
+
ignoreSources: NotRequired[list[str]]
|
|
60
|
+
"""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."""
|
|
45
61
|
keyword: Required[str]
|
|
46
62
|
"""The search term to analyze (e.g. "seo tools")."""
|
|
47
63
|
preferLatencyUnderMs: NotRequired[int]
|
|
48
64
|
"""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."""
|
|
65
|
+
source: NotRequired[list[str]]
|
|
66
|
+
"""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`."""
|
|
49
67
|
|
|
50
68
|
|
|
51
69
|
class AhrefsOverviewInput(TypedDict, total=False):
|
|
52
70
|
"""Input for Ahrefs Domain Overview."""
|
|
53
71
|
|
|
72
|
+
allowFallbacks: NotRequired[bool]
|
|
73
|
+
"""Optional, default true. When false, only the sources listed in `source` may serve; the request is refused with no charge if none of them can. When true, the listed sources are tried first and any other source may serve after them, at the normal price. Default: true."""
|
|
74
|
+
ignoreSources: NotRequired[list[str]]
|
|
75
|
+
"""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."""
|
|
54
76
|
mode: NotRequired[Literal["exact", "subdomains"]]
|
|
55
77
|
"""Analysis scope: subdomains covers the whole domain, exact matches only the given URL. Default: subdomains."""
|
|
56
78
|
preferLatencyUnderMs: NotRequired[int]
|
|
57
79
|
"""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."""
|
|
80
|
+
source: NotRequired[list[str]]
|
|
81
|
+
"""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`."""
|
|
58
82
|
url: Required[str]
|
|
59
83
|
"""The domain or page URL to analyze (e.g. ahrefs.com)."""
|
|
60
84
|
|
|
@@ -111,6 +135,10 @@ class AhrefsKeywordIdeasItem(BaseModel):
|
|
|
111
135
|
default=None,
|
|
112
136
|
description="Related keyword suggestions for the seed term. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
|
|
113
137
|
)
|
|
138
|
+
questions: list[AhrefsKeywordIdeasQuestion] | None = Field(
|
|
139
|
+
default=None,
|
|
140
|
+
description="Question-shaped keyword suggestions for the seed term.",
|
|
141
|
+
)
|
|
114
142
|
search_engine: str | None = Field(
|
|
115
143
|
default=None,
|
|
116
144
|
alias="searchEngine",
|
|
@@ -143,6 +171,27 @@ class AhrefsKeywordIdeasIdea(BaseModel):
|
|
|
143
171
|
)
|
|
144
172
|
|
|
145
173
|
|
|
174
|
+
class AhrefsKeywordIdeasQuestion(BaseModel):
|
|
175
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
176
|
+
|
|
177
|
+
difficulty: str | None = Field(
|
|
178
|
+
default=None,
|
|
179
|
+
description="Relative Ahrefs difficulty bucket (a letter such as E, M, or H), not an exact number.",
|
|
180
|
+
)
|
|
181
|
+
keyword: str | None = Field(
|
|
182
|
+
default=None, description="The suggested question keyword."
|
|
183
|
+
)
|
|
184
|
+
updated_utc: float | None = Field(
|
|
185
|
+
default=None,
|
|
186
|
+
alias="updatedUtc",
|
|
187
|
+
description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.",
|
|
188
|
+
)
|
|
189
|
+
volume: str | None = Field(
|
|
190
|
+
default=None,
|
|
191
|
+
description="Relative search-volume bucket (a letter grade), not an exact number.",
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
146
195
|
class AhrefsKeywordsData(BaseModel):
|
|
147
196
|
items: list[AhrefsKeywordsItem] = Field(
|
|
148
197
|
description="Keyword-difficulty records: the difficulty score and the referring-domain gap needed to rank in the top 10. Populated whenever the provider has data for the entity."
|
|
@@ -155,6 +204,11 @@ class AhrefsKeywordsItem(BaseModel):
|
|
|
155
204
|
country: str | None = Field(
|
|
156
205
|
default=None, description="Two-letter country code the metrics are scoped to."
|
|
157
206
|
)
|
|
207
|
+
cpc_usd: float | None = Field(
|
|
208
|
+
default=None,
|
|
209
|
+
alias="cpcUsd",
|
|
210
|
+
description="Ahrefs' estimated paid-search cost per click in USD.",
|
|
211
|
+
)
|
|
158
212
|
difficulty: int | None = Field(
|
|
159
213
|
default=None, description="Ahrefs Keyword Difficulty, 0-100."
|
|
160
214
|
)
|
|
@@ -166,6 +220,16 @@ class AhrefsKeywordsItem(BaseModel):
|
|
|
166
220
|
alias="referringDomainsToRank",
|
|
167
221
|
description="Estimated number of referring domains a page needs to rank in the top 10 for this keyword.",
|
|
168
222
|
)
|
|
223
|
+
search_volume: int | None = Field(
|
|
224
|
+
default=None,
|
|
225
|
+
alias="searchVolume",
|
|
226
|
+
description="Average monthly search volume for the keyword in the requested country.",
|
|
227
|
+
)
|
|
228
|
+
updated_utc: float | None = Field(
|
|
229
|
+
default=None,
|
|
230
|
+
alias="updatedUtc",
|
|
231
|
+
description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.",
|
|
232
|
+
)
|
|
169
233
|
|
|
170
234
|
|
|
171
235
|
class AhrefsOverviewData(BaseModel):
|
|
@@ -226,7 +290,7 @@ class AhrefsNamespace:
|
|
|
226
290
|
Get the referring pages linking to a domain or URL, each with the source
|
|
227
291
|
page, anchor text, linking domain rating, and page title.
|
|
228
292
|
|
|
229
|
-
Price: $0.
|
|
293
|
+
Price: $0.00501 per request plus $0 per result (maximum $0.00501).
|
|
230
294
|
|
|
231
295
|
Example:
|
|
232
296
|
res = client.ahrefs.backlinks(mode="exact", url="ahrefs.com")
|
|
@@ -247,7 +311,7 @@ class AhrefsNamespace:
|
|
|
247
311
|
Get related keyword suggestions for any seed term, each with an Ahrefs
|
|
248
312
|
difficulty and search-volume bucket.
|
|
249
313
|
|
|
250
|
-
Price: $0.
|
|
314
|
+
Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
|
|
251
315
|
|
|
252
316
|
Example:
|
|
253
317
|
res = client.ahrefs.keyword_ideas(country="us", keyword="coffee")
|
|
@@ -269,7 +333,7 @@ class AhrefsNamespace:
|
|
|
269
333
|
difficulty score (0-100) and the number of referring domains a page needs to
|
|
270
334
|
rank in the top 10 - as normalized JSON.
|
|
271
335
|
|
|
272
|
-
Price: $0.
|
|
336
|
+
Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
|
|
273
337
|
|
|
274
338
|
Example:
|
|
275
339
|
res = client.ahrefs.keywords(country="us", keyword="seo tools")
|
|
@@ -290,7 +354,7 @@ class AhrefsNamespace:
|
|
|
290
354
|
Get an SEO authority overview for any domain or URL: Domain Rating, total
|
|
291
355
|
backlinks, and referring domains - as normalized JSON.
|
|
292
356
|
|
|
293
|
-
Price: $0.
|
|
357
|
+
Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
|
|
294
358
|
|
|
295
359
|
Example:
|
|
296
360
|
res = client.ahrefs.overview(mode="subdomains", url="ahrefs.com")
|
|
@@ -318,7 +382,7 @@ class AsyncAhrefsNamespace:
|
|
|
318
382
|
Get the referring pages linking to a domain or URL, each with the source
|
|
319
383
|
page, anchor text, linking domain rating, and page title.
|
|
320
384
|
|
|
321
|
-
Price: $0.
|
|
385
|
+
Price: $0.00501 per request plus $0 per result (maximum $0.00501).
|
|
322
386
|
|
|
323
387
|
Example:
|
|
324
388
|
res = client.ahrefs.backlinks(mode="exact", url="ahrefs.com")
|
|
@@ -339,7 +403,7 @@ class AsyncAhrefsNamespace:
|
|
|
339
403
|
Get related keyword suggestions for any seed term, each with an Ahrefs
|
|
340
404
|
difficulty and search-volume bucket.
|
|
341
405
|
|
|
342
|
-
Price: $0.
|
|
406
|
+
Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
|
|
343
407
|
|
|
344
408
|
Example:
|
|
345
409
|
res = client.ahrefs.keyword_ideas(country="us", keyword="coffee")
|
|
@@ -361,7 +425,7 @@ class AsyncAhrefsNamespace:
|
|
|
361
425
|
difficulty score (0-100) and the number of referring domains a page needs to
|
|
362
426
|
rank in the top 10 - as normalized JSON.
|
|
363
427
|
|
|
364
|
-
Price: $0.
|
|
428
|
+
Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
|
|
365
429
|
|
|
366
430
|
Example:
|
|
367
431
|
res = client.ahrefs.keywords(country="us", keyword="seo tools")
|
|
@@ -382,7 +446,7 @@ class AsyncAhrefsNamespace:
|
|
|
382
446
|
Get an SEO authority overview for any domain or URL: Domain Rating, total
|
|
383
447
|
backlinks, and referring domains - as normalized JSON.
|
|
384
448
|
|
|
385
|
-
Price: $0.
|
|
449
|
+
Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
|
|
386
450
|
|
|
387
451
|
Example:
|
|
388
452
|
res = client.ahrefs.overview(mode="subdomains", url="ahrefs.com")
|
|
@@ -20,6 +20,8 @@ class AirbnbSearchInput(TypedDict, total=False):
|
|
|
20
20
|
|
|
21
21
|
adults: NotRequired[int]
|
|
22
22
|
"""Number of adult guests (e.g. 2). Minimum: 1."""
|
|
23
|
+
allowFallbacks: NotRequired[bool]
|
|
24
|
+
"""Optional, default true. When false, only the sources listed in `source` may serve; the request is refused with no charge if none of them can. When true, the listed sources are tried first and any other source may serve after them, at the normal price. Default: true."""
|
|
23
25
|
checkIn: NotRequired[str]
|
|
24
26
|
"""Check-in date in YYYY-MM-DD format (e.g. 2026-07-01)."""
|
|
25
27
|
checkOut: NotRequired[str]
|
|
@@ -79,6 +81,8 @@ class AirbnbSearchInput(TypedDict, total=False):
|
|
|
79
81
|
]
|
|
80
82
|
]
|
|
81
83
|
"""Currency code for prices (e.g. EUR). Default: USD."""
|
|
84
|
+
ignoreSources: NotRequired[list[str]]
|
|
85
|
+
"""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."""
|
|
82
86
|
infants: NotRequired[int]
|
|
83
87
|
"""Number of infant guests (e.g. 1). Minimum: 0."""
|
|
84
88
|
limit: NotRequired[int]
|
|
@@ -99,6 +103,8 @@ class AirbnbSearchInput(TypedDict, total=False):
|
|
|
99
103
|
"""Maximum search price in the selected currency (e.g. 300). Minimum: 0."""
|
|
100
104
|
priceMin: NotRequired[int]
|
|
101
105
|
"""Minimum search price in the selected currency (e.g. 50). Minimum: 0."""
|
|
106
|
+
source: NotRequired[list[str]]
|
|
107
|
+
"""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`."""
|
|
102
108
|
|
|
103
109
|
|
|
104
110
|
class AirbnbSearchData(BaseModel):
|
|
@@ -110,7 +116,31 @@ class AirbnbSearchData(BaseModel):
|
|
|
110
116
|
class AirbnbSearchItem(BaseModel):
|
|
111
117
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
112
118
|
|
|
119
|
+
description: str | None = Field(
|
|
120
|
+
default=None, description="Listing description written by the host."
|
|
121
|
+
)
|
|
122
|
+
host_avatar_url: str | None = Field(
|
|
123
|
+
default=None, alias="hostAvatarUrl", description="Host profile photo URL."
|
|
124
|
+
)
|
|
125
|
+
host_id: str | None = Field(
|
|
126
|
+
default=None, alias="hostId", description="Airbnb host identifier."
|
|
127
|
+
)
|
|
113
128
|
host_name: str | None = Field(default=None, alias="hostName")
|
|
129
|
+
host_rating: float | None = Field(
|
|
130
|
+
default=None,
|
|
131
|
+
alias="hostRating",
|
|
132
|
+
description="Average rating across the host other listings (0-5).",
|
|
133
|
+
)
|
|
134
|
+
host_reviews_count: int | None = Field(
|
|
135
|
+
default=None,
|
|
136
|
+
alias="hostReviewsCount",
|
|
137
|
+
description="Number of reviews across the host other listings.",
|
|
138
|
+
)
|
|
139
|
+
host_verified: bool | None = Field(
|
|
140
|
+
default=None,
|
|
141
|
+
alias="hostVerified",
|
|
142
|
+
description="Whether Airbnb has verified the host identity.",
|
|
143
|
+
)
|
|
114
144
|
id: str = Field(
|
|
115
145
|
description="Airbnb listing identifier. Populated whenever the provider has data for the entity."
|
|
116
146
|
)
|
|
@@ -118,6 +148,9 @@ class AirbnbSearchItem(BaseModel):
|
|
|
118
148
|
default=None,
|
|
119
149
|
description="Primary listing image URL. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
|
|
120
150
|
)
|
|
151
|
+
images: list[AirbnbSearchImage] | None = Field(
|
|
152
|
+
default=None, description="Listing photos."
|
|
153
|
+
)
|
|
121
154
|
is_available: bool | None = Field(default=None, alias="isAvailable")
|
|
122
155
|
is_superhost: bool | None = Field(default=None, alias="isSuperhost")
|
|
123
156
|
latitude: float | None = None
|
|
@@ -132,6 +165,28 @@ class AirbnbSearchItem(BaseModel):
|
|
|
132
165
|
rating: float | None = Field(
|
|
133
166
|
default=None, description="Guest satisfaction rating (0-5)."
|
|
134
167
|
)
|
|
168
|
+
rating_accuracy: float | None = Field(
|
|
169
|
+
default=None, alias="ratingAccuracy", description="Accuracy sub-rating (0-5)."
|
|
170
|
+
)
|
|
171
|
+
rating_checkin: float | None = Field(
|
|
172
|
+
default=None, alias="ratingCheckin", description="Check-in sub-rating (0-5)."
|
|
173
|
+
)
|
|
174
|
+
rating_cleanliness: float | None = Field(
|
|
175
|
+
default=None,
|
|
176
|
+
alias="ratingCleanliness",
|
|
177
|
+
description="Cleanliness sub-rating (0-5).",
|
|
178
|
+
)
|
|
179
|
+
rating_communication: float | None = Field(
|
|
180
|
+
default=None,
|
|
181
|
+
alias="ratingCommunication",
|
|
182
|
+
description="Communication sub-rating (0-5).",
|
|
183
|
+
)
|
|
184
|
+
rating_location: float | None = Field(
|
|
185
|
+
default=None, alias="ratingLocation", description="Location sub-rating (0-5)."
|
|
186
|
+
)
|
|
187
|
+
rating_value: float | None = Field(
|
|
188
|
+
default=None, alias="ratingValue", description="Value sub-rating (0-5)."
|
|
189
|
+
)
|
|
135
190
|
reviews_count: int | None = Field(default=None, alias="reviewsCount")
|
|
136
191
|
room_type: str | None = Field(default=None, alias="roomType")
|
|
137
192
|
title: str = Field(
|
|
@@ -142,6 +197,13 @@ class AirbnbSearchItem(BaseModel):
|
|
|
142
197
|
)
|
|
143
198
|
|
|
144
199
|
|
|
200
|
+
class AirbnbSearchImage(BaseModel):
|
|
201
|
+
model_config = ConfigDict(extra="allow")
|
|
202
|
+
|
|
203
|
+
caption: str | None = Field(default=None, description="Photo caption.")
|
|
204
|
+
url: str | None = Field(default=None, description="Photo URL.")
|
|
205
|
+
|
|
206
|
+
|
|
145
207
|
class AirbnbNamespace:
|
|
146
208
|
"""Typed methods for this platform. Attached lazily to the client."""
|
|
147
209
|
|
|
@@ -18,12 +18,18 @@ if TYPE_CHECKING:
|
|
|
18
18
|
class AlibabaSearchInput(TypedDict, total=False):
|
|
19
19
|
"""Input for Alibaba Search."""
|
|
20
20
|
|
|
21
|
+
allowFallbacks: NotRequired[bool]
|
|
22
|
+
"""Optional, default true. When false, only the sources listed in `source` may serve; the request is refused with no charge if none of them can. When true, the listed sources are tried first and any other source may serve after them, at the normal price. Default: true."""
|
|
23
|
+
ignoreSources: NotRequired[list[str]]
|
|
24
|
+
"""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."""
|
|
21
25
|
limit: NotRequired[int]
|
|
22
26
|
"""Maximum number of results to return (1-25, default 25). You are billed per result returned, so a lower limit costs less. Range: 1 to 25."""
|
|
23
27
|
preferLatencyUnderMs: NotRequired[int]
|
|
24
28
|
"""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."""
|
|
25
29
|
query: Required[str]
|
|
26
30
|
"""Keywords to search for on Alibaba (e.g. "bluetooth speaker wholesale")."""
|
|
31
|
+
source: NotRequired[list[str]]
|
|
32
|
+
"""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`."""
|
|
27
33
|
|
|
28
34
|
|
|
29
35
|
class AlibabaSearchData(BaseModel):
|
|
@@ -35,21 +41,42 @@ class AlibabaSearchData(BaseModel):
|
|
|
35
41
|
class AlibabaSearchItem(BaseModel):
|
|
36
42
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
37
43
|
|
|
44
|
+
company_id: str | None = Field(
|
|
45
|
+
default=None,
|
|
46
|
+
alias="companyId",
|
|
47
|
+
description="Alibaba supplier company identifier.",
|
|
48
|
+
)
|
|
38
49
|
country_code: str | None = Field(
|
|
39
50
|
default=None,
|
|
40
51
|
alias="countryCode",
|
|
41
52
|
description='Supplier country ISO code, e.g. "CN".',
|
|
42
53
|
)
|
|
54
|
+
currency: str | None = Field(
|
|
55
|
+
default=None, description='Price currency symbol or code, e.g. "$".'
|
|
56
|
+
)
|
|
43
57
|
image: str | None = Field(default=None, description="Primary product image URL.")
|
|
58
|
+
images: list[str] | None = Field(default=None, description="Product image URLs.")
|
|
59
|
+
is_sponsored: bool | None = Field(
|
|
60
|
+
default=None,
|
|
61
|
+
alias="isSponsored",
|
|
62
|
+
description="True when the listing is a paid placement.",
|
|
63
|
+
)
|
|
44
64
|
moq: str | None = Field(
|
|
45
65
|
default=None,
|
|
46
66
|
description='Minimum order quantity text, e.g. "Min. order: 1 piece".',
|
|
47
67
|
)
|
|
68
|
+
price: float | None = Field(
|
|
69
|
+
default=None,
|
|
70
|
+
description="Lowest price in the displayed range, as a numeric amount; 0 when Alibaba shows no price.",
|
|
71
|
+
)
|
|
48
72
|
price_text: str | None = Field(
|
|
49
73
|
default=None,
|
|
50
74
|
alias="priceText",
|
|
51
75
|
description='Price or price range as displayed, e.g. "$40.80-45.80" (Alibaba lists ranges, not a single numeric value).',
|
|
52
76
|
)
|
|
77
|
+
product_id: str | None = Field(
|
|
78
|
+
default=None, alias="productId", description="Alibaba product identifier."
|
|
79
|
+
)
|
|
53
80
|
promotion_price: str | None = Field(
|
|
54
81
|
default=None,
|
|
55
82
|
alias="promotionPrice",
|
|
@@ -67,6 +94,11 @@ class AlibabaSearchItem(BaseModel):
|
|
|
67
94
|
supplier_name: str | None = Field(
|
|
68
95
|
default=None, alias="supplierName", description="Supplier / company name."
|
|
69
96
|
)
|
|
97
|
+
supplier_url: str | None = Field(
|
|
98
|
+
default=None,
|
|
99
|
+
alias="supplierUrl",
|
|
100
|
+
description="Supplier storefront URL on Alibaba.",
|
|
101
|
+
)
|
|
70
102
|
supplier_years: str | None = Field(
|
|
71
103
|
default=None,
|
|
72
104
|
alias="supplierYears",
|