Lookup (Input)
Payer Attachment Rules
Verification Center (Human Image Review)
Batch Lab (Ensemble Classification)
Image Ingestion
Custom Credentials (optional)
Stored Patients & Images
XVWeb Internal API (Gateway Testing)
Query Images
RCM API Reference
These are the external-facing APIs that Denticon's RCM module calls to check attachment requirements and manage per-practice rule overrides.
All endpoints live under /api/RCM/v1/.
/api/RCM/v1/GetAttachmentInfo
Full workflow in one call. Given a procedure code + payer + practice, this endpoint: (1) looks up the attachment rule, (2) determines which X-ray subtypes are needed (Model #1), and (3) optionally classifies patient images via XVWeb gateway to find matching X-rays (Model #2). This is the primary endpoint Denticon calls at claim submission time.
Example Request
{
"pgid": "2937",
"ada_code": "D2740",
"payer_id": "60054",
"tooth_number": "14",
"date_of_service": "2026-03-17",
"date_of_birth": "1990-01-15",
"xvweb_primary_id": "PAT001",
"xvweb_url": "https://test.xvweb.dev"
}
Example Response
{
"attachmentNeeded": true,
"code": "D2740",
"payerId": "60054",
"hasRule": true,
"source": "default",
"toothNumber": "14",
"attachments": [
{
"type": "xray",
"required": true,
"confidence": 100,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"xrays": [
{
"xrayType": "Periapical",
"category": "pre-operative",
"xrayDate": "2026-03-10",
"imageId": "12345",
"imageModality": "IO",
"toothNumbers": "14,15",
"seriesId": "11111",
"imageConfidence": 80
}
]
},
{ "type": "periochart", "required": false, "confidence": 100 },
{ "type": "eob", "required": false, "confidence": 100 },
{ "type": "narrative", "required": false, "confidence": 100 }
],
"processingTimeMs": 1250
}
/api/RCM/v1/GetAttachmentInfo/rules
System 1
Rule lookup + X-ray breakdown only. Fast (~20ms–5s). Given a procedure code + payer + practice,
returns the attachment matrix and which X-ray subtypes are needed (Model #1). No image classification.
Call this first, then pass requiredXrayTypes to the /images endpoint if X-ray images are needed.
Example Request
{
"pgid": "2937",
"ada_code": "D2740",
"payer_id": "60054",
"tooth_number": "14"
}
Example Response
{
"attachmentNeeded": true,
"code": "D2740",
"payerId": "60054",
"hasRule": true,
"source": "default",
"attachments": [
{
"type": "xray",
"required": true,
"confidence": 100,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"requiredXrayTypes": [
{ "type": "Periapical", "category": "pre-operative" },
{ "type": "Bitewing", "category": "pre-operative" }
]
},
{ "type": "periochart", "required": false, "confidence": 100 },
{ "type": "eob", "required": false, "confidence": 100 },
{ "type": "narrative", "required": false, "confidence": 100 }
]
}
{type, category} objects listing which X-ray subtypes are needed and their timing. Pass the type values to the /images endpoint.
source — "default" (DXC scraped), "custom" (practice override), or "none" (no rule found).
/api/RCM/v1/GetAttachmentInfo/images
System 2
Image classification + selection. Slower (5–60s typical). Given the required X-ray types from System 1 and a patient’s XVWeb ID,
resolves candidate images, classifies them via the 3-model ensemble (Model #2), and selects the best match for each type.
Only call this when the /rules response indicates X-ray attachments are needed.
Example Request
{
"requiredXrayTypes": ["Periapical", "Bitewing"],
"xvweb_primary_id": "PAT001",
"xvweb_url": "https://test.xvweb.dev",
"tooth_number": "14",
"date_of_service": "2026-03-17"
}
Example Response
{
"xrays": [
{
"xrayType": "Periapical",
"xrayDate": "2026-03-10",
"imageId": "1.2.840.113619.2.55.3.12345",
"imageModality": "IO",
"toothNumbers": "14,15",
"seriesId": "11111",
"imageConfidence": 87,
"originalSelectionType": "Periapical",
"selectionCriteria": "default"
},
{
"xrayType": "Bitewing",
"xrayDate": "2026-03-10",
"imageId": "1.2.840.113619.2.55.3.67890",
"imageModality": "IO",
"toothNumbers": "14,15,16",
"seriesId": "11112",
"imageConfidence": 92,
"originalSelectionType": "Bitewing",
"selectionCriteria": "default"
}
]
}
/rules response (e.g. ["Periapical", "Bitewing"]).
xrays[] — best-matching image for each requested type.
originalSelectionType — the X-ray type originally needed (before hierarchy fallback).
selectionCriteria — "default" (exact match) or "hierarchy" (fallback from PA→BW→FMX→PANO).
/api/RCM/v1/GetAttachmentRulesByADACodeByPayerID
Single rule lookup. Returns the attachment requirements for one specific ADA code + payer combination. If the practice (pgid) has a custom override, that takes priority over the default DXC-scraped rule.
Example Request
{
"pgid": "2937",
"ada_code": "D2740",
"payer_id": "60054",
"xvweb_url": ""
}
Example Response
{
"rule_id": 1234,
"payer_id": "60054",
"payer_name": "Aetna Dental Plans",
"cdt_code": "D2740",
"code_description": "- Porcelain/Ceramic substrate",
"code_class": "Major",
"xray": true,
"perio_chart": false,
"narrative": true,
"eob": false,
"xray_pa": true,
"xray_bw": false,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"source": "default",
"notes": null,
"has_rule": true
}
/api/RCM/v1/GetAttachmentRulesByADACode/{ada_code}
All payers for one code. Returns every payer's attachment rule for a given ADA code, with pagination. Useful for seeing which payers require attachments for a specific procedure.
Example Request
GET /api/RCM/v1/GetAttachmentRulesByADACode/D2740?pgid=2937&offset=0&limit=50
Example Response
{
"total": 127,
"offset": 0,
"limit": 50,
"rules": [
{
"rule_id": 1234,
"payer_id": "60054",
"payer_name": "Aetna Dental Plans",
"cdt_code": "D2740",
"code_description": "- Porcelain/Ceramic substrate",
"code_class": "Major",
"xray": true,
"perio_chart": false,
"narrative": true,
"eob": false,
"xray_pa": true,
"xray_bw": false,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"source": "default",
"notes": null
}
]
}
/api/RCM/v1/ListAllPayerRules
Browse all rules. Returns the full rule database (45,000+ rules across 329 payers and 784 codes) with optional search and pagination. If a pgid is provided, custom overrides are merged in.
Example Request
GET /api/RCM/v1/ListAllPayerRules?pgid=2937&q=Aetna&offset=0&limit=50
Example Response
{
"total": 45357,
"offset": 0,
"limit": 50,
"rules": [
{
"rule_id": 1,
"payer_id": "00590",
"payer_name": "Dominion Dental USA",
"cdt_code": "D0120",
"code_description": "Periodic oral evaluation - established patient",
"code_class": "Diagnostic",
"xray": false,
"perio_chart": false,
"narrative": false,
"eob": false,
"xray_pa": false, "xray_bw": false, "xray_fmx": false,
"xray_pano": false, "xray_pm": false, "xray_ceph": false,
"source": "default",
"notes": null
}
]
}
/api/RCM/v1/AddCustomRule
Create or update a practice-level override. Lets a practice change the attachment requirements for a specific code+payer. The override completely replaces the default rule for that practice. If a custom rule already exists for the same (code, payer, pgid), it is updated (upsert). A default rule must already exist for the code+payer combination.
Example Request
{
"pgid": "2937",
"ada_code": "D2740",
"payer_id": "60054",
"xray": true,
"eob": false,
"perio": false,
"narrative": true,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Override: require BW + PA only, plus narrative"
}
Example Response (201 Created)
{
"rule_id": 42,
"pgid": "2937",
"payer_id": "60054",
"code": "D2740",
"xray": true,
"eob": false,
"perio": false,
"narrative": true,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Override: require BW + PA only, plus narrative",
"last_updated": "2026-03-18 10:30:00+00:00"
}
/api/RCM/v1/ListCustomRules
List all overrides for a practice. Returns every custom rule that a specific practice (pgid) has created, ordered by most recently updated. Use this to show a practice admin what overrides are in effect.
Example Request
GET /api/RCM/v1/ListCustomRules?pgid=2937&offset=0&limit=50
Example Response
{
"total": 3,
"offset": 0,
"limit": 50,
"rules": [
{
"rule_id": 42,
"pgid": "2937",
"payer_id": "60054",
"code": "D2740",
"xray": true,
"eob": false,
"perio": false,
"narrative": true,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Override: require BW + PA only, plus narrative",
"last_updated": "2026-03-18 10:30:00+00:00"
}
]
}
/api/RCM/v1/UpdateCustomRule/{rule_id}
Modify an existing override. Updates the attachment flags and notes for a custom rule by its rule_id. Only custom rules (those with a pgid) can be updated — default rules are read-only.
Example Request
PUT /api/RCM/v1/UpdateCustomRule/42
{
"xray": true,
"eob": true,
"perio": false,
"narrative": true,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Updated: now also require EOB"
}
Example Response
{
"rule_id": 42,
"pgid": "2937",
"payer_id": "60054",
"code": "D2740",
"xray": true,
"eob": true,
"perio": false,
"narrative": true,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Updated: now also require EOB",
"last_updated": "2026-03-18 11:00:00+00:00"
}
/api/RCM/v1/DeleteCustomRule/{rule_id}
Remove a practice override. Deletes a custom rule, reverting the practice back to the default DXC-scraped rule for that code+payer. Only custom rules can be deleted.
Example Request
DELETE /api/RCM/v1/DeleteCustomRule/42
Example Response
{
"deleted": true,
"rule_id": 42
}