{
  "slug": "public-records-request-cost",
  "title": "Public Records Request Cost Calculator",
  "heading": "FOIA / Records Request Cost Calculator",
  "category": "financial",
  "url": "https://www.revenuelab.fyi/toolbox/public-records-request-cost",
  "summary": "Estimate search, review, and duplication charges before you file.",
  "description": "Agencies bill for staff search time, page duplication, and sometimes review by counsel. Requester category changes what is free. Estimating first helps you narrow the request so it lands under the free tier.",
  "formula": "Cost = max(0, search hours − free hours) × rate + max(0, pages − free pages) × per page + review + media.",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=public-records-request-cost",
  "inputs": [
    {
      "id": "searchHours",
      "label": "Estimated search hours",
      "kind": "number",
      "hint": null,
      "default": 6,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "freeHours",
      "label": "Free search hours",
      "kind": "number",
      "hint": null,
      "default": 2,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "rate",
      "label": "Staff hourly rate",
      "kind": "number",
      "hint": null,
      "default": 42,
      "unit": "$",
      "min": 0,
      "max": null
    },
    {
      "id": "pages",
      "label": "Pages expected",
      "kind": "number",
      "hint": null,
      "default": 600,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "freePages",
      "label": "Free pages",
      "kind": "number",
      "hint": null,
      "default": 100,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "perPage",
      "label": "Cost per page",
      "kind": "number",
      "hint": null,
      "default": 0.1,
      "unit": "$",
      "min": 0,
      "max": null
    },
    {
      "id": "review",
      "label": "Review / redaction charges",
      "kind": "number",
      "hint": null,
      "default": 0,
      "unit": "$",
      "min": 0,
      "max": null
    }
  ],
  "outputs": [
    {
      "id": "total",
      "label": "Estimated fee",
      "format": "currency",
      "hint": null,
      "primary": true
    },
    {
      "id": "search",
      "label": "Search time charges",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "dup",
      "label": "Duplication charges",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "review",
      "label": "Review charges",
      "format": "currency",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Estimated search hours: 6",
      "Free search hours: 2",
      "Staff hourly rate: 42 $",
      "Pages expected: 600",
      "Free pages: 100",
      "Cost per page: 0.1 $",
      "Review / redaction charges: 0 $"
    ],
    "outputs": [
      "Estimated fee: $218.00",
      "Search time charges: $168.00",
      "Duplication charges: $50.00",
      "Review charges: $0.00"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter estimated search hours.",
      "Enter free search hours.",
      "Enter staff hourly rate ($).",
      "Enter pages expected.",
      "Enter free pages.",
      "Enter cost per page ($).",
      "Enter review / redaction charges ($).",
      "Read your estimated fee on the right — it updates as you type.",
      "Hit Share to keep the scenario or send it to someone."
    ]
  },
  "scenarios": [
    {
      "name": "Conservative",
      "description": "Lower-end numbers — what if things land soft?",
      "values": {
        "searchHours": 3.5999999999999996,
        "freeHours": 1.2,
        "rate": 42,
        "pages": 350,
        "freePages": 60,
        "perPage": 0.06,
        "review": 0
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "searchHours": 6,
        "freeHours": 2,
        "rate": 42,
        "pages": 600,
        "freePages": 100,
        "perPage": 0.1,
        "review": 0
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "searchHours": 9.600000000000001,
        "freeHours": 3.2,
        "rate": 42,
        "pages": 950,
        "freePages": 160,
        "perPage": 0.16000000000000003,
        "review": 0
      }
    }
  ],
  "limitations": [
    "Results are estimates before tax, fees, and inflation unless an input explicitly covers them.",
    "Rates are treated as fixed for the whole period — variable-rate products will drift from this projection.",
    "This is educational maths, not financial advice. Check anything contractual with the lender or your accountant."
  ],
  "faq": [
    {
      "q": "How do I keep the fee low?",
      "a": "Narrow the date range, name specific custodians, and ask for electronic delivery. Requesting records already posted online is the most common source of avoidable charges."
    },
    {
      "q": "Who gets fee waivers?",
      "a": "News media, educational, and non-commercial scientific requesters typically get search time free, and public-interest waivers can eliminate fees entirely when disclosure benefits the public."
    }
  ],
  "related": [],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — Public Records Request Cost Calculator (https://www.revenuelab.fyi/toolbox/public-records-request-cost)"
}