getanyapi 0.49.0__tar.gz → 0.51.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. {getanyapi-0.49.0 → getanyapi-0.51.0}/PKG-INFO +1 -1
  2. {getanyapi-0.49.0 → getanyapi-0.51.0}/pyproject.toml +1 -1
  3. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/__init__.py +1 -1
  4. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/__init__.py +1 -0
  5. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/ahrefs.py +163 -0
  6. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/ebay.py +174 -15
  7. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/facebook.py +81 -3
  8. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google.py +12 -10
  9. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/instagram.py +25 -7
  10. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/linkedin.py +2 -2
  11. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/maps.py +38 -3
  12. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/perplexity.py +2 -2
  13. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/reddit.py +2 -2
  14. getanyapi-0.51.0/src/getanyapi/platforms/similarweb.py +379 -0
  15. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/tiktok.py +2 -2
  16. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/tiktok_shop.py +1 -1
  17. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/youtube.py +6 -2
  18. {getanyapi-0.49.0 → getanyapi-0.51.0}/.gitignore +0 -0
  19. {getanyapi-0.49.0 → getanyapi-0.51.0}/README.md +0 -0
  20. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_account.py +0 -0
  21. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_async_client.py +0 -0
  22. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_client.py +0 -0
  23. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_errors.py +0 -0
  24. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_idempotency.py +0 -0
  25. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_pagination.py +0 -0
  26. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_transport.py +0 -0
  27. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/discovery_types.py +0 -0
  28. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/airbnb.py +0 -0
  29. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/alibaba.py +0 -0
  30. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/amazon.py +0 -0
  31. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/apollo.py +0 -0
  32. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/appstore.py +0 -0
  33. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/bluesky.py +0 -0
  34. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/booking.py +0 -0
  35. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/capterra.py +0 -0
  36. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/chatgpt.py +0 -0
  37. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
  38. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company.py +0 -0
  39. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
  40. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company_identify.py +0 -0
  41. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company_search.py +0 -0
  42. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/congress.py +0 -0
  43. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
  44. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/douyin.py +0 -0
  45. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/email.py +0 -0
  46. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/email_finding.py +0 -0
  47. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/email_verification.py +0 -0
  48. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/fiverr.py +0 -0
  49. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/g2.py +0 -0
  50. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/gemini.py +0 -0
  51. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/github.py +0 -0
  52. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/glassdoor.py +0 -0
  53. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google_ads.py +0 -0
  54. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google_finance.py +0 -0
  55. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google_shopping.py +0 -0
  56. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/hackernews.py +0 -0
  57. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/indeed.py +0 -0
  58. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/job_search.py +0 -0
  59. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
  60. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/naver.py +0 -0
  61. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/nextdoor.py +0 -0
  62. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/people_search.py +0 -0
  63. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/person.py +0 -0
  64. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
  65. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/pinterest.py +0 -0
  66. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/playstore.py +0 -0
  67. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/polymarket.py +0 -0
  68. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/property_records.py +0 -0
  69. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/realtor.py +0 -0
  70. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/redfin.py +0 -0
  71. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/rednote.py +0 -0
  72. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/sec.py +0 -0
  73. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/semrush.py +0 -0
  74. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/seo.py +0 -0
  75. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/snapchat.py +0 -0
  76. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/social.py +0 -0
  77. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/spotify.py +0 -0
  78. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/substack.py +0 -0
  79. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/technographics.py +0 -0
  80. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/threads.py +0 -0
  81. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
  82. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/trustpilot.py +0 -0
  83. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/truthsocial.py +0 -0
  84. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/twitter.py +0 -0
  85. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/upwork.py +0 -0
  86. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/walmart.py +0 -0
  87. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/web.py +0 -0
  88. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/weibo.py +0 -0
  89. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
  90. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/yelp.py +0 -0
  91. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/zhihu.py +0 -0
  92. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/zillow.py +0 -0
  93. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/py.typed +0 -0
  94. {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/types.py +0 -0
  95. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/conftest.py +0 -0
  96. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_account.py +0 -0
  97. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_client.py +0 -0
  98. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_durable_requests.py +0 -0
  99. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_envelope.py +0 -0
  100. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_errors.py +0 -0
  101. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_fixture_roundtrip.py +0 -0
  102. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_fixture_sweep.py +0 -0
  103. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_not_found_reason.py +0 -0
  104. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_pagination.py +0 -0
  105. {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_transport.py +0 -0
  106. {getanyapi-0.49.0 → getanyapi-0.51.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: getanyapi
3
- Version: 0.49.0
3
+ Version: 0.51.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.49.0"
7
+ version = "0.51.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.49.0"
58
+ __version__ = "0.51.0"
59
59
 
60
60
  __all__ = [
61
61
  # clients + top-level functions
@@ -117,6 +117,7 @@ REGISTRY: dict[str, tuple[str, str, str]] = {
117
117
  "sec": ("sec", "SecNamespace", "AsyncSecNamespace"),
118
118
  "semrush": ("semrush", "SemrushNamespace", "AsyncSemrushNamespace"),
119
119
  "seo": ("seo", "SeoNamespace", "AsyncSeoNamespace"),
120
+ "similarweb": ("similarweb", "SimilarwebNamespace", "AsyncSimilarwebNamespace"),
120
121
  "snapchat": ("snapchat", "SnapchatNamespace", "AsyncSnapchatNamespace"),
121
122
  "social": ("social", "SocialNamespace", "AsyncSocialNamespace"),
122
123
  "spotify": ("spotify", "SpotifyNamespace", "AsyncSpotifyNamespace"),
@@ -83,6 +83,23 @@ class AhrefsOverviewInput(TypedDict, total=False):
83
83
  """The domain or page URL to analyze (e.g. ahrefs.com)."""
84
84
 
85
85
 
86
+ class AhrefsTrafficInput(TypedDict, total=False):
87
+ """Input for Ahrefs Traffic Overview."""
88
+
89
+ allowFallbacks: NotRequired[bool]
90
+ """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."""
91
+ ignoreSources: NotRequired[list[str]]
92
+ """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."""
93
+ mode: NotRequired[Literal["exact", "subdomains", "prefix", "domain"]]
94
+ """Analysis scope: subdomains covers the domain and its subdomains, domain covers the root domain only, prefix covers every page under the given path, exact matches only the given URL. Default: subdomains."""
95
+ preferLatencyUnderMs: NotRequired[int]
96
+ """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."""
97
+ source: NotRequired[list[str]]
98
+ """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`."""
99
+ url: Required[str]
100
+ """The domain or page URL to analyze (e.g. ahrefs.com)."""
101
+
102
+
86
103
  class AhrefsBacklinksData(BaseModel):
87
104
  items: list[AhrefsBacklinksItem] = Field(
88
105
  description="Referring pages that link to the domain or URL. Populated whenever the provider has data for the entity."
@@ -273,6 +290,106 @@ class AhrefsOverviewItem(BaseModel):
273
290
  )
274
291
 
275
292
 
293
+ class AhrefsTrafficData(BaseModel):
294
+ items: list[AhrefsTrafficItem] = Field(
295
+ description="Traffic overview records: the requested domain plus its monthly organic traffic, top ranking keywords, top pages, top countries, and traffic history. Populated whenever the provider has data for the entity."
296
+ )
297
+
298
+
299
+ class AhrefsTrafficItem(BaseModel):
300
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
301
+
302
+ domain: str = Field(
303
+ description="The domain or URL the metrics are scoped to. Populated whenever the provider has data for the entity."
304
+ )
305
+ mode: str | None = Field(
306
+ default=None,
307
+ description="Analysis scope used: subdomains, domain, prefix, or exact.",
308
+ )
309
+ monthly_traffic: int | None = Field(
310
+ default=None,
311
+ alias="monthlyTraffic",
312
+ description="Estimated monthly organic search visits.",
313
+ )
314
+ monthly_traffic_value_usd: float | None = Field(
315
+ default=None,
316
+ alias="monthlyTrafficValueUsd",
317
+ description="Estimated monthly USD value of the organic traffic, what the same clicks would cost in paid search.",
318
+ )
319
+ top_countries: list[AhrefsTrafficTopCountrie] | None = Field(
320
+ default=None,
321
+ alias="topCountries",
322
+ description="Countries sending the most organic traffic, up to five.",
323
+ )
324
+ top_keywords: list[AhrefsTrafficTopKeyword] | None = Field(
325
+ default=None,
326
+ alias="topKeywords",
327
+ description="The top organic keywords the domain already ranks for, up to five, ordered by traffic. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
328
+ )
329
+ top_pages: list[AhrefsTrafficTopPage] | None = Field(
330
+ default=None,
331
+ alias="topPages",
332
+ description="The pages receiving the most organic traffic, up to five.",
333
+ )
334
+ traffic_history: list[AhrefsTrafficTrafficHistory] | None = Field(
335
+ default=None,
336
+ alias="trafficHistory",
337
+ description="Monthly organic traffic estimates for recent months, oldest first.",
338
+ )
339
+
340
+
341
+ class AhrefsTrafficTopCountrie(BaseModel):
342
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
343
+
344
+ country: str = Field(description="Two-letter country code.")
345
+ share_pct: float | None = Field(
346
+ default=None,
347
+ alias="sharePct",
348
+ description="Share (0-100) of the domain's organic traffic from this country.",
349
+ )
350
+
351
+
352
+ class AhrefsTrafficTopKeyword(BaseModel):
353
+ model_config = ConfigDict(extra="allow")
354
+
355
+ keyword: str = Field(description="The organic keyword.")
356
+ position: int | None = Field(
357
+ default=None, description="Current Google organic position for this keyword."
358
+ )
359
+ traffic: int | None = Field(
360
+ default=None,
361
+ description="Estimated monthly traffic this keyword drives to the domain.",
362
+ )
363
+
364
+
365
+ class AhrefsTrafficTopPage(BaseModel):
366
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
367
+
368
+ share_pct: float | None = Field(
369
+ default=None,
370
+ alias="sharePct",
371
+ description="Share (0-100) of the domain's organic traffic this page receives.",
372
+ )
373
+ traffic: int | None = Field(
374
+ default=None, description="Estimated monthly organic visits to the page."
375
+ )
376
+ url: str = Field(description="The page URL.")
377
+
378
+
379
+ class AhrefsTrafficTrafficHistory(BaseModel):
380
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
381
+
382
+ month_utc: float = Field(
383
+ alias="monthUtc",
384
+ description="UTC epoch timestamp in seconds (Unix time) of the first day of the month. Multiply by 1000 for a JS Date in milliseconds.",
385
+ )
386
+ organic_traffic: int | None = Field(
387
+ default=None,
388
+ alias="organicTraffic",
389
+ description="Estimated organic search visits in that month.",
390
+ )
391
+
392
+
276
393
  class AhrefsNamespace:
277
394
  """Typed methods for this platform. Attached lazily to the client."""
278
395
 
@@ -364,6 +481,29 @@ class AhrefsNamespace:
364
481
  )
365
482
  return RunResult[AhrefsOverviewData].model_validate(raw)
366
483
 
484
+ def traffic(
485
+ self,
486
+ *,
487
+ options: RequestOptions | None = None,
488
+ **input: Unpack[AhrefsTrafficInput],
489
+ ) -> RunResult[AhrefsTrafficData]:
490
+ """Ahrefs Traffic Overview
491
+
492
+ Get the Ahrefs organic traffic overview for any domain or URL: monthly
493
+ traffic estimate and value, the top keywords it already ranks for with
494
+ position and traffic, top pages, traffic by country, and a monthly traffic
495
+ history - as normalized JSON.
496
+
497
+ Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
498
+
499
+ Example:
500
+ res = client.ahrefs.traffic(mode="subdomains", url="ahrefs.com")
501
+ """
502
+ raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
503
+ "ahrefs.traffic", dict(input), options
504
+ )
505
+ return RunResult[AhrefsTrafficData].model_validate(raw)
506
+
367
507
 
368
508
  class AsyncAhrefsNamespace:
369
509
  """Typed methods for this platform. Attached lazily to the client."""
@@ -455,3 +595,26 @@ class AsyncAhrefsNamespace:
455
595
  "ahrefs.overview", dict(input), options
456
596
  )
457
597
  return RunResult[AhrefsOverviewData].model_validate(raw)
598
+
599
+ async def traffic(
600
+ self,
601
+ *,
602
+ options: RequestOptions | None = None,
603
+ **input: Unpack[AhrefsTrafficInput],
604
+ ) -> RunResult[AhrefsTrafficData]:
605
+ """Ahrefs Traffic Overview
606
+
607
+ Get the Ahrefs organic traffic overview for any domain or URL: monthly
608
+ traffic estimate and value, the top keywords it already ranks for with
609
+ position and traffic, top pages, traffic by country, and a monthly traffic
610
+ history - as normalized JSON.
611
+
612
+ Price: $0.00006 per request plus $0.00495 per result (maximum $0.00501).
613
+
614
+ Example:
615
+ res = client.ahrefs.traffic(mode="subdomains", url="ahrefs.com")
616
+ """
617
+ raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
618
+ "ahrefs.traffic", dict(input), options
619
+ )
620
+ return RunResult[AhrefsTrafficData].model_validate(raw)
@@ -68,6 +68,22 @@ class EbaySearchInput(TypedDict, total=False):
68
68
  """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."""
69
69
  query: Required[str]
70
70
  """Search keywords, e.g. "nintendo switch" or "vintage levis 501"."""
71
+ requireFields: NotRequired[
72
+ list[
73
+ Literal[
74
+ "bidCount",
75
+ "condition",
76
+ "currency",
77
+ "listingType",
78
+ "price",
79
+ "sellerFeedbackCount",
80
+ "sellerFeedbackPercent",
81
+ "sellerName",
82
+ "shippingCost",
83
+ ]
84
+ ]
85
+ ]
86
+ """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 `sellerName`, 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 listing that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
71
87
  sort: NotRequired[
72
88
  Literal[
73
89
  "best_match", "ending_soonest", "newly_listed", "price_low", "price_high"
@@ -86,11 +102,11 @@ class EbaySoldListingsInput(TypedDict, total=False):
86
102
  condition: NotRequired[Literal["any", "new", "used"]]
87
103
  """Item condition filter (e.g. used). Default: any."""
88
104
  freeShipping: NotRequired[bool]
89
- """Only include listings that sold with free shipping."""
105
+ """Not supported by the current sources: only false (no filter) is accepted; true is refused without charge."""
90
106
  ignoreSources: NotRequired[list[str]]
91
107
  """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."""
92
108
  limit: NotRequired[int]
93
- """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."""
109
+ """Maximum number of results to return (1-25, default 25). Range: 1 to 25."""
94
110
  listingType: NotRequired[Literal["all", "auction", "buy_it_now"]]
95
111
  """Restrict to a listing format; omit or use all for both (e.g. auction for auction sales only)."""
96
112
  maxPrice: NotRequired[float]
@@ -102,13 +118,42 @@ class EbaySoldListingsInput(TypedDict, total=False):
102
118
  query: Required[str]
103
119
  """Search keyword for sold items (e.g. iphone 13 pro)."""
104
120
  returnsAccepted: NotRequired[bool]
105
- """Only include listings from sellers who accept returns."""
121
+ """Not supported by the current sources: only false (no filter) is accepted; true is refused without charge."""
106
122
  seller: NotRequired[str]
107
- """Restrict to sold listings from one seller username (e.g. rainierconsignment)."""
123
+ """Not supported by the current sources: a request that sets it is refused without charge."""
124
+ site: NotRequired[Literal["ebay.com"]]
125
+ """eBay country site to search. Sold-listing coverage is currently US only. Default: ebay.com."""
126
+ sort: NotRequired[Literal["ended_recently", "price_low", "price_high"]]
127
+ """Result sort order; omitted means ended_recently (e.g. price_high sorts by highest sold price plus shipping first)."""
128
+ source: NotRequired[list[str]]
129
+ """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`."""
130
+
131
+
132
+ class EbaySoldListingsThinInput(TypedDict, total=False):
133
+ """Input for eBay Sold Listings (Basic)."""
134
+
135
+ allowFallbacks: NotRequired[bool]
136
+ """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."""
137
+ condition: NotRequired[Literal["any", "new", "used"]]
138
+ """Item condition filter (e.g. used). Default: any."""
139
+ ignoreSources: NotRequired[list[str]]
140
+ """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."""
141
+ limit: NotRequired[int]
142
+ """Maximum number of results to return (1-25, default 25). Range: 1 to 25."""
143
+ listingType: NotRequired[Literal["all", "auction", "buy_it_now"]]
144
+ """Restrict to a listing format; omit or use all for both (e.g. auction for auction sales only)."""
145
+ maxPrice: NotRequired[float]
146
+ """Optional maximum sold price in the site currency (e.g. 500). Minimum: 0."""
147
+ minPrice: NotRequired[float]
148
+ """Optional minimum sold price in the site currency (e.g. 200). Minimum: 0."""
149
+ preferLatencyUnderMs: NotRequired[int]
150
+ """Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint's lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted. Minimum: 1."""
151
+ query: Required[str]
152
+ """Search keyword for sold items (e.g. iphone 13 pro)."""
108
153
  site: NotRequired[Literal["ebay.com"]]
109
154
  """eBay country site to search. Sold-listing coverage is currently US only. Default: ebay.com."""
110
155
  sort: NotRequired[Literal["ended_recently", "price_low", "price_high"]]
111
- """Result sort order; omit for eBay's default best-match order (e.g. price_high sorts by highest sold price first)."""
156
+ """Result sort order; omitted means ended_recently (e.g. price_high sorts by highest sold price plus shipping first)."""
112
157
  source: NotRequired[list[str]]
113
158
  """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`."""
114
159
 
@@ -454,6 +499,11 @@ class EbaySoldListingsData(BaseModel):
454
499
  class EbaySoldListingsItem(BaseModel):
455
500
  model_config = ConfigDict(extra="allow", populate_by_name=True)
456
501
 
502
+ best_offer_accepted: bool | None = Field(
503
+ default=None,
504
+ alias="bestOfferAccepted",
505
+ description="True when eBay marked the sale as Best Offer accepted. Absent when the source could not tell.",
506
+ )
457
507
  bid_count: int | None = Field(
458
508
  default=None,
459
509
  alias="bidCount",
@@ -485,27 +535,90 @@ class EbaySoldListingsItem(BaseModel):
485
535
  listing_type: str | None = Field(
486
536
  default=None,
487
537
  alias="listingType",
488
- description="Sale format (e.g. Fixed price, Auction).",
538
+ description="Sale format: Auction or Fixed price.",
489
539
  )
490
540
  seller_feedback_count: int | None = Field(
491
541
  default=None,
492
542
  alias="sellerFeedbackCount",
493
- description="Seller's lifetime feedback count, when available.",
543
+ description="Seller's lifetime feedback count. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
494
544
  )
495
545
  seller_feedback_percent: float | None = Field(
496
546
  default=None,
497
547
  alias="sellerFeedbackPercent",
498
- description="Seller's positive-feedback percentage, when available.",
548
+ description="Seller's positive-feedback percentage. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
499
549
  )
500
550
  seller_username: str | None = Field(
501
551
  default=None,
502
552
  alias="sellerUsername",
503
- description="Seller's eBay username, when available.",
553
+ description="Seller's eBay username. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
554
+ )
555
+ shipping_cost: str | None = Field(
556
+ default=None,
557
+ alias="shippingCost",
558
+ description='Shipping the buyer paid, in the site currency (e.g. "$5.55"; "$0" is free shipping).',
559
+ )
560
+ sold_currency: str | None = Field(
561
+ default=None,
562
+ alias="soldCurrency",
563
+ description="ISO currency code of the sold price (e.g. USD).",
564
+ )
565
+ sold_price: float | None = Field(
566
+ default=None,
567
+ alias="soldPrice",
568
+ description="Final sold price in the site currency. When bestOfferAccepted is true this is the listing's asking price: eBay does not publish the accepted offer amount.",
569
+ )
570
+ sold_utc: float | None = Field(
571
+ default=None,
572
+ alias="soldUtc",
573
+ description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.",
574
+ )
575
+ title: str = Field(
576
+ description="Listing title as it appeared on eBay. Populated whenever the provider has data for the entity."
577
+ )
578
+ url: str = Field(
579
+ description="Canonical listing URL. Populated whenever the provider has data for the entity."
580
+ )
581
+
582
+
583
+ class EbaySoldListingsThinData(BaseModel):
584
+ items: list[EbaySoldListingsThinItem] = Field(
585
+ description="Sold listing records: title, sold price, sale date, condition, format, bids, and item URL, without seller details. Populated whenever the provider has data for the entity."
586
+ )
587
+
588
+
589
+ class EbaySoldListingsThinItem(BaseModel):
590
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
591
+
592
+ best_offer_accepted: bool | None = Field(
593
+ default=None,
594
+ alias="bestOfferAccepted",
595
+ description="True when eBay marked the sale as Best Offer accepted. Absent when the source could not tell.",
596
+ )
597
+ bid_count: int | None = Field(
598
+ default=None,
599
+ alias="bidCount",
600
+ description="Number of bids the listing received, for auction sales.",
601
+ )
602
+ condition: str | None = Field(
603
+ default=None, description="Item condition as listed (e.g. Pre-Owned)."
604
+ )
605
+ image: str | None = Field(
606
+ default=None,
607
+ description="Primary listing image URL. Populated whenever the provider has data for the entity. Present whenever the upstream returns this record.",
608
+ )
609
+ item_id: str = Field(
610
+ alias="itemId",
611
+ description="eBay item identifier. Populated whenever the provider has data for the entity.",
612
+ )
613
+ listing_type: str | None = Field(
614
+ default=None,
615
+ alias="listingType",
616
+ description="Sale format: Auction or Fixed price.",
504
617
  )
505
618
  shipping_cost: str | None = Field(
506
619
  default=None,
507
620
  alias="shippingCost",
508
- description='Shipping cost as displayed on the listing (e.g. "Free delivery", "$5.55 delivery").',
621
+ description='Shipping the buyer paid, in the site currency (e.g. "$5.55"; "$0" is free shipping).',
509
622
  )
510
623
  sold_currency: str | None = Field(
511
624
  default=None,
@@ -515,7 +628,7 @@ class EbaySoldListingsItem(BaseModel):
515
628
  sold_price: float | None = Field(
516
629
  default=None,
517
630
  alias="soldPrice",
518
- description="Final sold price in the site currency.",
631
+ description="Final sold price in the site currency. When bestOfferAccepted is true this is the listing's asking price: eBay does not publish the accepted offer amount.",
519
632
  )
520
633
  sold_utc: float | None = Field(
521
634
  default=None,
@@ -590,7 +703,7 @@ class EbayNamespace:
590
703
  item-condition, listing-type, and sort filters and get title, price,
591
704
  condition, shipping, and seller in one normalized response.
592
705
 
593
- Price: $0.0005 per request.
706
+ Price: $0.00225 per request.
594
707
 
595
708
  Example:
596
709
  res = client.ebay.search(limit=3, query="nintendo switch", sort="price_low")
@@ -612,7 +725,7 @@ class EbayNamespace:
612
725
  price-range, condition, and sort filters (sold price, sale date, condition,
613
726
  seller, item details); ideal for pricing research.
614
727
 
615
- Price: $0.022 per request plus $0.00264 per result (maximum $0.088).
728
+ Price: $0.0135 per request.
616
729
 
617
730
  Example:
618
731
  res = client.ebay.sold_listings(limit=10, query="iphone 13 pro", sort="ended_recently")
@@ -622,6 +735,29 @@ class EbayNamespace:
622
735
  )
623
736
  return RunResult[EbaySoldListingsData].model_validate(raw)
624
737
 
738
+ def sold_listings_thin(
739
+ self,
740
+ *,
741
+ options: RequestOptions | None = None,
742
+ **input: Unpack[EbaySoldListingsThinInput],
743
+ ) -> RunResult[EbaySoldListingsThinData]:
744
+ """eBay Sold Listings (Basic)
745
+
746
+ Retrieve recently sold eBay listings for any keyword with the sold price,
747
+ sale date, condition, format, bids, and whether a Best Offer was accepted,
748
+ without seller details; the lighter sibling of eBay Sold Listings for price
749
+ comps.
750
+
751
+ Price: $0.0135 per request.
752
+
753
+ Example:
754
+ res = client.ebay.sold_listings_thin(limit=10, query="iphone 13 pro", sort="ended_recently")
755
+ """
756
+ raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
757
+ "ebay.sold_listings_thin", dict(input), options
758
+ )
759
+ return RunResult[EbaySoldListingsThinData].model_validate(raw)
760
+
625
761
 
626
762
  class AsyncEbayNamespace:
627
763
  """Typed methods for this platform. Attached lazily to the client."""
@@ -683,7 +819,7 @@ class AsyncEbayNamespace:
683
819
  item-condition, listing-type, and sort filters and get title, price,
684
820
  condition, shipping, and seller in one normalized response.
685
821
 
686
- Price: $0.0005 per request.
822
+ Price: $0.00225 per request.
687
823
 
688
824
  Example:
689
825
  res = client.ebay.search(limit=3, query="nintendo switch", sort="price_low")
@@ -705,7 +841,7 @@ class AsyncEbayNamespace:
705
841
  price-range, condition, and sort filters (sold price, sale date, condition,
706
842
  seller, item details); ideal for pricing research.
707
843
 
708
- Price: $0.022 per request plus $0.00264 per result (maximum $0.088).
844
+ Price: $0.0135 per request.
709
845
 
710
846
  Example:
711
847
  res = client.ebay.sold_listings(limit=10, query="iphone 13 pro", sort="ended_recently")
@@ -714,3 +850,26 @@ class AsyncEbayNamespace:
714
850
  "ebay.sold_listings", dict(input), options
715
851
  )
716
852
  return RunResult[EbaySoldListingsData].model_validate(raw)
853
+
854
+ async def sold_listings_thin(
855
+ self,
856
+ *,
857
+ options: RequestOptions | None = None,
858
+ **input: Unpack[EbaySoldListingsThinInput],
859
+ ) -> RunResult[EbaySoldListingsThinData]:
860
+ """eBay Sold Listings (Basic)
861
+
862
+ Retrieve recently sold eBay listings for any keyword with the sold price,
863
+ sale date, condition, format, bids, and whether a Best Offer was accepted,
864
+ without seller details; the lighter sibling of eBay Sold Listings for price
865
+ comps.
866
+
867
+ Price: $0.0135 per request.
868
+
869
+ Example:
870
+ res = client.ebay.sold_listings_thin(limit=10, query="iphone 13 pro", sort="ended_recently")
871
+ """
872
+ raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
873
+ "ebay.sold_listings_thin", dict(input), options
874
+ )
875
+ return RunResult[EbaySoldListingsThinData].model_validate(raw)
@@ -374,6 +374,26 @@ class FacebookPostInput(TypedDict, total=False):
374
374
  """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."""
375
375
  preferLatencyUnderMs: NotRequired[int]
376
376
  """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."""
377
+ requireFields: NotRequired[
378
+ list[
379
+ Literal[
380
+ "authorId",
381
+ "authorImage",
382
+ "authorName",
383
+ "authorVerified",
384
+ "comments",
385
+ "createdUtc",
386
+ "durationSeconds",
387
+ "image",
388
+ "likes",
389
+ "shares",
390
+ "url",
391
+ "videoId",
392
+ "views",
393
+ ]
394
+ ]
395
+ ]
396
+ """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 `videoId` or `authorId`, 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 post that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
377
397
  source: NotRequired[list[str]]
378
398
  """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`."""
379
399
  url: Required[str]
@@ -1922,7 +1942,7 @@ class FacebookPostData(BaseModel):
1922
1942
  description="Length of the post's video in seconds, 0 when the post carries no video.",
1923
1943
  )
