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.
- {getanyapi-0.49.0 → getanyapi-0.51.0}/PKG-INFO +1 -1
- {getanyapi-0.49.0 → getanyapi-0.51.0}/pyproject.toml +1 -1
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/__init__.py +1 -1
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/__init__.py +1 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/ahrefs.py +163 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/ebay.py +174 -15
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/facebook.py +81 -3
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google.py +12 -10
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/instagram.py +25 -7
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/linkedin.py +2 -2
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/maps.py +38 -3
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/perplexity.py +2 -2
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/reddit.py +2 -2
- getanyapi-0.51.0/src/getanyapi/platforms/similarweb.py +379 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/tiktok.py +2 -2
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/tiktok_shop.py +1 -1
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/youtube.py +6 -2
- {getanyapi-0.49.0 → getanyapi-0.51.0}/.gitignore +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/README.md +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_account.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_async_client.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_client.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_errors.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_idempotency.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_pagination.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/_transport.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/discovery_types.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/airbnb.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/alibaba.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/amazon.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/apollo.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/appstore.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/bluesky.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/booking.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/capterra.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/chatgpt.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company_identify.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/company_search.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/congress.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/douyin.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/email.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/email_finding.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/email_verification.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/fiverr.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/g2.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/gemini.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/github.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/glassdoor.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google_ads.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google_finance.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/google_shopping.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/hackernews.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/indeed.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/job_search.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/naver.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/nextdoor.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/people_search.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/person.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/pinterest.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/playstore.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/polymarket.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/property_records.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/realtor.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/redfin.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/rednote.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/sec.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/semrush.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/seo.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/snapchat.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/social.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/spotify.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/substack.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/technographics.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/threads.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/trustpilot.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/truthsocial.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/twitter.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/upwork.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/walmart.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/web.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/weibo.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/yelp.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/zhihu.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/platforms/zillow.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/py.typed +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/src/getanyapi/types.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/conftest.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_account.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_client.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_durable_requests.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_envelope.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_errors.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_fixture_roundtrip.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_fixture_sweep.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_not_found_reason.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_pagination.py +0 -0
- {getanyapi-0.49.0 → getanyapi-0.51.0}/tests/test_transport.py +0 -0
- {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.
|
|
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
|
|
@@ -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
|
-
"""
|
|
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).
|
|
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
|
-
"""
|
|
121
|
+
"""Not supported by the current sources: only false (no filter) is accepted; true is refused without charge."""
|
|
106
122
|
seller: NotRequired[str]
|
|
107
|
-
"""
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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")
|