getanyapi 0.43.0__tar.gz → 0.44.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.43.0 → getanyapi-0.44.0}/PKG-INFO +1 -1
- {getanyapi-0.43.0 → getanyapi-0.44.0}/pyproject.toml +1 -1
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/__init__.py +1 -1
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/amazon.py +35 -4
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/instagram.py +80 -31
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/linkedin.py +5 -2
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/reddit.py +4 -1
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/twitter.py +9 -6
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/youtube.py +15 -1
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/zillow.py +29 -1
- {getanyapi-0.43.0 → getanyapi-0.44.0}/.gitignore +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/README.md +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/_account.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/_async_client.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/_client.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/_errors.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/_idempotency.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/_pagination.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/_transport.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/discovery_types.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/__init__.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/ahrefs.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/airbnb.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/alibaba.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/apollo.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/appstore.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/bluesky.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/booking.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/capterra.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/chatgpt.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/coinmarketcap.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/company.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/company_enrichment.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/company_search.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/congress.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/dexscreener.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/douyin.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/ebay.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/email.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/email_finding.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/email_verification.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/facebook.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/fiverr.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/g2.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/gemini.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/github.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/glassdoor.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/google.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/google_ads.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/google_finance.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/google_shopping.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/hackernews.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/indeed.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/job_search.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/maps.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/mobile_phone.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/naver.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/nextdoor.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/people_search.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/perplexity.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/person.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/person_enrichment.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/pinterest.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/playstore.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/polymarket.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/realtor.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/redfin.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/rednote.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/sec.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/semrush.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/seo.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/snapchat.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/social.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/spotify.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/substack.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/technographics.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/threads.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/tiktok.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/tiktok_shop.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/tripadvisor.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/trustpilot.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/truthsocial.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/upwork.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/walmart.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/web.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/weibo.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/yahoo_finance.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/yelp.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/platforms/zhihu.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/py.typed +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/src/getanyapi/types.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/conftest.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_account.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_client.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_durable_requests.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_envelope.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_errors.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_fixture_roundtrip.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_fixture_sweep.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_pagination.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.0}/tests/test_transport.py +0 -0
- {getanyapi-0.43.0 → getanyapi-0.44.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.44.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
|
|
@@ -35,6 +35,21 @@ class AmazonBestsellersInput(TypedDict, total=False):
|
|
|
35
35
|
"""Maximum number of results to return (1-20, default 20). Range: 1 to 20. Default: 20."""
|
|
36
36
|
preferLatencyUnderMs: NotRequired[int]
|
|
37
37
|
"""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."""
|
|
38
|
+
requireFields: NotRequired[
|
|
39
|
+
list[
|
|
40
|
+
Literal[
|
|
41
|
+
"categoryName",
|
|
42
|
+
"currency",
|
|
43
|
+
"image",
|
|
44
|
+
"offersCount",
|
|
45
|
+
"price",
|
|
46
|
+
"rank",
|
|
47
|
+
"rating",
|
|
48
|
+
"reviewsCount",
|
|
49
|
+
]
|
|
50
|
+
]
|
|
51
|
+
]
|
|
52
|
+
"""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 `offersCount` or `categoryName`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a product that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
|
|
38
53
|
url: Required[str]
|
|
39
54
|
"""Amazon Best Sellers category URL (e.g. https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics)."""
|
|
40
55
|
|
|
@@ -137,6 +152,22 @@ class AmazonSearchInput(TypedDict, total=False):
|
|
|
137
152
|
"""Maximum number of results to return (1-20, default 20). Range: 1 to 20. Default: 20."""
|
|
138
153
|
preferLatencyUnderMs: NotRequired[int]
|
|
139
154
|
"""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."""
|
|
155
|
+
requireFields: NotRequired[
|
|
156
|
+
list[
|
|
157
|
+
Literal[
|
|
158
|
+
"currency",
|
|
159
|
+
"image",
|
|
160
|
+
"isSponsored",
|
|
161
|
+
"listPrice",
|
|
162
|
+
"offersCount",
|
|
163
|
+
"position",
|
|
164
|
+
"price",
|
|
165
|
+
"rating",
|
|
166
|
+
"reviewsCount",
|
|
167
|
+
]
|
|
168
|
+
]
|
|
169
|
+
]
|
|
170
|
+
"""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 `offersCount`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a product that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
|
|
140
171
|
url: Required[str]
|
|
141
172
|
"""Amazon search or category URL to pull results from (e.g. https://www.amazon.com/s?k=gaming+mouse)."""
|
|
142
173
|
|
|
@@ -193,7 +224,7 @@ class AmazonBestsellersItem(BaseModel):
|
|
|
193
224
|
category_name: str | None = Field(
|
|
194
225
|
default=None,
|
|
195
226
|
alias="categoryName",
|
|
196
|
-
description="Best Sellers category name the product ranks in.",
|
|
227
|
+
description="Best Sellers category name the product ranks in, or null when the serving source does not publish it.",
|
|
197
228
|
)
|
|
198
229
|
currency: str | None = Field(
|
|
199
230
|
default=None, description='Price currency symbol or code, e.g. "$".'
|
|
@@ -204,7 +235,7 @@ class AmazonBestsellersItem(BaseModel):
|
|
|
204
235
|
offers_count: int | None = Field(
|
|
205
236
|
default=None,
|
|
206
237
|
alias="offersCount",
|
|
207
|
-
description="Number of available offers
|
|
238
|
+
description="Number of available offers, or null when the serving source does not publish it.",
|
|
208
239
|
)
|
|
209
240
|
price: float | None = Field(
|
|
210
241
|
default=None, description="Listed price; 0 when no offer is available."
|
|
@@ -367,12 +398,12 @@ class AmazonSearchItem(BaseModel):
|
|
|
367
398
|
list_price: float | None = Field(
|
|
368
399
|
default=None,
|
|
369
400
|
alias="listPrice",
|
|
370
|
-
description="Pre-discount list price when on sale
|
|
401
|
+
description="Pre-discount list price when on sale, 0 when not discounted, or null when the serving source does not publish it.",
|
|
371
402
|
)
|
|
372
403
|
offers_count: int | None = Field(
|
|
373
404
|
default=None,
|
|
374
405
|
alias="offersCount",
|
|
375
|
-
description="Number of available offers
|
|
406
|
+
description="Number of available offers, or null when the serving source does not publish it.",
|
|
376
407
|
)
|
|
377
408
|
position: int | None = Field(
|
|
378
409
|
default=None, description="1-based position of the result on the search page."
|
|
@@ -213,10 +213,12 @@ class InstagramProfileContactInput(TypedDict, total=False):
|
|
|
213
213
|
class InstagramReelTranscriptInput(TypedDict, total=False):
|
|
214
214
|
"""Input for Instagram Reel Transcript."""
|
|
215
215
|
|
|
216
|
+
includeTranscript: NotRequired[bool]
|
|
217
|
+
"""Set false to download and host the video only, without transcribing its speech (e.g. false). Default: true."""
|
|
216
218
|
preferLatencyUnderMs: NotRequired[int]
|
|
217
219
|
"""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."""
|
|
218
220
|
url: Required[str]
|
|
219
|
-
"""The URL of a public Instagram reel or video post
|
|
221
|
+
"""The URL of a public Instagram reel or video post (e.g. https://www.instagram.com/reel/C8yKXdRxKqK/), or an Instagram CDN media URL you already hold."""
|
|
220
222
|
wordTimestamps: NotRequired[bool]
|
|
221
223
|
"""Set true to include a precise timestamp for every word in the transcript (e.g. true). Default: false."""
|
|
222
224
|
|
|
@@ -1177,57 +1179,76 @@ class InstagramProfileContactData(BaseModel):
|
|
|
1177
1179
|
|
|
1178
1180
|
class InstagramReelTranscriptData(BaseModel):
|
|
1179
1181
|
items: list[InstagramReelTranscriptItem] = Field(
|
|
1180
|
-
description="
|
|
1182
|
+
description="Record for the requested reel (one item), with its hosted video link, the full transcript text, timed segments, and source video metadata. Populated whenever the provider has data for the entity."
|
|
1181
1183
|
)
|
|
1182
1184
|
|
|
1183
1185
|
|
|
1184
1186
|
class InstagramReelTranscriptItem(BaseModel):
|
|
1185
1187
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
1186
1188
|
|
|
1187
|
-
|
|
1188
|
-
default=None,
|
|
1189
|
-
description="The reel's caption text. Empty when the reel has no caption.",
|
|
1189
|
+
bytes: int | None = Field(
|
|
1190
|
+
default=None, description="Size of the downloaded MP4 in bytes."
|
|
1190
1191
|
)
|
|
1191
|
-
|
|
1192
|
+
duration_seconds: float | None = Field(
|
|
1192
1193
|
default=None,
|
|
1193
|
-
alias="
|
|
1194
|
-
description="
|
|
1194
|
+
alias="durationSeconds",
|
|
1195
|
+
description="Video duration in seconds. Absent when there is no transcript, which is what measures it.",
|
|
1195
1196
|
)
|
|
1196
|
-
|
|
1197
|
+
expires_utc: float | None = Field(
|
|
1197
1198
|
default=None,
|
|
1198
|
-
alias="
|
|
1199
|
-
description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.",
|
|
1199
|
+
alias="expiresUtc",
|
|
1200
|
+
description="UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. After this moment the hosted MP4 is deleted.",
|
|
1200
1201
|
)
|
|
1201
|
-
|
|
1202
|
-
default=None,
|
|
1202
|
+
hosted_url: str | None = Field(
|
|
1203
|
+
default=None,
|
|
1204
|
+
alias="hostedUrl",
|
|
1205
|
+
description="A direct link to the downloaded MP4, hosted by AnyAPI and playable without an Instagram session.",
|
|
1203
1206
|
)
|
|
1204
1207
|
id: str = Field(
|
|
1205
|
-
description="The reel's numeric Instagram media ID, as a string. Populated whenever the provider has data for the entity."
|
|
1208
|
+
description="The reel's numeric Instagram media ID, as a string. Empty when the request supplied a CDN media URL, which carries no post record. Populated whenever the provider has data for the entity."
|
|
1206
1209
|
)
|
|
1207
1210
|
language: str | None = Field(
|
|
1208
1211
|
default=None,
|
|
1209
|
-
description='Detected spoken language (ISO 639-1 code, e.g. "en").
|
|
1212
|
+
description='Detected spoken language (ISO 639-1 code, e.g. "en"). Absent when there is no transcript.',
|
|
1210
1213
|
)
|
|
1211
1214
|
like_count: int | None = Field(
|
|
1212
|
-
default=None,
|
|
1215
|
+
default=None,
|
|
1216
|
+
alias="likeCount",
|
|
1217
|
+
description="Number of likes on the reel. Absent when the lane that served the lookup does not carry a like count.",
|
|
1218
|
+
)
|
|
1219
|
+
media_type: str | None = Field(
|
|
1220
|
+
default=None,
|
|
1221
|
+
alias="mediaType",
|
|
1222
|
+
description="What kind of media this is, as Instagram labels it (for example a video or an image post).",
|
|
1213
1223
|
)
|
|
1214
1224
|
owner_username: str | None = Field(
|
|
1215
1225
|
default=None,
|
|
1216
1226
|
alias="ownerUsername",
|
|
1217
|
-
description="Username of the reel's owner, without the @ prefix. Empty when the
|
|
1227
|
+
description="Username of the reel's owner, without the @ prefix. Empty when the request supplied a CDN media URL.",
|
|
1218
1228
|
)
|
|
1219
1229
|
segments: list[InstagramReelTranscriptSegment] | None = Field(
|
|
1220
1230
|
default=None,
|
|
1221
|
-
description="Time-aligned transcript segments, each with its text and start/end offsets in seconds.",
|
|
1231
|
+
description="Time-aligned transcript segments, each with its text, speaker label, and start/end offsets in seconds. Empty when includeTranscript was false.",
|
|
1232
|
+
)
|
|
1233
|
+
shortcode: str | None = Field(
|
|
1234
|
+
default=None,
|
|
1235
|
+
description="The reel's short code, the part of its instagram.com URL after /reel/. Empty when the request supplied a CDN media URL.",
|
|
1222
1236
|
)
|
|
1223
1237
|
text: str = Field(
|
|
1224
|
-
description="The full speech transcript. Empty when the reel has no detectable spoken audio. Populated whenever the provider has data for the entity."
|
|
1238
|
+
description="The full speech transcript. Empty when the reel has no detectable spoken audio, and when includeTranscript was false. Populated whenever the provider has data for the entity."
|
|
1239
|
+
)
|
|
1240
|
+
thumbnail_url: str | None = Field(
|
|
1241
|
+
default=None,
|
|
1242
|
+
alias="thumbnailUrl",
|
|
1243
|
+
description="A link to the reel's cover image on Instagram. This link is signed by Instagram and stops working after a short time.",
|
|
1225
1244
|
)
|
|
1226
1245
|
url: str = Field(
|
|
1227
|
-
description="
|
|
1246
|
+
description="The reel URL the request asked for, returned as sent. Populated whenever the provider has data for the entity."
|
|
1228
1247
|
)
|
|
1229
1248
|
view_count: int | None = Field(
|
|
1230
|
-
default=None,
|
|
1249
|
+
default=None,
|
|
1250
|
+
alias="viewCount",
|
|
1251
|
+
description="Number of video views. Absent when the lane that served the lookup does not carry a view count.",
|
|
1231
1252
|
)
|
|
1232
1253
|
|
|
1233
1254
|
|
|
@@ -1238,6 +1259,10 @@ class InstagramReelTranscriptSegment(BaseModel):
|
|
|
1238
1259
|
default=None,
|
|
1239
1260
|
description="Segment end offset in seconds from the start of the video.",
|
|
1240
1261
|
)
|
|
1262
|
+
speaker: str | None = Field(
|
|
1263
|
+
default=None,
|
|
1264
|
+
description='Which speaker said this segment, as a stable label within this transcript (e.g. "0", "1").',
|
|
1265
|
+
)
|
|
1241
1266
|
start: float | None = Field(
|
|
1242
1267
|
default=None,
|
|
1243
1268
|
description="Segment start offset in seconds from the start of the video.",
|
|
@@ -1245,6 +1270,24 @@ class InstagramReelTranscriptSegment(BaseModel):
|
|
|
1245
1270
|
text: str | None = Field(
|
|
1246
1271
|
default=None, description="The segment's transcribed text."
|
|
1247
1272
|
)
|
|
1273
|
+
words: list[InstagramReelTranscriptWord] | None = Field(
|
|
1274
|
+
default=None,
|
|
1275
|
+
description="Every word in the segment with its own timing. Present only when wordTimestamps was true.",
|
|
1276
|
+
)
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
class InstagramReelTranscriptWord(BaseModel):
|
|
1280
|
+
model_config = ConfigDict(extra="allow")
|
|
1281
|
+
|
|
1282
|
+
end: float | None = Field(
|
|
1283
|
+
default=None,
|
|
1284
|
+
description="Word end offset in seconds from the start of the video.",
|
|
1285
|
+
)
|
|
1286
|
+
start: float | None = Field(
|
|
1287
|
+
default=None,
|
|
1288
|
+
description="Word start offset in seconds from the start of the video.",
|
|
1289
|
+
)
|
|
1290
|
+
text: str | None = Field(default=None, description="The word as spoken.")
|
|
1248
1291
|
|
|
1249
1292
|
|
|
1250
1293
|
class InstagramReelsSearchData(BaseModel):
|
|
@@ -2423,7 +2466,7 @@ class InstagramNamespace:
|
|
|
2423
2466
|
Fetch a single Instagram post or reel by URL (media URLs, like count, owner,
|
|
2424
2467
|
type) as normalized JSON.
|
|
2425
2468
|
|
|
2426
|
-
Price: $0.
|
|
2469
|
+
Price: $0.0005 per request.
|
|
2427
2470
|
|
|
2428
2471
|
Example:
|
|
2429
2472
|
res = client.instagram.post(url="https://www.instagram.com/reel/DWzrfE2kaY8/")
|
|
@@ -2549,13 +2592,16 @@ class InstagramNamespace:
|
|
|
2549
2592
|
) -> RunResult[InstagramReelTranscriptData]:
|
|
2550
2593
|
"""Instagram Reel Transcript
|
|
2551
2594
|
|
|
2552
|
-
|
|
2553
|
-
|
|
2595
|
+
Download any public Instagram reel or video post to a hosted MP4 link, with
|
|
2596
|
+
an optional full speech transcript, speaker labels, and word-level
|
|
2597
|
+
timestamps. Transcription runs on MAI-Transcribe-2, chosen for its accuracy
|
|
2598
|
+
and its speaker labels. If you only want the text and not the video file,
|
|
2599
|
+
instagram.media_transcript is the cheaper transcript-only option.
|
|
2554
2600
|
|
|
2555
|
-
Price: $0.
|
|
2601
|
+
Price: $0.005 per request plus $0.006 per audio minute (maximum $0.05).
|
|
2556
2602
|
|
|
2557
2603
|
Example:
|
|
2558
|
-
res = client.instagram.reel_transcript(url="https://www.instagram.com/reel/
|
|
2604
|
+
res = client.instagram.reel_transcript(includeTranscript=True, url="https://www.instagram.com/reel/CfY6jCIgH-P/", wordTimestamps=False)
|
|
2559
2605
|
"""
|
|
2560
2606
|
raw = self._client._run_raw( # pyright: ignore[reportPrivateUsage]
|
|
2561
2607
|
"instagram.reel_transcript", dict(input), options
|
|
@@ -3441,7 +3487,7 @@ class AsyncInstagramNamespace:
|
|
|
3441
3487
|
Fetch a single Instagram post or reel by URL (media URLs, like count, owner,
|
|
3442
3488
|
type) as normalized JSON.
|
|
3443
3489
|
|
|
3444
|
-
Price: $0.
|
|
3490
|
+
Price: $0.0005 per request.
|
|
3445
3491
|
|
|
3446
3492
|
Example:
|
|
3447
3493
|
res = client.instagram.post(url="https://www.instagram.com/reel/DWzrfE2kaY8/")
|
|
@@ -3567,13 +3613,16 @@ class AsyncInstagramNamespace:
|
|
|
3567
3613
|
) -> RunResult[InstagramReelTranscriptData]:
|
|
3568
3614
|
"""Instagram Reel Transcript
|
|
3569
3615
|
|
|
3570
|
-
|
|
3571
|
-
|
|
3616
|
+
Download any public Instagram reel or video post to a hosted MP4 link, with
|
|
3617
|
+
an optional full speech transcript, speaker labels, and word-level
|
|
3618
|
+
timestamps. Transcription runs on MAI-Transcribe-2, chosen for its accuracy
|
|
3619
|
+
and its speaker labels. If you only want the text and not the video file,
|
|
3620
|
+
instagram.media_transcript is the cheaper transcript-only option.
|
|
3572
3621
|
|
|
3573
|
-
Price: $0.
|
|
3622
|
+
Price: $0.005 per request plus $0.006 per audio minute (maximum $0.05).
|
|
3574
3623
|
|
|
3575
3624
|
Example:
|
|
3576
|
-
res = client.instagram.reel_transcript(url="https://www.instagram.com/reel/
|
|
3625
|
+
res = client.instagram.reel_transcript(includeTranscript=True, url="https://www.instagram.com/reel/CfY6jCIgH-P/", wordTimestamps=False)
|
|
3577
3626
|
"""
|
|
3578
3627
|
raw = await self._client._arun_raw( # pyright: ignore[reportPrivateUsage]
|
|
3579
3628
|
"instagram.reel_transcript", dict(input), options
|
|
@@ -2817,7 +2817,8 @@ class LinkedinProfileThinData(BaseModel):
|
|
|
2817
2817
|
default=None, description="About/summary text of the profile."
|
|
2818
2818
|
)
|
|
2819
2819
|
articles: list[LinkedinProfileThinArticle] | None = Field(
|
|
2820
|
-
default=None,
|
|
2820
|
+
default=None,
|
|
2821
|
+
description="The profile's published articles, or null when the serving source does not publish them.",
|
|
2821
2822
|
)
|
|
2822
2823
|
avatar_url: str | None = Field(
|
|
2823
2824
|
default=None, alias="avatarUrl", description="URL of the profile avatar image."
|
|
@@ -2835,7 +2836,9 @@ class LinkedinProfileThinData(BaseModel):
|
|
|
2835
2836
|
)
|
|
2836
2837
|
name: str = Field(description="Full name of the profile owner.")
|
|
2837
2838
|
recent_posts: list[LinkedinProfileThinRecentPost] | None = Field(
|
|
2838
|
-
default=None,
|
|
2839
|
+
default=None,
|
|
2840
|
+
alias="recentPosts",
|
|
2841
|
+
description="The profile's recent posts, or null when the serving source does not publish them.",
|
|
2839
2842
|
)
|
|
2840
2843
|
|
|
2841
2844
|
|
|
@@ -826,7 +826,10 @@ class RedditUserPostsMedia(BaseModel):
|
|
|
826
826
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
827
827
|
|
|
828
828
|
height: int | None = None
|
|
829
|
-
type_: str = Field(
|
|
829
|
+
type_: str | None = Field(
|
|
830
|
+
alias="type",
|
|
831
|
+
description="One of photo, video, or gif, or null when the serving source wraps a thumbnail it cannot classify.",
|
|
832
|
+
)
|
|
830
833
|
url: str = Field(
|
|
831
834
|
description="Image URL. For a video or GIF this is the poster/thumbnail frame."
|
|
832
835
|
)
|
|
@@ -249,7 +249,7 @@ class TwitterUserPostsInput(TypedDict, total=False):
|
|
|
249
249
|
]
|
|
250
250
|
]
|
|
251
251
|
]
|
|
252
|
-
"""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 `isReply`, 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 tweet that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. 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."""
|
|
252
|
+
"""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 `isPinned` or `isReply`, 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 tweet that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. 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."""
|
|
253
253
|
|
|
254
254
|
|
|
255
255
|
class TwitterUserTweetsInput(TypedDict, total=False):
|
|
@@ -260,7 +260,7 @@ class TwitterUserTweetsInput(TypedDict, total=False):
|
|
|
260
260
|
handle: Required[str]
|
|
261
261
|
"""Twitter/X handle without the leading @."""
|
|
262
262
|
limit: NotRequired[int]
|
|
263
|
-
"""Maximum number of authored tweets and replies to return in
|
|
263
|
+
"""Maximum number of authored tweets and replies to return in THIS page (1-100). Sources return fewer - most cap at 20 - so read `nextCursor` and pass it back as `cursor` to walk further rather than asking for one large page. Range: 1 to 100. Default: 20."""
|
|
264
264
|
preferLatencyUnderMs: NotRequired[int]
|
|
265
265
|
"""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."""
|
|
266
266
|
requireFields: NotRequired[
|
|
@@ -280,7 +280,7 @@ class TwitterUserTweetsInput(TypedDict, total=False):
|
|
|
280
280
|
]
|
|
281
281
|
]
|
|
282
282
|
]
|
|
283
|
-
"""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 `
|
|
283
|
+
"""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 `isPinned` or `nextCursor`, 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. 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."""
|
|
284
284
|
requireSinglePage: NotRequired[bool]
|
|
285
285
|
"""Require a lane that can return the requested limit in one response."""
|
|
286
286
|
|
|
@@ -1030,9 +1030,9 @@ class TwitterUserPostsTweet(BaseModel):
|
|
|
1030
1030
|
id: str = Field(
|
|
1031
1031
|
description="The post's numeric tweet ID, represented as a string. Populated whenever the provider has data for the entity."
|
|
1032
1032
|
)
|
|
1033
|
-
is_pinned: bool = Field(
|
|
1033
|
+
is_pinned: bool | None = Field(
|
|
1034
1034
|
alias="isPinned",
|
|
1035
|
-
description="Whether X marks the post as pinned on the profile.",
|
|
1035
|
+
description="Whether X marks the post as pinned on the profile, or null when the serving source does not publish it.",
|
|
1036
1036
|
)
|
|
1037
1037
|
is_reply: bool | None = Field(
|
|
1038
1038
|
default=None,
|
|
@@ -1099,7 +1099,10 @@ class TwitterUserTweetsTweet(BaseModel):
|
|
|
1099
1099
|
id: str = Field(
|
|
1100
1100
|
description="Populated whenever the provider has data for the entity."
|
|
1101
1101
|
)
|
|
1102
|
-
is_pinned: bool = Field(
|
|
1102
|
+
is_pinned: bool | None = Field(
|
|
1103
|
+
alias="isPinned",
|
|
1104
|
+
description="Whether X marks the post as pinned on the profile, or null when the serving source does not publish it.",
|
|
1105
|
+
)
|
|
1103
1106
|
is_reply: bool | None = Field(default=None, alias="isReply")
|
|
1104
1107
|
lang: str | None = None
|
|
1105
1108
|
likes: int
|
|
@@ -248,6 +248,20 @@ class YoutubeVideoTranscriptFullInput(TypedDict, total=False):
|
|
|
248
248
|
"""Preferred caption language code (e.g. "en", "es"). Defaults to English."""
|
|
249
249
|
preferLatencyUnderMs: NotRequired[int]
|
|
250
250
|
"""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."""
|
|
251
|
+
requireFields: NotRequired[
|
|
252
|
+
list[
|
|
253
|
+
Literal[
|
|
254
|
+
"channel",
|
|
255
|
+
"durationSeconds",
|
|
256
|
+
"endSeconds",
|
|
257
|
+
"isAiGenerated",
|
|
258
|
+
"startSeconds",
|
|
259
|
+
"text",
|
|
260
|
+
"title",
|
|
261
|
+
]
|
|
262
|
+
]
|
|
263
|
+
]
|
|
264
|
+
"""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 `isAiGenerated`, 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 transcript that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge."""
|
|
251
265
|
url: Required[str]
|
|
252
266
|
"""YouTube video or Short URL (e.g. "https://www.youtube.com/watch?v=dQw4w9WgXcQ" or "https://www.youtube.com/shorts/Fir1x9cw2vg")."""
|
|
253
267
|
|
|
@@ -807,7 +821,7 @@ class YoutubeVideoTranscriptFullData(BaseModel):
|
|
|
807
821
|
is_ai_generated: bool | None = Field(
|
|
808
822
|
default=None,
|
|
809
823
|
alias="isAiGenerated",
|
|
810
|
-
description="True when the words were recognized from the audio by the serving lane rather than read from any YouTube caption track.",
|
|
824
|
+
description="True when the words were recognized from the audio by the serving lane rather than read from any YouTube caption track, or null when the serving source does not say.",
|
|
811
825
|
)
|
|
812
826
|
is_auto_generated: bool = Field(
|
|
813
827
|
alias="isAutoGenerated",
|
|
@@ -96,6 +96,30 @@ class ZillowSearchInput(TypedDict, total=False):
|
|
|
96
96
|
"""Listing type: buy (for sale), rent, or sold. Default: buy."""
|
|
97
97
|
preferLatencyUnderMs: NotRequired[int]
|
|
98
98
|
"""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."""
|
|
99
|
+
requireFields: NotRequired[
|
|
100
|
+
list[
|
|
101
|
+
Literal[
|
|
102
|
+
"baths",
|
|
103
|
+
"beds",
|
|
104
|
+
"city",
|
|
105
|
+
"currency",
|
|
106
|
+
"daysOnZillow",
|
|
107
|
+
"latitude",
|
|
108
|
+
"livingArea",
|
|
109
|
+
"longitude",
|
|
110
|
+
"lotSize",
|
|
111
|
+
"price",
|
|
112
|
+
"propertyType",
|
|
113
|
+
"rentZestimate",
|
|
114
|
+
"state",
|
|
115
|
+
"status",
|
|
116
|
+
"yearBuilt",
|
|
117
|
+
"zestimate",
|
|
118
|
+
"zipcode",
|
|
119
|
+
]
|
|
120
|
+
]
|
|
121
|
+
]
|
|
122
|
+
"""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 `yearBuilt`, 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."""
|
|
99
123
|
showOnlyPriceReductions: NotRequired[bool]
|
|
100
124
|
"""Only show listings with a price reduction. Buy searches only; ignored for rentals (e.g. true)."""
|
|
101
125
|
sortBy: NotRequired[
|
|
@@ -242,7 +266,11 @@ class ZillowSearchItem(BaseModel):
|
|
|
242
266
|
url: str = Field(
|
|
243
267
|
description="Absolute Zillow listing URL. Populated whenever the provider has data for the entity."
|
|
244
268
|
)
|
|
245
|
-
year_built: int | None = Field(
|
|
269
|
+
year_built: int | None = Field(
|
|
270
|
+
default=None,
|
|
271
|
+
alias="yearBuilt",
|
|
272
|
+
description="Year the home was built, or null when the serving source does not publish it.",
|
|
273
|
+
)
|
|
246
274
|
zestimate: float | None = Field(
|
|
247
275
|
default=None, description="Zillow estimated market value."
|
|
248
276
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|