Manthan returns answers quoted from real sources, with the sources attached. Every sentence it produces exists verbatim on a page you can open. If nothing usable is found, it says so rather than filling the gap.
That matters if you are building something that cannot afford a fabricated answer —
a health product, a fintech, an education app, a public-service portal. You get a
citation you can show your own users, and a
tier telling you whether it came from the body that issues the thing or
from an ordinary page.
OpenAI-compatible, so any OpenAI client library works unchanged — only the base URL and the model name differ.
POST https://manthan.quantforge.co.in/v1/chat/completions
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"model": "dhandare-3.1-pro",
"messages": [{"role": "user", "content": "what is the adult dose of amoxicillin"}]
}
curl https://manthan.quantforge.co.in/v1/chat/completions \
-H "Authorization: Bearer $MANTHAN_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"dhandare-3.1-pro",
"messages":[{"role":"user","content":"what is PCR in options trading"}]}'
from openai import OpenAI
client = OpenAI(api_key=MANTHAN_KEY,
base_url="https://manthan.quantforge.co.in/v1")
reply = client.chat.completions.create(
model="dhandare-3.1-pro",
messages=[{"role": "user", "content": "what is normalization in DBMS"}],
)
print(reply.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MANTHAN_KEY,
baseURL: "https://manthan.quantforge.co.in/v1",
});
const reply = await client.chat.completions.create({
model: "dhandare-3.1-pro",
messages: [{ role: "user", content: "explain gradient descent" }],
});
A standard chat-completion object, plus a manthan block carrying the part
that makes this different. A client that only reads content still gets the
citations inline as [n] markers.
{
"choices": [{ "message": { "role": "assistant", "content": "..." } }],
"usage": { "prompt_tokens": 12, "completion_tokens": 180, "total_tokens": 192 },
"manthan": {
"intent": "definition",
"confidence": "high", // high | medium | low | none
"elapsed_ms": 2140,
"cost_inr": "0.017234",
"markdown": "# ...", // ready to store or render, sources attached
"sources": [
{ "index": 1,
"url": "https://www.who.int/...",
"title": "...",
"domain": "who.int",
"tier": "official", // official | established | ""
"published": "2024-06-01" }
]
}
}
confidence and tiernone means Manthan found nothing it could stand
behind — surface that to your user rather than hiding it.official is the body that issues the
thing being asked about (a regulator, a standards body, an exchange),
established is a recognised reference, and an empty string is an
ordinary page. Authority is judged per subject — an exchange is authoritative on a
listed company and says nothing about medicine.If your product cannot afford a weak answer, the honest gate is
confidence != "none" and at least one source at official or
established. That decision is yours to make, which is why you are given
the inputs for it instead of a single opaque score.
OpenAI error shape throughout, so existing error handling works. Each is actionable:
400 | invalid_request |
No user message, or an empty messages array. |
401 | invalid_api_key |
Missing or unrecognised key. Read yours from your dashboard. |
402 | insufficient_balance |
Wallet empty. Recharge any amount, or take a plan. |
402 | subscription_expired |
Plan lapsed. Renew, or recharge to continue on wallet balance alone. |
404 | model_not_found |
Unknown model id. Answering anyway would silently mislead you. |
429 | rate_limited |
Too many calls. Honour Retry-After; a throttled call is never billed. |
temperature, top_p, frequency_penalty and
presence_penalty are accepted so OpenAI clients work unchanged, and do
nothing — there is no sampling in an extractive engine for them to steer. Determinism is
the product, not a setting. max_tokens is likewise inert: answers are never
truncated mid-quotation, because half a quotation is a misquotation.
stream: true returns one well-formed chunk followed by
[DONE]. One chunk is honest — the engine computes a complete answer, so a
token-by-token drip would add latency and simulate nothing real.
Sign in, open your dashboard, and copy the key and base URL. New accounts start on wallet
credit, so you can make a real call before choosing a plan. Usage is metered per token
and every call reports its own cost_inr, so nothing is a surprise at the end
of the month.