Knowledge Hub
OBD2 Codes Explained: How to Read Diagnostic Trouble Codes

You connect an OBD2 scanner and see something like P0300, P0420 or P0171.
Now what?
Those five-character messages are Diagnostic Trouble Codes, usually shortened to DTCs. They are one of the most useful pieces of information an OBD2 scanner can retrieve, but they are also easy to misunderstand.
A trouble code does not normally mean:
“Replace this part.”
It means the vehicle’s diagnostic system detected a condition that meets the criteria for that code.
That difference matters.
Learning to read the code is the first step. Learning how to use it as diagnostic evidence is the next.
What Is an OBD2 Trouble Code?
A Diagnostic Trouble Code is an identifier reported by a vehicle’s onboard diagnostic system when a monitored malfunction or condition is detected.
SAE J2012 defines the standardized DTC format and standardized code sets used by OBD systems, while also defining ranges reserved for manufacturer-specific use.
A typical code looks like this: P0300
The five characters are not random.
They help identify the general system and the particular fault definition associated with the code.
But the code itself is only part of the diagnostic picture.
Depending on the situation, useful supporting information can include:
- whether the code is pending or confirmed;
- whether a permanent code is present;
- freeze-frame information;
- other codes stored at the same time;
- live data;
- symptoms;
- vehicle-specific service information;
- results from electrical or mechanical testing.
That is why reading a code and diagnosing a fault are not the same task.
How to Read an OBD2 Code

The familiar OBD2 DTC format uses one letter followed by four characters.
The easiest way to understand it is to read the code from left to right.
First character: P, B, C or U
The first character identifies the broad system family.
P: Powertrain. Powertrain codes cover areas associated with the engine, transmission and related powertrain/emissions controls. Many of the Check Engine codes drivers encounter are P codes. Examples include P0300, P0420 and P0171.
B: Body. Body codes are associated with body-related electronic systems. The exact systems and available diagnostic information can be vehicle-specific.
C: Chassis. Chassis codes are associated with chassis-related systems. Depending on the vehicle and diagnostic tool, this can include systems outside the scope of a basic engine-only OBD2 code reader.
U: Network and Vehicle Integration. U codes relate to communication/network and vehicle-integration faults. A U code can indicate that modules are having trouble communicating, but it does not automatically tell you why communication failed.
The first letter therefore tells you the broad neighborhood of the fault, not the failed component.
Second character: code family
This part is often oversimplified.
You may see beginner guides say: 0 = generic, 1 = manufacturer-specific.
That is useful as a starting point, but it is not a complete rule for every DTC family.
SAE J2012 defines standardized code ranges and ranges reserved for vehicle-manufacturer use.
For common powertrain codes:
- P0xxx codes are standardized;
- P1xxx codes are manufacturer-specific;
- P2xxx codes are standardized;
- P3xxx includes both standardized and manufacturer-specific ranges.
Other B, C and U code families also have defined standardized and manufacturer-specific ranges.
The practical lesson is simple: do not decode a manufacturer-specific DTC without knowing the vehicle make and the correct definition for that vehicle.
A code that looks similar across two brands does not necessarily carry the same manufacturer-specific meaning.
For the complete distinction, see Generic vs Manufacturer-Specific OBD2 Codes: What’s the Difference?
Remaining characters: fault identification
The remaining characters narrow the code toward a particular diagnostic fault or condition.
For standardized powertrain codes, portions of the number can also indicate broad functional areas.
For example, common P03xx codes include ignition and misfire-related faults.
That is why P0300 and P0301 are related, but not identical.
P0300 is associated with random/multiple-cylinder misfire detection.
P0301 identifies a misfire associated with cylinder 1.
The complete five-character code matters.
Never search only part of a DTC and assume the result applies.
Generic vs Manufacturer-Specific OBD2 Codes
This distinction is important because not every code definition is universal.
Standardized codes. Standardized DTCs are defined so the code has a consistent standardized meaning where that definition applies. That helps generic OBD2 equipment provide useful diagnostic information across different vehicle brands. For example, standardized powertrain codes such as P0300 are not supposed to acquire an entirely different definition simply because the badge on the vehicle changes.
Manufacturer-specific codes. Manufacturers also need diagnostic codes for vehicle-specific systems, strategies and faults that are not covered by the standardized set. Those codes occupy manufacturer-specific ranges defined within the DTC framework. When you retrieve one, the correct interpretation may require the exact manufacturer, model, model year, powertrain, module and manufacturer service information, plus a diagnostic tool with the required enhanced coverage.
This is one reason a basic OBD2 scanner and a vehicle-specific or full-system diagnostic tool can provide very different levels of information.
What Do Common P-Code Groups Mean?
For beginners, powertrain codes are the most familiar because they commonly appear in Check Engine diagnostics.
Some standardized P-code groupings provide useful clues about the general area involved, including groups associated with fuel and air metering, injector circuits, ignition and misfire, emissions controls, vehicle speed and idle control, computer/output circuits, and transmission-related faults.
But these groups should be used as orientation, not diagnosis.
Knowing that a code falls in a misfire family tells you what kind of problem the vehicle detected. It does not tell you whether the root cause is a spark plug, ignition coil, injector, wiring fault, vacuum leak, compression problem or something else.
Three Common OBD2 Code Examples

P0300: Random/Multiple-Cylinder Misfire Detected
P tells you the code is in the powertrain family. The standardized code definition points toward random or multiple-cylinder misfire detection.
What it does not tell you is the root cause. Possible causes can vary widely, so replacing ignition parts simply because P0300 is present is not a complete diagnostic strategy. Related cylinder-specific codes, freeze-frame information, misfire data where available, fuel trims, symptoms and physical testing can all matter.
P0420: Catalyst System Efficiency Below Threshold, Bank 1
P0420 is another standardized powertrain code. It indicates that the vehicle’s diagnostic strategy detected catalyst-system performance below the applicable threshold for Bank 1.
It does not automatically prove that the catalytic converter itself is the only possible cause. Before replacing an expensive component, the diagnostic process should consider the complete fault context and applicable vehicle-specific test procedure.
P0171: System Too Lean, Bank 1
P0171 indicates a lean condition for Bank 1 under the standardized definition. “Lean” means the diagnostic system has detected a fuel/air-control condition consistent with too little fuel relative to air, or an equivalent correction condition recognized by the control strategy.
Again, the code does not identify one guaranteed failed part. Air leaks, fuel-delivery problems, measurement errors and other faults can contribute to a lean condition. The correct next step is diagnosis, not parts roulette.
Pending vs Confirmed vs Permanent Codes
A scanner may show more than one status for diagnostic trouble codes. Understanding the difference helps prevent misreading what the vehicle is telling you.
Pending codes. A pending code generally means the diagnostic system has detected a condition but the criteria for a confirmed fault may not yet have been satisfied. Pending information can be useful when a problem is intermittent or when checking whether a condition returns after repair. A pending code should not automatically be treated as proof that a component has failed.
Confirmed or stored codes. A confirmed/stored code indicates that the diagnostic criteria for storing that fault have been met. Depending on the fault and OBD strategy, a confirmed emissions-related fault can be associated with illumination of the Malfunction Indicator Lamp, the Check Engine light. The exact scanner may use wording such as “stored,” “confirmed” or similar terminology.
Permanent codes. Permanent DTCs are different from ordinary erasable codes. On vehicles that support them, a permanent emissions-related DTC cannot simply be removed by pressing “Clear Codes” or disconnecting the battery. The OBD system clears the permanent code after the relevant criteria are satisfied and the system verifies that the fault is no longer present. That makes permanent codes useful evidence that a qualifying fault occurred even if ordinary diagnostic information has been cleared.
What Is Freeze-Frame Data?

When certain emissions-related faults are stored, the OBD system can preserve a snapshot of operating conditions associated with the fault. This is called freeze-frame data.
Depending on the vehicle and fault, it can provide values such as engine speed, engine load, coolant temperature, vehicle speed, fuel-system information, fuel trims and other supported parameters.
Freeze-frame data can help answer a question the DTC alone cannot: what was the vehicle doing when the fault was recorded?
For example, a problem that appeared during a cold start may require a different diagnostic path from one that occurred under heavy load at highway speed.
That is why clearing codes before looking at freeze-frame information can throw away useful evidence.
Does an OBD2 Code Tell You Which Part Is Bad?
Usually, no. This is the most important lesson in this article.
A DTC identifies a detected diagnostic condition. A code description may mention a sensor, circuit, system or performance condition, but that does not automatically prove that the named component itself has failed.
Consider a hypothetical sensor-related fault. Possible causes might include the sensor, damaged wiring, a poor connector, loss of power or ground, an air or exhaust leak, another component affecting the reading, a mechanical problem, contamination, or a control-system issue.
The exact possibilities depend on the code and vehicle.
A good technician therefore asks: “What could cause the vehicle to set this code?”, not: “Which part name appears in the code description?”
That single change in thinking can prevent expensive unnecessary repairs.
Why One Problem Can Set Multiple Codes
A vehicle can store several DTCs at the same time.
That does not necessarily mean several unrelated components failed simultaneously.
One underlying problem can sometimes affect multiple systems or measurements. For example, a shared electrical problem, air leak, low system voltage or communication problem can create more than one symptom or code.
The relationship between codes matters. Before treating each DTC as a separate repair, look at which codes are present, which are pending or confirmed, when they appeared, freeze-frame information, whether the codes share a system or operating condition, and relevant symptoms.
The complete pattern can be more informative than any one code in isolation.
Why the Same Code Can Have Different Causes

A standardized DTC has a standardized definition, but the physical reason the vehicle reached that diagnostic conclusion can vary.
Two vehicles with the same P0171 code, for example, do not necessarily need the same repair. One might have an intake leak. Another might have a fuel-delivery problem. Another might have a measurement issue.
Vehicle design, engine configuration, mileage, previous repairs, operating conditions and other stored data all affect diagnosis.
This is why internet lists of “top five causes” can be useful for orientation but should not replace vehicle-specific testing.
What Should You Record Before Clearing Codes?
Before pressing Clear or Erase, preserve the information that may help diagnosis. At minimum, record:
- The complete DTC: all five characters.
- Whether it is pending, confirmed/stored or permanent.
- Every other code present.
- Freeze-frame information, if available.
- Relevant readiness status if emissions testing matters.
- The vehicle symptoms.
- The conditions when the problem occurred.
- Vehicle make, model, model year and engine.
Screenshots or photographs can be useful if your scanner does not save reports.
Why be so careful? Because clearing diagnostic information can remove evidence you may need later.
Should You Clear an OBD2 Code?

A scanner’s erase function can be useful, but it should not be confused with a repair.
If the underlying fault is still present, the diagnostic system may detect it again. The code can return. The Check Engine light can return.
Clearing codes can also reset emissions readiness information, which matters if the vehicle is approaching an inspection.
And a permanent DTC, where supported, is not simply erased on command like an ordinary stored code.
A better sequence is: read → record → understand → diagnose → repair → verify. Not: read → erase → hope.
What Should You Do After Reading a Code?
Once you have the DTC, do not immediately order the part named in a search result. Instead:
- Record the complete code and its status.
- Check for additional codes.
- Save freeze-frame information.
- Look at relevant symptoms.
- Use reliable information for the exact vehicle.
- Identify the possible causes.
- Test before replacing expensive parts.
- After repair, verify whether the fault returns and whether the relevant monitor completes successfully.
SCG covers this complete workflow separately in What to Do After Your OBD2 Scanner Finds a Trouble Code.
If you need to understand sensor values and fuel trims during diagnosis, continue to How to Read OBD2 Live Data: PIDs, Fuel Trims, O2 Sensors and More.
OBD2 Code FAQ
What does DTC stand for?
DTC stands for Diagnostic Trouble Code. It is an identifier reported by a vehicle diagnostic system for a detected fault or condition.
What do P, B, C and U mean in OBD2 codes?
They identify broad DTC families: P: Powertrain, B: Body, C: Chassis, U: Network and vehicle integration. The complete code is still required for the actual definition.
Are all P0 codes generic?
P0 powertrain codes are part of the standardized DTC range. But do not generalize the simple “0 generic / 1 manufacturer-specific” rule to every possible DTC family without checking the applicable code range.
Are P1 codes manufacturer-specific?
P1 powertrain codes are in manufacturer-specific ranges. Their definitions must be interpreted for the appropriate manufacturer.
What about P2 and P3 codes?
P2 powertrain codes are standardized. P3 includes both standardized and manufacturer-specific ranges. That is why looking at the entire code and using the correct definition matters.
What is a pending OBD2 code?
A pending code indicates that a diagnostic condition has been detected but may not yet have met the criteria for a confirmed fault.
What is a permanent OBD2 code?
A permanent DTC is an emissions-related code state designed so it cannot simply be erased with a scan tool or battery disconnect. The OBD system clears it after the required criteria are met and the fault is verified as no longer present.
Can I clear a permanent code with my scanner?
Not simply by using the normal erase command. The vehicle’s OBD system controls clearing of permanent DTCs after the applicable verification criteria are satisfied.
Does P0420 always mean I need a catalytic converter?
No. P0420 identifies a catalyst-efficiency diagnostic condition; it does not, by itself, prove the catalytic converter is the only possible root cause.
Does P0300 mean I need spark plugs?
No. P0300 indicates random/multiple-cylinder misfire detection. Spark plugs are only one possible area to investigate.
Should I clear codes before taking the car to a mechanic?
Usually it is better to preserve useful diagnostic information first. Clearing codes can remove stored context and reset readiness information that may help diagnosis.
The Bottom Line
OBD2 trouble codes are not repair instructions. They are structured diagnostic messages.
The first character tells you the broad system family. The remaining characters identify the applicable standardized or manufacturer-specific fault definition.
But the most useful interpretation goes beyond the five characters. Ask: is the code pending, confirmed or permanent? What other codes are present? What does the freeze-frame information show? What symptoms does the vehicle have? What tests are required to identify the actual cause?
The rule to remember is simple: read the code, preserve the evidence, diagnose the cause, then repair.
If you have just retrieved a DTC and want to know what to do next, continue to What to Do After Your OBD2 Scanner Finds a Trouble Code.
If you are still learning the diagnostic system itself, start with What Is OBD2 and How Does an OBD2 Scanner Work?
Looking for a scanner to read these codes? See the Best OBD2 Scanners for Beginners.