Skip to content

Parallel Ai

Fetched 2026-03-15 from docs.parallel.ai

Parallel is a web integration platform that combines AI inference with live web data for research, enrichment, and automation. It provides two categories of APIs:

  • Web Tools — Synchronous, low-latency APIs for direct web access (Search, Extract)
  • Web Agents — AI-powered APIs combining inference with multi-step research workflows (Task, FindAll, Monitor, Chat)

Authentication is via API key passed in the x-api-key header. SDKs are available for Python (parallel-web on PyPI) and TypeScript (parallel-web on npm).


Searches the web and returns LLM-optimized excerpts.

  • Endpoint: POST https://api.parallel.ai/v1beta/search
  • Auth: x-api-key header
ParameterTypeRequiredDescription
objectivestringOne of objective/search_queries requiredNatural-language description of what to find
search_queriesstring[]One of objective/search_queries requiredKeyword search queries with optional operators
modeone-shot | agentic | fastNoControls comprehensiveness vs speed. Default: one-shot
max_resultsintegerNoUpper bound on results. Default: 10
excerptsExcerptSettingsNoExcerpt configuration (see below)
source_policySourcePolicyNoDomain/date filtering
fetch_policyFetchPolicyNoCache vs live content strategy

ExcerptSettings:

FieldTypeDescription
max_chars_per_resultintegerPer-URL character limit (min 1000)
max_chars_totalintegerTotal characters across all URLs (min 1000)

SourcePolicy:

FieldTypeDescription
include_domainsstring[]Restrict to these domains/extensions, e.g. ["wikipedia.org", ".edu"]
exclude_domainsstring[]Exclude these domains/extensions
after_datestringRFC 3339 date (YYYY-MM-DD), filter to results on or after this date

FetchPolicy:

FieldTypeDescription
max_age_secondsintegerCache age threshold triggering live fetch. Min 600
timeout_secondsnumberTimeout for live content fetching
disable_cache_fallbackbooleanIf true, error when live fetch fails. Default: false
{
"search_id": "search_cad0a6d2dec046bd95ae900527d880e7",
"results": [
{
"url": "https://www.example.com",
"title": "Sample webpage title",
"publish_date": "2024-01-15",
"excerpts": ["Relevant excerpt 1", "Relevant excerpt 2"]
}
],
"warnings": [],
"usage": [{ "name": "sku_search_additional_results", "count": 1 }]
}
Terminal window
curl -X POST https://api.parallel.ai/v1beta/search \
-H 'Content-Type: application/json' \
-H 'x-api-key: <api-key>' \
-d '{"objective": "What was the GDP of France in 2023?"}'
from parallel import Parallel
client = Parallel()
search = client.beta.search(objective="What was the GDP of France in 2023?")
print(search.results)

Extracts clean, LLM-optimized markdown from specific web URLs.

  • Endpoint: POST https://api.parallel.ai/v1beta/extract
  • Auth: x-api-key header
ParameterTypeRequiredDescription
urlsstring[]YesURLs to extract from
objectivestringNoFocuses extraction on a specific objective
search_queriesstring[]NoKeyword queries to focus extraction
fetch_policyFetchPolicyNoCache vs live fetch behavior
excerptsboolean | ExcerptSettingsNoInclude relevant excerpts. Default: true
full_contentboolean | FullContentSettingsNoInclude full page content. Default: false

FullContentSettings:

FieldTypeDescription
max_chars_per_resultintegerCharacter limit per URL
{
"extract_id": "string",
"results": [
{
"url": "https://www.example.com",
"title": "Page Title",
"publish_date": "2024-01-15",
"excerpts": ["Relevant content..."],
"full_content": "# Full markdown..."
}
],
"errors": [
{
"url": "https://failed.example.com",
"error_type": "fetch_error",
"http_status_code": 403,
"content": "Access denied"
}
],
"warnings": [],
"usage": []
}
from parallel import Parallel
client = Parallel()
extract = client.beta.extract(
urls=["https://www.example.com"],
excerpts=True,
full_content=True
)

Executes complex, multi-step web research operations. Supports deep research and structured data enrichment with citations, reasoning, and confidence scores.

  • Create: POST https://api.parallel.ai/v1/tasks/runs
  • Retrieve status: GET https://api.parallel.ai/v1/tasks/runs/{run_id}
  • Retrieve result: GET https://api.parallel.ai/v1/tasks/runs/{run_id}/result
  • Stream events: GET https://api.parallel.ai/v1/tasks/runs/{run_id}/events (SSE)
  • Auth: x-api-key header
