Decisions API
# Decisions grounded in the live web
## Fast classification grounded in live web data. Ask about your own context or anything on the web, and every answer comes back with citations.
- - 100
- : max questions per call, all from one search
- - <1s
- : typical response time
- - $1
- : per 1,000 requests
Better decisions grounded in the live web
The Decisions API searches the web in real-time to answer questions training data alone can’t.
Batch up to 100 questions in a single call
Batch up to 100 related questions with shared context in a single request. Get an answer to each for the cost of one call, helping you scale enrichment and other high-volume workflows.
Automate with confidence backed by evidence
Every answer carries a probability, and every response carries its citations. Automate above a threshold you choose and send the rest to a person with the evidence attached.
Benchmarks
## Best-in-class accuracy on web-grounded decisions
PWS-Decisions is an open-source benchmark composed of 300 closed-ended questions whose answers depend on current, niche, or scattered facts on the web. Every answer is confirmed by independent research and a direct source, and every system is scored by exact match. On JevBench, where the answer sits in the input, all three systems score about the same.
Exact-match accuracy. Source: PWS-Decisions benchmark, November 2026.
| Benchmark | Parallel Decisions | OpenAI Decisions | TypeSafe Jev | | --- | --- | --- | --- | | PWS-Decisions (300 questions, live web) | 76.2% | 41.7% | 33.4% | | JevBench (231 questions, answer in input) | 89.6% | 90% | 88.3% |
Exact-match accuracy. Source: PWS-Decisions benchmark, November 2026.
Use Cases
Turn everyday decisions into automated workflows
Finance
Perpetual KYB
A bank rechecked 426 public companies for changes to addresses, officers, and status in under 10 seconds for $0.85. 98% of the flags held up on review.
GTM
Lead routing
500 inbound leads were classified by segment in under 9 seconds for about $0.50. 97% of the auto-routed leads landed in the right segment.
Not sure where the Decisions API fits for your team? Try this demo
Quickstart
## Try one call
Send state and named questions with your API key in the x-api-key header. Each answer comes back typed, with a probability, and the response lists the citations behind it.
- - state:
- Shared context for every question, such as a page or a company
- - questions:
- Up to 100 named questions that share one retrieval
- - type:
- noul for yes or no, choice for a fixed set of options, score for an ordered rubric
- - instructions:
- The question itself, in plain language
```bash curl https://api.parallel.ai/v1/decisions \ -H "x-api-key: $PARALLEL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "state": { "page": "https://parallel.ai/blog/decisions-api", "note": "Thinking fast, but checking first." }, "questions": { "is_this_real": { "type": "noul", "instructions": "Has Parallel announced a Decisions API?" }, "has_anyone_noticed": { "type": "noul", "instructions": "Has this blog post been submitted to Hacker News?" } } }' ```
```python import os import requests r = requests.post( "https://api.parallel.ai/v1/decisions", headers={"x-api-key": os.environ["PARALLEL_API_KEY"]}, json={ "state": {"company": "Clay", "website": "https://www.clay.com"}, "questions": { "has_cli": { "type": "noul", "instructions": "Does the company offer an official CLI?", } }, }, timeout=30, ) r.raise_for_status() answer = r.json()["answers"]["has_cli"] print("refusal" if answer["type"] == "refusal" else answer["noul"]) ```
```typescript const res = await fetch("https://api.parallel.ai/v1/decisions", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": process.env.PARALLEL_API_KEY!, }, body: JSON.stringify({ state: { company: "Clay", website: "https://www.clay.com" }, questions: { has_cli: { type: "noul", instructions: "Does the company offer an official CLI?", }, }, }), }); if (!res.ok) throw new Error(`${res.status}`); const answer = (await res.json()).answers.has_cli; console.log(answer.type === "refusal" ? "refusal" : answer.noul); ```
```bash claude mcp add --transport http parallel https://mcp.parallel.ai/mcp ```
Pricing
## $1 per 1,000 requests
A request can carry up to 100 questions, and they all share one retrieval, so a CRM row costs the same whether you fill one column or ten. Start with 5,000 free requests in the playground.
- - Per request:
- $0.001
- - Questions per request:
- Up to 100
- - Free to start:
- 5,000 requests
FAQs
What counts as a request?
One request is one state and the questions you send with it, up to 100. However many questions you batch, it’s billed as one request at $1 per 1,000.
What question types are there?
Each question has a name you choose, a type, and instructions in plain language. noul answers yes or no with a probability, choice picks one option from a fixed set, and score rates against an ordered rubric. See question types.
How do citations work?
Every response lists the sources behind it, each with a URL and the excerpts used, so you can audit any result before you act on it.
What happens when the web doesn’t have an answer?
A question can come back as a refusal instead of a guess. It’s still a successful response, so check each answer’s type before you read its value.
Can I use it from an agent?
Yes. It’s the web_decisions tool in the Parallel MCP server, free to use without an account. Sign in or add an API key for higher limits.
When should I use the Task API instead?
Use the Task API for open-ended research or long-form output. The Decisions API is for closed questions with a fixed answer space, answered in under a second.
Start building
Get 5,000 free requests in the Developer Platform or dive into the documentation.
Agent onboarding prompt:
Use curl to read parallel.ai/agents.md and perform the setup to install Parallel