Manthan

An answer API that will not invent

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.

The endpoint

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

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"}]}'

Python

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)

Node

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" }],
});

What comes back

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" }
    ]
  }
}

Reading confidence and tier

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.

Errors

OpenAI error shape throughout, so existing error handling works. Each is actionable:

400invalid_request No user message, or an empty messages array.
401invalid_api_key Missing or unrecognised key. Read yours from your dashboard.
402insufficient_balance Wallet empty. Recharge any amount, or take a plan.
402subscription_expired Plan lapsed. Renew, or recharge to continue on wallet balance alone.
404model_not_found Unknown model id. Answering anyway would silently mislead you.
429rate_limited Too many calls. Honour Retry-After; a throttled call is never billed.

Accepted and ignored, on purpose

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.

Getting a key

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.

Get an API key Plans and pricing