How many people live in India?
q.people.total
The site is built from a small set of contracts: questions map to indicator IDs, indicators map to source APIs, and every explanation is generated from locked evidence.
V1 question spine
q.people.total
q.people.growth
q.people.age
q.people.pyramid
q.people.old_before_rich
q.econ.size
q.econ.growth
q.econ.per_person
q.econ.inflation
q.work.how_india_works
q.econ.borrow
q.econ.compare
q.health.life
q.health.hale
q.health.u5mr
q.health.deaths
q.education.literacy
q.education.years
q.work.force
q.work.women
q.work.agriculture
q.energy.mix
q.energy.system
q.energy.coal
q.energy.renewables
q.energy.access
q.air.today
q.climate.city_heat
q.climate.heat_mortality
q.climate.rainfall_cities
q.climate.co2
q.climate.co2_pc
q.climate.historical
q.climate.impact
q.services.water
q.state.tax
q.world.share
q.society.connected
q.econ.trade
q.econ.trade_partners
q.econ.trade_services
q.econ.trade_competitiveness
Artifact schemas
SeriesArtifact
Simple time series such as GDP, population, electricity access, or tax revenue.
type SeriesArtifact = {
schemaVersion: 1;
artifactType: "series";
indicatorId: string;
title: string;
sourceId: string;
sourceIndicatorId: string;
sourceUrl: string;
unit: string;
frequency: "annual" | "quarterly" | "monthly" | "daily";
geography: { type: string; id: string; name: string };
fetchedAt: string;
observations: Array<{ date: string; value: number | null }>;
}; TableArtifact
Dimensional data that should not be flattened early: age-sex tables, fuel mixes, WHO rows, and city AQI.
type TableArtifact = {
schemaVersion: 1;
artifactType: "table";
indicatorId: string;
title: string;
sourceId: string;
sourceIndicatorId: string;
sourceUrl: string;
unit: string;
geography: { type: string; id: string; name: string };
fetchedAt: string;
dimensions: string[];
rows: Array<Record<string, unknown>>;
metadata: Record<string, unknown>;
}; EvidencePacket
The locked input sent to DeepSeek. Prose can use these numbers, and no others.
type EvidencePacket = {
schemaVersion: 1;
questionId: string;
question: string;
requiredIndicatorIds: string[];
availableIndicatorIds: string[];
lockedNumbers: Array<{
label: string;
value: number;
date?: string;
unit: string;
sourceId: string;
indicatorId: string;
}>;
sourceSummaries: Array<Record<string, unknown>>;
caveats: string[];
forbiddenClaims: string[];
}; ExplanationArtifact
The generated short and long prose saved for each V1 question.
type ExplanationArtifact = {
schemaVersion: 1;
questionId: string;
status: "ready" | "work_in_progress" | "needs_data";
short: { headline: string; dek: string; body: string };
article: { title: string; standfirst: string; bodyMarkdown: string };
sourceNotes: string[];
caveats: string[];
lockedNumbersUsed: string[];
qualityFlags: string[];
generatedAt: string;
model: string;
evidence: EvidencePacket;
}; Source registry