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
Request
Node.js
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);Response
JSON
{
"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
Request
Node.js
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);Response
JSON
{
"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
Node.js
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