Feature Extractors
After your data is connected, extractors run in parallel to pull out structured features, embeddings, entities, transcripts, and more.
7 production extractors, each with a README, a live schema, and a Studio path
Web Scraper + Multimodal Embeddings
Crawl sites (docs, job boards, news, SPAs) and extract text, code & image embeddings in one pass.
Multimodal Video/Audio/Image (Vertex v1 · Gemini v2)
Unified embeddings for video, audio, image & text: FFmpeg scene/silence chunking, Whisper transcription, thumbnails.
Universal All-in-One (Gemini)
One extractor for image, video, audio & documents: auto-detects modality and applies the right pipeline.
Multi-File Object Embeddings (Gemini)
Embed ALL files of an object (images, PDFs, video, audio, text) into one 3072-D Gemini vector.
Document Layout Graph
Decompose PDFs into spatial blocks: paragraphs, tables, forms, headers: with layout classification & confidence.
Passthrough (Storage Only)
Store and canonicalize objects with zero ML: metadata-only ingestion.
Scrolling/Marquee Text OCR
Reads scrolling video text via phase-correlation band detection, panoramic stitching, and VLM OCR.
What's new in extractors
Full changelog- Jul 30, 2026The web scraper gets through reCAPTCHA v2 gatesScrapes that hit a reCAPTCHA v2 interstitial used to stop there. The scraper now detects the gate, extracts the sitekey, solves it, injects the token and fires the widget callback. One case needed more than that. Form-style gates run a callback that clears error state without submitting anything, so the page sat on the gate even though every step had worked. When the callback leaves the page un-navigated and still thin, the widget's enclosing form is submitted directly, bypassing client validation that can swallow a programmatic submit. Pages whose callback does navigate are left alone. The JS render path was also brought to parity so the same gate handling applies whether or not the page needs rendering.
- Jul 29, 2026One blocked page no longer fails every other URL in the scrapeA failed scrape leaves its columns empty, and pandas fills those with NaN floats. The document expander then sliced and measured them as if they were strings and lists, so a single unreachable page crashed the processor for the entire Ray batch. Observed on a four-URL run where one publisher's captcha took down the three siblings that had scraped perfectly. The subtle part is why the obvious guard did not help: `x or []` does not rescue a NaN, because NaN is truthy, so it returns the NaN and the length check still raises. Every column the expander touches is now normalised once, up front, so a blocked page fails only itself.
- Jul 29, 2026Scraping JavaScript pages no longer runs out of memory mid-runThe scraper's headless Chromium was landing on a 6 GiB worker and getting OOM-killed, which showed up as a scrape that simply died rather than an error you could act on. Sizing is now explicit: one URL per actor call so a call means exactly one browser session, and a memory reservation large enough that two sessions can never share a pod. The extractor runs on a dedicated 16 GiB profile applied at the worker level, deliberately without changing its tier, so a browser-heavy extractor does not get pulled onto the shared cluster as a side effect.
- Jul 29, 2026The extractor catalog now lists only extractors that actually exist`/extractors` advertised 204 extractors against a live catalog of 11. Each of the other 193 rendered a complete product page, with a playground, a parameter table and a button to go build with it, for a capability that was never there. Anyone who arrived from a search for one of them got a convincing page and a dead end. The catalog is now gated on what the production API actually serves, and each card carries the extractor's real one-line description taken from its own README rather than hand-written copy. Two things keep it honest: the page content is generated from those READMEs, which are themselves generated from the live extractor schema, so a parameter or output field cannot be claimed unless it exists; and CI diffs the catalog against the live API on every run, failing the build if we ever advertise an extractor we do not serve.