ParameterTypeRequiredDescription
processorstringYesProcessor tier (see Processor Tiers below)
inputstring | objectYesInput text or structured JSON object
task_specTaskSpecNoTask specification with input/output schemas
metadataobjectNoUser-provided metadata (key max 16 chars, value max 512 chars)
source_policySourcePolicyNoDomain filtering for web search
previous_interaction_idstringNoInteraction ID for context reuse
mcp_serversMcpServer[]NoOptional MCP servers for the run
enable_eventsbooleanNoEnable execution progress tracking
webhookWebhookNoCallback URL for completion notifications

Create Task Run — Response (202 Accepted)

Section titled “Create Task Run — Response (202 Accepted)”
{
"run_id": "trun_9907962f83aa4d9d98fd7f4bf745d654",
"interaction_id": "trun_9907962f83aa4d9d98fd7f4bf745d654",
"status": "queued",
"is_active": true,
"processor": "core",
"metadata": { "my_key": "my_value" },
"created_at": "2025-04-23T20:21:48.037943Z",
"modified_at": "2025-04-23T20:21:48.037943Z"
}

Task statuses: queued, action_required, running, completed, failed, cancelling, cancelled

Retrieve Task Run Result — Response (200)

Section titled “Retrieve Task Run Result — Response (200)”
{
"run": {
"run_id": "trun_9907962f83aa4d9d98fd7f4bf745d654",
"status": "completed",
"is_active": false,
"processor": "core"
},
"output": {
"basis": [
{
"field": "gdp",
"reasoning": "Based on World Bank data...",
"citations": [{ "url": "...", "excerpt": "..." }],
"confidence": "high"
}
],
"type": "json",
"content": { "gdp": "$3.1 trillion (2023)" }
}
}

The Task API excels at enriching structured data. Define input and output schemas:

from parallel import Parallel
client = Parallel()
task_run = client.task_run.create(
processor="core",
input={"company_name": "Acme Corp", "website": "https://acme.com"},
task_spec={
"input_schema": {
"type": "object",
"properties": {
"company_name": {"type": "string", "description": "Company name"},
"website": {"type": "string", "description": "Company website"}
}
},
"output_schema": {
"type": "object",
"properties": {
"founding_date": {"type": "string", "description": "When the company was founded"},
"employee_count": {"type": "string", "description": "Approximate number of employees"},
"funding": {"type": "string", "description": "Total funding raised"}
}
}
}
)
# Poll for result
result = client.task_run.retrieve_result(run_id=task_run.run_id)

Each output field includes basis with citations, reasoning, and confidence (high/medium/low).

  • Create group: POST https://api.parallel.ai/v1beta/tasks/groups
  • Add runs: POST https://api.parallel.ai/v1beta/tasks/groups/{taskgroup_id}/runs
  • Retrieve group: GET https://api.parallel.ai/v1beta/tasks/groups/{taskgroup_id}
  • Fetch runs: GET https://api.parallel.ai/v1beta/tasks/groups/{taskgroup_id}/runs
  • Stream events: GET https://api.parallel.ai/v1beta/tasks/groups/{taskgroup_id}/events (SSE)
TierLatencyMax FieldsBest For
lite10s-60s~2Basic metadata, fallback, low latency
base15s-100s~5Standard data enrichment
core60s-5min~10Cross-referenced, moderately complex outputs
core2x60s-10min~10More demanding cross-referenced analysis
pro2min-10min~20Exploratory web research
ultra5min-25min~20Advanced multi-source deep research
ultra2x5min-50min~25Complex extended research
ultra4x5min-90min~25Very difficult deep research
ultra8x5min-2hr~25Extremely difficult research problems

All tiers have -fast variants (e.g., core-fast) that are 2-5x faster but optimize for speed over freshness. Use fast for interactive apps and testing; use standard for freshness-critical tasks.

StatusDescription
401Unauthorized: invalid or missing credentials
402Payment required: insufficient credit
403Forbidden: invalid processor
422Validation error
429Rate limit exceeded

Discovers and enriches entities from the web matching natural language criteria.

  • Create: POST https://api.parallel.ai/v1beta/findall/runs
  • Status: GET https://api.parallel.ai/v1beta/findall/runs/{findall_id}
  • Result: GET https://api.parallel.ai/v1beta/findall/runs/{findall_id}/result
  • Stream: GET https://api.parallel.ai/v1beta/findall/runs/{findall_id}/events (SSE)
  • Extend: POST https://api.parallel.ai/v1beta/findall/runs/{findall_id}/extend
  • Cancel: POST https://api.parallel.ai/v1beta/findall/runs/{findall_id}/cancel
  • Ingest: POST https://api.parallel.ai/v1beta/findall/ingest (NL to structured spec)
  • Auth: x-api-key header
