Skip to content
Get started
Guides
Parameters & Configuration

Choosing an Effort Level

Every extract and generate request accepts an optional effort parameter that controls the tradeoff between speed and capability.

Every /extract and /generate request accepts an optional effort parameter. It controls the tradeoff between speed and capability; specifically, how hard Tabstack works to render and process the target page before extracting data.


LevelSpeedWhat it does
min1–5sFetches raw HTML. No JavaScript execution. Use for static, server-rendered pages.
standard3–15sFetches with enhanced reliability and light JS handling. Default for all requests.
max15–60sFull headless browser rendering. Executes JavaScript, waits for dynamic content to load.

Default is standard when the parameter is omitted.


Use when:

  • The page is server-rendered HTML (blogs, news sites, documentation)
  • Speed matters and the content doesn’t require JavaScript to appear
  • You’re running high-volume extractions and want lowest latency

Don’t use when:

  • The page uses a JavaScript framework (React, Vue, Next.js, Angular)
  • Content is loaded asynchronously after the initial HTML response
  • You see empty fields or missing data with standard
const result = await client.extract.json({
url: 'https://news.ycombinator.com', // Static HTML — min works fine
effort: 'min',
json_schema: { /* ... */ }
})

standard: The default, works for most pages

Section titled “standard: The default, works for most pages”

Use when:

  • You’re not sure what the page renders like
  • You want reliable results without committing to full browser rendering time
  • The page may have some JavaScript but its primary content is in the initial HTML

This is the right starting point. If results feel incomplete, move to max.

const result = await client.extract.json({
url: 'https://example.com/products',
// effort: 'standard' is the default — can be omitted
json_schema: { /* ... */ }
})

Use when:

  • The page is a Single Page Application (React, Vue, Angular, Next.js client-side)
  • Content loads lazily or after user interaction
  • Pricing tables, product listings, or data grids are rendered by JavaScript
  • You’re getting empty fields with standard
  • The page is behind a login with JS-rendered content after auth
const result = await client.extract.json({
url: 'https://app.example.com/dashboard',
effort: 'max', // Wait for JS to fully render
json_schema: { /* ... */ }
})

Is the page server-rendered HTML with no JavaScript?
└─ Yes → try 'min'
└─ No or unsure → use 'standard' (default)
Are you getting empty fields or incomplete data?
└─ Yes → upgrade to 'max'
Is the page a React/Vue/Angular SPA or loads content dynamically?
└─ Yes → use 'max' from the start

max uses full headless browser rendering. It consumes more compute than min or standard. If your target page consistently needs max, factor this into your per-request cost expectations.

Default request timeout is 60 seconds. max requests on complex SPAs can approach this limit on very slow pages. If you’re hitting timeouts, consider whether the page can be targeted more specifically with a starting URL or nocache.