Right to Information Wiki

The working reference for India's Right to Information Act, 2005.

User Tools

Site Tools


state-rti-portals-directory
Translate:

State-Specific RTI Online Portals: The 2026 Directory

Need help drafting this RTI? Use our free RTI Assistant — describe your problem, get a ready-to-file Section 6(1) application with your name and address pre-filled. Also handles First Appeal and Second Appeal to the CIC/SIC.

State-Specific RTI Online Portals: The 2026 Directory — RTI Wiki

In one line: The Central Government's rtionline.gov.in portal covers only Central ministries. For State RTIs, most citizens must file postal applications with a Rs 10 Indian Postal Order. A handful of States have functional online portals; several others have portals that exist but do not work. This page maps each State and Union Territory.

AI disclaimer: URLs and portal status change without notice. AI models, including Claude and ChatGPT, do not always know which State portal is currently live. Always return to this page before filing and confirm the link works.

<html> <!– state-portals-cards-v2 –> <style> #sp-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin: 18px 0; } #sp-stats .stat { background: #fff; border: 1px solid #e2e8f0; border-radius: 11px; padding: 12px 16px; text-align: center; } #sp-stats .stat .n { font: 900 22px Inter, system-ui, sans-serif; color: #0a2540; } #sp-stats .stat .l { font: 600 11.5px Inter; color: #64748b; text-transform: uppercase; letter-spacing: .04em; margin-top: 4px; } #sp-toolbar { display: flex; gap: 10px; flex-wrap: wrap; margin: 14px 0 18px; align-items: center; } #sp-search { flex: 1; min-width: 220px; padding: 10px 14px; border: 1.5px solid #e2e8f0; border-radius: 10px; font: 14.5px Inter; background: #fff; } #sp-search:focus { outline: none; border-color: #0B63CE; box-shadow: 0 0 0 3px rgba(11,99,206,.12); } #sp-toolbar select { padding: 9px 14px; border: 1px solid #e2e8f0; border-radius: 9px; font: 13px Inter; background: #fff; } #sp-toolbar a.compare { padding: 9px 16px; background: #0B63CE; color: #fff; text-decoration: none; border-radius: 9px; font: 700 13px Inter; } #sp-toolbar a.compare:hover { background: #0951a8; } #sp-grid, #sp-grid-uts { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 12px; } .sp-card { background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; overflow: hidden; transition: all .12s; position: relative; display: flex; flex-direction: column; } .sp-card:hover { box-shadow: 0 8px 22px rgba(11,99,206,.12); transform: translateY(-2px); } .sp-card .thumb { width: 100%; height: 110px; object-fit: cover; background: #f8fafc; border-bottom: 1px solid #f1f5f9; } .sp-card .body { padding: 14px 16px; flex: 1; display: flex; flex-direction: column; } .sp-card .top { display: flex; justify-content: space-between; align-items: flex-start; gap: 8px; margin-bottom: 6px; } .sp-card .name { font: 800 15.5px Inter; color: #0a2540; margin: 0; line-height: 1.3; } .sp-card .name a { color: inherit; text-decoration: none; } .sp-card .badges { display: flex; flex-direction: column; gap: 3px; align-items: flex-end; } .sp-card .badge { font: 700 10px Inter; padding: 2px 8px; border-radius: 99px; text-transform: uppercase; letter-spacing: .04em; white-space: nowrap; } .sp-card .badge.b-working, .sp-card .badge.b-up { background: #dcfce7; color: #166534; } .sp-card .badge.b-unreliable, .sp-card .badge.b-slow { background: #fef3c7; color: #92400e; } .sp-card .badge.b-down { background: #fef2f2; color: #dc2626; } .sp-card .badge.b-postal, .sp-card .badge.b-no_portal { background: #f1f5f9; color: #475569; } .sp-card .badge.b-sic_only { background: #cffafe; color: #155e75; } .sp-card .badge.b-best { background: linear-gradient(135deg,#fef3c7,#fde68a); color: #92400e; border: 1px solid #fcd34d; } .sp-card .meta { font: 12px Inter; color: #64748b; margin: 4px 0; line-height: 1.5; } .sp-card .meta strong { color: #0a2540; } .sp-card .meta .dot { color: #cbd5e1; margin: 0 5px; } .sp-card .reviews-line { font: 12px Inter; color: #64748b; margin-top: 4px; cursor: pointer; } .sp-card .reviews-line:hover { color: #0B63CE; text-decoration: underline; } .sp-card .reviews-line .stars { color: #f59e0b; } .sp-card .actions { margin-top: auto; padding-top: 10px; display: flex; gap: 5px; flex-wrap: wrap; } .sp-card .actions a, .sp-card .actions button { font: 600 11px Inter; padding: 5px 9px; background: #f8fafc; color: #0a2540; border: 1px solid #e2e8f0; border-radius: 7px; text-decoration: none; cursor: pointer; } .sp-card .actions a:hover, .sp-card .actions button:hover { background: #0B63CE; color: #fff; border-color: #0B63CE; } .sp-card .actions .file { background: #0B63CE; color: #fff; border-color: #0B63CE; } .sp-card .live-uptime { font: 11px Inter; color: #64748b; margin-top: 6px; padding-top: 6px; border-top: 1px dashed #f1f5f9; } .sp-card .live-uptime .v.up { color: #166534; font-weight: 700; } .sp-card .live-uptime .v.slow { color: #92400e; font-weight: 700; } .sp-card .live-uptime .v.down { color: #dc2626; font-weight: 700; } .sp-card .compare-cb { position: absolute; top: 12px; right: 12px; z-index: 2; background: rgba(255,255,255,.92); border-radius: 4px; } #sp-section-h, #sp-section-h2 { font: 800 13px Inter; color: #475569; text-transform: uppercase; letter-spacing: .05em; margin: 22px 0 10px; padding-bottom: 6px; border-bottom: 1px solid #e2e8f0; } /* Modal */ #sp-modal-back { position: fixed; inset: 0; background: rgba(15,23,42,.5); z-index: 9500; display: none; } #sp-modal-back.open { display: block; } #sp-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 90%; max-width: 580px; max-height: 85vh; background: #fff; border-radius: 14px; box-shadow: 0 24px 60px rgba(15,23,42,.32); z-index: 9501; display: none; overflow: hidden; flex-direction: column; } #sp-modal-back.open + #sp-modal { display: flex; } #sp-modal .head { padding: 14px 18px; background: linear-gradient(135deg,#0a2540,#0B63CE); color: #fff; display: flex; justify-content: space-between; align-items: center; } #sp-modal .head h3 { margin: 0; font: 800 15px Inter; } #sp-modal .head .x { background: transparent; color: #fff; border: 0; font-size: 22px; cursor: pointer; } #sp-modal .body { padding: 18px 20px; overflow-y: auto; flex: 1; } #sp-modal pre { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 12px 14px; font: 12.5px Menlo, monospace; white-space: pre-wrap; word-wrap: break-word; max-height: 380px; overflow-y: auto; } #sp-modal .copy { margin-top: 10px; padding: 8px 16px; background: #0B63CE; color: #fff; border: 0; border-radius: 8px; font: 700 13px Inter; cursor: pointer; } #sp-modal .review { padding: 10px 12px; border: 1px solid #e2e8f0; border-radius: 9px; margin-bottom: 8px; } #sp-modal .review .r { color: #f59e0b; font-weight: 700; font-size: 13px; } #sp-modal .review .t { font: 13.5px Inter; color: #334155; line-height: 1.55; margin-top: 4px; } #sp-modal .review .by { font: 11px Inter; color: #94a3b8; margin-top: 4px; } #sp-modal .form { background: #f8fafc; padding: 14px 16px; border-radius: 9px; } #sp-modal .form input, #sp-modal .form select, #sp-modal .form textarea { width: 100%; padding: 8px 10px; border: 1px solid #e2e8f0; border-radius: 7px; font: 13px Inter; font-family: inherit; margin-bottom: 8px; } #sp-modal .form textarea { min-height: 80px; resize: vertical; } @media print {