ParameterTypeRequiredDescription
objectivestringYesNatural language objective
entity_typestringYesType of entity to find
match_conditionsMatchCondition[]YesConditions entities must satisfy
generatorpreview | base | core | proYesGenerator tier
match_limitintegerYesMax matches to find (5-1000)
exclude_listExcludeCandidate[]NoEntities to exclude from results
metadataobjectNoCustom key-value pairs
webhookWebhookNoWebhook configuration

MatchCondition:

FieldTypeDescription
namestringCondition identifier
descriptionstringDetailed specification with guidance

ExcludeCandidate:

FieldTypeDescription
namestringEntity name to exclude
urlstringEntity URL to exclude
{
"findall_id": "findall_56ccc4d188fb41a0803a935cf485c774",
"status": {
"status": "queued",
"is_active": true,
"metrics": {
"generated_candidates_count": 0,
"matched_candidates_count": 0
},
"termination_reason": null
},
"generator": "base",
"metadata": {},
"created_at": "2025-09-10T21:02:08.626446Z",
"modified_at": "2025-09-10T21:02:08.627376Z"
}

Termination reasons: low_match_rate, match_limit_met, candidates_exhausted, user_cancelled, error_occurred, timeout, insufficient_funds

Converts a natural language objective into a structured FindAll spec:

from parallel import Parallel
client = Parallel()
ingest = client.beta.findall.ingest(
objective="Find all AI companies that raised Series A funding in 2024"
)
run = client.beta.findall.create(
objective=ingest.objective,
entity_type=ingest.entity_type,
match_conditions=[mc.model_dump() for mc in ingest.match_conditions],
generator="base",
match_limit=10,
)
  • Preview: Test queries with small sample before committing to full runs
  • Extend: Increase match_limit on existing runs without changing criteria
  • Refresh: Re-run with exclude_list to discover net-new entities over time
  • Enrichments: Add non-boolean enrichment data to candidates without affecting match conditions
  • Streaming: Real-time SSE updates on candidate discovery
  • Webhooks: Async notifications on run events

Tracks web changes via scheduled queries with webhook notifications.

  • Create: POST https://api.parallel.ai/v1alpha/monitors
  • List: GET https://api.parallel.ai/v1alpha/monitors
  • Retrieve: GET https://api.parallel.ai/v1alpha/monitors/{monitor_id}
  • Update: PUT https://api.parallel.ai/v1alpha/monitors/{monitor_id}
  • Delete: DELETE https://api.parallel.ai/v1alpha/monitors/{monitor_id}
  • List events: GET https://api.parallel.ai/v1alpha/monitors/{monitor_id}/events
  • Retrieve event group: GET https://api.parallel.ai/v1alpha/monitors/{monitor_id}/events/{event_group_id}
  • Simulate event: POST https://api.parallel.ai/v1alpha/monitors/{monitor_id}/simulate
  • Auth: x-api-key header
ParameterTypeRequiredDescription
querystringYesSearch query to monitor for material changes
frequencystringYesFormat: <number><unit> where unit is h/d/w. Range: 1h to 30d
webhookMonitorWebhookNoWebhook configuration for notifications
metadataobjectNoUser-provided metadata (string values)
output_schemaJsonSchemaNoStructured output schema for events

MonitorWebhook:

FieldTypeDescription
urlstringWebhook destination URL
event_typesstring[]monitor.event.detected, monitor.execution.completed, monitor.execution.failed
{
"monitor_id": "monitor_b0079f70195e4258a3b982c1b6d8bd3a",
"query": "Extract recent news about AI",
"status": "active",
"frequency": "1d",
"created_at": "2025-04-23T20:21:48.037943Z",
"metadata": { "key": "value" },
"webhook": {
"url": "https://example.com/webhook",
"event_types": ["monitor.event.detected"]
}
}

Monitor statuses: active, canceled

Returns an array of MonitorResponse objects. Supports cursor-based pagination via monitor_id parameter (lexicographic order) and limit parameter (1-10,000).

  • Monitor executes once at creation, then continues per frequency schedule
  • Supports structured output via output_schema for consistent event formats
  • Simulate endpoint lets you test webhook integrations without waiting for real events
  • Slack integration available for receiving updates directly in channels
  • Events are grouped; up to 300 event groups retained