1924
1944
  id: str = Field(
1925
- description="Populated whenever the provider has data for the entity."
1945
+ description="Facebook post id. For a reel or video post this is NOT the id in the /reel/ URL; that one is videoId. Populated whenever the provider has data for the entity."
1926
1946
  )
1927
1947
  image: str | None = Field(
1928
1948
  default=None, description="Preview image or video thumbnail URL for the post."
@@ -1935,6 +1955,11 @@ class FacebookPostData(BaseModel):
1935
1955
  url: str | None = Field(
1936
1956
  default=None, description="Canonical Facebook URL of the post."
1937
1957
  )
1958
+ video_id: str | None = Field(
1959
+ default=None,
1960
+ alias="videoId",
1961
+ description="Facebook video id of the post's reel or video, the id that appears in its /reel/<id> URL. Null when the post carries no video or this lane cannot read it.",
1962
+ )
1938
1963
  views: int
1939
1964
 
1940
1965
 
@@ -2165,6 +2190,13 @@ class FacebookProfilePostsMedia(BaseModel):
2165
2190
 
2166
2191
 
2167
2192
  class FacebookProfileReelsData(BaseModel):
2193
+ model_config = ConfigDict(populate_by_name=True)
2194
+
2195
+ next_cursor: str | None = Field(
2196
+ default=None,
2197
+ alias="nextCursor",
2198
+ description="Opaque cursor for the next page of reels, or null when this lane has no more. Pass it back as cursor to continue.",
2199
+ )
2168
2200
  reels: list[FacebookProfileReelsReel] = Field(
2169
2201
  description="The profile's reels. Populated whenever the provider has data for the entity."
2170
2202
  )
@@ -3198,6 +3230,29 @@ class FacebookNamespace:
3198
3230
  )
