Documentation
Parel is paid data tools for AI agents, billed per call in Indian rupees from a prepaid balance. Failed calls, timeouts, empty results and repeats are always ₹0. One MCP endpoint for Claude and other assistants, one REST API for code.
Quickstart
Every path starts with an account at app.parel.si. The ₹100 welcome credit is added automatically; during the beta, further credit is added by Parel on request to [email protected].
Claude (claude.ai and the desktop app)
- Open Settings → Connectors → Add custom connector.
- Name: Parel. URL: the address below. Click Connect.
- Sign in with your Parel account and allow access. That is the whole setup; there is no key to paste.
https://api.parel.si/mcp
Check it works. In a new chat, turn the Parel connector on and ask "Check my Parel balance." A balance in rupees means you are connected. Then try "Find the work email of Priya Sharma at acme.in and verify it."
Claude reads each tool's description, which includes today's price, picks the tool and reports the cost. You can revoke the connection at any time from Claude's connector settings or from the Parel dashboard.
Claude Code
Create an API key in the dashboard (API keys → Create; it is shown once). Then:
claude mcp add --transport http parel https://api.parel.si/mcp \
--header "Authorization: Bearer sk_live_…"
Type /mcp in Claude Code to confirm parel is connected. Give the key a daily cap in the dashboard so an agent loop can never spend more than you meant.
Cursor
In Cursor Settings → MCP → Add new global MCP server, or in .cursor/mcp.json in your project:
{
"mcpServers": {
"parel": {
"url": "https://api.parel.si/mcp",
"headers": { "Authorization": "Bearer sk_live_…" }
}
}
}
n8n
Two ways, same key:
- MCP Client Tool node (for an AI Agent node): endpoint
https://api.parel.si/mcp, transport HTTP streamable, authentication Bearer with your key. The agent then sees every Parel tool. - HTTP Request node for one fixed tool:
POST https://api.parel.si/v1/run, headerAuthorization: Bearer sk_live_…, JSON body{"tool": "search_news", "input": {"q": "Infosys", "gl": "in", "num": 10}}. The response'sdatais the result;cost_paiseis what it cost.
Your own code
# curl
curl https://api.parel.si/v1/run \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{"tool":"find_email","input":{"domain":"acme.in","full_name":"Priya Sharma"},"idempotency_key":"lead-1842"}'
// Node (fetch)
const r = await fetch("https://api.parel.si/v1/run", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PAREL_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ tool: "search_web", input: { q: "best CRM for small business in India", gl: "in", num: 10 } }),
});
const out = await r.json(); // { ok, call_id, class, cost_paise, balance_paise, data }
console.log(out.cost_paise / 100, "₹");
# Python (requests)
import os, requests
r = requests.post("https://api.parel.si/v1/run",
headers={"Authorization": f"Bearer {os.environ['PAREL_KEY']}"},
json={"tool": "verify_email", "input": {"email": "[email protected]"}})
out = r.json()
print(out["class"], out["cost_paise"], out.get("data"))
Agents: point them at /skill.md (setup, who goes first, costs, the error table) and /llms.txt (what Parel is and when to use it). Both are short on purpose.
API keys and scopes
Keys are created in the dashboard, shown once and stored only as a one-way hash. Each key has scopes and optional daily and monthly caps:
| Scope | Allows |
|---|---|
run | Paid calls (POST /v1/run, run_tool and the headline tools over MCP) |
read | Balance, call history, quotes, tool details |
admin | Manage keys and budgets |
Use one key per place (Claude Code, a server, an n8n workflow) so you can revoke one without touching the others. The Claude connector uses your sign-in, not a key.
API reference
Base URL https://api.parel.si. Every request carries Authorization: Bearer sk_… (or X-API-Key: sk_…). Every response carries X-Call-Id; a paid call also carries X-Cost-Paise and X-Balance-Paise. Amounts are integers in paise (₹1 = 100 paise). Bodies are JSON.
| Endpoint | Scope | What it does |
|---|---|---|
POST /v1/run | run | Run a tool. Returns 200 with the result, 202 for a slow job, or an error with charged_paise: 0. |
GET /v1/runs/:id | read | Status, class and cost of any call; polls slow jobs. |
POST /v1/quote | read | The charge and hold for an exact input before running it. Free; nothing is recorded. |
POST /v1/discover | any | Enabled tools with today's prices, optionally filtered: {"query": "email"}. Free. |
GET /v1/tools | any | The same list, unfiltered. Free. |
GET /v1/tools/:name | any | One tool: input schema, today's price and hold. Free. |
GET /v1/balance | read | Balance in paise and as text. |
GET /v1/packs, POST /v1/topup | read | Top-up packs and checkout. Not available during the beta: credit is added by Parel. |
POST /v1/run
{
"tool": "find_email",
"input": { "domain": "acme.in", "full_name": "Priya Sharma" },
"idempotency_key": "lead-1842", // optional: makes retries safe
"client_tag": "acme" // optional: spend shows per client in the dashboard
}
Success:
{
"ok": true,
"call_id": "c_01J…",
"tool": "find_email",
"class": "ok",
"cost_paise": 280,
"balance_paise": 9720,
"data": { "email": "[email protected]", "score": 94, … }
}
Failure (always ₹0):
{
"ok": false,
"call_id": "c_01J…",
"tool": "find_email",
"class": "upstream_error",
"error": "upstream_timeout",
"charged_paise": 0,
"message": "The provider did not answer in time. Nothing was charged.",
"retryable": true,
"retry_after_seconds": 5
}
Input is validated against the tool's schema before anything is held: a bad field returns 400 invalid_input with errors[] naming the paths, free. Tools that accept more than one set of fields (for example a full name, or a first and last name) say so in GET /v1/tools/:name.
POST /v1/quote
{ "tool": "search_web", "input": { "q": "best CRM for small business in India", "num": 10 } }
→ { "ok": true, "estimate_paise": 25, "hold_paise": 38, "enough_balance": true }
GET /v1/runs/:id
200 with class, cost_paise, latency_ms and, for a finished slow job, data; 202 with poll_after_seconds while a slow job runs; 422 and ₹0 if it failed upstream.
POST /v1/discover and GET /v1/tools
Each tool comes back with name, description (what it does, today's price, when it is free), price_paise, hold_paise and, for short lists, input_schema. The price is computed with the same formula and exchange rate that settle the call.
Idempotency
Send idempotency_key (any string unique to the request) to make retries safe:
- A successful call is replayed from storage for ₹0 for 24 hours (
class: "replay"). - A failed call can be retried with the same key.
- The same key with a different input is refused:
422 idempotency_key_mismatch. - A key still running returns
409 in_progress; a purged replay returns410 replay_expired.
MCP tools
The MCP endpoint is https://api.parel.si/mcp (streamable HTTP). Claude connects by signing in; other clients send Authorization: Bearer sk_….
| Tool | Cost | Use |
|---|---|---|
discover_tools | free | List tools with today's prices; filter with a keyword such as "email". |
inspect_tool | free | One tool in full: input schema and one-of field sets, an example input, price and hold, whether a miss is free. |
quote_tool | free | The exact charge and hold for an input, before running it. |
run_tool | per call | Run any tool by name with its input. |
get_run | free | Check a call by call_id; polls slow jobs. |
check_balance | free | Balance in rupees. |
search_web, find_email, get_social_posts, check_ai_visibility | per call | Headline tools exposed directly, so the assistant picks them without a round trip. |
An MCP answer over 48 KB is cut to whole list items (always valid JSON) with a _truncated note saying how many were kept; the REST API returns the full response.
Tools and prices
The eight tools in the beta, at today's rate (₹94.96 per US dollar on 19 October 2026). discover_tools and GET /v1/tools have the live figure.
| Tool | What it does | Price | When it is free |
|---|---|---|---|
search_webWeb search | Google results for any query, country and language. Ten results per call. | ₹0.25 per call | ₹0 if it fails |
search_newsNews search | Google News results, newest first, any country. | ₹0.25 per call | ₹0 if it fails |
read_pageRead a page | Any web page as clean text or markdown, including pages built with JavaScript. | ₹0.57 per page | ₹0 if it fails or finds nothing |
find_emailFind a work email | A person's work email from their name and company domain. | ₹2.80 per email found | ₹0 if it fails or finds nothing |
verify_emailVerify an email | Is this address deliverable? Catch-all, disposable and risky addresses flagged. | ₹1.40 per check | ₹0 if it fails |
get_social_postsInstagram posts | Recent posts of a public Instagram account with likes, comments and captions. | ₹0.25 per call | ₹0 if it fails |
get_redditReddit posts | Recent posts from a subreddit, with scores and comment counts. | ₹0.25 per call | ₹0 if it fails |
check_ai_visibilityAI visibility | What ChatGPT answers for a prompt in a chosen country, with the sources it cites. | ₹0.42 per prompt | ₹0 if it fails |
Per-result tools (search, posts) hold for up to 10 results; ask for the number you need with num. One query, one handle, one domain per call.
Errors and what you pay
Every response has a class. Only ok is charged.
| class | Meaning | You pay |
|---|---|---|
ok | A result came back | the shown price |
ok_free | Nothing found (no email for that person, an empty list), or a free tool | ₹0 |
replay | Same idempotency key: the stored answer | ₹0 |
vendor_error (HTTP 422) | The data provider rejected the call: bad input for that provider, not found | ₹0 |
upstream_error (HTTP 502) | Timeout, provider down or out of capacity. retryable: true, often with retry_after_seconds | ₹0 |
rejected (400, 402, 404, 429) | Invalid input, empty balance (insufficient_balance), unknown tool, a spend cap (budget_exceeded, with cap) or a rate limit | ₹0; the provider was never called |
running (HTTP 202) | A slow job has started; poll it | held, settled when done |
Error codes you will meet: invalid_input (with errors[]), unknown_tool, tool_unavailable, insufficient_balance, budget_exceeded, rate_limited, insufficient_scope, in_progress, idempotency_key_mismatch, replay_expired, upstream_timeout, upstream_unavailable, upstream_busy, no_result. Each comes with a plain message.
A charged answer that was useless anyway? Report bad result on the call in your usage log within 7 days. Small refunds are automatic up to a monthly cap; larger ones are reviewed within two business days. Policy.
Pricing rules
- Price first. Each tool shows its price. Before a call runs, Parel holds that estimate plus a safety margin on your balance; after the call it charges the real price and releases the rest. The charge is never more than the hold.
- Minimum charge ₹0.25 per successful call. Prices follow the provider's price and the day's exchange rate, which is fixed for each call when it starts.
- Failed is free. Every class except
okis ₹0. - Budgets. Daily and monthly caps per key and per team, set in the dashboard. A capped call is refused before it runs.
- Per client. Pass
client_tagand spend is attributed per client in the dashboard. - Beta. Credit is added by Parel: the ₹100 welcome credit automatically, more on request. Payments open after the beta.
Slow jobs
Some tools (deep research, when it is enabled) take minutes. POST /v1/run then answers 202 with { "class": "running", "call_id", "poll_after_seconds", "cost_paise": 0 } and keeps the hold open. Poll GET /v1/runs/:id (or get_run) at that interval: 202 while running, 200 with data and the real cost_paise when done, 422 and ₹0 if the job failed. None of the eight beta tools is slow; when a slow tool is switched on, its description says so and the assistant is instructed to quote the cost and ask first.
Limits
- 300 paid calls per minute per key by default. Over the limit:
429 rate_limitedwithRetry-After, nothing charged. - One query, handle or domain per call; up to 10 results per call for per-result tools.
- MCP answers are cut at 48 KB (see above); the REST API returns everything.
- Results are for your own, lawful work: no bulk unsolicited messaging, no reselling raw data, no lookups of minors. Acceptable use policy.
- Something not covered here: [email protected]. Include the
call_id.