#sp-toolbar, #sp-stats, #sp-modal-back, #sp-modal { display: none !important; }
#sp-grid, #sp-grid-uts { grid-template-columns: 1fr 1fr; gap: 6px; }
.sp-card { page-break-inside: avoid; box-shadow: none; }
.sp-card .thumb { display: none; }

} </style>

Loading state data

<input type="text" id="sp-search" placeholder="🔎 Filter by state, language, fee, status (e.g. 'kerala', 'hindi', '₹10', 'working')…" autocomplete="off">
<select id="sp-filter-status">
  <option value="">All portal statuses</option>
  <option value="up">✓ Live (real-time)</option>
  <option value="working">Working (curated)</option>
  <option value="unreliable">Unreliable</option>
  <option value="sic_only">SIC-only portal</option>
  <option value="postal">Postal only</option>
</select>
<select id="sp-filter-fee">
  <option value="">All fees</option>
  <option value="10">₹10</option>
  <option value="20">₹20</option>
  <option value="50">₹50</option>
</select>
<a class="compare" href="/state-compare.html" id="sp-compare-link">⚖ Compare states →</a>

28 States

8 Union Territories

<div class="head"><h3 id="sp-modal-title">Modal</h3><button class="x" onclick="document.getElementById('sp-modal-back').classList.remove('open')">×</button></div>
<div class="body" id="sp-modal-body"></div>

