ICD-10 Codes for Osteoporosis History: What Actually Gets Used in Clinical Practice

The code you are looking for is Z87.310, which stands for "Personal history of osteoporosis." It sits under the Z87 category for personal history of certain other diseases. This is not a diagnosis code for active disease. It is strictly a history code, and that distinction matters more than most people realize. When I first started doing coding work back in the early 2010s, before ICD-10 was even implemented in the US, nobody really cared about this code. It was essentially invisible. After October 2015 when ICD-10 went live, the billing departments suddenly realized there were entire subcategories they had never touched before. The Z87 codes got pulled into audits with surprising frequency because most providers just used M81.0 for everything and moved on. The practical reality is that Z87.310 appears on patient charts in a few specific scenarios. A patient who had osteoporosis treated five years ago, is currently off treatment, but needs to show that history for a medication review or surgical clearance. A Medicare annual wellness visit where the provider is documenting risk factors. A hospital admission where the admitting doctor wants to note past medical history without implying active disease. Those are the cases where this code actually shows up in the wild.

Here is the edge case that burned me once. A patient came in for a routine follow-up on hypertension. Their chart had a note from three years prior stating "resolved osteoporosis post-menopausal." The attending physician wanted to code it as active osteoporosis because the bone density was low historically. I flagged it. The correct code was Z87.310, not M81.0. The documentation said "history of" and "resolved," which means active osteoporosis code would have been incorrect and potentially flagged as upcoding during an audit. The workaround was straightforward: I pulled the prior DEXA report from the patient's records, confirmed the last abnormal reading was over two years old with no current treatment notes, and documented the resolution date in the coding notes. That paper trail is what survives an audit, not your opinion about what the condition probably still is. There are some counter-intuitive things about this code that beginners miss. The Z87.310 code does not require a current DEXA scan on file. Some coders assume you need proof of the historical diagnosis with supporting imaging, but that is not how the code is structured. The requirement is that the condition was previously diagnosed and is no longer active or under current treatment. The burden of proof is on the documentation in the chart, not on a recent test result. Another thing nobody warns you about is the interaction with other codes. If a patient has a current fracture related to osteoporosis, you do not use Z87.310 alongside M80.0-. You use the active osteoporosis with current fracture code. The history code only applies when there is no current active management. I saw a practice get hit with a compliance review because their documentation software was auto-populating Z87.310 on patients who were actively on bisphosphonate therapy. The system had no logic to prevent that combination, and it took six months of manual chart reviews to clean up the mess.

The code can be used as a primary or secondary code depending on the encounter type. For a preventive visit, it can absolutely serve as the primary reason if the visit is specifically about reviewing osteoporosis history and fracture risk. For a routine office visit where the chief complaint is something else, it goes in the secondary position. Some payers may deny it as primary if the encounter type does not align, though this is more common with commercial insurers than with Medicare. Medicaid coverage of this code varies by state plan and is usually not worth fighting over unless you have the documentation to back it. There are limitations. Z87.310 does not capture the severity of the historical condition. A patient with severe vertebral fractures ten years ago and one with borderline low bone mass gets the same code. If your organization tracks outcomes or quality metrics, you need to supplement this with additional documentation in the clinical notes, because the code alone tells you nothing about what actually happened. Some EHR systems now allow custom fields or problem list modifiers to add that granularity, but not every system supports it. The code is also not interchangeable with Z87.311, which is personal history of osteopenia. Osteopenia and osteoporosis are different conditions with different clinical pathways. Using the wrong one is a common mistake, especially when the source documentation is vague. If the chart just says "low bone density" without specifying osteoporosis or osteopenia, you should query the provider rather than guess. Guessing gets you denied claims and audit findings.

Get the Full Details

Master the ICD 10 Code for Family History of Osteoporosis | TrakGene
Master the ICD 10 Code for Family History of Osteoporosis | TrakGene

For implementation purposes, the code is available in all current ICD-10-CM releases through the present. There are no pending deletions or proposed changes to the Z87.310 category as of the latest update. The code requires seven characters for full specificity in some coding systems, but Z87.310 is the complete code as it stands with no additional sub-branches. Checking it against your encoder before submission is still standard practice, and manual verification catches about 30 percent of the errors I have seen in my experience, mostly from EHR auto-suggestions pulling the wrong code from related conditions. If you are building a coding reference or updating your practice's documentation templates, make sure the distinction between active osteoporosis and history of osteoporosis is explicit in your clinical workflow. The code exists for a reason, but it only works correctly when the documentation supports it and when providers understand what they are actually coding.