getanyapi 0.61.2__tar.gz → 0.64.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 (108) hide show
  1. {getanyapi-0.61.2 → getanyapi-0.64.0}/PKG-INFO +4 -3
  2. {getanyapi-0.61.2 → getanyapi-0.64.0}/README.md +3 -2
  3. {getanyapi-0.61.2 → getanyapi-0.64.0}/pyproject.toml +1 -1
  4. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/__init__.py +1 -1
  5. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/facebook.py +2 -2
  6. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/instagram.py +214 -16
  7. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/linkedin.py +2 -2
  8. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/maps.py +2 -2
  9. getanyapi-0.64.0/src/getanyapi/platforms/redfin.py +388 -0
  10. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/tiktok.py +130 -7
  11. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/tiktok_shop.py +25 -203
  12. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/zillow.py +118 -0
  13. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/types.py +7 -9
  14. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_account.py +18 -13
  15. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_envelope.py +0 -10
  16. getanyapi-0.64.0/tests/test_not_found_reason.py +33 -0
  17. getanyapi-0.61.2/src/getanyapi/platforms/redfin.py +0 -194
  18. getanyapi-0.61.2/tests/test_not_found_reason.py +0 -49
  19. {getanyapi-0.61.2 → getanyapi-0.64.0}/.gitignore +0 -0
  20. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/_account.py +0 -0
  21. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/_async_client.py +0 -0
  22. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/_client.py +0 -0
  23. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/_errors.py +0 -0
  24. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/_idempotency.py +0 -0
  25. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/_pagination.py +0 -0
  26. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/_transport.py +0 -0
  27. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/discovery_types.py +0 -0
  28. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/__init__.py +0 -0
  29. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/ahrefs.py +0 -0
  30. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/airbnb.py +0 -0
  31. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/alibaba.py +0 -0
  32. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/amazon.py +0 -0
  33. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/apollo.py +0 -0
  34. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/appstore.py +0 -0
  35. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/bluesky.py +0 -0
  36. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/booking.py +0 -0
  37. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/capterra.py +0 -0
  38. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/chatgpt.py +0 -0
  39. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
  40. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/company.py +0 -0
  41. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
  42. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/company_identify.py +0 -0
  43. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/company_search.py +0 -0
  44. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/congress.py +0 -0
  45. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/contact_enrichment.py +0 -0
  46. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/douyin.py +0 -0
  47. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/ebay.py +0 -0
  48. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/email.py +0 -0
  49. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/email_finding.py +0 -0
  50. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/email_verification.py +0 -0
  51. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/fiverr.py +0 -0
  52. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/g2.py +0 -0
  53. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/gemini.py +0 -0
  54. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/github.py +0 -0
  55. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/glassdoor.py +0 -0
  56. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/google.py +0 -0
  57. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/google_ads.py +0 -0
  58. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/google_finance.py +0 -0
  59. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/google_shopping.py +0 -0
  60. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/hackernews.py +0 -0
  61. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/indeed.py +0 -0
  62. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/job_search.py +0 -0
  63. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
  64. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/naver.py +0 -0
  65. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/nextdoor.py +0 -0
  66. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/people_search.py +0 -0
  67. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/perplexity.py +0 -0
  68. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/person.py +0 -0
  69. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
  70. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/pinterest.py +0 -0
  71. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/playstore.py +0 -0
  72. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/polymarket.py +0 -0
  73. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/property_records.py +0 -0
  74. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/realtor.py +0 -0
  75. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/reddit.py +0 -0
  76. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/rednote.py +0 -0
  77. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/sec.py +0 -0
  78. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/semrush.py +0 -0
  79. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/seo.py +0 -0
  80. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/similarweb.py +0 -0
  81. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/snapchat.py +0 -0
  82. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/social.py +0 -0
  83. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/spotify.py +0 -0
  84. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/substack.py +0 -0
  85. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/technographics.py +0 -0
  86. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/threads.py +0 -0
  87. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
  88. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/trustpilot.py +0 -0
  89. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/truthsocial.py +0 -0
  90. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/twitter.py +0 -0
  91. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/upwork.py +0 -0
  92. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/walmart.py +0 -0
  93. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/web.py +0 -0
  94. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/weibo.py +0 -0
  95. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
  96. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/yelp.py +0 -0
  97. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/youtube.py +0 -0
  98. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/platforms/zhihu.py +0 -0
  99. {getanyapi-0.61.2 → getanyapi-0.64.0}/src/getanyapi/py.typed +0 -0
  100. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/conftest.py +0 -0
  101. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_client.py +0 -0
  102. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_durable_requests.py +0 -0
  103. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_errors.py +0 -0
  104. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_fixture_roundtrip.py +0 -0
  105. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_fixture_sweep.py +0 -0
  106. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_pagination.py +0 -0
  107. {getanyapi-0.61.2 → getanyapi-0.64.0}/tests/test_transport.py +0 -0
  108. {getanyapi-0.61.2 → getanyapi-0.64.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: getanyapi
3
- Version: 0.61.2
3
+ Version: 0.64.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
@@ -195,8 +195,9 @@ result = agent_signup(label="my-agent")
195
195
  client = AnyAPI(api_key=result.secret)
196
196
  ```
197
197
 
198
- The key ships with a small starter balance and a per-key spend cap; a human funds it by claiming
199
- it at `result.claim_url`.
198
+ The key ships with a small starter balance and a per-key spend cap; to go past the cap, a human
199
+ authorizes an AnyAPI wallet over OAuth, as described in
200
+ [agent self-signup](https://getanyapi.com/docs/agent-self-signup).
200
201
 
201
202
  ## Docs
202
203
 
@@ -166,8 +166,9 @@ result = agent_signup(label="my-agent")
166
166
  client = AnyAPI(api_key=result.secret)
167
167
  ```
168
168
 
169
- The key ships with a small starter balance and a per-key spend cap; a human funds it by claiming
170
- it at `result.claim_url`.
169
+ The key ships with a small starter balance and a per-key spend cap; to go past the cap, a human
170
+ authorizes an AnyAPI wallet over OAuth, as described in
171
+ [agent self-signup](https://getanyapi.com/docs/agent-self-signup).
171
172
 
172
173
  ## Docs
173
174
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "getanyapi"
7
- version = "0.61.2"
7
+ version = "0.64.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.61.2"
58
+ __version__ = "0.64.0"
59
59
 
60
60
  __all__ = [
61
61
  # clients + top-level functions
@@ -3377,7 +3377,7 @@ class FacebookNamespace:
3377
3377
  Search public Facebook posts by keyword, optionally filtered by location,
3378
3378
  and get structured post records (text, author, engagement).
3379
3379
 
3380
- Price: $0 per request plus $0.00135 per result (maximum $0.027).
3380
+ Price: $0.00006 per request plus $0.0033 per result (maximum $0.0661).
3381
3381
 
3382
3382
  Example:
3383
3383
  res = client.facebook.search_posts(limit=3, query="nike")
@@ -4232,7 +4232,7 @@ class AsyncFacebookNamespace:
4232
4232
  Search public Facebook posts by keyword, optionally filtered by location,
4233
4233
  and get structured post records (text, author, engagement).
4234
4234
 
4235
- Price: $0 per request plus $0.00135 per result (maximum $0.027).
4235
+ Price: $0.00006 per request plus $0.0033 per result (maximum $0.0661).
4236
4236
 
4237
4237
  Example:
4238
4238
  res = client.facebook.search_posts(limit=3, query="nike")
@@ -404,6 +404,40 @@ class InstagramSearchInput(TypedDict, total=False):
404
404
  """What to search for: user profiles, hashtags, or places (e.g. hashtag). Default: user."""
405
405
 
406
406
 
407
+ class InstagramSearchFollowersInput(TypedDict, total=False):
408
+ """Input for Instagram Search Followers."""
409
+
410
+ allowFallbacks: NotRequired[bool]
411
+ """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."""
412
+ ignoreSources: NotRequired[list[str]]
413
+ """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."""
414
+ preferLatencyUnderMs: NotRequired[int]
415
+ """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."""
416
+ query: Required[str]
417
+ """Name or username text to look for among this account's followers (e.g. john). Instagram matches loosely, and on large accounts it does not search followers at all, so the most recent followers come back instead."""
418
+ source: NotRequired[list[str]]
419
+ """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`."""
420
+ username: Required[str]
421
+ """The Instagram username whose followers to search, without the leading @ (e.g. milada2788)."""
422
+
423
+
424
+ class InstagramSearchFollowingInput(TypedDict, total=False):
425
+ """Input for Instagram Search Following."""
426
+
427
+ allowFallbacks: NotRequired[bool]
428
+ """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."""
429
+ ignoreSources: NotRequired[list[str]]
430
+ """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."""
431
+ preferLatencyUnderMs: NotRequired[int]
432
+ """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."""
433
+ query: Required[str]
434
+ """Name or username text to look for among the accounts this user follows (e.g. skin). Instagram matches loosely, so close matches are returned too."""
435
+ source: NotRequired[list[str]]
436
+ """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`."""
437
+ username: Required[str]
438
+ """The Instagram username whose following list to search, without the leading @ (e.g. moogooskincare)."""
439
+
440
+
407
441
  class InstagramSearchHashtagInput(TypedDict, total=False):
408
442
  """Input for Instagram Hashtag Search."""
409
443
 
@@ -1836,6 +1870,74 @@ class InstagramSearchItem(BaseModel):
1836
1870
  )
1837
1871
 
1838
1872
 
1873
+ class InstagramSearchFollowersData(BaseModel):
1874
+ items: list[InstagramSearchFollowersItem] = Field(
1875
+ description="Followers of the account that Instagram returned for the query, in Instagram's own order. On smaller accounts these are matches from the whole follower list, and Instagram's matching is loose, so some may not contain the exact query text. On large accounts Instagram does not search followers, so these are the account's most recent followers, whatever the query. Populated whenever the provider has data for the entity."
1876
+ )
1877
+
1878
+
1879
+ class InstagramSearchFollowersItem(BaseModel):
1880
+ model_config = ConfigDict(extra="allow")
1881
+
1882
+ handle: str = Field(
1883
+ description="The follower's username, without the @ prefix. Populated whenever the provider has data for the entity."
1884
+ )
1885
+ id: str = Field(
1886
+ description="The follower's numeric Instagram user ID, as a string. Populated whenever the provider has data for the entity."
1887
+ )
1888
+ image: str | None = Field(
1889
+ default=None,
1890
+ description="URL of the follower's profile picture. Instagram signs this URL in its query string, so use it as returned. Empty when the source omits it.",
1891
+ )
1892
+ name: str | None = Field(
1893
+ default=None,
1894
+ description="The follower's display name. Empty when the account has none.",
1895
+ )
1896
+ private: bool | None = Field(
1897
+ default=None, description="Whether the follower's account is private."
1898
+ )
1899
+ url: str | None = Field(
1900
+ default=None, description="Canonical URL of the follower's profile."
1901
+ )
1902
+ verified: bool | None = Field(
1903
+ default=None, description="Whether the follower's account is verified."
1904
+ )
1905
+
1906
+
1907
+ class InstagramSearchFollowingData(BaseModel):
1908
+ items: list[InstagramSearchFollowingItem] = Field(
1909
+ description="Accounts the user follows that Instagram matched to the query, in Instagram's own order. Instagram's matching is loose, so some results may not contain the exact query text. Populated whenever the provider has data for the entity."
1910
+ )
1911
+
1912
+
1913
+ class InstagramSearchFollowingItem(BaseModel):
1914
+ model_config = ConfigDict(extra="allow")
1915
+
1916
+ handle: str = Field(
1917
+ description="The followed account's username, without the @ prefix. Populated whenever the provider has data for the entity."
1918
+ )
1919
+ id: str = Field(
1920
+ description="The followed account's numeric Instagram user ID, as a string. Populated whenever the provider has data for the entity."
1921
+ )
1922
+ image: str | None = Field(
1923
+ default=None,
1924
+ description="URL of the followed account's profile picture. Instagram signs this URL in its query string, so use it as returned. Empty when the source omits it.",
1925
+ )
1926
+ name: str | None = Field(
1927
+ default=None,
1928
+ description="The followed account's display name. Empty when the account has none.",
1929
+ )
1930
+ private: bool | None = Field(
1931
+ default=None, description="Whether the followed account is private."
1932
+ )
1933
+ url: str | None = Field(
1934
+ default=None, description="Canonical URL of the followed account's profile."
1935
+ )
1936
+ verified: bool | None = Field(
1937
+ default=None, description="Whether the followed account is verified."
1938
+ )
1939
+
1940
+
1839
1941
  class InstagramSearchHashtagData(BaseModel):
1840
1942
  model_config = ConfigDict(populate_by_name=True)
1841
1943
 
@@ -2768,7 +2870,7 @@ class InstagramNamespace:
2768
2870
 
2769
2871
  List Instagram reels that use a given audio track by audio id.
2770
2872
 
2771
- Price: $0.0012 per request.
2873
+ Price: $0.0011 per request.
2772
2874
 
2773
2875
  Example:
2774
2876
  res = client.instagram.audio_reels(audioId="1392969992841787")
@@ -2833,7 +2935,7 @@ class InstagramNamespace:
2833
2935
  List the replies to an Instagram comment with cursor pagination (text,
2834
2936
  author, likes).
2835
2937
 
2836
- Price: $0.0012 per request.
2938
+ Price: $0.0011 per request.
2837
2939
 
2838
2940
  Example:
2839
2941
  res = client.instagram.comment_replies(commentId="18126632131325044", url="https://www.instagram.com/p/C8rKmYvsrck/")
@@ -3061,7 +3163,7 @@ class InstagramNamespace:
3061
3163
  filters use instagram.search_hashtag; for the chronological feed use
3062
3164
  instagram.hashtag_recent_posts.
3063
3165
 
3064
- Price: $0.0015 per request.
3166
+ Price: $0.0011 per request.
3065
3167
 
3066
3168
  Example:
3067
3169
  res = client.instagram.hashtag_top_posts(hashtag="skincare")
@@ -3301,7 +3403,7 @@ class InstagramNamespace:
3301
3403
  publishes on its profile, including the address behind the profile's Email
3302
3404
  button that public profile lookups do not return.
3303
3405
 
3304
- Price: $0.00257 per request plus $0 per result (maximum $0.00257).
3406
+ Price: $0.00175 per request.
3305
3407
 
3306
3408
  Example:
3307
3409
  res = client.instagram.profile_contact(handle="eminenceorganics")
@@ -3355,7 +3457,7 @@ class InstagramNamespace:
3355
3457
  same keyword, with a recency filter and numbered pages, use
3356
3458
  instagram.web_reels_search.
3357
3459
 
3358
- Price: $0.0015 per request.
3460
+ Price: $0.0011 per request.
3359
3461
 
3360
3462
  Example:
3361
3463
  res = client.instagram.reels_search(query="travel")
@@ -3409,6 +3511,54 @@ class InstagramNamespace:
3409
3511
  )
3410
3512
  return RunResult[InstagramSearchData].model_validate(raw)
3411
3513
 
3514
+ def search_followers(
3515
+ self,
3516
+ *,
3517
+ options: RequestOptions | None = None,
3518
+ **input: Unpack[InstagramSearchFollowersInput],
3519
+ ) -> RunResult[InstagramSearchFollowersData]:
3520
+ """Instagram Search Followers
3521
+
3522
+ Search the followers of a public Instagram account by name or username,
3523
+ using Instagram's own follower search. On smaller accounts it searches the
3524
+ whole follower list and returns close matches ranked by Instagram. On large
3525
+ accounts Instagram does not support searching followers, so the result is
3526
+ the account's most recent followers instead, whatever the query. Returns
3527
+ usernames, names, and profile details.
3528
+
3529
+ Price: $0.0022 per request.
3530
+
3531
+ Example:
3532
+ res = client.instagram.search_followers(query="john", username="milada2788")
3533
+ """
3534
+ raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
3535
+ "instagram.search_followers", dict(input), options
3536
+ )
3537
+ return RunResult[InstagramSearchFollowersData].model_validate(raw)
3538
+
3539
+ def search_following(
3540
+ self,
3541
+ *,
3542
+ options: RequestOptions | None = None,
3543
+ **input: Unpack[InstagramSearchFollowingInput],
3544
+ ) -> RunResult[InstagramSearchFollowingData]:
3545
+ """Instagram Search Following
3546
+
3547
+ Search the accounts a public Instagram user follows by name or username.
3548
+ Matching is Instagram's own loose search, so results are close matches
3549
+ ranked by Instagram and some may not contain your exact word. Returns
3550
+ usernames, names, and profile details.
3551
+
3552
+ Price: $0.0022 per request.
3553
+
3554
+ Example:
3555
+ res = client.instagram.search_following(query="skin", username="moogooskincare")
3556
+ """
3557
+ raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
3558
+ "instagram.search_following", dict(input), options
3559
+ )
3560
+ return RunResult[InstagramSearchFollowingData].model_validate(raw)
3561
+
3412
3562
  def search_hashtag(
3413
3563
  self,
3414
3564
  *,
@@ -3469,7 +3619,7 @@ class InstagramNamespace:
3469
3619
  Search Instagram locations by keyword and return each place's id, name,
3470
3620
  address and coordinates.
3471
3621
 
3472
- Price: $0.0024 per request.
3622
+ Price: $0.0011 per request.
3473
3623
 
3474
3624
  Example:
3475
3625
  res = client.instagram.search_locations(query="Eiffel Tower")
@@ -3601,7 +3751,7 @@ class InstagramNamespace:
3601
3751
  Fetch a public Instagram account's currently live stories with media, type,
3602
3752
  dimensions, posting time, and 24-hour expiry by username.
3603
3753
 
3604
- Price: $0.0024 per request.
3754
+ Price: $0.0022 per request.
3605
3755
 
3606
3756
  Example:
3607
3757
  res = client.instagram.stories_full(username="natgeo")
@@ -3817,7 +3967,7 @@ class InstagramNamespace:
3817
3967
  List the posts a public Instagram account has reposted to its feed, with
3818
3968
  cursor pagination.
3819
3969
 
3820
- Price: $0.0012 per request.
3970
+ Price: $0.0011 per request.
3821
3971
 
3822
3972
  Example:
3823
3973
  res = client.instagram.user_reposts(userId="787132")
@@ -3894,7 +4044,7 @@ class AsyncInstagramNamespace:
3894
4044
 
3895
4045
  List Instagram reels that use a given audio track by audio id.
3896
4046
 
3897
- Price: $0.0012 per request.
4047
+ Price: $0.0011 per request.
3898
4048
 
3899
4049
  Example:
3900
4050
  res = client.instagram.audio_reels(audioId="1392969992841787")
@@ -3959,7 +4109,7 @@ class AsyncInstagramNamespace:
3959
4109
  List the replies to an Instagram comment with cursor pagination (text,
3960
4110
  author, likes).
3961
4111
 
3962
- Price: $0.0012 per request.
4112
+ Price: $0.0011 per request.
3963
4113
 
3964
4114
  Example:
3965
4115
  res = client.instagram.comment_replies(commentId="18126632131325044", url="https://www.instagram.com/p/C8rKmYvsrck/")
@@ -4189,7 +4339,7 @@ class AsyncInstagramNamespace:
4189
4339
  filters use instagram.search_hashtag; for the chronological feed use
4190
4340
  instagram.hashtag_recent_posts.
4191
4341
 
4192
- Price: $0.0015 per request.
4342
+ Price: $0.0011 per request.
4193
4343
 
4194
4344
  Example:
4195
4345
  res = client.instagram.hashtag_top_posts(hashtag="skincare")
@@ -4429,7 +4579,7 @@ class AsyncInstagramNamespace:
4429
4579
  publishes on its profile, including the address behind the profile's Email
4430
4580
  button that public profile lookups do not return.
4431
4581
 
4432
- Price: $0.00257 per request plus $0 per result (maximum $0.00257).
4582
+ Price: $0.00175 per request.
4433
4583
 
4434
4584
  Example:
4435
4585
  res = client.instagram.profile_contact(handle="eminenceorganics")
@@ -4483,7 +4633,7 @@ class AsyncInstagramNamespace:
4483
4633
  same keyword, with a recency filter and numbered pages, use
4484
4634
  instagram.web_reels_search.
4485
4635
 
4486
- Price: $0.0015 per request.
4636
+ Price: $0.0011 per request.
4487
4637
 
4488
4638
  Example:
4489
4639
  res = client.instagram.reels_search(query="travel")
@@ -4537,6 +4687,54 @@ class AsyncInstagramNamespace:
4537
4687
  )