<script> (function(){

function esc(s){return String(s||'').replace(/[&<>"]/g,function(c){return({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'})[c];});}
var STATES = [];
var TEMPLATES = {};
var REVIEW_STATS = {};  // slug → {count, avg}
var BEST_SLUGS = new Set();
function statusBadge(s) {
  var live = s.live_status;
  if (live === 'up') return '<span class="badge b-up">✓ Live</span>';
  if (live === 'slow') return '<span class="badge b-slow">⚠ Slow</span>';
  if (live === 'down') return '<span class="badge b-down">✗ Down</span>';
  var labels = { working:'Working', unreliable:'Unreliable', sic_only:'SIC only', postal:'Postal only', no_portal:'Postal only' };
  var label = labels[s.portal_status] || s.portal_status;
  var cls = s.portal_status === 'no_portal' ? 'postal' : (s.portal_status||'');
  return '<span class="badge b-' + esc(cls) + '">' + esc(label) + '</span>';
}
function card(s) {
  var stats = REVIEW_STATS[s.slug] || {count:0, avg:null};
  var thumb = '<img class="thumb" src="/state-screenshot.php?slug=' + esc(s.slug) + '" alt="' + esc(s.name) + ' portal" loading="lazy">';
  var fileFormBtn = s.filing_form_url ? '<a class="file" href="' + esc(s.filing_form_url) + '" target="_blank" rel="noopener" title="Direct link to filing form">📝 File now</a>' : '';
  var portalLink = s.portal && !s.filing_form_url ? '<a href="' + esc(s.portal) + '" target="_blank" rel="noopener">Portal ↗</a>' : '';
  var sicLink = s.sic_website ? '<a href="' + esc(s.sic_website) + '" target="_blank" rel="noopener">SIC ↗</a>' : '';
  var liveBox = (s.live_uptime_30d_pct != null) ?
    '<div class="live-uptime">Live uptime 30d: <span class="v ' + (s.live_status||'') + '">' + s.live_uptime_30d_pct + '%</span></div>' : '';
  var bestBadge = BEST_SLUGS.has(s.slug) ? '<span class="badge b-best">★ Best</span>' : '';
  var reviewsLine = stats.count > 0
    ? '<div class="reviews-line" data-action="reviews" data-slug="' + esc(s.slug) + '"><span class="stars">' + '★'.repeat(Math.round(stats.avg||0)) + '</span> ' + (stats.avg||'-') + ' / 5 · ' + stats.count + ' review' + (stats.count !== 1 ? 's' : '') + ' →</div>'
    : '<div class="reviews-line" data-action="reviews" data-slug="' + esc(s.slug) + '">No reviews yet — be the first →</div>';
  return '<div class="sp-card" data-slug="' + esc(s.slug) + '" data-name="' + esc((s.name||'').toLowerCase()) + '" data-language="' + esc((s.language||'').toLowerCase()) + '" data-status="' + esc(s.portal_status||'') + '" data-live="' + esc(s.live_status||'') + '" data-fee="' + esc(s.fee||'') + '">' +
    '<input type="checkbox" class="compare-cb" data-slug="' + esc(s.slug) + '" title="Add to comparison">' +
    thumb +
    '<div class="body">' +
      '<div class="top">' +
        '<div class="name"><a href="/state.php?slug=' + esc(s.slug) + '">📍 ' + esc(s.name) + '</a></div>' +
        '<div class="badges">' + bestBadge + statusBadge(s) + '</div>' +
      '</div>' +
      '<div class="meta"><strong>Capital:</strong> ' + esc(s.capital||'—') + '<span class="dot">·</span><strong>Lang:</strong> ' + esc(s.language||'—') + '</div>' +
      '<div class="meta"><strong>Fee:</strong> ₹' + (s.fee||10) + '<span class="dot">·</span><strong>Pay:</strong> ' + (s.mode||[]).join(', ') + '</div>' +
      '<div class="meta"><strong>SIC Chief:</strong> ' + esc(s.sic_chief||'—') + '</div>' +
      (s.sic_phone ? '<div class="meta">📞 ' + esc(s.sic_phone) + '</div>' : '') +
      reviewsLine +
      '<div class="actions">' +
        fileFormBtn + portalLink + sicLink +
        '<button data-action="template" data-slug="' + esc(s.slug) + '">📋 Template (' + esc(s.template_lang||'en') + ')</button>' +
        '<button data-action="ask" data-slug="' + esc(s.slug) + '">🤖 Ask</button>' +
        '<a href="/state.php?slug=' + esc(s.slug) + '">Detail →</a>' +
      '</div>' +
      liveBox +
    '</div>' +
  '</div>';
}
function applyFilter() {
  var q = document.getElementById('sp-search').value.toLowerCase();
  var status = document.getElementById('sp-filter-status').value;
  var fee = document.getElementById('sp-filter-fee').value;
  document.querySelectorAll('.sp-card').forEach(function(c){
    var hay = c.dataset.name + ' ' + c.dataset.language + ' ' + c.dataset.status + ' ₹' + c.dataset.fee;
    var ok = (!q || hay.indexOf(q) !== -1);
    if (status === 'up') ok = ok && c.dataset.live === 'up';
    else if (status) ok = ok && c.dataset.status === status;
    if (fee) ok = ok && c.dataset.fee === fee;
    c.style.display = ok ? '' : 'none';
  });
}
function openModal(title, html) {
  document.getElementById('sp-modal-title').textContent = title;
  document.getElementById('sp-modal-body').innerHTML = html;
  document.getElementById('sp-modal-back').classList.add('open');
}
document.getElementById('sp-modal-back').addEventListener('click', function(){
  document.getElementById('sp-modal-back').classList.remove('open');
});
function showTemplate(slug) {
  var s = STATES.find(function(x){return x.slug === slug;});
  var lang = s.template_lang || 'en';
  var tpl = TEMPLATES[lang] || TEMPLATES['en'] || '';
  var langLabel = ({en:'English',hi:'हिंदी',mr:'मराठी',ta:'தமிழ்',te:'తెలుగు',kn:'ಕನ್ನಡ',ml:'മലയാളം',bn:'বাংলা',gu:'ગુજરાતી',pa:'ਪੰਜਾਬੀ',or:'ଓଡ଼ିଆ'})[lang] || lang;
  openModal('📋 RTI template — ' + s.name + ' (' + langLabel + ')',
    '<p style="font:13px Inter;color:#64748b">Copy + paste into your application. Fields in [brackets] need to be filled in.</p>' +
    '<pre id="tpl-pre">' + esc(tpl) + '</pre>' +
    '<button class="copy" onclick="navigator.clipboard.writeText(document.getElementById(\'tpl-pre\').textContent).then(function(){this.textContent=\'✓ Copied\';}.bind(this))">📋 Copy template</button>'
  );
}
function showReviews(slug) {
  var s = STATES.find(function(x){return x.slug === slug;});
  openModal('★ Reviews for ' + s.name + ' portal', '<div>Loading…</div>');
  fetch('/state-reviews.php?slug=' + slug).then(function(r){return r.json();}).then(function(d){
    var html = '';
    if (d.count > 0) {
      html += '<div style="margin-bottom:12px;font:14px Inter"><strong style="color:#f59e0b">★ ' + d.avg_rating + ' / 5</strong> based on ' + d.count + ' citizen review' + (d.count!==1?'s':'') + '.</div>';
      d.reviews.forEach(function(r){
        html += '<div class="review"><div class="r">' + '★'.repeat(r.rating) + '<span style="color:#cbd5e1">' + '★'.repeat(5-r.rating) + '</span></div>' +
                '<div class="t">' + esc(r.text) + '</div>' +
                '<div class="by">— ' + esc(r.name||'Anonymous') + ' · ' + (r.at||'').slice(0,10) + '</div></div>';
      });
    } else {
      html += '<p style="color:#64748b">No reviews yet. Be the first ↓</p>';
    }
    html += '<div class="form"><h4 style="margin:0 0 8px;font:700 13px Inter">Submit your experience</h4>' +
            '<input type="text" id="rev-name" placeholder="Your name (optional)" maxlength="60">' +
            '<select id="rev-rating"><option value="">Pick rating…</option><option value="5">★★★★★ — Excellent (worked perfectly)</option><option value="4">★★★★ — Good</option><option value="3">★★★ — OK with workarounds</option><option value="2">★★ — Mostly broken</option><option value="1">★ — Unusable</option></select>' +
            '<textarea id="rev-text" placeholder="What was your experience? When did you file? How long did the response take? Any defects?" maxlength="600"></textarea>' +
            '<button class="copy" id="rev-submit">Submit (will be moderated)</button>' +
            '<p id="rev-msg" style="font:12px Inter;margin-top:6px"></p></div>';
    document.getElementById('sp-modal-body').innerHTML = html;
    document.getElementById('rev-submit').addEventListener('click', async function(){
      var rating = document.getElementById('rev-rating').value;
      var text = document.getElementById('rev-text').value.trim();
      var name = document.getElementById('rev-name').value.trim();
      var msg = document.getElementById('rev-msg');
      if (!rating) { msg.textContent = '⚠ Pick a rating'; msg.style.color = '#dc2626'; return; }
      if (text.length < 30) { msg.textContent = '⚠ Review must be 30+ chars'; msg.style.color = '#dc2626'; return; }
      var r = await fetch('/state-reviews.php', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({slug:slug, rating:parseInt(rating,10), text:text, name:name})});
      var j = await r.json();
      if (j.error) { msg.textContent = '⚠ ' + (j.message||j.error); msg.style.color = '#dc2626'; }
      else { msg.textContent = '✓ ' + j.message; msg.style.color = '#16a34a';
             document.getElementById('rev-text').value = ''; document.getElementById('rev-rating').value = ''; }
    });
  });
}
function askChatbot(slug) {
  var s = STATES.find(function(x){return x.slug === slug;});
  var fab = document.getElementById('rti-chat-fab');
  if (fab) {
    fab.click();
    setTimeout(function(){
      var i = document.getElementById('rti-chat-input');
      if (i) {
        i.value = 'I have a question about RTI in ' + s.name + ' — ';
        i.focus();
        i.setSelectionRange(i.value.length, i.value.length);
      }
    }, 250);
  }
}
function attachActions() {
  document.querySelectorAll('[data-action]').forEach(function(el){
    el.addEventListener('click', function(e){
      e.preventDefault();
      var slug = el.dataset.slug;
      var act = el.dataset.action;
      if (act === 'template') showTemplate(slug);
      else if (act === 'reviews') showReviews(slug);
      else if (act === 'ask') askChatbot(slug);
    });
  });
}
function attachCompare() {
  var selected = JSON.parse(localStorage.getItem('sp_compare') || '[]');
  document.querySelectorAll('.compare-cb').forEach(function(cb){
    cb.checked = selected.indexOf(cb.dataset.slug) !== -1;
    cb.addEventListener('change', function(){
      var arr = JSON.parse(localStorage.getItem('sp_compare') || '[]');
      if (cb.checked) {
        if (arr.length >= 4) { alert('Compare up to 4 states.'); cb.checked = false; return; }
        if (arr.indexOf(cb.dataset.slug) === -1) arr.push(cb.dataset.slug);
      } else {
        arr = arr.filter(function(s){return s !== cb.dataset.slug;});
      }
      localStorage.setItem('sp_compare', JSON.stringify(arr));
      var link = document.getElementById('sp-compare-link');
      link.textContent = '⚖ Compare ' + (arr.length ? '(' + arr.length + ') ' : '') + '→';
      link.href = '/state-compare.html' + (arr.length ? '?states=' + arr.join(',') : '');
    });
  });
}
function computeBest(states) {
  // "Best of month" = top 3 by composite score: live uptime 30d% (60%) + working/curated bonus (30%) + has-online (10%)
  var ranked = states.filter(function(s){return s.portal && s.live_uptime_30d_pct != null;}).map(function(s){
    var u = s.live_uptime_30d_pct || 0;
    var bonus = s.portal_status === 'working' ? 30 : (s.portal_status === 'unreliable' ? 10 : 0);
    var hasOnline = (s.mode||[]).indexOf('online') !== -1 ? 10 : 0;
    return { slug: s.slug, score: u * 0.6 + bonus + hasOnline };
  });
  ranked.sort(function(a,b){return b.score - a.score;});
  BEST_SLUGS = new Set(ranked.slice(0,3).map(function(r){return r.slug;}));
}
// Load templates from API (we'll piggyback on /state-api.php — but templates aren't in that response. So make a parallel fetch to a new endpoint OR include templates directly here.)
// For simplicity, fetch /state-api.php and a separate call for templates inlined below:
Promise.all([
  fetch('/state-api.php?include=uptime').then(function(r){return r.json();}),
  fetch('/state-reviews.php').then(function(r){return r.json();}).catch(function(){return {ok:false, reviews:[]};})
]).then(function(results){
  var d = results[0];
  var revs = results[1];
  if (!d.ok) return;
  STATES = d.states;
  // Templates: load from data file via an inline fetch
  fetch('https://righttoinformation.wiki/state-templates.json').then(function(r){return r.ok ? r.json() : {};}).catch(function(){return {};}).then(function(t){
    TEMPLATES = t || {};
    // Aggregate review stats per slug
    (revs.reviews || []).forEach(function(r){
      if (!REVIEW_STATS[r.slug]) REVIEW_STATS[r.slug] = {count:0, sum:0};
      REVIEW_STATS[r.slug].count += 1;
      REVIEW_STATS[r.slug].sum += r.rating;
    });
    Object.keys(REVIEW_STATS).forEach(function(k){ REVIEW_STATS[k].avg = (REVIEW_STATS[k].sum / REVIEW_STATS[k].count).toFixed(1); });
    computeBest(STATES);
    var stats = d.fee_distribution || {};
    var ps = d.portal_status_distribution || {};
    var liveCount = STATES.filter(function(s){return s.live_status === 'up';}).length;
    document.getElementById('sp-stats').innerHTML =
      '<div class="stat"><div class="n">' + STATES.length + '</div><div class="l">Total states + UTs</div></div>' +
      '<div class="stat"><div class="n" style="color:#16a34a">' + ((ps.working||0) + liveCount) + '</div><div class="l">Working portals</div></div>' +
      '<div class="stat"><div class="n">₹' + Math.min.apply(null, STATES.map(function(s){return s.fee||10;})) + '</div><div class="l">Cheapest fee</div></div>' +
      '<div class="stat"><div class="n">₹' + Math.max.apply(null, STATES.map(function(s){return s.fee||10;})) + '</div><div class="l">Highest fee</div></div>' +
      '<div class="stat"><div class="n">' + ((ps.postal||0) + (ps.no_portal||0)) + '</div><div class="l">Postal-only states</div></div>';
    document.getElementById('sp-grid').innerHTML = STATES.filter(function(s){return !s.is_ut;}).map(card).join('');
    document.getElementById('sp-grid-uts').innerHTML = STATES.filter(function(s){return s.is_ut;}).map(card).join('');
    attachActions();
    attachCompare();
  });
}).catch(function(e){
  document.getElementById('sp-grid').innerHTML = '<p style="color:#dc2626">Could not load state data: ' + esc(e.message||'') + '</p>';
});
document.getElementById('sp-search').addEventListener('input', applyFilter);
document.getElementById('sp-filter-status').addEventListener('change', applyFilter);
document.getElementById('sp-filter-fee').addEventListener('change', applyFilter);

})(); </script> </html>

Introduction: Why this directory matters

India's RTI Act is Central legislation, but information lies with both the Centre and the States. The filing route depends on who holds the record. A request for your passport file goes Central. A request for your land record goes State. Filing at the wrong portal wastes 30 days, sometimes 60, and at second appeal the Commission will dismiss for non-exhaustion of the proper channel.

Most State portals were built between 2012 and 2019 under the Digital India initiative. Quality varies. Kerala and Maharashtra run reliable portals. Many northern States have portals that accept applications but never route them to the SIC. This directory tells you what works and what does not.

  • Section 6 of the RTI Act, 2005 — application must be made to the PIO of the public authority holding the record.
  • Section 27 — each State Government makes its own RTI Rules governing fee and mode of payment.
  • Section 28 — the “competent authority” (for example, State Legislature Secretariat, High Court) makes its own procedural rules.
  • State RTI Rules typically mandate a Rs 10 fee payable by Indian Postal Order, Demand Draft, or Banker's Cheque to the Accounts Officer of the department. A few States accept online payment.

The Portal Directory

A. States with LIVE and working online portals

State / UT Portal URL Fee Status (April 2026)
Delhi rtionline.delhi.gov.in Rs 10 (online pay) Working. Covers Delhi Government departments, not MCD.
Maharashtra rtionline.maharashtra.gov.in Rs 10 Working. Also accepts IPO physical route.
Kerala keralartionline.gov.in Rs 10 Working. Strong tracker and SMS alerts.
Karnataka rtionline.karnataka.gov.in Rs 10 (UPI) Working. Integrated with Seva Sindhu.
Tamil Nadu tnsic.tn.gov.in Rs 50 SIC-only. Applications still go to PIO by post.
Odisha rtiodisha.gov.in Rs 10 Working for State departments.
Punjab rtionline.punjab.gov.in Rs 50 Working but routing to PIOs is inconsistent.
Haryana cmoffice.haryana.gov.in/rti Rs 50 Partial. Best used for CM's Office complaints.
Himachal Pradesh admis.hp.nic.in/himrti Rs 10 Working. Deputy Commissioner routes well.
Andhra Pradesh rti.ap.gov.in Rs 10 Working but slow response.

B. States with portals that exist but are unreliable

State / UT Portal URL Issue
Uttar Pradesh State SIC portal (upsic.up.nic.in) Application form works; file routing to PIOs is spotty. Use post.
Bihar birtips.bihar.gov.in Portal active; many departments not onboarded.
Madhya Pradesh rtionline.mp.gov.in Works intermittently.
Rajasthan rti.rajasthan.gov.in Mostly for SIC appeals; first-line filing patchy.
West Bengal rti.wbic.in SIC-side only; PIOs reachable mainly by post.
Gujarat rti.gujarat.gov.in Working; local bodies not always indexed.
Telangana tsic.telangana.gov.in SIC-side; first application by post preferred.

C. States and UTs where postal filing remains the only reliable route

  • Jammu and Kashmir — postal to J&K SIC, Srinagar or Jammu.
  • Ladakh — postal to Ladakh Administration, Leh.
  • Assam, Arunachal Pradesh, Nagaland, Manipur, Mizoram, Tripura, Meghalaya — North-Eastern states largely post-only for State matters. Union Territory offices in each go Central.
  • Uttarakhand — a dysfunctional portal exists; postal is faster.
  • Chhattisgarh, Jharkhand — post only for reliable delivery.
  • Andaman and Nicobar Islands, Lakshadweep, Puducherry, Dadra and Nagar Haveli and Daman and Diu, Chandigarh — UT administrations; use the UT Secretariat address.
  • Goa, Sikkim — post.

D. The Central Portal

  • rtionline.gov.in — for all Central Government Ministries, Departments, PSUs, and statutory bodies under Central jurisdiction. Rs 10 fee via UPI, card, or net banking. Life-and-liberty applications flagged separately.

Drafting Strategy: 7 Questions to Test Before Picking a Portal

Before filing, answer each of these in one line:

  1. Who holds the record? Central ministry, State department, municipal body, PSU, constitutional authority.
  2. Is the matter on the Central List, State List, or Concurrent List? (Seventh Schedule, Constitution of India.)
  3. Has the issue already reached the Information Commission? If yes, file a second appeal, not a fresh RTI.
  4. Does the department have a designated PIO and a designated online portal? Check the department's own website.
  5. What is the current fee and mode of payment? Rs 10 is standard, but some States levy Rs 50 or more.
  6. Is this a life-or-liberty matter? If yes, flag for 48-hour response under Section 7(1) proviso.
  7. Do I need to file parallel RTIs? Some subjects straddle Central and State records.

Common Hurdles with State Portals

Problem Counter-strategy
Portal accepts application but gives no receipt Screenshot every screen. Save PDF of the submission. Assume it failed; file parallel Speed Post.
Payment gateway fails Retry on a different browser. If it fails twice, switch to IPO + Speed Post.
Department not listed in the drop-down Portal does not cover that body. Use postal RTI.
30 days pass with no reply First appeal to FAA within 30 days. See our First Appeal template.
Portal returns your RTI with “forward by post” The portal is a facade. File by Speed Post with Rs 10 IPO. Keep the portal rejection as proof.
SIC website says “case not found” The SIC has not yet registered your appeal. Wait 10 working days, then email SIC registrar.

Step-by-Step Action Plan

  1. Identify jurisdiction. Central or State, using the Seventh Schedule check above.
  2. Open the portal URL from this page. Do not Google; fake portals exist.
  3. Register on the State portal. Most require a one-time email + OTP.
  4. Draft your RTI using the First RTI template or AI-Drafter guide.
  5. Pay the fee on the portal.
  6. Save the acknowledgement, the reference number, and a PDF of the submission.
  7. File a parallel Speed Post with Rs 10 IPO, marked “Parallel to online application no. [X]”. This is your insurance.
  8. Diarise the 30-day reply window.
  9. Follow up by email on day 25 if no response.
  10. Appeal to the First Appellate Authority on day 31 under Section 19(1).

Pro-Tip: The "Two-Channel" Rule

For any State RTI that matters, file simultaneously on the State portal AND by Speed Post. You pay Rs 10 twice and save a month when the portal silently drops your file. The Speed Post receipt is proof of filing; the portal gets you any email alerts; whichever replies first wins.

This technique cuts practitioner waiting time by 40 percent on unreliable State portals (UP, Bihar, MP, Rajasthan).

Frequently asked questions

Does rtionline.gov.in cover State matters?

No. It covers only Central Government Ministries and Departments. State matters go through the State portal or by post to the State department's PIO.

What if my matter has both Central and State components (e.g. GST)?

File parallel RTIs — one Central, one State. GST is a good example: policy and rate matters go Central (CBIC), registration and assessment go State (SGST office).

Does an RTI filed in one State reach another State?

No. The PIO has a duty to transfer under Section 6(3) if the information lies with a different public authority in the same jurisdictional chain. It does not bridge inter-State records.

Is there an all-India RTI filing app?

No single app covers all States. The CIC mobile app is Central-only. Third-party apps exist but are not official; verify each before use.

How do I find the right PIO for a local body?

Use Section 4. Every public authority must publish its PIO list. Search the department's website or send a brief letter asking for the PIO's designation and address before filing the full RTI.

Call to action

Use the directory table above to find your State's status. If it says Working, click through and file online. If it says Unreliable or Post only, download the First RTI template, print, attach IPO, post by Speed Post. Either way, see our page on Central vs State RTI to confirm jurisdiction first.

Sources

  1. Right to Information Act, 2005. Sections 6, 19, 27, 28.
  2. Seventh Schedule, Constitution of India (Central/State/Concurrent Lists).
  3. Central Information Commission, cic.gov.in.
  4. State Information Commission websites (verified April 2026).
  5. Department of Personnel and Training, Guide on the RTI Act, 2005 (2013 updated).
  6. Government of India, rtionline.gov.in.

Last reviewed on: 20 April 2026 Last reviewed: 24 April 2026.

Share this article
Was this helpful? views
state-rti-portals-directory.txt · Last modified: by 127.0.0.1

Except where otherwise noted, content on this wiki is licensed under the following license: GNU Free Documentation License 1.3
GNU Free Documentation License 1.3 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki