Workflow methods allow you to build multi-step scraping pipelines where the output of one scraper feeds into the next. See the Workflows concept page for an introduction.
Field name in upstream results containing URLs to scrape. If provided, sets input type to upstream_urls
parameter_config
Dict
No
Map upstream result fields to strategy parameters
parameters
Dict
No
Static API parameter overrides
filter
Dict
No
Filter condition (use Filter class to build)
Returns:WorkflowNode — the new downstream node (for further chaining)
If url_field is provided, the node uses upstream_urls input type (extracts URLs from upstream results). If neither url_field nor parameter_config is provided, it uses upstream_data input type (passes full upstream results as context).
Workflow object (creates then runs) or workflow ID
force
bool
No
Force re-run, skipping change detection (default: False)
wait
bool
No
Block until completion (default: True)
timeout
float
No
Maximum seconds to wait (default: 3600)
Returns: Completed run details including status and node_executions (if wait=True) or run details with status (if wait=False). Use get_workflow_output() to fetch results.Raises:MeterError if run fails or times out
# Create and run in one stepworkflow = Workflow("My Scraper")index = workflow.start("index", strategy_id, urls=["https://example.com"])result = client.run_workflow(workflow)# Run an existing workflow by IDresult = client.run_workflow("workflow-uuid")# Fire and forget (don't wait)run = client.run_workflow("workflow-uuid", wait=False)print(f"Run started: {run['id']}")# Force re-run (skip change detection)result = client.run_workflow("workflow-uuid", force=True)
Returns: Completed run with resultsRaises:MeterError if run fails or times out
# Start a run without waitingrun = client.run_workflow("workflow-uuid", wait=False)# Wait for it latercompleted = client.wait_for_workflow("workflow-uuid", run["id"], timeout=600)
Return flat per-URL results instead of grouped by strategy (default: False)
Returns: Latest run output. Default format uses final_results_by_url_grouped; with flat=True uses final_results_by_url. Also includes status, changed_since_previous, run_id, workflow_id, completed_at.Raises:MeterError if no completed runs exist
# Grouped by URL and strategy (default)output = client.get_workflow_output("workflow-uuid")for url, strategies in output["final_results_by_url_grouped"].items(): for strategy, items in strategies.items(): print(f"{strategy}: {len(items)} items")# Flat per-URL resultsoutput = client.get_workflow_output("workflow-uuid", flat=True)for url, items in output["final_results_by_url"].items(): print(f"{url}: {len(items)} items")
Custom JSON metadata included in every webhook payload
webhook_secret
str
No
Secret for X-Webhook-Secret header
webhook_type
str
No
'standard' or 'slack' (default: 'standard')
# Run every hourclient.schedule_workflow(workflow_id, interval_seconds=3600)# Daily at 9 AM with webhookclient.schedule_workflow( workflow_id, cron_expression="0 9 * * *", webhook_url="https://your-app.com/webhook", webhook_metadata={"project": "my-project"})