OBD-II

OBD-II Codes Explained: A Complete Guide

Albert Carles — Hardware Engineer, OBD-II Specialist

Written by

Albert Carles

Hardware Engineer, OBD-II Specialist

Published Last updated 14 min read
OBD-II Codes Explained: A Complete Guide — OBD-II guide

Key Takeaway

A complete breakdown of OBD-II diagnostic trouble codes. Learn what P0, C0, B0, and U0 codes mean and how to read them.

OBD-II Diagnostic Trouble Codes (DTCs) are 5-character codes that identify which system in your vehicle reported a fault. The first character indicates the system (P = Powertrain, C = Chassis, B = Body, U = Network), the second indicates whether the code is generic (0) or manufacturer-specific (1), and the last three characters identify the specific fault. Code format and communication protocols are defined by SAE standards J2012 and J1979, both of which apply to every car sold in the US since 1996.

What Are OBD-II Codes?

On-Board Diagnostics II (OBD-II) is a standardized vehicle diagnostics system mandated by the EPA under the Clean Air Act and adopted as a federal requirement for all passenger vehicles sold in the United States since 1996. The system monitors your vehicle's engine, transmission, emissions, and increasingly the chassis and body electronics. When any monitored system detects a fault, the relevant control module stores a Diagnostic Trouble Code (DTC) that identifies the issue.

Every vehicle sold in the US since 1996 is required to have an OBD-II port, located within three feet of the steering wheel and typically under the dashboard (left of the steering column on most vehicles, near the center on some). The port itself is a standardized 16-pin connector (technically the SAE J1962 connector) that any OBD-II scanner can plug into.

The SAE Standards Behind OBD-II Codes

The reason you can take an OBD-II scanner from Year A on Make B and use it on Year C on Make D is that the entire system is defined by published standards. Two SAE standards are particularly important to understand.

SAE J2012 — Diagnostic Trouble Code Definitions. This standard defines the 5-character code structure (the P0420 format) and the meaning of each defined code in the generic ranges. When a manufacturer's ECM stores P0420, the engineering team at that manufacturer is following the J2012 definition: "Catalyst System Efficiency Below Threshold (Bank 1)." Same code, same meaning, regardless of make. J2012 is updated periodically to add new codes as new emissions monitoring requirements are added.

SAE J1979 — E/E Diagnostic Test Modes. Where J2012 defines the codes themselves, J1979 defines the communication protocol used to retrieve them. It specifies the Parameter IDs (PIDs) for every standardized data point exposed over OBD-II — engine RPM (PID 0x0C), vehicle speed (PID 0x0D), short-term fuel trim (PID 0x06), long-term fuel trim (PID 0x07), and dozens more. J1979 also defines the freeze-frame data format (Mode 02), how to read and clear stored codes (Modes 03/04), how to read pending codes (Mode 07), and how to access enhanced data (Mode 22). Any OBD-II scanner that complies with J1979 will work on any car that complies with J1979.

These two SAE standards plus the EPA emissions regulations are the reason OBD-II is universal. They are also why a $20 Bluetooth adapter from a hardware store reports the same fundamental data as a $5,000 dealer scan tool — the underlying protocol is identical. What dealer tools add are manufacturer-specific Mode 22 PIDs and proprietary code definitions that go beyond the SAE-defined generic set.

DTC Format Breakdown

PositionMeaningValues
1st charSystemP = Powertrain, C = Chassis, B = Body, U = Network
2nd charType0 = Generic (SAE J2012), 1 = Manufacturer-specific
3rd charSubsystemFuel, ignition, emissions, etc.
4th–5thFault #Specific fault within that subsystem

Example: P0171

  • P = Powertrain
  • 0 = Generic (applies to all makes; defined in SAE J2012)
  • 1 = Fuel and air metering
  • 71 = System too lean (Bank 1)
  • This code means the engine is getting too much air and not enough fuel on Bank 1. See the detailed P0171 Volkswagen diagnosis guide for the fuel-trim methodology that applies to lean codes on any make.

    How to diagnose OBD-II Codes Explained: A Complete Guide — OBD2 car scanner guide
    OBD-II Codes Explained: A Complete GuideOBD-II diagnostic guide

    Freeze Frame: The Snapshot That Comes With Every Code

    When the ECM logs a DTC, it also captures a "freeze frame" — a snapshot of operating conditions at the moment the fault triggered. Freeze frame is one of the most-underused features of OBD-II, and it is the single best tool for diagnosing intermittent faults. Here is what a typical freeze frame from a P0420 catalyst code looks like:

    ParameterValueNotes
    Engine RPM2,475 RPMHighway cruise
    Vehicle Speed65 mphSustained highway
    Engine Coolant Temp196°F (91°C)Fully warmed up
    Short-Term Fuel Trim B1+2.3%Healthy
    Long-Term Fuel Trim B1+1.1%Healthy
    Calculated Engine Load38%Moderate load
    Throttle Position18%Light cruise
    MAF Sensor12.4 g/sNormal for conditions

    Reading this freeze frame tells you: the catalyst code did not log because the engine was cold (it was at full operating temperature), not because of high engine load (load was moderate), and not because of a fuel-trim issue (trims were near zero). This narrows the cause to the catalyst itself or the downstream O2 sensor — exactly the diagnostic direction the next steps should follow. A code without a freeze frame is half the information. Always pull both.

    20 Most Common OBD-II Codes

    CodeMeaningSeverity
    P0171System Too Lean (Bank 1)Medium
    P0174System Too Lean (Bank 2)Medium
    P0300Random/Multiple Cylinder MisfireHigh
    P0301Cylinder 1 MisfireHigh
    P0420Catalyst System Below Threshold (Bank 1)Medium
    P0430Catalyst System Below Threshold (Bank 2)Medium
    P0440EVAP System General MalfunctionLow
    P0442EVAP System Small LeakLow
    P0455EVAP System Large LeakLow
    P0128Coolant Thermostat Below TempMedium
    P0135O2 Sensor Heater Circuit (Bank 1 Sensor 1)Medium
    P0401EGR Insufficient FlowMedium
    P0411Secondary Air Injection Incorrect FlowLow
    P0500Vehicle Speed SensorMedium
    P0505Idle Air Control SystemMedium
    P0700Transmission Control SystemHigh
    P0715Input/Turbine Speed SensorHigh
    C0035Left Front Wheel Speed SensorMedium
    B0100Driver Frontal Stage 1 Deployment ControlHigh
    U0100Lost Communication with ECM/PCMHigh

    Generic vs. Manufacturer-Specific Codes

    Generic codes (starting with P0, C0, B0, U0) are standardized across all manufacturers under SAE J2012. Any OBD-II scanner can read and interpret them. Manufacturer-specific codes (starting with P1, C1, B1, U1) are unique to each brand and often require specialized knowledge or tools. For example, Volkswagen's 18044 throttle adaptation code, Toyota's P1130 air-fuel ratio sensor code, and Ford's P1131 lean-condition code are all manufacturer-specific and may not be defined by SAE.

    In practice, generic codes cover most of what an everyday driver needs. Manufacturer-specific codes become important on European cars (BMW, VW, Mercedes) and for complex transmission or chassis diagnoses on any make.

    How STEER helps with this on your car

    Code numbers alone tell you the symptom, not the root cause. STEER reads the DTC, pulls the freeze frame snapshot, identifies your vehicle by VIN, and translates everything into plain English with a clear severity rating. Same SAE-standard PIDs every other scanner reads — surfaced in a workflow that does not require you to memorize the code list or look up freeze frame interpretation.

    What to Do After Reading a Code

    1. Do not just clear it. Understand the root cause first. Clearing a code without fixing the problem means it will come back within 1-3 drive cycles.

    2. Check severity. Some codes are informational (gas cap), others require immediate attention (flashing misfire). The safe-to-drive decision tree covers each scenario.

    3. Look for related codes. Multiple codes often share a single root cause. A P0171 plus a P0420 plus an O2 sensor code usually all trace back to the same upstream fault.

    4. Pull the freeze frame. Operating conditions at the moment the code logged are the single best diagnostic clue.

    5. Check open recalls. Run your VIN through the NHTSA recall lookup before paying for any emissions or powertrain repair.

    Frequently Asked Questions

    What is the difference between a P0 code and a P1 code?

    P0 codes are generic, defined by SAE J2012, and have the same meaning across all manufacturers. Any OBD-II scanner can interpret them. P1 codes are manufacturer-specific — Toyota, Volkswagen, Ford, GM, and other manufacturers each define their own P1 code library. P1 codes often require manufacturer-specific scan tools (VCDS for VW, Forscan for Ford, Techstream for Toyota) to interpret accurately, though many code databases catalog the most common P1 codes for major brands.

    How do I clear an OBD-II code?

    Any OBD-II scanner can clear codes using SAE J1979 Mode 04 (Clear Diagnostic Information). Connect the scanner, select "Clear Codes" or "Erase DTCs," and confirm. The codes clear from ECM memory and the check engine light extinguishes. Important: clearing the code does not fix the underlying issue, and the code will return within 1-3 drive cycles if the fault persists. Clearing also resets all OBD-II readiness monitors to "Not Ready," which causes automatic failure of OBD-II-based emissions inspections until monitors complete naturally (typically 100-200 miles of varied driving).

    What is a pending code vs a confirmed code?

    A pending DTC is a fault the ECM has detected once but has not yet confirmed across multiple drive cycles. The check engine light typically does not illuminate for pending codes — they are stored as warnings. A confirmed DTC has occurred across two or more consecutive drive cycles (the exact number varies by code) and triggers the check engine light. Both types are readable; pending codes are accessed via SAE J1979 Mode 07. Pending codes are a useful early-warning signal for intermittent faults that have not yet triggered the light.

    Can I read OBD-II codes without a scanner?

    Some older vehicles (pre-2000) supported "key dance" or "paperclip" methods to flash check engine light codes via the OBD-II port pins or the gauge cluster. For OBD-II compliant vehicles (1996+) using the standard J1979 protocol, a scanner is required to retrieve codes from the ECM memory. Inexpensive options: Bluetooth adapters paired with a smartphone app ($20-$60), basic handheld scanners ($30-$80), or free code scans at AutoZone, O'Reilly, and similar parts stores.

    What does "readiness monitor" mean?

    OBD-II readiness monitors are internal self-tests the ECM runs to verify that emissions-related systems are functioning correctly. There are typically 8-11 monitors per vehicle (catalyst, EVAP, O2 sensor, O2 heater, EGR, secondary air, A/C system, misfire, comprehensive component, fuel system, plus a few others depending on configuration). Each monitor is either "Ready" (test has run and passed) or "Not Ready" (test has not yet run or failed). OBD-II emissions inspections require all monitors to be Ready and no stored DTCs to pass. Monitors reset to Not Ready any time codes are cleared or the battery is disconnected.

    Are all OBD-II codes safety-critical?

    No. Many codes (gas cap codes, slow-developing catalyst efficiency codes, idle control codes) are informational and the vehicle is safe to drive in normal conditions. Other codes (flashing misfire, transmission failure, ABS module fault) indicate active mechanical or safety system problems and require immediate attention. The check engine light alone does not distinguish between these — the code itself does. The safe-to-drive decision tree gives scenario-by-scenario guidance by code.

    Get plain-English answers on your iPhone

    STEER reads your car's codes the moment they trigger and translates them into something you can act on.

    Download on the App Store

    Related reads

    Keep going. These pair well with what you just read.