Legal Aid Calculator: Check Your Eligibility for Free Legal Help
Use our free Legal Aid Calculator to quickly determine if you qualify for legal aid services. Find out if you're eligible based on your income and situation in just minutes.
ready
enter income & household
📋 Federal poverty line (2025)$20,440
⚖️ 200% threshold$40,880
📊 Your income / poverty line127%
In‑state criminal defense hourly rate
$339/hrFlorida average
⚖️ Typical retainer: $2,800 – $3,200
Federal CJA rate$177 / hour
Market rate vs CJA191%
⚠️ High gap may reduce attorney availability
🔁 Referral & alternatives
Based on eligibility, suggestions will appear here.
🔄 Reset to typical values
CriminalRate(optionText) {
const match = optionText.match(/$(d+)/);
return match ? parseInt(match[1], 10) : null;
}
// get current state info
function getCurrentState() {
const select = document.getElementById('stateSelect');
const option = select.options[select.selectedIndex];
const code = option.value;
const text = option.text;
const rate = extractCriminalRate(text);
let displayName = text.split('·')[0].trim();
return { code, rate, displayName, fullText: text };
}
// main update function
function updateAll() {
// read inputs
const hh = parseInt(document.getElementById('household').value, 10);
const incomeRaw = parseFloat(document.getElementById('income').value);
const income = isNaN(incomeRaw) ? 0 : incomeRaw;
const state = getCurrentState();
// base poverty (48)
let basePov = POVERTY_48[hh] || (POVERTY_48[8] + (hh - 8) * EXTRA_PER_PERSON);
// adjust for AK / HI
if (state.code === 'AK') basePov = Math.round(basePov * AK_MULT);
if (state.code === 'HI') basePov = Math.round(basePov * HI_MULT);
const threshold200 = basePov * 2.0;
const percent = income >0 ? (income / basePov * 100) : 0;
const percentFormatted = percent.toFixed(1) + '%';
// update stats
document.getElementById('povertyLine').innerText = '$' + basePov.toLocaleString();
document.getElementById('threshold200').innerText = '$' + threshold200.toLocaleString();
document.getElementById('percentOfPoverty').innerText = percentFormatted;
// eligibility (200%)
const isEligible = income <= threshold200;
const eligEl = document.getElementById('eligibilityText');
const gapEl = document.getElementById('gapMessage');
if (isEligible) {
eligEl.innerHTML = '✅ Likely eligible for legal aid';
eligEl.className = 'eligibility-large eligible';
gapEl.innerText = `Income ≤ 200% poverty ($${threshold200.toLocaleString()}). Contact public defender.`;
} else {
eligEl.innerHTML = '⚠️ Income may exceed guidelines';
eligEl.className = 'eligibility-large not-eligible';
gapEl.innerText = `Income exceeds 200% threshold ($${threshold200.toLocaleString()}). See referral.`;
}
// referral text
const referralEl = document.getElementById('referralText');
if (isEligible) {
referralEl.innerText = 'Bring proof of income to your local public defender or legal aid office.';
} else {
referralEl.innerText = '🔹 Try a lawyer referral service, low‑cost clinic, or ask about flat fees. Some nonprofits offer sliding scale.';
}
// criminal rate display & retainer / CJA ratio
const rateDisplay = document.getElementById('criminalRateDisplay');
const rateNote = document.getElementById('rateNote');
const retainerHint = document.getElementById('retainerHint');
const ratioSpan = document.getElementById('ratioValue');
const warningDiv = document.getElementById('cjaWarning');
if (state.rate !== null && state.rate > 0) {
rateDisplay.innerText = '$' + state.rate + '/hr';
rateNote.innerText = state.displayName + ' criminal';
// retainer hint (softer dash)
retainerHint.innerText = `⚖️ Typical retainer (criminal): $2,500 – $3,500`;
// CJA ratio
const ratio = (state.rate / CJA_RATE * 100).toFixed(0);
ratioSpan.innerText = ratio + '%';
if (state.rate > CJA_RATE * 1.5) {
// 🔧 FIXED: used EM DASH (—) instead of invalid character
warningDiv.innerHTML = '⚠️ Market rate >150% of CJA — may limit assigned counsel availability.';
} else if (state.rate < CJA_RATE * 0.8) {
warningDiv.innerHTML = '✅ Market rate near or below CJA — more lawyers may accept assignments.';
} else {
warningDiv.innerHTML = 'ℹ️ Moderate gap between market and federal CJA rate.';
}
} else {
rateDisplay.innerText = 'N/A';
rateNote.innerText = state.displayName + ' (rate unavailable)';
retainerHint.innerText = 'Contact state bar for fee information.';
ratioSpan.innerText = '—';
warningDiv.innerHTML = 'No criminal rate data for this state.';
}
// also fix any possible dash in the gapMessage (just in case)
// (already using standard hyphens, fine)
}
// reset to typical (Florida, 2 persons, 26000)
function resetToTypical() {
document.getElementById('household').value = '2';
document.getElementById('income').value = '26000';
document.getElementById('stateSelect').value = 'FL';
updateAll();
}
// attach event listeners
document.getElementById('household').addEventListener('change', updateAll);
document.getElementById('income').addEventListener('input', updateAll);
document.getElementById('stateSelect').addEventListener('change', updateAll);
document.getElementById('resetBtn').addEventListener('click', resetToTypical);
// initial load
resetToTypical();
})();