{
  "candidates": [
    {
      "ballot_status": "certified",
      "party": "Republican",
      "person": "keith-faber",
      "running_mate": null
    },
    {
      "ballot_status": "certified",
      "party": "Democratic",
      "person": "john-kulewicz",
      "running_mate": null
    }
  ],
  "cycle": 2026,
  "date": "2026-11-03",
  "district": null,
  "id": "2026-attorney-general",
  "notes": "Candidates are listed alphabetically by surname (N-5). Ohio rotates ballot order by precinct. The seat became vacant early: Attorney General Dave Yost, himself term-limited, resigned effective June 7, 2026, and Governor Mike DeWine appointed the public safety director Andy Wilson as interim attorney general. Wilson is not a candidate in November, so the election is between Faber and Kulewicz either way. There is no rendered field for that context; see the question in design/reports/politics/P1-02b.md. P1-04’s Secretary of State import is the authority on the certified list; this record carries the two major-party nominees the research archive profiled.",
  "office": "Attorney General of Ohio",
  "office_slug": "attorney-general",
  "research_ref": [
    "cracked-buckeye-political@b5291c6a147d356f768bea96a9dc281ca604771b:data/candidates-2026/keith-faber.md",
    "cracked-buckeye-political@b5291c6a147d356f768bea96a9dc281ca604771b:data/candidates-2026/john-kulewicz.md",
    "cracked-buckeye-political@b5291c6a147d356f768bea96a9dc281ca604771b:data/candidates-2026/README.md"
  ],
  "result": null,
  "sources": [
    {
      "accessed": "2026-09-18",
      "publisher": "Ballotpedia",
      "title": "Ohio Attorney General election, 2026",
      "url": "https://ballotpedia.org/Ohio_Attorney_General_election,_2026"
    },
    {
      "accessed": "2026-09-18",
      "publisher": "Ballotpedia",
      "title": "Keith Faber",
      "url": "https://ballotpedia.org/Keith_Faber"
    },
    {
      "accessed": "2026-09-18",
      "publisher": "Ballotpedia",
      "title": "John Kulewicz",
      "url": "https://ballotpedia.org/John_Kulewicz"
    },
    {
      "accessed": "2026-09-18",
      "publisher": "Wikipedia",
      "title": "2026 Ohio Attorney General election",
      "url": "https://en.wikipedia.org/wiki/2026_Ohio_Attorney_General_election"
    },
    {
      "accessed": "2026-09-18",
      "publisher": "WKYC",
      "title": "Ohio primary election 2026: John Kulewicz wins Democratic nomination for attorney general, will face Republican Keith Faber",
      "url": "https://www.wkyc.com/article/news/politics/elections/dnp-ohio-primary-election-2026-john-kulewicz-wins-democratic-nomination-attorney-general-republican-keith-faber-general-election/95-4e3af7fc-b3b6-432c-bec8-cfd0afbaf3c2"
    },
    {
      "accessed": "2026-09-18",
      "publisher": "Ohio Capital Journal",
      "title": "Columbus lawyer John Kulewicz wins Ohio Democratic primary for Attorney General",
      "url": "https://ohiocapitaljournal.com/briefs/columbus-lawyer-john-kulewicz-wins-ohio-democratic-primary-for-attorney-general/"
    },
    {
      "accessed": "2026-09-18",
      "date": "2026-05-07",
      "publisher": "Ohio Capital Journal",
      "title": "Ohio Attorney General Dave Yost resigning to take private-sector job with nonprofit law firm",
      "url": "https://ohiocapitaljournal.com/2026/05/07/sources-say-ohio-attorney-general-dave-yost-expected-to-resign-to-take-private-sector-job/"
    },
    {
      "accessed": "2026-09-18",
      "date": "2026-05-11",
      "publisher": "Ohio Capital Journal",
      "title": "Ohio Gov. Mike DeWine selects public safety director as interim attorney general",
      "url": "https://ohiocapitaljournal.com/2026/05/11/ohio-gov-mike-dewine-selects-public-safety-director-as-interim-attorney-general/"
    },
    {
      "accessed": "2026-09-18",
      "date": "2026-06-08",
      "publisher": "Spectrum News 1",
      "title": "Andy Wilson steps into new position as Ohio attorney general",
      "url": "https://spectrumnews1.com/oh/columbus/news/2026/06/08/andy-wilson-steps-in-new-position-as-ohio-attorney-general-"
    }
  ],
  "type": "race",
  "unpaged_candidates": [],
  "updated": "2026-09-19",
  "symmetry": {
    "ratio": 2.0,
    "candidates": [
      {
        "person": "keith-faber",
        "name": "Keith Faber",
        "counts": {
          "finance": 3,
          "donors": 10,
          "outside_spending": 0,
          "polling": 3,
          "candidacies": 1,
          "claims": 0,
          "ballot": 1,
          "money": 13,
          "elections": 1
        },
        "whole_counts": {
          "positions": 14,
          "record": 10,
          "net_worth": 0,
          "interests": 10,
          "endorsements_given": 0,
          "endorsements_received": 2,
          "offices": 5,
          "sources": 52,
          "profile": 10,
          "endorsements": 2
        },
        "all_counts": {
          "positions": 14,
          "record": 10,
          "finance": 3,
          "donors": 10,
          "outside_spending": 0,
          "net_worth": 0,
          "interests": 10,
          "polling": 3,
          "candidacies": 1,
          "endorsements_given": 0,
          "endorsements_received": 2,
          "offices": 5,
          "sources": 52,
          "claims": 0,
          "profile": 10,
          "ballot": 1,
          "money": 13,
          "elections": 1,
          "endorsements": 2
        }
      },
      {
        "person": "john-kulewicz",
        "name": "John Kulewicz",
        "counts": {
          "finance": 4,
          "donors": 0,
          "outside_spending": 0,
          "polling": 3,
          "candidacies": 1,
          "claims": 0,
          "ballot": 1,
          "money": 4,
          "elections": 1
        },
        "whole_counts": {
          "positions": 5,
          "record": 1,
          "net_worth": 0,
          "interests": 0,
          "endorsements_given": 0,
          "endorsements_received": 6,
          "offices": 1,
          "sources": 27,
          "profile": 6,
          "endorsements": 6
        },
        "all_counts": {
          "positions": 5,
          "record": 1,
          "finance": 4,
          "donors": 0,
          "outside_spending": 0,
          "net_worth": 0,
          "interests": 0,
          "polling": 3,
          "candidacies": 1,
          "endorsements_given": 0,
          "endorsements_received": 6,
          "offices": 1,
          "sources": 27,
          "claims": 0,
          "profile": 6,
          "ballot": 1,
          "money": 4,
          "elections": 1,
          "endorsements": 6
        }
      }
    ],
    "per_race": {
      "sections": {
        "ballot": {
          "max": 1,
          "min": 1,
          "ratio": 1.0,
          "skewed": false
        },
        "candidacies": {
          "max": 1,
          "min": 1,
          "ratio": 1.0,
          "skewed": false
        },
        "claims": {
          "max": 0,
          "min": 0,
          "ratio": null,
          "skewed": false
        },
        "donors": {
          "max": 10,
          "min": 0,
          "ratio": null,
          "skewed": true
        },
        "elections": {
          "max": 1,
          "min": 1,
          "ratio": 1.0,
          "skewed": false
        },
        "finance": {
          "max": 4,
          "min": 3,
          "ratio": 1.3333333333333333,
          "skewed": false
        },
        "money": {
          "max": 13,
          "min": 4,
          "ratio": 3.25,
          "skewed": true
        },
        "outside_spending": {
          "max": 0,
          "min": 0,
          "ratio": null,
          "skewed": false
        },
        "polling": {
          "max": 3,
          "min": 3,
          "ratio": 1.0,
          "skewed": false
        }
      },
      "skewed": [
        "donors"
      ],
      "notes": [
        "Donors, in this race: 10 for Keith Faber, 0 for John Kulewicz. The gap is in our research, not in them."
      ]
    },
    "whole_record": {
      "sections": {
        "endorsements": {
          "max": 6,
          "min": 2,
          "ratio": 3.0,
          "skewed": true
        },
        "endorsements_given": {
          "max": 0,
          "min": 0,
          "ratio": null,
          "skewed": false
        },
        "endorsements_received": {
          "max": 6,
          "min": 2,
          "ratio": 3.0,
          "skewed": true
        },
        "interests": {
          "max": 10,
          "min": 0,
          "ratio": null,
          "skewed": true
        },
        "net_worth": {
          "max": 0,
          "min": 0,
          "ratio": null,
          "skewed": false
        },
        "offices": {
          "max": 5,
          "min": 1,
          "ratio": 5.0,
          "skewed": true
        },
        "positions": {
          "max": 14,
          "min": 5,
          "ratio": 2.8,
          "skewed": true
        },
        "profile": {
          "max": 10,
          "min": 6,
          "ratio": 1.6666666666666667,
          "skewed": false
        },
        "record": {
          "max": 10,
          "min": 1,
          "ratio": 10.0,
          "skewed": true
        },
        "sources": {
          "max": 52,
          "min": 27,
          "ratio": 1.9259259259259258,
          "skewed": false
        }
      },
      "skewed": [
        "endorsements_received",
        "positions",
        "record"
      ],
      "notes": [
        "Endorsements received, across every cycle: 6 for John Kulewicz, 2 for Keith Faber. The gap is in our research, not in them.",
        "Where they stand, across every cycle: 14 for Keith Faber, 5 for John Kulewicz. The gap is in our research, not in them.",
        "Record in office, across every cycle: 10 for Keith Faber, 1 for John Kulewicz. The gap is in our research, not in them."
      ]
    },
    "sections": {
      "endorsements": {
        "max": 6,
        "min": 2,
        "ratio": 3.0,
        "skewed": true
      },
      "endorsements_given": {
        "max": 0,
        "min": 0,
        "ratio": null,
        "skewed": false
      },
      "endorsements_received": {
        "max": 6,
        "min": 2,
        "ratio": 3.0,
        "skewed": true
      },
      "interests": {
        "max": 10,
        "min": 0,
        "ratio": null,
        "skewed": true
      },
      "net_worth": {
        "max": 0,
        "min": 0,
        "ratio": null,
        "skewed": false
      },
      "offices": {
        "max": 5,
        "min": 1,
        "ratio": 5.0,
        "skewed": true
      },
      "positions": {
        "max": 14,
        "min": 5,
        "ratio": 2.8,
        "skewed": true
      },
      "profile": {
        "max": 10,
        "min": 6,
        "ratio": 1.6666666666666667,
        "skewed": false
      },
      "record": {
        "max": 10,
        "min": 1,
        "ratio": 10.0,
        "skewed": true
      },
      "sources": {
        "max": 52,
        "min": 27,
        "ratio": 1.9259259259259258,
        "skewed": false
      },
      "ballot": {
        "max": 1,
        "min": 1,
        "ratio": 1.0,
        "skewed": false
      },
      "candidacies": {
        "max": 1,
        "min": 1,
        "ratio": 1.0,
        "skewed": false
      },
      "claims": {
        "max": 0,
        "min": 0,
        "ratio": null,
        "skewed": false
      },
      "donors": {
        "max": 10,
        "min": 0,
        "ratio": null,
        "skewed": true
      },
      "elections": {
        "max": 1,
        "min": 1,
        "ratio": 1.0,
        "skewed": false
      },
      "finance": {
        "max": 4,
        "min": 3,
        "ratio": 1.3333333333333333,
        "skewed": false
      },
      "money": {
        "max": 13,
        "min": 4,
        "ratio": 3.25,
        "skewed": true
      },
      "outside_spending": {
        "max": 0,
        "min": 0,
        "ratio": null,
        "skewed": false
      },
      "polling": {
        "max": 3,
        "min": 3,
        "ratio": 1.0,
        "skewed": false
      }
    },
    "skewed": [
      "donors",
      "endorsements_received",
      "positions",
      "record"
    ],
    "race": "2026-attorney-general",
    "notes": [
      "Donors, in this race: 10 for Keith Faber, 0 for John Kulewicz. The gap is in our research, not in them.",
      "Endorsements received, across every cycle: 6 for John Kulewicz, 2 for Keith Faber. The gap is in our research, not in them.",
      "Where they stand, across every cycle: 14 for Keith Faber, 5 for John Kulewicz. The gap is in our research, not in them.",
      "Record in office, across every cycle: 10 for Keith Faber, 1 for John Kulewicz. The gap is in our research, not in them."
    ]
  },
  "candidate_links": [
    {
      "person": "keith-faber",
      "name": null,
      "url": "https://crackedbuckeye.com/people/keith-faber/",
      "api": "https://crackedbuckeye.com/api/politics/people/keith-faber.json"
    },
    {
      "person": "john-kulewicz",
      "name": null,
      "url": "https://crackedbuckeye.com/people/john-kulewicz/",
      "api": "https://crackedbuckeye.com/api/politics/people/john-kulewicz.json"
    }
  ],
  "claims": [],
  "_meta": {
    "generated": "2026-09-19",
    "license": "CC BY 4.0 for the compilation; each source keeps its own terms",
    "cite": "Cracked Buckeye (Open Shower Co), \"Attorney General of Ohio, 2026\", https://crackedbuckeye.com/election/2026/attorney-general/, built 2026-09-19, accessed [date].",
    "schema": "https://crackedbuckeye.com/api/politics/schema.json",
    "url": "https://crackedbuckeye.com/election/2026/attorney-general/",
    "api": "https://crackedbuckeye.com/api/politics/races/2026-attorney-general.json"
  },
  "cite": "Cracked Buckeye (Open Shower Co), \"Attorney General of Ohio, 2026\", https://crackedbuckeye.com/election/2026/attorney-general/, built 2026-09-19, accessed [date].",
  "url": "https://crackedbuckeye.com/election/2026/attorney-general/",
  "api": "https://crackedbuckeye.com/api/politics/races/2026-attorney-general.json",
  "license": "CC BY 4.0 for the compilation; each source keeps its own terms",
  "generated": "2026-09-19",
  "schema": "https://crackedbuckeye.com/api/politics/schema.json"
}
