getanyapi 0.93.3__tar.gz → 0.94.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. {getanyapi-0.93.3 → getanyapi-0.94.0}/PKG-INFO +1 -1
  2. {getanyapi-0.93.3 → getanyapi-0.94.0}/pyproject.toml +1 -1
  3. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/__init__.py +1 -1
  4. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/booking.py +2 -2
  5. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/email.py +2 -2
  6. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/google.py +3 -3
  7. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/google_hotels.py +4 -4
  8. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/linkedin.py +2 -2
  9. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/upwork.py +2 -2
  10. getanyapi-0.94.0/src/getanyapi/platforms/walmart.py +484 -0
  11. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/zhihu.py +7 -26
  12. getanyapi-0.93.3/src/getanyapi/platforms/walmart.py +0 -169
  13. {getanyapi-0.93.3 → getanyapi-0.94.0}/.gitignore +0 -0
  14. {getanyapi-0.93.3 → getanyapi-0.94.0}/README.md +0 -0
  15. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/_account.py +0 -0
  16. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/_async_client.py +0 -0
  17. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/_client.py +0 -0
  18. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/_errors.py +0 -0
  19. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/_idempotency.py +0 -0
  20. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/_pagination.py +0 -0
  21. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/_transport.py +0 -0
  22. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/discovery_types.py +0 -0
  23. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/__init__.py +0 -0
  24. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/ahrefs.py +0 -0
  25. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/airbnb.py +0 -0
  26. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/alibaba.py +0 -0
  27. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/amazon.py +0 -0
  28. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/apollo.py +0 -0
  29. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/appstore.py +0 -0
  30. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/bluesky.py +0 -0
  31. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/capterra.py +0 -0
  32. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/chatgpt.py +0 -0
  33. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
  34. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/company.py +0 -0
  35. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
  36. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/company_identify.py +0 -0
  37. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/company_search.py +0 -0
  38. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/congress.py +0 -0
  39. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
  40. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/douyin.py +0 -0
  41. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/ebay.py +0 -0
  42. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/email_finding.py +0 -0
  43. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/email_verification.py +0 -0
  44. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/facebook.py +0 -0
  45. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/fiverr.py +0 -0
  46. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/g2.py +0 -0
  47. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/gemini.py +0 -0
  48. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/github.py +0 -0
  49. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/glassdoor.py +0 -0
  50. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/google_ads.py +0 -0
  51. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/google_finance.py +0 -0
  52. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/google_shopping.py +0 -0
  53. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/hackernews.py +0 -0
  54. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/indeed.py +0 -0
  55. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/instagram.py +0 -0
  56. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/job_search.py +0 -0
  57. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/maps.py +0 -0
  58. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
  59. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/naver.py +0 -0
  60. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/nextdoor.py +0 -0
  61. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/people_search.py +0 -0
  62. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/perplexity.py +0 -0
  63. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/person.py +0 -0
  64. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
  65. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/pexels.py +0 -0
  66. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/pinterest.py +0 -0
  67. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/playstore.py +0 -0
  68. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/polymarket.py +0 -0
  69. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/property_records.py +0 -0
  70. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/realtor.py +0 -0
  71. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/reddit.py +0 -0
  72. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/redfin.py +0 -0
  73. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/rednote.py +0 -0
  74. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/sec.py +0 -0
  75. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/semrush.py +0 -0
  76. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/seo.py +0 -0
  77. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/similarweb.py +0 -0
  78. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/snapchat.py +0 -0
  79. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/social.py +0 -0
  80. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/spotify.py +0 -0
  81. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/substack.py +0 -0
  82. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/technographics.py +0 -0
  83. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/threads.py +0 -0
  84. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/tiktok.py +0 -0
  85. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/tiktok_shop.py +0 -0
  86. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
  87. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/trustpilot.py +0 -0
  88. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/truthsocial.py +0 -0
  89. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/twitter.py +0 -0
  90. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/unsplash.py +0 -0
  91. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/web.py +0 -0
  92. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/weibo.py +0 -0
  93. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
  94. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/yelp.py +0 -0
  95. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/youtube.py +0 -0
  96. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/platforms/zillow.py +0 -0
  97. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/py.typed +0 -0
  98. {getanyapi-0.93.3 → getanyapi-0.94.0}/src/getanyapi/types.py +0 -0
  99. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/conftest.py +0 -0
  100. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_account.py +0 -0
  101. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_client.py +0 -0
  102. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_durable_requests.py +0 -0
  103. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_envelope.py +0 -0
  104. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_errors.py +0 -0
  105. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_fixture_roundtrip.py +0 -0
  106. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_fixture_sweep.py +0 -0
  107. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_not_found_reason.py +0 -0
  108. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_pagination.py +0 -0
  109. {getanyapi-0.93.3 → getanyapi-0.94.0}/tests/test_transport.py +0 -0
  110. {getanyapi-0.93.3 → getanyapi-0.94.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: getanyapi
3
- Version: 0.93.3
3
+ Version: 0.94.0
4
4
  Summary: Official typed Python SDK for AnyAPI: any API, one wallet, USD, no subscriptions.
5
5
  Project-URL: Homepage, https://getanyapi.com
6
6
  Project-URL: Documentation, https://getanyapi.com/docs
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "getanyapi"
7
- version = "0.93.3"
7
+ version = "0.94.0"
8
8
  description = "Official typed Python SDK for AnyAPI: any API, one wallet, USD, no subscriptions."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -55,7 +55,7 @@ from .types import (
55
55
  unwrap,
56
56
  )
57
57
 
58
- __version__ = "0.93.3"
58
+ __version__ = "0.94.0"
59
59
 
60
60
  __all__ = [
61
61
  # clients + top-level functions
@@ -153,7 +153,7 @@ class BookingNamespace:
153
153
  Price: $0.0022 per request plus $0.00495 per result (maximum $0.102).
154
154
 
155
155
  Example:
156
- res = client.booking.search(adults=2, checkIn="2026-11-06", checkOut="2026-11-08", limit=3, query="New York")
156
+ res = client.booking.search(adults=2, checkIn="2026-11-07", checkOut="2026-11-09", limit=3, query="New York")
157
157
  """
158
158
  raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
159
159
  "booking.search", dict(input), options
@@ -182,7 +182,7 @@ class AsyncBookingNamespace:
182
182
  Price: $0.0022 per request plus $0.00495 per result (maximum $0.102).
183
183
 
184
184
  Example:
185
- res = client.booking.search(adults=2, checkIn="2026-11-06", checkOut="2026-11-08", limit=3, query="New York")
185
+ res = client.booking.search(adults=2, checkIn="2026-11-07", checkOut="2026-11-09", limit=3, query="New York")
186
186
  """
187
187
  raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
188
188
  "booking.search", dict(input), options
@@ -121,7 +121,7 @@ class EmailNamespace:
121
121
 
122
122
  Find a person's work email address from their name and company domain.
123
123
 
124
- Price: $0.0308 per request.
124
+ Price: $0.0154 per request.
125
125
 
126
126
  Example:
127
127
  res = client.email.find(person={"domain": "google.com", "firstName": "Damien", "surname": "Neil"})
@@ -169,7 +169,7 @@ class AsyncEmailNamespace:
169
169
 
170
170
  Find a person's work email address from their name and company domain.
171
171
 
172
- Price: $0.0308 per request.
172
+ Price: $0.0154 per request.
173
173
 
174
174
  Example:
175
175
  res = client.email.find(person={"domain": "google.com", "firstName": "Damien", "surname": "Neil"})
@@ -299,7 +299,7 @@ class GoogleAiOverviewData(BaseModel):
299
299
  description="The same answer in Markdown, preserving the headings and lists Google rendered. Populated whenever the provider has data for the entity.",
300
300
  )
301
301
  citations: list[GoogleAiOverviewCitation] = Field(
302
- description="Every source Google listed for this overview, in Google's own order. This is the full list behind the overview, not only the few sources Google renders inline before the list is expanded, so it is routinely longer than what a reader sees at a glance."
302
+ description="Every source Google listed with a usable URL for this overview, in Google's own order. References without a URL are omitted. This is the full list behind the overview, not only the few sources Google renders inline before the list is expanded, so it is routinely longer than what a reader sees at a glance."
303
303
  )
304
304
  language: str | None = Field(
305
305
  default=None,
@@ -852,7 +852,7 @@ class GoogleNamespace:
852
852
  further, or use google.search_100 for up to 100 ranked results in one call,
853
853
  which is cheaper past roughly 20 results.
854
854
 
855
- Price: $0.0004 per request.
855
+ Price: $0.0005 per request.
856
856
 
857
857
  Example:
858
858
  res = client.google.search(gl="us", hl="en", limit=10, query="best coffee maker")
@@ -1141,7 +1141,7 @@ class AsyncGoogleNamespace:
1141
1141
  further, or use google.search_100 for up to 100 ranked results in one call,
1142
1142
  which is cheaper past roughly 20 results.
1143
1143
 
1144
- Price: $0.0004 per request.
1144
+ Price: $0.0005 per request.
1145
1145
 
1146
1146
  Example:
1147
1147
  res = client.google.search(gl="us", hl="en", limit=10, query="best coffee maker")
@@ -695,7 +695,7 @@ class GoogleHotelsNamespace:
695
695
  Price: $0.0015 per request.
696
696
 
697
697
  Example:
698
- res = client.google_hotels.details(checkIn="2026-11-06", checkOut="2026-11-08", country="us", propertyToken="ChcImaG28Zbom8uuARoKL20vMDNncTd2NBAB")
698
+ res = client.google_hotels.details(checkIn="2026-11-07", checkOut="2026-11-09", country="us", propertyToken="ChcImaG28Zbom8uuARoKL20vMDNncTd2NBAB")
699
699
  """
700
700
  raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
701
701
  "google_hotels.details", dict(input), options
@@ -717,7 +717,7 @@ class GoogleHotelsNamespace:
717
717
  Price: $0.0015 per request.
718
718
 
719
719
  Example:
720
- res = client.google_hotels.search(checkIn="2026-11-06", checkOut="2026-11-08", country="us", query="hotels near times square new york")
720
+ res = client.google_hotels.search(checkIn="2026-11-07", checkOut="2026-11-09", country="us", query="hotels near times square new york")
721
721
  """
722
722
  raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
723
723
  "google_hotels.search", dict(input), options
@@ -746,7 +746,7 @@ class AsyncGoogleHotelsNamespace:
746
746
  Price: $0.0015 per request.
747
747
 
748
748
  Example:
749
- res = client.google_hotels.details(checkIn="2026-11-06", checkOut="2026-11-08", country="us", propertyToken="ChcImaG28Zbom8uuARoKL20vMDNncTd2NBAB")
749
+ res = client.google_hotels.details(checkIn="2026-11-07", checkOut="2026-11-09", country="us", propertyToken="ChcImaG28Zbom8uuARoKL20vMDNncTd2NBAB")
750
750
  """
751
751
  raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
752
752
  "google_hotels.details", dict(input), options
@@ -768,7 +768,7 @@ class AsyncGoogleHotelsNamespace:
768
768
  Price: $0.0015 per request.
769
769
 
770
770
  Example:
771
- res = client.google_hotels.search(checkIn="2026-11-06", checkOut="2026-11-08", country="us", query="hotels near times square new york")
771
+ res = client.google_hotels.search(checkIn="2026-11-07", checkOut="2026-11-09", country="us", query="hotels near times square new york")
772
772
  """
773
773
  raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
774
774
  "google_hotels.search", dict(input), options
@@ -65,7 +65,7 @@ class LinkedinAdsSearchInput(TypedDict, total=False):
65
65
  countries: NotRequired[str]
66
66
  """Comma-separated two-letter country codes (e.g. "US,CA,MX")."""
67
67
  endDate: NotRequired[str]
68
- """Search end date in YYYY-MM-DD format."""
68
+ """Search end date in YYYY-MM-DD format. Today or a later date is moved back to yesterday in UTC when your range overlaps LinkedIn's accepted dates."""
69
69
  ignoreSources: NotRequired[list[str]]
70
70
  """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."""
71
71
  keyword: NotRequired[str]
@@ -77,7 +77,7 @@ class LinkedinAdsSearchInput(TypedDict, total=False):
77
77
  source: NotRequired[list[str]]
78
78
  """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`."""
79
79
  startDate: NotRequired[str]
80
- """Search start date in YYYY-MM-DD format."""
80
+ """Search start date in YYYY-MM-DD format. An earlier date is moved up to one year ago in UTC when your range overlaps LinkedIn's accepted dates."""
81
81
 
82
82
 
83
83
  class LinkedinArticleInput(TypedDict, total=False):
@@ -149,7 +149,7 @@ class UpworkNamespace:
149
149
  Search Upwork job postings by keyword, with up to 25 fresh listings per
150
150
  request.
151
151
 
152
- Price: $0.007 per request.
152
+ Price: $0.0011 per request plus $0.0011 per result (maximum $0.0286).
153
153
 
154
154
  Example:
155
155
  res = client.upwork.jobs(jobType="fixed", limit=10, query="web developer")
@@ -174,7 +174,7 @@ class AsyncUpworkNamespace:
174
174
  Search Upwork job postings by keyword, with up to 25 fresh listings per
175
175
  request.
176
176
 
177
- Price: $0.007 per request.
177
+ Price: $0.0011 per request plus $0.0011 per result (maximum $0.0286).
178
178
 
179
179
  Example:
180
180
  res = client.upwork.jobs(jobType="fixed", limit=10, query="web developer")
@@ -0,0 +1,484 @@
1
+ # Generated - do not edit. Regenerate with: pnpm generate
2
+ """Generated namespace module for the walmart platform."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from typing import Literal, TYPE_CHECKING
7
+
8
+ from pydantic import BaseModel, ConfigDict, Field
9
+ from typing_extensions import NotRequired, Required, TypedDict, Unpack
10
+
11
+ from ..types import RequestOptions, RunResult
12
+
13
+ if TYPE_CHECKING:
14
+ from .._async_client import AsyncAnyAPI
15
+ from .._client import AnyAPI
16
+
17
+
18
+ class WalmartProductInput(TypedDict, total=False):
19
+ """Input for Walmart Product."""
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."""
25
+ preferLatencyUnderMs: NotRequired[int]
26
+ """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."""
27
+ requireFields: NotRequired[list[Literal["productId"]]]
28
+ """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 `productId`, 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 product that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
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`."""
31
+ url: Required[str]
32
+ """Walmart product page URL."""
33
+
34
+
35
+ class WalmartReviewsInput(TypedDict, total=False):
36
+ """Input for Walmart Reviews."""
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."""
40
+ ignoreSources: NotRequired[list[str]]
41
+ """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."""
42
+ page: NotRequired[int]
43
+ """1-based page of 10 reviews, Walmart's fixed page size; Walmart serves at most 100 pages. Each page is billed as one request; keep url and sort the same while walking pages. Range: 1 to 100. Default: 1."""
44
+ preferLatencyUnderMs: NotRequired[int]
45
+ """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."""
46
+ requireFields: NotRequired[list[Literal["totalPages"]]]
47
+ """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 `totalPages`, 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. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
48
+ sort: NotRequired[
49
+ Literal["recent", "oldest", "relevancy", "helpful", "rating_high", "rating_low"]
50
+ ]
51
+ """Review order: recent (newest first, the default), oldest, relevancy, helpful, rating_high, or rating_low (e.g. helpful). Default: recent."""
52
+ source: NotRequired[list[str]]
53
+ """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`."""
54
+ url: Required[str]
55
+ """Walmart product page URL (e.g. https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121)."""
56
+
57
+
58
+ class WalmartSearchInput(TypedDict, total=False):
59
+ """Input for Walmart Search."""
60
+
61
+ allowFallbacks: NotRequired[bool]
62
+ """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."""
63
+ facet: NotRequired[str]
64
+ """Optional Walmart facet filter token, e.g. brand:HP to keep only HP products."""
65
+ ignoreSources: NotRequired[list[str]]
66
+ """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."""
67
+ maxPrice: NotRequired[float]
68
+ """Optional maximum product price in USD. Minimum: 0."""
69
+ minPrice: NotRequired[float]
70
+ """Optional minimum product price in USD. Minimum: 0."""
71
+ page: NotRequired[int]
72
+ """1-based results page of about 40 to 60 products; Walmart serves no products past page 10. Each page is billed as one request. Walmart re-ranks between requests, so consecutive pages can repeat a product: deduplicate on itemId. Range: 1 to 10. Default: 1."""
73
+ preferLatencyUnderMs: NotRequired[int]
74
+ """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."""
75
+ query: Required[str]
76
+ """Search keywords, e.g. "airpods" or "paper towels"."""
77
+ requireFields: NotRequired[list[Literal["totalPages"]]]
78
+ """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 `totalPages`, 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. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
79
+ sort: NotRequired[
80
+ Literal[
81
+ "best_match", "best_seller", "price_low", "price_high", "rating_high", "new"
82
+ ]
83
+ ]
84
+ """Result sort order; omit for Walmart's Best Match (e.g. price_low sorts by lowest price first)."""
85
+ source: NotRequired[list[str]]
86
+ """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`."""
87
+
88
+
89
+ class WalmartProductData(BaseModel):
90
+ items: list[WalmartProductItem] = Field(
91
+ description="Product detail records (one per requested product URL). Populated whenever the provider has data for the entity."
92
+ )
93
+
94
+
95
+ class WalmartProductItem(BaseModel):
96
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
97
+
98
+ availability: str | None = Field(
99
+ default=None, description='Stock status, e.g. "IN_STOCK".'
100
+ )
101
+ brand: str | None = Field(
102
+ default=None, description="Brand name; empty when not reported."
103
+ )
104
+ description: str | None = Field(
105
+ default=None,
106
+ description="Short product description; empty when the listing has none.",
107
+ )
108
+ image: str | None = Field(
109
+ default=None,
110
+ description="Primary product image URL. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
111
+ )
112
+ images: list[str] | None = Field(
113
+ default=None, description="All product image URLs."
114
+ )
115
+ item_id: str | None = Field(
116
+ default=None,
117
+ alias="itemId",
118
+ description="Walmart US item id (usItemId). Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
119
+ )
120
+ model: str | None = Field(
121
+ default=None, description="Manufacturer model number; empty when not reported."
122
+ )
123
+ order_limit: int | None = Field(
124
+ default=None,
125
+ alias="orderLimit",
126
+ description="Maximum units of this item one order may contain.",
127
+ )
128
+ price_text: str | None = Field(
129
+ default=None,
130
+ alias="priceText",
131
+ description='Current price as displayed, e.g. "$125.00"; empty when unavailable (Walmart returns a formatted string, not a numeric value).',
132
+ )
133
+ product_id: str | None = Field(
134
+ default=None, alias="productId", description="Walmart internal product id."
135
+ )
136
+ rating: float | None = Field(
137
+ default=None, description="Average customer rating, 0-5; 0 when unrated."
138
+ )
139
+ return_window: int | None = Field(
140
+ default=None,
141
+ alias="returnWindow",
142
+ description="Days the buyer has to return the item.",
143
+ )
144
+ reviews_count: int | None = Field(
145
+ default=None,
146
+ alias="reviewsCount",
147
+ description="Number of customer reviews; 0 when none.",
148
+ )
149
+ seller_id: str | None = Field(
150
+ default=None,
151
+ alias="sellerId",
152
+ description="Identifier of the seller fulfilling the offer.",
153
+ )
154
+ seller_name: str | None = Field(
155
+ default=None,
156
+ alias="sellerName",
157
+ description="Name of the seller fulfilling the offer.",
158
+ )
159
+ title: str = Field(
160
+ description="Product title. Populated whenever the provider has data for the entity."
161
+ )
162
+ upc: str | None = Field(
163
+ default=None, description="Universal Product Code; empty when not reported."
164
+ )
165
+ url: str = Field(
166
+ description="Canonical Walmart product page URL (condition query param retained, as it selects the offer). Populated whenever the provider has data for the entity."
167
+ )
168
+
169
+
170
+ class WalmartReviewsData(BaseModel):
171
+ model_config = ConfigDict(populate_by_name=True)
172
+
173
+ items: list[WalmartReviewsItem] = Field(
174
+ description="Customer review records for the requested page. Populated whenever the provider has data for the entity."
175
+ )
176
+ rating: float | None = Field(
177
+ default=None,
178
+ description="Overall product score (1-5), or null when the serving source does not report it.",
179
+ )
180
+ rating_distribution: WalmartReviewsRatingDistribution | None = Field(
181
+ default=None,
182
+ alias="ratingDistribution",
183
+ description='Number of reviews at each star rating, keyed "1" through "5".',
184
+ )
185
+ total_pages: int | None = Field(
186
+ default=None,
187
+ alias="totalPages",
188
+ description="Number of 10-review pages Walmart reports for the product (it can exceed the 100 pages this SKU serves), or absent or null when the serving source does not report it.",
189
+ )
190
+ total_reviews: int | None = Field(
191
+ default=None,
192
+ alias="totalReviews",
193
+ description="Total number of reviews for the product, or null when the serving source does not report it.",
194
+ )
195
+
196
+
197
+ class WalmartReviewsItem(BaseModel):
198
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
199
+
200
+ created_utc: float | None = Field(
201
+ default=None,
202
+ alias="createdUtc",
203
+ description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Walmart publishes the review date only, so this is midnight UTC of that date; null when not reported. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
204
+ )
205
+ helpful_votes: int | None = Field(
206
+ default=None,
207
+ alias="helpfulVotes",
208
+ description='Number of "helpful" votes the review received, or null when not reported.',
209
+ )
210
+ rating: float = Field(description="Star rating the reviewer gave, 1-5.")
211
+ review_id: str = Field(
212
+ alias="reviewId",
213
+ description="Walmart review id; use it to deduplicate across pages. Populated whenever the provider has data for the entity.",
214
+ )
215
+ reviewer: str | None = Field(
216
+ default=None,
217
+ description='Reviewer display name as Walmart shows it, e.g. "anonymous"; empty when withheld.',
218
+ )
219
+ text: str = Field(
220
+ description="Full review body text. Populated whenever the provider has data for the entity."
221
+ )
222
+ title: str | None = Field(
223
+ default=None, description="Review headline; empty when the review has none."
224
+ )
225
+ verified_purchase: bool | None = Field(
226
+ default=None,
227
+ alias="verifiedPurchase",
228
+ description="True when Walmart marks the review a verified purchase; null when the serving source reports no badge either way.",
229
+ )
230
+
231
+
232
+ class WalmartReviewsRatingDistribution(BaseModel):
233
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
234
+
235
+ field_1: int | None = Field(
236
+ default=None, alias="1", description="Number of 1-star reviews."
237
+ )
238
+ field_2: int | None = Field(
239
+ default=None, alias="2", description="Number of 2-star reviews."
240
+ )
241
+ field_3: int | None = Field(
242
+ default=None, alias="3", description="Number of 3-star reviews."
243
+ )
244
+ field_4: int | None = Field(
245
+ default=None, alias="4", description="Number of 4-star reviews."
246
+ )
247
+ field_5: int | None = Field(
248
+ default=None, alias="5", description="Number of 5-star reviews."
249
+ )
250
+
251
+
252
+ class WalmartSearchData(BaseModel):
253
+ model_config = ConfigDict(populate_by_name=True)
254
+
255
+ items: list[WalmartSearchItem] = Field(
256
+ description="Matching Walmart product records for the requested page. Populated whenever the provider has data for the entity."
257
+ )
258
+ total_pages: int | None = Field(
259
+ default=None,
260
+ alias="totalPages",
261
+ description="Highest page number available for the query; request pages 1 through this value. Absent or null when the serving source does not report it.",
262
+ )
263
+ total_results: int | None = Field(
264
+ default=None,
265
+ alias="totalResults",
266
+ description="Total number of matching products Walmart reports for the query, or null when not reported.",
267
+ )
268
+
269
+
270
+ class WalmartSearchItem(BaseModel):
271
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
272
+
273
+ availability: str | None = Field(
274
+ default=None,
275
+ description='Stock status as Walmart reports it, e.g. "IN_STOCK" or "OUT_OF_STOCK".',
276
+ )
277
+ brand: str | None = Field(
278
+ default=None,
279
+ description="Brand name, or null when Walmart omits it from the search grid (it publishes brand on clothing-style grids and on no row elsewhere; the Walmart Product SKU always carries it).",
280
+ )
281
+ currency: str | None = Field(
282
+ default=None,
283
+ description='Price currency code, e.g. "USD"; empty when no price is shown.',
284
+ )
285
+ image: str | None = Field(
286
+ default=None,
287
+ description="Primary product image URL. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
288
+ )
289
+ in_stock: bool | None = Field(
290
+ default=None,
291
+ alias="inStock",
292
+ description="True when the product is in stock, false when it is not, or null when not reported.",
293
+ )
294
+ is_sponsored: bool | None = Field(
295
+ default=None,
296
+ alias="isSponsored",
297
+ description="True when the result is a sponsored placement.",
298
+ )
299
+ item_id: str = Field(
300
+ alias="itemId",
301
+ description="Walmart US item id (usItemId), the number in a walmart.com/ip/ URL; use the product URL with the Walmart Product or Walmart Reviews SKU. Populated whenever the provider has data for the entity.",
302
+ )
303
+ list_price: float | None = Field(
304
+ default=None,
305
+ alias="listPrice",
306
+ description='Pre-discount "was" price when the product is on sale, or null when it is not discounted.',
307
+ )
308
+ position: int | None = Field(
309
+ default=None, description="1-based position of the result in this page."
310
+ )
311
+ price: float | None = Field(
312
+ default=None,
313
+ description="Current price in USD as a number, or null when the result shows no current price. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
314
+ )
315
+ rating: float | None = Field(
316
+ default=None,
317
+ description="Average customer rating, 0-5, or null when the product is unrated.",
318
+ )
319
+ reviews_count: int | None = Field(
320
+ default=None,
321
+ alias="reviewsCount",
322
+ description="Number of customer ratings, or null when the product has none.",
323
+ )
324
+ seller_id: str | None = Field(
325
+ default=None,
326
+ alias="sellerId",
327
+ description="Identifier of the seller fulfilling the shown offer.",
328
+ )
329
+ seller_name: str | None = Field(
330
+ default=None,
331
+ alias="sellerName",
332
+ description="Name of the seller fulfilling the shown offer.",
333
+ )
334
+ title: str = Field(
335
+ description="Product title. Populated whenever the provider has data for the entity."
336
+ )
337
+ url: str | None = Field(
338
+ default=None,
339
+ description="Walmart product page URL with tracking query parameters removed. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
340
+ )
341
+
342
+
343
+ class WalmartNamespace:
344
+ """Typed methods for this platform. Attached lazily to the client."""
345
+
346
+ def __init__(self, client: "AnyAPI") -> None:
347
+ self._client = client
348
+
349
+ def product(
350
+ self,
351
+ *,
352
+ options: RequestOptions | None = None,
353
+ **input: Unpack[WalmartProductInput],
354
+ ) -> RunResult[WalmartProductData]:
355
+ """Walmart Product
356
+
357
+ Fetch a Walmart product page by URL and get full product details (title,
358
+ price, availability, ratings, images, and specs) in one normalized response.
359
+
360
+ Price: $0.001 per request.
361
+
362
+ Example:
363
+ res = client.walmart.product(url="https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121")
364
+ """
365
+ raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
366
+ "walmart.product", dict(input), options
367
+ )
368
+ return RunResult[WalmartProductData].model_validate(raw)
369
+
370
+ def reviews(
371
+ self,
372
+ *,
373
+ options: RequestOptions | None = None,
374
+ **input: Unpack[WalmartReviewsInput],
375
+ ) -> RunResult[WalmartReviewsData]:
376
+ """Walmart Reviews
377
+
378
+ Pull a page of 10 customer reviews for any Walmart product by URL, newest
379
+ first or by relevance, helpfulness, or rating: rating, title, text, date,
380
+ reviewer, and verified-purchase badge.
381
+
382
+ Price: $0.00125 per request.
383
+
384
+ Example:
385
+ res = client.walmart.reviews(url="https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121")
386
+ """
387
+ raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
388
+ "walmart.reviews", dict(input), options
389
+ )
390
+ return RunResult[WalmartReviewsData].model_validate(raw)
391
+
392
+ def search(
393
+ self,
394
+ *,
395
+ options: RequestOptions | None = None,
396
+ **input: Unpack[WalmartSearchInput],
397
+ ) -> RunResult[WalmartSearchData]:
398
+ """Walmart Search
399
+
400
+ Search Walmart by keyword with optional sort, price-range, facet, and page
401
+ filters and get title, price, rating, seller, and availability for each
402
+ product in one normalized response.
403
+
404
+ Price: $0.0009 per request.
405
+
406
+ Example:
407
+ res = client.walmart.search(query="airpods", sort="best_seller")
408
+ """
409
+ raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
410
+ "walmart.search", dict(input), options
411
+ )
412
+ return RunResult[WalmartSearchData].model_validate(raw)
413
+
414
+
415
+ class AsyncWalmartNamespace:
416
+ """Typed methods for this platform. Attached lazily to the client."""
417
+
418
+ def __init__(self, client: "AsyncAnyAPI") -> None:
419
+ self._client = client
420
+
421
+ async def product(
422
+ self,
423
+ *,
424
+ options: RequestOptions | None = None,
425
+ **input: Unpack[WalmartProductInput],
426
+ ) -> RunResult[WalmartProductData]:
427
+ """Walmart Product
428
+
429
+ Fetch a Walmart product page by URL and get full product details (title,
430
+ price, availability, ratings, images, and specs) in one normalized response.
431
+
432
+ Price: $0.001 per request.
433
+
434
+ Example:
435
+ res = client.walmart.product(url="https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121")
436
+ """
437
+ raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
438
+ "walmart.product", dict(input), options
439
+ )
440
+ return RunResult[WalmartProductData].model_validate(raw)
441
+
442
+ async def reviews(
443
+ self,
444
+ *,
445
+ options: RequestOptions | None = None,
446
+ **input: Unpack[WalmartReviewsInput],
447
+ ) -> RunResult[WalmartReviewsData]:
448
+ """Walmart Reviews
449
+
450
+ Pull a page of 10 customer reviews for any Walmart product by URL, newest
451
+ first or by relevance, helpfulness, or rating: rating, title, text, date,
452
+ reviewer, and verified-purchase badge.
453
+
454
+ Price: $0.00125 per request.
455
+
456
+ Example:
457
+ res = client.walmart.reviews(url="https://www.walmart.com/ip/Apple-AirPods-Pro-2/5689919121")
458
+ """
459
+ raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
460
+ "walmart.reviews", dict(input), options
461
+ )
462
+ return RunResult[WalmartReviewsData].model_validate(raw)
463
+
464
+ async def search(
465
+ self,
466
+ *,
467
+ options: RequestOptions | None = None,
468
+ **input: Unpack[WalmartSearchInput],
469
+ ) -> RunResult[WalmartSearchData]:
470
+ """Walmart Search
471
+
472
+ Search Walmart by keyword with optional sort, price-range, facet, and page
473
+ filters and get title, price, rating, seller, and availability for each
474
+ product in one normalized response.
475
+
476
+ Price: $0.0009 per request.
477
+
478
+ Example:
479
+ res = client.walmart.search(query="airpods", sort="best_seller")
480
+ """
481
+ raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
482
+ "walmart.search", dict(input), options
483
+ )
484
+ return RunResult[WalmartSearchData].model_validate(raw)