getanyapi 0.102.0__tar.gz → 0.103.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 (109) hide show
  1. {getanyapi-0.102.0 → getanyapi-0.103.0}/PKG-INFO +1 -1
  2. {getanyapi-0.102.0 → getanyapi-0.103.0}/pyproject.toml +1 -1
  3. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/__init__.py +1 -1
  4. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/facebook.py +302 -9
  5. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/linkedin.py +2 -2
  6. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/youtube.py +2 -2
  7. {getanyapi-0.102.0 → getanyapi-0.103.0}/.gitignore +0 -0
  8. {getanyapi-0.102.0 → getanyapi-0.103.0}/README.md +0 -0
  9. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/_account.py +0 -0
  10. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/_async_client.py +0 -0
  11. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/_client.py +0 -0
  12. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/_errors.py +0 -0
  13. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/_idempotency.py +0 -0
  14. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/_pagination.py +0 -0
  15. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/_transport.py +0 -0
  16. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/discovery_types.py +0 -0
  17. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/__init__.py +0 -0
  18. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/ahrefs.py +0 -0
  19. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/airbnb.py +0 -0
  20. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/alibaba.py +0 -0
  21. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/amazon.py +0 -0
  22. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/apollo.py +0 -0
  23. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/appstore.py +0 -0
  24. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/bluesky.py +0 -0
  25. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/booking.py +0 -0
  26. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/capterra.py +0 -0
  27. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/chatgpt.py +0 -0
  28. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
  29. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/company.py +0 -0
  30. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
  31. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/company_identify.py +0 -0
  32. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/company_search.py +0 -0
  33. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/congress.py +0 -0
  34. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
  35. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/douyin.py +0 -0
  36. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/ebay.py +0 -0
  37. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/email.py +0 -0
  38. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/email_finding.py +0 -0
  39. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/email_verification.py +0 -0
  40. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/fiverr.py +0 -0
  41. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/g2.py +0 -0
  42. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/gemini.py +0 -0
  43. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/github.py +0 -0
  44. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/glassdoor.py +0 -0
  45. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/google.py +0 -0
  46. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/google_ads.py +0 -0
  47. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/google_finance.py +0 -0
  48. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/google_hotels.py +0 -0
  49. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/google_shopping.py +0 -0
  50. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/hackernews.py +0 -0
  51. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/indeed.py +0 -0
  52. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/instagram.py +0 -0
  53. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/job_search.py +0 -0
  54. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/maps.py +0 -0
  55. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
  56. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/naver.py +0 -0
  57. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/nextdoor.py +0 -0
  58. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/people_search.py +0 -0
  59. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/perplexity.py +0 -0
  60. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/person.py +0 -0
  61. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
  62. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/pexels.py +0 -0
  63. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/pinterest.py +0 -0
  64. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/playstore.py +0 -0
  65. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/polymarket.py +0 -0
  66. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/property_records.py +0 -0
  67. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/realtor.py +0 -0
  68. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/reddit.py +0 -0
  69. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/redfin.py +0 -0
  70. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/rednote.py +0 -0
  71. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/sec.py +0 -0
  72. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/semrush.py +0 -0
  73. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/seo.py +0 -0
  74. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/similarweb.py +0 -0
  75. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/snapchat.py +0 -0
  76. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/social.py +0 -0
  77. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/spotify.py +0 -0
  78. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/substack.py +0 -0
  79. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/technographics.py +0 -0
  80. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/threads.py +0 -0
  81. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/tiktok.py +0 -0
  82. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/tiktok_shop.py +0 -0
  83. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
  84. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/trustpilot.py +0 -0
  85. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/truthsocial.py +0 -0
  86. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/twitter.py +0 -0
  87. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/unsplash.py +0 -0
  88. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/upwork.py +0 -0
  89. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/walmart.py +0 -0
  90. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/web.py +0 -0
  91. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/weibo.py +0 -0
  92. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
  93. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/yelp.py +0 -0
  94. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/zhihu.py +0 -0
  95. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/platforms/zillow.py +0 -0
  96. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/py.typed +0 -0
  97. {getanyapi-0.102.0 → getanyapi-0.103.0}/src/getanyapi/types.py +0 -0
  98. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/conftest.py +0 -0
  99. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_account.py +0 -0
  100. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_client.py +0 -0
  101. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_durable_requests.py +0 -0
  102. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_envelope.py +0 -0
  103. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_errors.py +0 -0
  104. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_fixture_roundtrip.py +0 -0
  105. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_fixture_sweep.py +0 -0
  106. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_not_found_reason.py +0 -0
  107. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_pagination.py +0 -0
  108. {getanyapi-0.102.0 → getanyapi-0.103.0}/tests/test_transport.py +0 -0
  109. {getanyapi-0.102.0 → getanyapi-0.103.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: getanyapi
3
- Version: 0.102.0
3
+ Version: 0.103.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.102.0"
7
+ version = "0.103.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.102.0"
58
+ __version__ = "0.103.0"
59
59
 
60
60
  __all__ = [
61
61
  # clients + top-level functions
@@ -395,7 +395,18 @@ class FacebookPostInput(TypedDict, total=False):
395
395
  """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."""
396
396
  preferLatencyUnderMs: NotRequired[int]
397
397
  """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."""
398
- requireFields: NotRequired[list[Literal["authorVerified", "videoId", "views"]]]
398
+ requireFields: NotRequired[
399
+ list[
400
+ Literal[
401
+ "authorVerified",
402
+ "feedbackId",
403
+ "reactions",
404
+ "videoId",
405
+ "videoUrl",
406
+ "views",
407
+ ]
408
+ ]
409
+ ]
399
410
  """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 `views`, 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."""
400
411
  source: NotRequired[list[str]]
401
412
  """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`."""
@@ -486,6 +497,8 @@ class FacebookProfilePostsInput(TypedDict, total=False):
486
497
  """Facebook page id."""
487
498
  preferLatencyUnderMs: NotRequired[int]
488
499
  """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."""
500
+ requireFields: NotRequired[list[Literal["shares"]]]
501
+ """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 `shares`, 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."""
489
502
  source: NotRequired[list[str]]
490
503
  """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`."""
491
504
  url: NotRequired[str]
@@ -503,7 +516,18 @@ class FacebookProfileReelsInput(TypedDict, total=False):
503
516
  """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."""
504
517
  preferLatencyUnderMs: NotRequired[int]
505
518
  """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."""
506
- requireFields: NotRequired[list[Literal["authorVerified", "feedbackId"]]]
519
+ requireFields: NotRequired[
520
+ list[
521
+ Literal[
522
+ "authorVerified",
523
+ "comments",
524
+ "feedbackId",
525
+ "likes",
526
+ "shares",
527
+ "videoUrl",
528
+ ]
529
+ ]
530
+ ]
507
531
  """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 `feedbackId` or `authorVerified`, 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 reel that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
508
532
  source: NotRequired[list[str]]
509
533
  """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`."""
@@ -585,6 +609,10 @@ class FacebookAdDetailsData(BaseModel):
585
609
  categories: list[str] | None = Field(
586
610
  default=None, description="Ad Library categories the ad is filed under."
587
611
  )
612
+ creatives: list[FacebookAdDetailsCreative] | None = Field(
613
+ default=None,
614
+ description="One entry per card of a carousel, dynamic-product, or dynamic-creative ad, in the order Meta returns them, each with its own text and destination. Single-creative ads return an empty array. The same card images and videos also appear in media. Meta CDN media URLs are signed and expire.",
615
+ )
588
616
  cta_text: str | None = Field(
589
617
  default=None,
590
618
  alias="ctaText",
@@ -677,6 +705,44 @@ class FacebookAdDetailsData(BaseModel):
677
705
  )
678
706
 
679
707
 
708
+ class FacebookAdDetailsCreative(BaseModel):
709
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
710
+
711
+ body: str | None = Field(default=None, description="Card body text.")
712
+ caption: str | None = Field(
713
+ default=None,
714
+ description="Card display caption, usually the destination domain.",
715
+ )
716
+ cta_text: str | None = Field(
717
+ default=None,
718
+ alias="ctaText",
719
+ description='Card call-to-action label (e.g. "Shop Now").',
720
+ )
721
+ cta_type: str | None = Field(
722
+ default=None,
723
+ alias="ctaType",
724
+ description='Card call-to-action type (e.g. "SHOP_NOW").',
725
+ )
726
+ image: str | None = Field(
727
+ default=None,
728
+ description="Card image URL. For a video card this is the poster frame.",
729
+ )
730
+ link_description: str | None = Field(
731
+ default=None,
732
+ alias="linkDescription",
733
+ description="Card secondary description line.",
734
+ )
735
+ link_url: str | None = Field(
736
+ default=None, alias="linkUrl", description="Card destination URL."
737
+ )
738
+ title: str | None = Field(default=None, description="Card headline.")
739
+ video_url: str | None = Field(
740
+ default=None,
741
+ alias="videoUrl",
742
+ description="Card video file URL (HD when supplied, otherwise SD). Present only on video cards.",
743
+ )
744
+
745
+
680
746
  class FacebookAdDetailsMedia(BaseModel):
681
747
  model_config = ConfigDict(extra="allow", populate_by_name=True)
682
748
 
@@ -917,6 +983,10 @@ class FacebookAdsSearchAd(BaseModel):
917
983
  categories: list[str] | None = Field(
918
984
  default=None, description="Ad Library categories the ad is filed under."
919
985
  )
986
+ creatives: list[FacebookAdsSearchCreative] | None = Field(
987
+ default=None,
988
+ description="One entry per card of a carousel, dynamic-product, or dynamic-creative ad, in the order Meta returns them, each with its own text and destination. Single-creative ads return an empty array. The same card images and videos also appear in media. Meta CDN media URLs are signed and expire.",
989
+ )
920
990
  cta_text: str = Field(
921
991
  alias="ctaText",
922
992
  description="Populated whenever the provider has data for the entity.",
@@ -1003,6 +1073,44 @@ class FacebookAdsSearchAd(BaseModel):
1003
1073
  )
1004
1074
 
1005
1075
 
1076
+ class FacebookAdsSearchCreative(BaseModel):
1077
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
1078
+
1079
+ body: str | None = Field(default=None, description="Card body text.")
1080
+ caption: str | None = Field(
1081
+ default=None,
1082
+ description="Card display caption, usually the destination domain.",
1083
+ )
1084
+ cta_text: str | None = Field(
1085
+ default=None,
1086
+ alias="ctaText",
1087
+ description='Card call-to-action label (e.g. "Shop Now").',
1088
+ )
1089
+ cta_type: str | None = Field(
1090
+ default=None,
1091
+ alias="ctaType",
1092
+ description='Card call-to-action type (e.g. "SHOP_NOW").',
1093
+ )
1094
+ image: str | None = Field(
1095
+ default=None,
1096
+ description="Card image URL. For a video card this is the poster frame.",
1097
+ )
1098
+ link_description: str | None = Field(
1099
+ default=None,
1100
+ alias="linkDescription",
1101
+ description="Card secondary description line.",
1102
+ )
1103
+ link_url: str | None = Field(
1104
+ default=None, alias="linkUrl", description="Card destination URL."
1105
+ )
1106
+ title: str | None = Field(default=None, description="Card headline.")
1107
+ video_url: str | None = Field(
1108
+ default=None,
1109
+ alias="videoUrl",
1110
+ description="Card video file URL (HD when supplied, otherwise SD). Present only on video cards.",
1111
+ )
1112
+
1113
+
1006
1114
  class FacebookAdsSearchMedia(BaseModel):
1007
1115
  model_config = ConfigDict(extra="allow", populate_by_name=True)
1008
1116
 
@@ -1112,6 +1220,10 @@ class FacebookCompanyAdsAd(BaseModel):
1112
1220
  categories: list[str] | None = Field(
1113
1221
  default=None, description="Ad Library categories the ad is filed under."
1114
1222
  )
1223
+ creatives: list[FacebookCompanyAdsCreative] | None = Field(
1224
+ default=None,
1225
+ description="One entry per card of a carousel, dynamic-product, or dynamic-creative ad, in the order Meta returns them, each with its own text and destination. Single-creative ads return an empty array. The same card images and videos also appear in media. Meta CDN media URLs are signed and expire.",
1226
+ )
1115
1227
  cta_text: str | None = Field(
1116
1228
  default=None,
1117
1229
  alias="ctaText",
@@ -1194,6 +1306,44 @@ class FacebookCompanyAdsAd(BaseModel):
1194
1306
  title: str | None = Field(default=None, description="Headline of the ad creative.")
1195
1307
 
1196
1308
 
1309
+ class FacebookCompanyAdsCreative(BaseModel):
1310
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
1311
+
1312
+ body: str | None = Field(default=None, description="Card body text.")
1313
+ caption: str | None = Field(
1314
+ default=None,
1315
+ description="Card display caption, usually the destination domain.",
1316
+ )
1317
+ cta_text: str | None = Field(
1318
+ default=None,
1319
+ alias="ctaText",
1320
+ description='Card call-to-action label (e.g. "Shop Now").',
1321
+ )
1322
+ cta_type: str | None = Field(
1323
+ default=None,
1324
+ alias="ctaType",
1325
+ description='Card call-to-action type (e.g. "SHOP_NOW").',
1326
+ )
1327
+ image: str | None = Field(
1328
+ default=None,
1329
+ description="Card image URL. For a video card this is the poster frame.",
1330
+ )
1331
+ link_description: str | None = Field(
1332
+ default=None,
1333
+ alias="linkDescription",
1334
+ description="Card secondary description line.",
1335
+ )
1336
+ link_url: str | None = Field(
1337
+ default=None, alias="linkUrl", description="Card destination URL."
1338
+ )
1339
+ title: str | None = Field(default=None, description="Card headline.")
1340
+ video_url: str | None = Field(
1341
+ default=None,
1342
+ alias="videoUrl",
1343
+ description="Card video file URL (HD when supplied, otherwise SD). Present only on video cards.",
1344
+ )
1345
+
1346
+
1197
1347
  class FacebookCompanyAdsMedia(BaseModel):
1198
1348
  model_config = ConfigDict(extra="allow", populate_by_name=True)
1199
1349
 
@@ -1497,7 +1647,7 @@ class FacebookFollowersItem(BaseModel):
1497
1647
  )
1498
1648
  image: str | None = Field(
1499
1649
  default=None,
1500
- description="URL of the account's profile picture, with tracking query params stripped. Empty when the upstream omits it.",
1650
+ description="URL of the account's profile picture, a signed CDN URL whose query must be kept. Empty when the upstream omits it.",
1501
1651
  )
1502
1652
  name: str = Field(
1503
1653
  description="The account's public display name. Populated whenever the provider has data for the entity."
@@ -1539,11 +1689,18 @@ class FacebookGroupPostsPost(BaseModel):
1539
1689
  id: str = Field(
1540
1690
  description="Populated whenever the provider has data for the entity."
1541
1691
  )
1692
+ image: str | None = Field(
1693
+ default=None,
1694
+ description="URL of the post's first image. Absent when the post has no image.",
1695
+ )
1542
1696
  publish_time: int = Field(
1543
1697
  alias="publishTime",
1544
1698
  description="Populated whenever the provider has data for the entity.",
1545
1699
  )
1546
1700
  reaction_count: int = Field(alias="reactionCount")
1701
+ reactions: FacebookGroupPostsReaction = Field(
1702
+ description="Reaction counts on the post, broken down by reaction type."
1703
+ )
1547
1704
  text: str = Field(
1548
1705
  description="Populated whenever the provider has data for the entity."
1549
1706
  )
@@ -1552,6 +1709,18 @@ class FacebookGroupPostsPost(BaseModel):
1552
1709
  )
1553
1710
 
1554
1711
 
1712
+ class FacebookGroupPostsReaction(BaseModel):
1713
+ model_config = ConfigDict(extra="allow")
1714
+
1715
+ angry: int | None = Field(default=None, description="Angry reactions.")
1716
+ care: int | None = Field(default=None, description="Care reactions.")
1717
+ haha: int | None = Field(default=None, description="Haha reactions.")
1718
+ like: int | None = Field(default=None, description="Like reactions.")
1719
+ love: int | None = Field(default=None, description="Love reactions.")
1720
+ sad: int | None = Field(default=None, description="Sad reactions.")
1721
+ wow: int | None = Field(default=None, description="Wow reactions.")
1722
+
1723
+
1555
1724
  class FacebookMarketplaceData(BaseModel):
1556
1725
  model_config = ConfigDict(populate_by_name=True)
1557
1726
 
@@ -1722,6 +1891,9 @@ class FacebookMarketplaceItemData(BaseModel):
1722
1891
  alias="priceFormatted",
1723
1892
  description="Populated whenever the provider has data for the entity.",
1724
1893
  )
1894
+ seller: FacebookMarketplaceItemSeller = Field(
1895
+ description="The person or business selling the item. Empty when Facebook does not show the seller on the listing."
1896
+ )
1725
1897
  share_url: str | None = Field(
1726
1898
  default=None,
1727
1899
  alias="shareUrl",
@@ -1769,6 +1941,32 @@ class FacebookMarketplaceItemPhoto(BaseModel):
1769
1941
  width: int | None = Field(default=None, description="Pixel width of the photo.")
1770
1942
 
1771
1943
 
1944
+ class FacebookMarketplaceItemSeller(BaseModel):
1945
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
1946
+
1947
+ id: str | None = Field(
1948
+ default=None, description="Facebook id of the seller, as a string."
1949
+ )
1950
+ image: str | None = Field(
1951
+ default=None, description="URL of the seller's profile picture."
1952
+ )
1953
+ joined_utc: float | None = Field(
1954
+ default=None,
1955
+ alias="joinedUtc",
1956
+ description="UTC epoch timestamp in seconds (Unix time) the seller joined Facebook. Multiply by 1000 for a JS Date in milliseconds.",
1957
+ )
1958
+ name: str | None = Field(default=None, description="The seller's display name.")
1959
+ rating: float | None = Field(
1960
+ default=None,
1961
+ description="The seller's average rating as a seller, out of 5. Absent when the seller has no ratings or keeps them private.",
1962
+ )
1963
+ rating_count: int | None = Field(
1964
+ default=None,
1965
+ alias="ratingCount",
1966
+ description="Number of ratings the seller has received as a seller. Absent when the seller has no ratings or keeps them private.",
1967
+ )
1968
+
1969
+
1772
1970
  class FacebookMarketplaceLocationSearchData(BaseModel):
1773
1971
  locations: list[FacebookMarketplaceLocationSearchLocation]
1774
1972
 
@@ -1842,8 +2040,13 @@ class FacebookPageContactData(BaseModel):
1842
2040
 
1843
2041
 
1844
2042
  class FacebookPageContactItem(BaseModel):
1845
- model_config = ConfigDict(extra="allow")
2043
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
1846
2044
 
2045
+ ad_library_page_id: str | None = Field(
2046
+ default=None,
2047
+ alias="adLibraryPageId",
2048
+ description="The page's Facebook Ad Library id, the `pageId` facebook.company_ads takes. It differs from `id`. Absent when Facebook shows none.",
2049
+ )
1847
2050
  address: str | None = Field(
1848
2051
  default=None,
1849
2052
  description="The page's public physical address. Empty when the page lists none.",
@@ -1861,7 +2064,11 @@ class FacebookPageContactItem(BaseModel):
1861
2064
  )
1862
2065
  image: str | None = Field(
1863
2066
  default=None,
1864
- description="URL of the page's profile picture, with tracking query params stripped. Empty when the upstream omits it.",
2067
+ description="URL of the page's profile picture, a signed CDN URL whose query must be kept. Empty when the upstream omits it.",
2068
+ )
2069
+ links: list[str] | None = Field(
2070
+ default=None,
2071
+ description="Other social profiles the page links to, such as its Instagram account, as URLs. Empty when the page links none.",
1865
2072
  )
1866
2073
  phone: str | None = Field(
1867
2074
  default=None,
@@ -1991,6 +2198,11 @@ class FacebookPostData(BaseModel):
1991
2198
  alias="durationSeconds",
1992
2199
  description="Length of the post's video in seconds, 0 when the post carries no video.",
1993
2200
  )
2201
+ feedback_id: str | None = Field(
2202
+ default=None,
2203
+ alias="feedbackId",
2204
+ description="Facebook feedback id of the post; pass it to facebook.post_comments as feedbackId to fetch its comments. Null when this source cannot read it.",
2205
+ )
1994
2206
  id: str = Field(
1995
2207
  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."
1996
2208
  )
@@ -1998,6 +2210,10 @@ class FacebookPostData(BaseModel):
1998
2210
  default=None, description="Preview image or video thumbnail URL for the post."
1999
2211
  )
2000
2212
  likes: int
2213
+ reactions: FacebookPostReaction | None = Field(
2214
+ default=None,
2215
+ description="Reaction counts on the post, broken down by reaction type. Null when this source reports only the total.",
2216
+ )
2001
2217
  shares: int
2002
2218
  text: str = Field(
2003
2219
  description="Populated whenever the provider has data for the entity."
@@ -2010,11 +2226,28 @@ class FacebookPostData(BaseModel):
2010
2226
  alias="videoId",
2011
2227
  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.",
2012
2228
  )
2229
+ video_url: str | None = Field(
2230
+ default=None,
2231
+ alias="videoUrl",
2232
+ description="Playable video file URL of the post's reel or video. Null when the post carries no video or this source cannot read it.",
2233
+ )
2013
2234
  views: int | None = Field(
2014
2235
  description="Number of views on the post's video. Null when the source cannot report an exact count, for example when it gives only a rounded figure such as 14K."
2015
2236
  )
2016
2237
 
2017
2238
 
2239
+ class FacebookPostReaction(BaseModel):
2240
+ model_config = ConfigDict(extra="allow")
2241
+
2242
+ angry: int | None = Field(default=None, description="Angry reactions.")
2243
+ care: int | None = Field(default=None, description="Care reactions.")
2244
+ haha: int | None = Field(default=None, description="Haha reactions.")
2245
+ like: int | None = Field(default=None, description="Like reactions.")
2246
+ love: int | None = Field(default=None, description="Love reactions.")
2247
+ sad: int | None = Field(default=None, description="Sad reactions.")
2248
+ wow: int | None = Field(default=None, description="Wow reactions.")
2249
+
2250
+
2018
2251
  class FacebookPostCommentsData(BaseModel):
2019
2252
  model_config = ConfigDict(populate_by_name=True)
2020
2253
 
@@ -2075,6 +2308,11 @@ class FacebookPostCommentsComment(BaseModel):
2075
2308
  class FacebookPostTranscriptData(BaseModel):
2076
2309
  model_config = ConfigDict(extra="allow", populate_by_name=True)
2077
2310
 
2311
+ duration_seconds: float | None = Field(
2312
+ default=None,
2313
+ alias="durationSeconds",
2314
+ description="Length of the video in seconds, with fractional seconds. Absent when the post has no transcribable video.",
2315
+ )
2078
2316
  post_id: str | None = Field(
2079
2317
  default=None,
2080
2318
  alias="postId",
@@ -2087,6 +2325,16 @@ class FacebookProfileData(BaseModel):
2087
2325
  model_config = ConfigDict(extra="allow", populate_by_name=True)
2088
2326
 
2089
2327
  about: str
2328
+ ad_library_page_id: str | None = Field(
2329
+ default=None,
2330
+ alias="adLibraryPageId",
2331
+ description="The page's Facebook Ad Library id, the `pageId` facebook.company_ads takes. It differs from `id`. Absent when Facebook shows none.",
2332
+ )
2333
+ ad_status: str | None = Field(
2334
+ default=None,
2335
+ alias="adStatus",
2336
+ description="Facebook Ad Library status sentence for the page, e.g. whether it is currently running ads. Absent when Facebook shows none.",
2337
+ )
2090
2338
  avatar_url: str = Field(
2091
2339
  alias="avatarUrl",
2092
2340
  description="Populated whenever the provider has data for the entity.",
@@ -2211,6 +2459,13 @@ class FacebookProfilePostsPost(BaseModel):
2211
2459
  default=None,
2212
2460
  description="Photo, video, and GIF attachments on the post. Empty when the post has none.",
2213
2461
  )
2462
+ reactions: FacebookProfilePostsReaction = Field(
2463
+ description="Reaction counts on the post, broken down by reaction type."
2464
+ )
2465
+ shares: int | None = Field(
2466
+ default=None,
2467
+ description="Number of times the post was shared. Null when this source does not report it.",
2468
+ )
2214
2469
  text: str = Field(
2215
2470
  description="Populated whenever the provider has data for the entity."
2216
2471
  )
@@ -2241,6 +2496,18 @@ class FacebookProfilePostsMedia(BaseModel):
2241
2496
  )
2242
2497
 
2243
2498
 
2499
+ class FacebookProfilePostsReaction(BaseModel):
2500
+ model_config = ConfigDict(extra="allow")
2501
+
2502
+ angry: int | None = Field(default=None, description="Angry reactions.")
2503
+ care: int | None = Field(default=None, description="Care reactions.")
2504
+ haha: int | None = Field(default=None, description="Haha reactions.")
2505
+ like: int | None = Field(default=None, description="Like reactions.")
2506
+ love: int | None = Field(default=None, description="Love reactions.")
2507
+ sad: int | None = Field(default=None, description="Sad reactions.")
2508
+ wow: int | None = Field(default=None, description="Wow reactions.")
2509
+
2510
+
2244
2511
  class FacebookProfileReelsData(BaseModel):
2245
2512
  model_config = ConfigDict(populate_by_name=True)
2246
2513
 
@@ -2280,6 +2547,10 @@ class FacebookProfileReelsReel(BaseModel):
2280
2547
  caption: str = Field(
2281
2548
  description="Reel caption text. Populated whenever the provider has data for the entity."
2282
2549
  )
2550
+ comments: int | None = Field(
2551
+ default=None,
2552
+ description="Comment count on the reel. Null when this source does not report it.",
2553
+ )
2283
2554
  created_utc: float = Field(
2284
2555
  alias="createdUtc",
2285
2556
  description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Populated whenever the provider has data for the entity.",
@@ -2295,7 +2566,15 @@ class FacebookProfileReelsReel(BaseModel):
2295
2566
  description="Facebook feedback id of the reel, used to fetch its comments.",
2296
2567
  )
2297
2568
  id: str = Field(
2298
- description="Reel identifier. Populated whenever the provider has data for the entity."
2569
+ description="Facebook post id of the reel, the same id facebook.post returns for it. This is NOT the id in the reel's /reel/ URL; that one is videoId. Populated whenever the provider has data for the entity."
2570
+ )
2571
+ likes: int | None = Field(
2572
+ default=None,
2573
+ description="Total reaction count on the reel. Null when this source does not report it.",
2574
+ )
2575
+ shares: int | None = Field(
2576
+ default=None,
2577
+ description="Number of times the reel was shared. Null when this source does not report it.",
2299
2578
  )
2300
2579
  thumbnail: str = Field(
2301
2580
  description="URL of the reel thumbnail image. Populated whenever the provider has data for the entity."
@@ -2303,6 +2582,15 @@ class FacebookProfileReelsReel(BaseModel):
2303
2582
  url: str = Field(
2304
2583
  description="Canonical URL of the reel. Populated whenever the provider has data for the entity."
2305
2584
  )
2585
+ video_id: str = Field(
2586
+ alias="videoId",
2587
+ description="Facebook video id of the reel, the id that appears in its /reel/<id> URL.",
2588
+ )
2589
+ video_url: str | None = Field(
2590
+ default=None,
2591
+ alias="videoUrl",
2592
+ description="Playable video file URL of the reel. Null when this source cannot read it.",
2593
+ )
2306
2594
  views: int = Field(description="Number of views on the reel.")
2307
2595
 
2308
2596
 
@@ -2370,6 +2658,11 @@ class FacebookSearchPagesItem(BaseModel):
2370
2658
  model_config = ConfigDict(extra="allow", populate_by_name=True)
2371
2659
 
2372
2660
  about: str | None = Field(default=None, description="The page's intro text.")
2661
+ ad_library_page_id: str | None = Field(
2662
+ default=None,
2663
+ alias="adLibraryPageId",
2664
+ description="The page's Facebook Ad Library id, the `pageId` facebook.company_ads takes. It differs from `id`. Absent when Facebook shows none.",
2665
+ )
2373
2666
  ad_status: str | None = Field(
2374
2667
  default=None,
2375
2668
  alias="adStatus",
@@ -2400,7 +2693,7 @@ class FacebookSearchPagesItem(BaseModel):
2400
2693
  )
2401
2694
  image: str | None = Field(
2402
2695
  default=None,
2403
- description="URL of the page's profile picture, with tracking query params stripped. Empty when the upstream omits it.",
2696
+ description="URL of the page's profile picture, a signed CDN URL whose query must be kept. Empty when the upstream omits it.",
2404
2697
  )
2405
2698
  likes: int | None = Field(default=None, description="The page's like count.")
2406
2699
  owner: str | None = Field(
@@ -2507,7 +2800,7 @@ class FacebookSearchPostsItem(BaseModel):
2507
2800
  )
2508
2801
  image: str | None = Field(
2509
2802
  default=None,
2510
- description="URL of the post's primary image, with tracking query params stripped. Empty for text-only or video posts.",
2803
+ description="URL of the post's primary image, a signed CDN URL whose query must be kept. Empty for text-only or video posts.",
2511
2804
  )
2512
2805
  reaction_count: int | None = Field(
2513
2806
  default=None,
@@ -2523,7 +2816,7 @@ class FacebookSearchPostsItem(BaseModel):
2523
2816
  description="The post's text/message. Empty for media-only posts with no caption."
2524
2817
  )
2525
2818
  url: str = Field(
2526
- description="Canonical URL of the post, with tracking query params stripped. Populated whenever the provider has data for the entity."
2819
+ description="Canonical URL of the post. A post with no page path keeps the query that identifies it (permalink.php?story_fbid=...&id=...). Populated whenever the provider has data for the entity."
2527
2820
  )
2528
2821
 
2529
2822
 
@@ -4992,7 +4992,7 @@ class LinkedinNamespace:
4992
4992
  experience detail, skills, certifications, connections, and verified flags
4993
4993
  use linkedin.profile.
4994
4994
 
4995
- Price: $0.0012 per request.
4995
+ Price: $0.0008 per request.
4996
4996
 
4997
4997
  Example:
4998
4998
  res = client.linkedin.profile_thin(url="https://www.linkedin.com/in/williamhgates")
@@ -5805,7 +5805,7 @@ class AsyncLinkedinNamespace:
5805
5805
  experience detail, skills, certifications, connections, and verified flags
5806
5806
  use linkedin.profile.
5807
5807
 
5808
- Price: $0.0012 per request.
5808
+ Price: $0.0008 per request.
5809
5809
 
5810
5810
  Example:
5811
5811
  res = client.linkedin.profile_thin(url="https://www.linkedin.com/in/williamhgates")
@@ -1342,7 +1342,7 @@ class YoutubeNamespace:
1342
1342
  Fetch a YouTube channel's stats (subscribers, video count, total views,
1343
1343
  description) and the links on its About page, by handle or channel ID.
1344
1344
 
1345
- Price: $0.0005 per request.
1345
+ Price: $0.00045 per request.
1346
1346
 
1347
1347
  Example:
1348
1348
  res = client.youtube.channel(handle="@mkbhd")
@@ -1980,7 +1980,7 @@ class AsyncYoutubeNamespace:
1980
1980
  Fetch a YouTube channel's stats (subscribers, video count, total views,
1981
1981
  description) and the links on its About page, by handle or channel ID.
1982
1982
 
1983
- Price: $0.0005 per request.
1983
+ Price: $0.00045 per request.
1984
1984
 
1985
1985
  Example:
1986
1986
  res = client.youtube.channel(handle="@mkbhd")
File without changes
File without changes
File without changes