NCCI PTP Edit Validation
Validate whether two CPT/HCPCS codes can be billed together on the same claim.
Overview
The National Correct Coding Initiative (NCCI) Procedure-to-Procedure (PTP) edits identify pairs of codes that should not normally be billed together. CMS publishes these edits quarterly for both practitioner and hospital outpatient settings.
When a code pair has an active edit, the column 2 code is typically denied unless a valid modifier is appended. The modifier_indicator field tells you whether modifier use is allowed.
Endpoint
| Method | Path | Description |
|---|---|---|
| GET | /v1/ncci/validate | Validate a code pair |
Validate a Code Pair
Check if arthroscopy codes can be billed together
const response = await fetch(
"https://api.fhirfly.io/v1/ncci/validate?code1=29881&code2=29880",
{
method: "GET",
headers: {
"x-api-key": "YOUR_API_KEY",
}
}
);
const data = await response.json();
console.log(data);{
"data": {
"code1": "29881",
"code2": "29880",
"can_bill_together": false,
"edits": [
{
"claim_type": "hospital",
"modifier_indicator": "1",
"modifier_allowed": true,
"effective_date": "2004-01-01",
"is_active": true,
"rationale": "Standards of medical/surgical practice"
},
{
"claim_type": "practitioner",
"modifier_indicator": "1",
"modifier_allowed": true,
"effective_date": "1996-01-01",
"is_active": true,
"rationale": "Standards of medical/surgical practice"
}
],
"summary": "These codes cannot be billed together. Modifier use is allowed for both claim types."
},
"meta": {
"source": {
"name": "CMS NCCI PTP Edits",
"quarter": "2026-Q1"
},
"legal": {
"license": "public_domain",
"attribution_required": false,
"source_name": "CMS National Correct Coding Initiative",
"citation": "CMS National Correct Coding Initiative PTP Edits. Accessed via FHIRfly."
}
}
}A clean pair (no edit found) returns can_bill_together: true with an empty edits array:
Check an office visit + venipuncture pair
const response = await fetch(
"https://api.fhirfly.io/v1/ncci/validate?code1=99213&code2=36415",
{
method: "GET",
headers: {
"x-api-key": "YOUR_API_KEY",
}
}
);
const data = await response.json();
console.log(data);{
"data": {
"code1": "99213",
"code2": "36415",
"can_bill_together": true,
"edits": [],
"summary": "No NCCI PTP edit found for this code pair. These codes can be billed together."
},
"meta": {
"source": {
"name": "CMS NCCI PTP Edits",
"quarter": "2026-Q1"
},
"legal": {
"license": "public_domain",
"attribution_required": false,
"source_name": "CMS National Correct Coding Initiative",
"citation": "CMS National Correct Coding Initiative PTP Edits. Accessed via FHIRfly."
}
}
}Parameters
| Parameter | Required | Description |
|---|---|---|
code1 | Yes | First CPT/HCPCS code (4-5 alphanumeric characters) |
code2 | Yes | Second CPT/HCPCS code (4-5 alphanumeric characters) |
claim_type | No | Filter by "practitioner" or "hospital". Returns both if omitted. |
Understanding the Response
can_bill_together
true— No active NCCI edit exists for this pair. Safe to bill together.false— An active edit exists. The column 2 code will typically be denied unless a modifier is used.
edits[]
Each edit in the array represents a PTP edit rule for a specific claim type.
| Field | Type | Description |
|---|---|---|
claim_type | string | "practitioner" or "hospital" |
modifier_indicator | string | "0" = no modifier allowed, "1" = modifier allowed, "9" = not applicable |
modifier_allowed | boolean | Whether appending a modifier can override the edit |
effective_date | string | null | When the edit took effect (ISO date) |
is_active | boolean | Whether the edit is currently active |
rationale | string | CMS rationale for the edit |
Modifier Indicators
| Value | Meaning |
|---|---|
0 | No modifier allowed — the code pair cannot be unbundled |
1 | Modifier allowed — append modifier 59 (or XE/XP/XS/XU) to override |
9 | Not applicable |
SDK Usage
import { Fhirfly } from "@fhirfly-io/terminology";
const client = new Fhirfly({ apiKey: "your-api-key" });
// Check if two codes can be billed together
const result = await client.claims.validateNcci("29881", "29880");
if (!result.data.can_bill_together) {
console.log("NCCI edit found — these codes conflict");
for (const edit of result.data.edits) {
console.log(` ${edit.claim_type}: modifier ${edit.modifier_allowed ? "allowed" : "not allowed"}`);
}
}
// Filter by claim type
const practitioner = await client.claims.validateNcci("29881", "29880", {
claim_type: "practitioner",
});
Required Scopes
claims.read— NCCI PTP edit validation
See Also
- MUE Limits — Maximum units per service
- Claims Intelligence Overview — All claims APIs