3199
3231
  return RunResult[FacebookProfileReelsData].model_validate(raw)
3200
3232
 
3233
+ def iter_profile_reels(
3234
+ self,
3235
+ *,
3236
+ options: RequestOptions | None = None,
3237
+ **input: Unpack[FacebookProfileReelsInput],
3238
+ ) -> Paginator[FacebookProfileReelsReel, FacebookProfileReelsData]:
3239
+ """Iterate Facebook Profile Reels results, following pagination cursors.
3240
+
3241
+ Yields validated `FacebookProfileReelsReel` items from the `reels` field of
3242
+ each page. Use `.pages()` on the returned paginator to walk whole
3243
+ `RunResult` pages.
3244
+ """
3245
+ return paginate(
3246
+ self._client,
3247
+ "facebook.profile_reels",
3248
+ dict(input),
3249
+ "reels",
3250
+ item_model=FacebookProfileReelsReel,
3251
+ data_model=FacebookProfileReelsData,
3252
+ bare=False,
3253
+ options=options,
3254
+ )
3255
+
3201
3256
  def search_companies(
3202
3257
  self,
3203
3258
  *,
@@ -3252,7 +3307,7 @@ class FacebookNamespace:
3252
3307
  Search public Facebook posts by keyword, optionally filtered by location,
3253
3308
  and get structured post records (text, author, engagement).
3254
3309
 
3255
- Price: $0.00006 per request plus $0.0033 per result (maximum $0.0661).
3310
+ Price: $0 per request plus $0.00135 per result (maximum $0.027).
3256
3311
 
3257
3312
  Example:
3258
3313
  res = client.facebook.search_posts(limit=3, query="nike")
@@ -4006,6 +4061,29 @@ class AsyncFacebookNamespace:
4006
4061
  )
