Topic explainers, grounded
Works todayPlain-language overviews of a legal topic. None can be stored without a jurisdiction level, a jurisdiction, an as-of date and a citation; review-due is computed from the as-of date on every read.
Available now
In build
The whole team
Nineteen specialists, each with a defined job and an honest status label.
See all nineteenWhat Vakil does and refuses to do: legal information with a jurisdiction and a date, never legal advice. Capabilities, the API, and the four things it will not draft.
Vakil explains what a legal topic generally involves, keeps a matter's facts and documents in order, checks a contract for the presence of standard clauses, and tracks the deadlines a business told it about. Every explainer and clause note it shows carries a jurisdiction and the date it was last checked true, because a statement of law with neither is indistinguishable from one an amendment already overtook.
Never tells you what to do in your situation
Every explainer is general and educational; the moment a question needs the general rule applied to your specific facts, Vakil routes to a consultation-prep sheet for an advocate instead of answering.
Never answers without a source you can check
An answer with no cited statement, a superseded one, a stale one, or one from the wrong jurisdiction is refused before it reaches you — the question is marked withheld and an escalation is recorded instead.
Never says whether a clause is fair, only whether it is present
A coverage check reports present, unclear, or absent against a reference list your workspace supplied — never favourable or enforceable. "All present" is not a statement that the contract is good.
Never drafts anything addressed to a counterparty, an authority, or a court
A payment-reminder notice, a reply to a notice you received, and a consumer complaint each have routes for capturing the underlying facts, but no route in this codebase drafts the document itself, and none is planned — everything each one would produce leaves the workspace addressed to somebody else. Employment paperwork is different: an offer or appointment letter is ordinary business paperwork addressed to an employee, not correspondence in a dispute, so that template library is fully built.
Never names, ranks, or takes a fee for a specific advocate
Only practice-area categories and a reminder to check your State Bar Council's own roll — never a directory, a ranking, or a referral fee.
Never lets a generated document leave looking finished
Every template render and every checklist carries a non-dismissible advocate-review notice, and a template can only render — nothing here drafts free-form from a blank page.
Getting started
Before Vakil can explain anything, your workspace records a statement: a jurisdiction level (central, state, union territory or local), a jurisdiction name, an as-of date, and a citation. Leave out the date and the request is refused outright — "a legal statement has to say when it was true" is not a copy note, it is a 422. Nothing about Indian law ships pre-loaded; an empty workspace has zero statements and answers nothing, which is the honest starting state for a tool that will not guess.
Create a matter with its category, jurisdiction and counterparty, then add events in your own words as they happen — a call, a letter received, a payment made. The timeline that comes back states plainly that it does not say whether these facts amount to a claim, how strong it is, or what will happen; it is the chronological record an advocate would otherwise have to reconstruct from your memory in the first meeting.
Log a question against a topic and jurisdiction. If it reads as asking for a legal position rather than the law — "should I sue", "will I win" — it is triaged into an escalation before anything is looked up. Answering it requires citing statements that are current, unsuperseded and in the right jurisdiction; missing any of that, Vakil withholds and records why, rather than answering with something confident and wrong.
Capabilities
Plain-language overviews of a legal topic. None can be stored without a jurisdiction level, a jurisdiction, an as-of date and a citation; review-due is computed from the as-of date on every read.
Term definitions are statements too, so each carries its own jurisdiction and as-of date. No dictionary content ships — the workspace supplies every entry.
Checks a document's text against a reference list of clause types your workspace built and reports present, unclear, or absent for each — recomputed on every read, never stored, so a coverage result can never quietly age past the clause library it came from.
A pasted document is split into sections deterministically and matched against your own workspace's grounded glossary and clause notes — the same term-matching the clause flagger already uses, with no credential needed. A plain-English paraphrase per section additionally uses an LLM key when configured, and passes back through the same regulated-advice gate as everything else before it is shown.
Needs: An LLM key, for the paraphrase only — section splitting and glossary matching work without one. There is also no OCR on this deployment: a scanned or photographed document is not readable, only pasted text.
Five fixed templates — an unpaid invoice, before signing, a notice received, a new hire, a premises lease — each about the papers you already have, never a shipped statutory requirements list. Every instance carries a copied caveat.
Workspace-supplied templates render by placeholder substitution with a non-dismissible advocate-review notice, a named reviewer and a last-reviewed date. Generating with keep=true persists a version-snapshotted draft you can re-read, edit field by field, and export. Export is plain text, not PDF — there is no PDF-rendering library on this deployment.
Needs: No template content ships; your workspace supplies every template.
Fact capture, a fixed reviewed question set, the answer log and a downloadable plain-text briefing sheet all work with no credential — and so does adaptive follow-up questioning. Each follow-up names the opening question whose answer makes it worth asking, so the sequence derives its order from what you recorded rather than generating a guess. That also makes it reproducible: the same answers ask the same questions. An LLM key is an optional extra that adds questions once the reviewed set runs out; it is no longer the only adaptive path.
The same substitution-only template machinery as document templates, filtered to employment paperwork — no generative drafting, no model credential. Labour-law notes are grounded statements scoped to the template's own jurisdiction: central notes always show, state notes only for that template's own state, so a state rule can never read as a national default.
The Nice Classification (45 classes) ships as reference data, and a search query records exactly what you want checked. No search actually runs against the registry — a query links out to the official government search instead of returning a result.
Needs: A client for the IP India Trade Marks Registry (tmrsearch.ipindia.gov.in) — not built. Until it is, this stays a query log with a link out, not a live lookup.
The register, key dates and renewal watch work against your own database and pasted text today.
Needs: File bodies, encryption at rest, virus scanning and time-limited share links need object storage and an antivirus service. Until then, storage_ref stays null on every document and only pasted body_text is readable.
A chronological record of a matter's own events, with no field for merits, strength, or outcome anywhere in the schema. A fixed-template summary and a downloadable plain-text briefing sheet both work with no credential.
Needs: Object storage, for attachments only — the upload-grant call fails cleanly with a 503 naming it until then. The timeline, summary and briefing sheet all work without it.
Due and overdue state, and roll-forward on completion, computed locally. A business profile now matches plausible deadline templates from your workspace's own grounded statements by structure and state — central templates always apply, state ones only for the profile's own state.
Needs: No statutory calendar ships; reminder delivery by email, SMS or WhatsApp needs a notification channel, which is not connected on this deployment.
Resolves only against grounded forum-mapping statements your workspace holds. With none current, it reports unresolved and raises an escalation rather than guessing. Each lookup gets a receipt id, and re-checking it resolves fresh against the current statement library rather than replaying a cached answer, so a mapping added later is visible immediately. Nothing computed is stored.
Practice-area categories and Bar Council enrolment-verification guidance only — complete at that boundary rather than extended into a directory.
An answer with no sources, a superseded source, a stale one, or one from the wrong jurisdiction is refused; the question is marked withheld and an escalation is recorded. A stale-sources check now flags already-published answers whose sources have since gone stale or been superseded, computed on every read.
Needs: Automatic verification of a citation's text against India Code is not built — no client exists for indiacode.nic.in.
Invoice facts, a self-declared MSME/Udyam eligibility check, and grounded MSMED Act information (the interest rate, the 45-day payment term) all work with no credential — this is fact capture and reference information, and nothing more. There is no route that drafts the reminder letter itself, and none is planned: producing a demand for payment is correspondence addressed to a counterparty, which this product's design rules out categorically, not for want of a credential or a future release.
The respondent, what happened, the amount, and the relief sought are captured and stay editable. There is no route that drafts the complaint itself, and none is planned: which forum to file in depends on claim value and is periodically revised, and the complaint text is correspondence addressed to a forum, which this product's design rules out categorically. It links to the National Consumer Helpline and e-Daakhil instead of producing a document.
A received notice is logged from pasted text, and a high-risk one — a Section 138 cheque-bounce notice, a show-cause notice, a summons, an arbitration notice — is escalated automatically, the same pattern the question log already uses. There is no route that drafts a reply, and none is planned: this is the highest-risk capability in the set, and everything past logging and escalating is correspondence addressed to a counterparty, an authority or a court, which this product's design rules out categorically.
API surface
Every route below is mounted and reachable today. Requests and responses are real shapes, not illustrations.
/api/v1/agents/vakil/statementsCreate a grounded statement as_of is missing, so services/vakil.py require_currency() raises before the row is written. The same statement with an as_of date returns 201.
Request
{
"kind": "general_rule",
"topic": "security_deposit",
"title": "Security deposit under a commercial lease",
"body": "[workspace-supplied summary, in the reviewer's own words]",
"jurisdiction_level": "state",
"jurisdiction_name": "Karnataka",
"source_kind": "bare_act",
"source_citation": "[the actual Act and section]"
}Response
422
{
"message": "A legal statement has to say when it was true.",
"ask": "Give the date this was checked against the source. A legal statement of law with no date cannot be told apart from one the last amendment already overtook.",
"notice": "This is general legal information, not legal advice, and it is not a substitute for an enrolled advocate."
}/api/v1/agents/vakil/statementsList, superseded excluded by default
/api/v1/agents/vakil/statements/{id}/supersedeReplace with a new dated version
/api/v1/agents/vakil/glossaryDefinitions (kind=definition statements)
/api/v1/agents/vakil/topicsTopic explainers (kind=general_rule statements)
/api/v1/agents/vakil/questionsLog a question; triaged for advice-shaped phrasing first
/api/v1/agents/vakil/questionsList, filterable by state
/api/v1/agents/vakil/questions/{id}One question with resolved sources and escalations
/api/v1/agents/vakil/questions/{id}/answerAnswer with cited statement ids; refused if ungrounded The withhold and the escalation are committed before the 422 is raised, so the record that Vakil declined survives even though the HTTP call itself failed.
Request
{
"answer_text": "[a proposed answer]",
"statement_ids": []
}Response
422
{
"message": "An answer needs at least one source a reader can check.",
"ask": "Cite the statement this rests on, or leave the question unanswered. Vakil withholds rather than guessing at a section number.",
"escalation_id": "...",
"question_state": "withheld_unsourced"
}/api/v1/agents/vakil/questions/{id}/escalateManual escalation
/api/v1/agents/vakil/escalationsList with a reason tally
/api/v1/agents/vakil/escalations/{id}/acknowledgeClose out an escalation
/api/v1/agents/vakil/mattersOpen a matter
/api/v1/agents/vakil/mattersList, filterable by status
/api/v1/agents/vakil/matters/{id}/eventsLog an event in your own words
/api/v1/agents/vakil/matters/{id}/timelineChronological record, no merits field
/api/v1/agents/vakil/documentsRegister a document (pasted text today)
/api/v1/agents/vakil/documentsList, filterable by kind and matter
/api/v1/agents/vakil/documents/{id}One document plus its obligations
/api/v1/agents/vakil/renewalsDocuments and obligations due within a window
/api/v1/agents/vakil/obligationsTrack a recurring or one-off deadline
/api/v1/agents/vakil/obligationsList with overdue ids called out
/api/v1/agents/vakil/obligations/{id}Mark done; rolls a recurring one forward
/api/v1/agents/vakil/clause-typesAdd a reference clause type, backed by a clause-note statement
/api/v1/agents/vakil/clause-typesList for a document type
/api/v1/agents/vakil/documents/{id}/coverage-checkPresent / unclear / absent per clause type "assessment": null is set explicitly on every response, not omitted, so a client reading the payload sees that no assessment is offered rather than wondering where it went.
Response
200
{
"results": [
{ "clause_key": "termination", "presence": "present",
"evidence": "…either party may terminate this agreement on 30 days' written notice…" },
{ "clause_key": "liability_cap", "presence": "unclear",
"evidence": null }
],
"assessment": null,
"disclaimer": "This says only whether each standard clause type appears in the text, matched on wording. It is not a review. It does not say whether any term is fair, favourable, enforceable or safe to sign, and 'all present' does not mean the contract is good — those are judgements for an enrolled advocate."
}/api/v1/agents/vakil/templatesAdd a workspace template with a named reviewer
/api/v1/agents/vakil/templatesList with review-due ids
/api/v1/agents/vakil/templates/{id}/generateFill placeholders; never persisted, never ready to sign
/api/v1/agents/vakil/checklists/templatesThe five fixed checklist templates
/api/v1/agents/vakil/checklistsInstantiate one for a matter The caveat is copied onto the instance at creation, so a printed copy keeps the wording that was current when it was made, even if the template's caveat is edited later.
Request
{
"template_key": "notice_received_pack",
"matter_id": "..."
}Response
201
{
"id": "...", "template_key": "notice_received_pack",
"title": "You have received a notice",
"caveat": "This is a list of your own papers to gather. It is not a statement of what any authority requires. ... confirm with the office concerned or an enrolled advocate before relying on it.",
"items": [
{ "item_key": "the_notice", "label": "The notice itself, all pages", "state": "pending" },
{ "item_key": "envelope", "label": "The envelope and postal receipt", "state": "pending" }
],
"gathered": 0, "total": 6
}/api/v1/agents/vakil/checklists/{id}One checklist with its items
/api/v1/agents/vakil/checklists/{id}/items/{item_id}Mark an item gathered
/api/v1/agents/vakil/practice-areasFixed categories, never a named advocate
/api/v1/agents/vakil/practice-areas/matchCategory to practice area
/api/v1/agents/vakil/jurisdiction-finderResolve against grounded forum-mapping statements
Limits and gotchas
Every glossary term, topic explainer, clause note and deadline rule has to arrive from your workspace with a jurisdiction and an as-of date. An empty deployment answers nothing and escalates instead — that is correct behaviour, not a missing feature.
The matter vault registers a document and its key dates against pasted body_text. storage_ref stays null on every row — file bodies, encryption at rest, virus scanning and time-limited share links need object storage and an antivirus service neither of which is configured yet.
The refusal logic checks that a source exists, is unsuperseded, is current and is in the right jurisdiction — all structural. It does not fetch the URL you cite or confirm the statute section still reads the way you typed it; that verification is not built.
A payment-reminder notice, a notice-response draft and a consumer complaint all capture their underlying facts today — invoice details and MSME eligibility, what a notice said, what happened and what relief is sought. None of the three has a route that drafts the actual document, because everything each one would produce is correspondence addressed to a counterparty, an authority or a court — past the line this agent is designed to stay behind. That line does not move as credentials get added; it is categorical, not a configuration gap.
What this needs from you
Everything else on this page works with none of these connected.
| Credential | Unlocks |
|---|---|
| Object storage (S3-compatible) + antivirus scanning | File bodies in the matter vault, encryption at rest, and time-limited share links. Today the vault holds pasted text only. |
| An LLM provider key | Adaptive follow-up questioning in consultation-prep. The question log, checklists and the grounding refusal logic all work with no model key at all. |
| A notification channel (push, SMS or WhatsApp) | Delivering a compliance-deadline reminder. The due/overdue computation and roll-forward work locally without one. |
Questions
No, and the boundary is enforced in the schema, not just in the copy. Every statement needs a jurisdiction and an as-of date before it can be stored, every generated document carries a non-dismissible advocate-review notice, and an answer with no checkable source is withheld rather than guessed. Vakil organises your own facts and explains what a topic generally involves; applying that to your specific situation is an enrolled advocate's role under the Advocates Act, 1961.
It is caught before anything is looked up. A pattern check runs on your own question text and, for advice-shaped phrasing, raises an escalation instead of attempting an answer. The escalation records the reason and the practice-area category, never a named advocate.
No, and this is not something to expect soon. A payment-reminder notice, a reply to a notice, and a consumer complaint each let you capture and organise the underlying facts — invoice details, what a notice said, what happened — but none has a route that drafts the actual document, because each one would be correspondence addressed to a counterparty, an authority or a court, and Vakil's design stops categorically before that line. Employment paperwork is different and is fully built: an offer or appointment letter is ordinary business paperwork to an employee, not correspondence in a dispute.
It will name a practice-area category and tell you to check your State Bar Council's own roll. It will never rank, rate, or recommend a specific advocate or firm, and it takes no referral fee — a 2024 Madras High Court ruling found that platforms which rank or solicit legal work on advocates' behalf run against Bar Council of India rules.
Vakil computes review-due from the as-of date on every read, not on a schedule that can silently lapse — a statement past its review interval shows in review_due lists on GET /api/v1/agents/vakil/topics, /glossary and /obligations. If it needs updating, the old row is never edited in place; a supersede creates a new dated row and links back to it, so nobody's earlier answer is silently rewritten under them.
The backend is built and tested, but this is a regulated domain: before it goes live, a qualified advocate needs to review the boundary copy on this page, the seeded jurisdiction and as-of-date discipline, and the refusal wording itself, per docs/REQUIRED_FROM_USER.md §4. That review has not happened yet.
Coming soon