4538
4688
  return RunResult[InstagramSearchData].model_validate(raw)
4539
4689
 
4690
+ async def search_followers(
4691
+ self,
4692
+ *,
4693
+ options: RequestOptions | None = None,
4694
+ **input: Unpack[InstagramSearchFollowersInput],
4695
+ ) -> RunResult[InstagramSearchFollowersData]:
4696
+ """Instagram Search Followers
4697
+
4698
+ Search the followers of a public Instagram account by name or username,
4699
+ using Instagram's own follower search. On smaller accounts it searches the
4700
+ whole follower list and returns close matches ranked by Instagram. On large
4701
+ accounts Instagram does not support searching followers, so the result is
4702
+ the account's most recent followers instead, whatever the query. Returns
4703
+ usernames, names, and profile details.
4704
+
4705
+ Price: $0.0022 per request.
4706
+
4707
+ Example:
4708
+ res = client.instagram.search_followers(query="john", username="milada2788")
4709
+ """
4710
+ raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
4711
+ "instagram.search_followers", dict(input), options
4712
+ )
4713
+ return RunResult[InstagramSearchFollowersData].model_validate(raw)
4714
+
4715
+ async def search_following(
4716
+ self,
4717
+ *,
4718
+ options: RequestOptions | None = None,
4719
+ **input: Unpack[InstagramSearchFollowingInput],
4720
+ ) -> RunResult[InstagramSearchFollowingData]:
4721
+ """Instagram Search Following
4722
+
4723
+ Search the accounts a public Instagram user follows by name or username.
4724
+ Matching is Instagram's own loose search, so results are close matches
4725
+ ranked by Instagram and some may not contain your exact word. Returns
4726
+ usernames, names, and profile details.
4727
+
4728
+ Price: $0.0022 per request.
4729
+
4730
+ Example:
4731
+ res = client.instagram.search_following(query="skin", username="moogooskincare")
4732
+ """
4733
+ raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
4734
+ "instagram.search_following", dict(input), options
4735
+ )
4736
+ return RunResult[InstagramSearchFollowingData].model_validate(raw)
4737
+
4540
4738
  async def search_hashtag(
4541
4739
  self,
4542
4740
  *,
@@ -4597,7 +4795,7 @@ class AsyncInstagramNamespace:
4597
4795
  Search Instagram locations by keyword and return each place's id, name,
4598
4796
  address and coordinates.
4599
4797
 
4600
- Price: $0.0024 per request.
4798
+ Price: $0.0011 per request.
4601
4799
 
4602
4800
  Example:
4603
4801
  res = client.instagram.search_locations(query="Eiffel Tower")
@@ -4729,7 +4927,7 @@ class AsyncInstagramNamespace:
4729
4927
  Fetch a public Instagram account's currently live stories with media, type,
4730
4928
  dimensions, posting time, and 24-hour expiry by username.
4731
4929
 
4732
- Price: $0.0024 per request.
4930
+ Price: $0.0022 per request.
4733
4931
 
4734
4932
  Example:
4735
4933
  res = client.instagram.stories_full(username="natgeo")
@@ -4945,7 +5143,7 @@ class AsyncInstagramNamespace:
4945
5143
  List the posts a public Instagram account has reposted to its feed, with
4946
5144
  cursor pagination.
4947
5145
 
4948
- Price: $0.0012 per request.
5146
+ Price: $0.0011 per request.
4949
5147
 
4950
5148
  Example:
4951
5149
  res = client.instagram.user_reposts(userId="787132")
@@ -4546,7 +4546,7 @@ class LinkedinNamespace:
4546
4546
  experience detail, skills, certifications, connections, and verified flags
4547
4547
  use linkedin.profile.
4548
4548
 
4549
- Price: $0.0008 per request.
4549
+ Price: $0.0012 per request.
4550
4550
 
4551
4551
  Example:
4552
4552
  res = client.linkedin.profile_thin(url="https://www.linkedin.com/in/williamhgates")
@@ -5238,7 +5238,7 @@ class AsyncLinkedinNamespace:
5238
5238
  experience detail, skills, certifications, connections, and verified flags
5239
5239
  use linkedin.profile.
5240
5240
 
5241
- Price: $0.0008 per request.
5241
+ Price: $0.0012 per request.
5242
5242
 
5243
5243
  Example:
5244
5244
  res = client.linkedin.profile_thin(url="https://www.linkedin.com/in/williamhgates")
@@ -746,7 +746,7 @@ class MapsNamespace:
746
746
  Fetch up to 100 Google Maps reviews for a place by place ID, sorted the way
747
747
  you need, in one normalized response.
748
748
 
749
- Price: $0.00605 per request plus $0.00005 per result (maximum $0.0105).
749
+ Price: $0.0035 per request.
750
750
 
751
751
  Example:
752
752
  res = client.maps.reviews(limit=3, placeId="ChIJN1t_tDeuEmsRUsoyG83frY4")
@@ -881,7 +881,7 @@ class AsyncMapsNamespace:
881
881
  Fetch up to 100 Google Maps reviews for a place by place ID, sorted the way
882
882
  you need, in one normalized response.
883
883
 
884
- Price: $0.00605 per request plus $0.00005 per result (maximum $0.0105).
884
+ Price: $0.0035 per request.
885
885
 
886
886
  Example:
887
887
  res = client.maps.reviews(limit=3, placeId="ChIJN1t_tDeuEmsRUsoyG83frY4")