{
  "slug": "csv-pii-redactor",
  "name": "gizza-ai/csv-pii-redactor",
  "version": "0.1.0",
  "title": "CSV PII Redactor — Mask, Salted-Hash & Redact Columns — gizza.ai",
  "description": "Mask, salted-hash, or redact the values in chosen CSV columns for safe sharing — pick columns by name or index, in your browser. Free, private, no upload.",
  "tags": [
    "csv pii redactor",
    "anonymize csv columns",
    "mask csv",
    "hash csv column",
    "salted hash pii",
    "redact csv",
    "data masking",
    "csv anonymizer"
  ],
  "category": "data",
  "urls": {
    "page": "https://gizza.ai/tools/csv-pii-redactor/",
    "markdown": "https://gizza.ai/tools/csv-pii-redactor/index.md",
    "descriptor": "https://gizza.ai/tools/csv-pii-redactor/tool.json",
    "deep_link_example": "https://gizza.ai/tools/csv-pii-redactor/?data=name%2Cemail%2Ccard%0AAda%2Cada%40example.com%2C4111111111111111&columns=email%2Ccard&mode=mask&header=true&delimiter=%2C&mask_char=%2A&keep_last=0&salt=team-2026&hash_length=8&label=%5BREDACTED%5D"
  },
  "cli": "gizza tool csv-pii-redactor \"name,email,card\nAda,ada@example.com,4111111111111111\" 'columns=email,card'",
  "tool": {
    "description": "Redact personally-identifiable data in the columns you choose of a CSV. Name columns by header (header=true) or 1-based index; the mode is 'mask' (replace characters with mask_char, keeping the last keep_last visible), 'hash' (salted SHA-256 hex code, deterministic so equal values map to equal codes), or 'redact' (replace with a fixed label). Non-selected columns and the header row are unchanged. delimiter is a single char or comma/tab/semicolon/pipe. Runs locally.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "columns": {
          "description": "Comma-separated columns to redact: column names (when header=true) or 1-based indices, e.g. 'email,phone' or '2,4'. Only these columns are changed; others pass through.",
          "type": "string"
        },
        "data": {
          "description": "The CSV text to redact.",
          "type": "string"
        },
        "delimiter": {
          "default": ",",
          "description": "Field separator: a single char or 'comma'/'tab'/'semicolon'/'pipe'. Default ','.",
          "type": "string"
        },
        "hash_length": {
          "default": 8,
          "description": "hash mode: how many hex characters of the SHA-256 code to keep, 4–64 (8 ≈ short code, 64 = full digest). Default 8.",
          "maximum": 64,
          "minimum": 4,
          "type": "integer"
        },
        "header": {
          "default": true,
          "description": "Treat the first row as a header so columns can be named and the header row is left unchanged (default true). With false, address columns by 1-based index.",
          "type": "boolean"
        },
        "keep_last": {
          "default": 0,
          "description": "mask mode: leave the last N characters of each value visible, masking the rest (e.g. 4 → ****1234). Default 0 (mask everything).",
          "maximum": 64,
          "minimum": 0,
          "type": "integer"
        },
        "label": {
          "default": "[REDACTED]",
          "description": "redact mode: the fixed string every selected cell becomes. Default '[REDACTED]'.",
          "type": "string"
        },
        "mask_char": {
          "default": "*",
          "description": "mask mode: the character each hidden character becomes (single char). Default '*'.",
          "type": "string"
        },
        "mode": {
          "default": "mask",
          "description": "How to replace each selected cell: 'mask' = characters → mask_char (length kept, last keep_last visible); 'hash' = salted SHA-256 hex code (deterministic, joinable); 'redact' = the fixed label. Default 'mask'.",
          "enum": [
            "mask",
            "hash",
            "redact"
          ],
          "type": "string"
        },
        "salt": {
          "description": "hash mode: salt prepended before hashing so codes aren't reversible via rainbow tables; the same salt+value always yields the same code (values stay joinable across files). Default empty.",
          "type": "string"
        }
      },
      "required": [
        "data",
        "columns"
      ],
      "type": "object"
    }
  }
}