4007
4062
  return RunResult[FacebookProfileReelsData].model_validate(raw)
4008
4063
 
4064
+ def iter_profile_reels(
4065
+ self,
4066
+ *,
4067
+ options: RequestOptions | None = None,
4068
+ **input: Unpack[FacebookProfileReelsInput],
4069
+ ) -> AsyncPaginator[FacebookProfileReelsReel, FacebookProfileReelsData]:
4070
+ """Iterate Facebook Profile Reels results, following pagination cursors.
4071
+
4072
+ Yields validated `FacebookProfileReelsReel` items from the `reels` field of
4073
+ each page. Use `.pages()` on the returned paginator to walk whole
4074
+ `RunResult` pages.
4075
+ """
4076
+ return apaginate(
4077
+ self._client,
4078
+ "facebook.profile_reels",
4079
+ dict(input),
4080
+ "reels",
4081
+ item_model=FacebookProfileReelsReel,
4082
+ data_model=FacebookProfileReelsData,
4083
+ bare=False,
4084
+ options=options,
4085
+ )
4086
+
4009
4087
  async def search_companies(
4010
4088
  self,
4011
4089
  *,
@@ -4060,7 +4138,7 @@ class AsyncFacebookNamespace:
4060
4138
  Search public Facebook posts by keyword, optionally filtered by location,
4061
4139
  and get structured post records (text, author, engagement).
4062
4140
 
4063
- Price: $0.00006 per request plus $0.0033 per result (maximum $0.0661).
4141
+ Price: $0 per request plus $0.00135 per result (maximum $0.027).
4064
4142
 
4065
4143
  Example:
4066
4144
  res = client.facebook.search_posts(limit=3, query="nike")