Planet DDS

Auto Attach

PDDS

Auto Attach

{}
Checking XVWeb...
Saved

Lookup (Input)

Payer Attachment Rules

X-ray Type Breakdown (Model #1)

X-ray Location (Model #2)

Results JSON (Output)

This is the full internal response with all fields. The RCM endpoint (/api/RCM/v1/GetAttachmentInfo) returns a slimmed version — see the RCM APIs tab for the actual response contract.

Verification Center (Human Image Review)

Select a Practice Group to load images for verification...
Full size

Batch Lab (Ensemble Classification)

Image Ingestion

Custom Credentials (optional)
Starting ingestion...
0 / 0 images 00:00

Stored Patients & Images

Starting classification...
0 / 0 images 00:00
goldHuman-verified via manual override
silverAll 3 models agree with ≥85% avg confidence
bronze2 of 3 models agreed, confirmed by judge
copperModels disagreed, judge arbitrated
No ingested patients yet. Use "Ingest Images" above.
0 selected

XVWeb Internal API (Gateway Testing)

Query Images

Check connection above, then enter a Patient ID and click "Load 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/.

POST

/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
}
Key fields: xvweb_primary_id — omit this to skip image classification (steps 1+2 only). source — "default" (DXC scraped), "custom" (practice override), or "none" (no rule found). xrays[] — each entry shows the required X-ray type, category, xrayDate, and the best-matching image found.
POST

/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 }
  ]
}
Key fields: requiredXrayTypes — array of {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).
POST

/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"
    }
  ]
}
Key fields: requiredXrayTypes — pass the X-ray type names from the /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).
POST

/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
}
Key fields: xray/perio_chart/eob/narrative — true/false for each attachment type. xray_pa..xray_ceph — which specific X-ray subtypes are needed (only relevant when xray=true). has_rule — false means no rule exists for this code+payer; all fields default to false.
GET

/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
    }
  ]
}
Query params: pgid (required) — merges practice overrides into results. offset/limit — pagination (max limit: 200).
GET

/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
    }
  ]
}
Query params: pgid (optional) — when provided, merges practice overrides. q — free-text search across payer ID, payer name, code, and description. offset/limit — pagination (max limit: 200).
POST

/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"
}
GET

/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"
    }
  ]
}
Query params: pgid (required) — the practice group ID to list overrides for. offset/limit — pagination (max limit: 200).
PUT

/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"
}

DELETE

/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
}

Claims Viewer

Select a Practice Group to load claims...

XVWeb Images — Patient

Loading...

Image Preview

Loading image...

Patient Images

SourcePGID PayerCodeDescription X-rayPerioEOBNarr. PABWFMXPanoPMCeph Notes
Payer IDPayer Name
CodeDescriptionClass
PGIDPayerCodeDescription X-rayPerioEOBNarr. PABWFMXPanoPMCeph Notes
SourceCodePayer PABWFMXPanoPMCeph Updated

Image Classification Detail

Loading...
Confirm Delete