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.
Files changed (106) hide show
  1. {getanyapi-0.46.2 → getanyapi-0.48.1}/PKG-INFO +1 -1
  2. {getanyapi-0.46.2 → getanyapi-0.48.1}/pyproject.toml +1 -1
  3. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/__init__.py +3 -1
  4. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/__init__.py +15 -1
  5. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/ahrefs.py +72 -8
  6. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/airbnb.py +62 -0
  7. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/alibaba.py +32 -0
  8. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/amazon.py +62 -0
  9. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/apollo.py +230 -0
  10. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/appstore.py +14 -1
  11. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/bluesky.py +52 -0
  12. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/booking.py +50 -0
  13. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/capterra.py +6 -0
  14. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/chatgpt.py +6 -0
  15. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/coinmarketcap.py +83 -0
  16. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/company.py +6 -0
  17. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/company_enrichment.py +24 -0
  18. getanyapi-0.48.1/src/getanyapi/platforms/company_identify.py +160 -0
  19. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/company_search.py +42 -0
  20. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/congress.py +14 -0
  21. getanyapi-0.48.1/src/getanyapi/platforms/contact_enrichment.py +130 -0
  22. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/douyin.py +100 -0
  23. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/ebay.py +88 -0
  24. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/email.py +31 -1
  25. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/email_finding.py +62 -0
  26. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/email_verification.py +30 -0
  27. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/facebook.py +872 -13
  28. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/fiverr.py +11 -0
  29. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/g2.py +23 -0
  30. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/gemini.py +6 -0
  31. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/github.py +155 -0
  32. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/glassdoor.py +60 -0
  33. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google.py +85 -4
  34. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google_ads.py +30 -0
  35. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google_finance.py +6 -0
  36. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/google_shopping.py +6 -0
  37. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/hackernews.py +41 -0
  38. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/indeed.py +69 -0
  39. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/instagram.py +801 -82
  40. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/job_search.py +6 -0
  41. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/linkedin.py +733 -2
  42. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/maps.py +84 -0
  43. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/mobile_phone.py +12 -0
  44. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/naver.py +10 -0
  45. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/nextdoor.py +22 -0
  46. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/people_search.py +227 -1
  47. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/perplexity.py +15 -1
  48. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/person.py +6 -0
  49. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/person_enrichment.py +530 -0
  50. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/pinterest.py +70 -3
  51. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/playstore.py +17 -1
  52. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/polymarket.py +81 -0
  53. getanyapi-0.48.1/src/getanyapi/platforms/property_records.py +279 -0
  54. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/realtor.py +78 -0
  55. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/reddit.py +264 -17
  56. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/redfin.py +36 -0
  57. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/rednote.py +68 -5
  58. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/sec.py +14 -0
  59. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/semrush.py +16 -4
  60. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/seo.py +252 -0
  61. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/snapchat.py +6 -0
  62. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/social.py +6 -0
  63. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/spotify.py +152 -3
  64. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/substack.py +6 -0
  65. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/technographics.py +6 -0
  66. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/threads.py +64 -0
  67. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/tiktok.py +1554 -204
  68. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/tiktok_shop.py +73 -113
  69. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/tripadvisor.py +68 -0
  70. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/trustpilot.py +38 -4
  71. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/truthsocial.py +115 -2
  72. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/twitter.py +419 -6
  73. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/upwork.py +25 -0
  74. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/walmart.py +24 -0
  75. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/web.py +28 -0
  76. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/weibo.py +78 -0
  77. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/yahoo_finance.py +22 -0
  78. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/yelp.py +8 -0
  79. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/youtube.py +444 -5
  80. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/zhihu.py +76 -0
  81. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/platforms/zillow.py +58 -0
  82. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/types.py +16 -1
  83. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_envelope.py +24 -0
  84. getanyapi-0.48.1/tests/test_not_found_reason.py +49 -0
  85. getanyapi-0.46.2/src/getanyapi/platforms/dexscreener.py +0 -189
  86. {getanyapi-0.46.2 → getanyapi-0.48.1}/.gitignore +0 -0
  87. {getanyapi-0.46.2 → getanyapi-0.48.1}/README.md +0 -0
  88. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_account.py +0 -0
  89. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_async_client.py +0 -0
  90. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_client.py +0 -0
  91. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_errors.py +0 -0
  92. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_idempotency.py +0 -0
  93. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_pagination.py +0 -0
  94. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/_transport.py +0 -0
  95. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/discovery_types.py +0 -0
  96. {getanyapi-0.46.2 → getanyapi-0.48.1}/src/getanyapi/py.typed +0 -0
  97. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/conftest.py +0 -0
  98. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_account.py +0 -0
  99. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_client.py +0 -0
  100. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_durable_requests.py +0 -0
  101. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_errors.py +0 -0
  102. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_fixture_roundtrip.py +0 -0
  103. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_fixture_sweep.py +0 -0
  104. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_pagination.py +0 -0
  105. {getanyapi-0.46.2 → getanyapi-0.48.1}/tests/test_transport.py +0 -0
  106. {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.46.2
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "getanyapi"
7
- version = "0.46.2"
7
+ version = "0.48.1"
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"
@@ -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.46.2"
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
- "dexscreener": ("dexscreener", "DexscreenerNamespace", "AsyncDexscreenerNamespace"),
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.0215 per request plus $0 per result (maximum $0.0215).
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.00165 per request plus $0.0198 per result (maximum $0.0215).
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.00165 per request plus $0.0198 per result (maximum $0.0215).
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.00165 per request plus $0.0198 per result (maximum $0.0215).
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.0215 per request plus $0 per result (maximum $0.0215).
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.00165 per request plus $0.0198 per result (maximum $0.0215).
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.00165 per request plus $0.0198 per result (maximum $0.0215).
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.00165 per request plus $0.0198 per result (maximum $0.0215).
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",