Terminal window
# Shell script (no Python required)
curl -fsSL https://parallel.ai/install.sh | bash
# Homebrew
brew install parallel-web/tap/parallel-cli
# pip (with optional extras)
pip install "parallel-cli[yaml,duckdb,bigquery,spark]"
Terminal window
parallel-cli login # Interactive OAuth
parallel-cli login --device # Headless/device auth
parallel-cli auth # Verify auth status

Or set PARALLEL_API_KEY environment variable.

search — Web search with natural language or keywords

Terminal window
parallel-cli search "latest FDA approvals 2024" --mode agentic --max-results 20
parallel-cli search "site:sec.gov 10-K filings" --after-date 2024-01-01

extract — Pull clean markdown from URLs

Terminal window
parallel-cli extract https://example.com --full-content
parallel-cli extract https://example.com --objective "Find pricing details"

research — Deep research with configurable processor tiers

Terminal window
parallel-cli research "What are the top competitors of Acme Corp?" --processor core
parallel-cli research "..." --processor ultra --no-wait # async

findall — Discover entities matching criteria

Terminal window
parallel-cli findall "AI startups in NYC with Series A funding" --generator base --match-limit 50

monitor — Track web changes

Terminal window
parallel-cli monitor create "SEC filings for AAPL" --frequency 1d --webhook https://...
parallel-cli monitor list
parallel-cli monitor events <monitor_id>

The enrich command transforms datasets through web research at scale.

Terminal window
# Basic CSV enrichment
parallel-cli enrich companies.csv \
--source-columns "company_name,website" \
--enrich-columns "employee_count,founding_date,funding_total" \
--processor core
# Inline data
parallel-cli enrich --data '["Apple", "Google", "Meta"]' \
--enrich-columns "market_cap,ceo,headquarters"
# With intent (AI suggests columns)
parallel-cli enrich companies.csv --intent "I need competitive intelligence"
# Dry run to preview
parallel-cli enrich companies.csv --source-columns name --enrich-columns revenue --dry-run
# YAML config for complex jobs
parallel-cli enrich plan # Interactive YAML config generation
parallel-cli enrich --config enrich-job.yaml

Key options:

OptionDescription
--source-typecsv or json
--source-columnsComma-separated input columns
--enrich-columnsComma-separated output columns
--processorTier: lite, base, core-fast, core, pro, etc.
--dry-runPreview without API calls
--no-waitLaunch async, poll later
--intentAI-powered column suggestion
--configYAML configuration file

Workflow modes:

  • Direct execution with file paths
  • Inline data via --data parameter
  • YAML configs for reproducible jobs
  • Async via --no-wait with subsequent status/poll commands

All commands support --json for structured output. Exit codes: 0 = success, 2 = input error, 3 = auth error, 4 = API error, 5 = timeout. Supports piped stdin for automation.


Parallel integrates directly with data platforms for SQL-native enrichment:

  • BigQuery — Remote functions via parallel-cli bigquery
  • Snowflake — SQL-native UDTF
  • Apache Spark — SQL-native UDFs
  • DuckDB — Native integration with batch processing
  • Polars — Native DataFrame integration
  • Supabase — Edge Functions integration
  • Google SheetsPARALLEL_QUERY function

  • 20,000 free requests to start
TierCost per 1K requestsUse Case
Base$4Standard search
Pro$9Enhanced search
  • Rate limit: 600 req/min
  • Latency: <3s
TierCost per 1K requestsUse Case
Lite$5Basic information retrieval
Base$10Simple web research
Core$25Complex web research
Core2x$50Very complex web research
Pro$100Exploratory web research
Ultra$300Extensive deep research
Ultra2x$600Advanced deep research (2x compute)
Ultra4x$1,200Advanced deep research (4x compute)
Ultra8x$2,400Advanced deep research (8x compute)
  • Rate limit: 2,000 req/min
  • Latency: 5s to 30min (async)
  • $5 per 1K requests
  • Rate limit: 300 req/min
  • Latency: <5s
  • Rate limit: 600 req/min (pricing not listed separately; likely included in Search tier)
  • Rate limit: 25 req/hour
  • Pricing varies by generator tier (preview, base, core, pro)
  • Rate limit: 300 req/min
  • Volume discounts
  • Custom rate limits
  • Data Protection Agreement
  • Dedicated support and early product access
  • Startup credits up to $5K for qualified startups
  • AWS Marketplace pre-committed spend option

EndpointLimitWindow
Search600per minute
Extract600per minute
Tasks / TaskGroups2,000per minute
Chat300per minute
FindAll25per hour
Monitor300per minute

Rate limits apply only to POST requests that create new resources. GET requests (status checks, result retrieval) do not count against these limits.

For expanded quotas, contact support@parallel.ai.