Releases: crawlsnap/crawlsnap-python
Release list
v0.9.0 — SerpApi
Contract: crawlsnap-contracts v0.12.0
Added
-
SerpApi — new
serp_apiresource (sync and async) with a single method,
search(query, *, count, page, language, country, safe, time_range, site, filetype), returning the typedSerpSearchData: ranked Google results for
one result page plus the related searches Google suggests. Each result's
urlis the real target URL, already unwrapped from Google's redirector.
Available ascrawlsnap.serp_apion the module singleton,client.serp_api
on an explicit client, andserp_api.v1for version pinning.Refinements left unset are omitted from the request so the API's own defaults
apply — the SDK does not pin a default the API is free to move.
v0.8.0
Contract: crawlsnap-contracts v0.11.0
Added
sport_snap.channel_repeats()(sync and async) accepts an optionalcursor
keyword that is forwarded verbatim as thecursorquery parameter. The
channel repeat schedule is served as ~20-fixture pages with
fixtures_next/fixtures_prevcursors; without this, callers were pinned
to the first page (roughly two days of schedule). The region is always taken
fromiso_code, never from the cursor.
Changed
- Models regenerated from the bundled contract: the cursor fields on the
channel repeat payload are now documented.
v0.7.0
v0.6.0
v0.5.0 — SportSnap resource
Adds the sport_snap resource (sync + async): channel, channel_schedule, match, country_channels, daily_schedule — live football (soccer) TV listings with typed models generated from the public contract. Same .v1 pinning, raw_response, and typed-error semantics as the other products.
Full Changelog: v0.4.0...v0.5.0
v0.4.0
v0.3.0
Highlights
- Async client —
AsyncCrawlSnap, the awaitable twin ofCrawlSnapwith an identical surface (same constructor, resources, retries, typed errors). Methods are coroutines;subdo_snap.scan_iteris an async generator. Ideal for enriching many indicators concurrently withasyncio.gather. - Stable-default per-API versioning — the product version is now a value carried in the request path, not a class hierarchy. Unpinned calls target a stable default that never moves on its own: upgrading the SDK no longer silently retargets your calls at a newer API version. Per-product
.v1pinning is unchanged. - Correct
raw_responsetyping —@overloadsoraw_response=Trueis typed asRawResponseand the default returns the typed model.
Internals: IO-free envelope/retry logic extracted to _base.py and shared by the sync and async clients.
v0.2.0
Per-API version pinning
Each CrawlSnap data product is now versioned independently. A direct resource call targets that product's latest API version; pin a single product to a specific version via its .v1 namespace — without affecting the others.
crawlsnap.vector_snap.ip("8.8.8.8") # latest VectorSnap
crawlsnap.vector_snap.v1.ip("8.8.8.8") # pinned VectorSnap v1
crawlsnap.pulse_snap.url("https://x.com") # unaffected — still latest PulseSnapPinned namespaces are typed and lazily cached, and each version keeps its own return types so a future v2 can coexist with v1 instead of breaking v1 callers.
v0.1.1
v0.1.0
Initial release of the official CrawlSnap Python SDK.
crawlsnap.init(api_key=...)singleton + explicitCrawlSnapclient- Resource namespacing:
crawlsnap.vector_snap.ip("8.8.8.8"),pulse_snap,subdo_snap - Returns typed data; raises typed exceptions (NotFoundError, QuotaExceededError, RateLimitError, ...)
- Built-in retries with exponential backoff, configurable timeout, auto-pagination
- httpx + pydantic v2; Python 3.8+
Install: pip install crawlsnap