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 using the CNN classifier (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": "1.2.840.113619.2.55.3.12345",
"imageModality": "IO",
"toothNumbers": "14,15",
"seriesId": "",
"imageConfidence": 80,
"originalSelectionType": "Periapical",
"selectionCriteria": "default",
"originalClassifiedType": null,
"orientation": "LEFT",
"orientationConfidence": "high",
"forCodes": [],
"requestedToothNumbers": ""
}
]
},
{ "type": "periochart", "required": false, "confidence": 100 },
{ "type": "eob", "required": false, "confidence": 100 },
{ "type": "narrative", "required": false, "confidence": 100 },
{ "type": "other", "required": true, "confidence": 100, "additionalInfo": "Pathology report" }
],
"processingTimeMs": 1250
}
officeCheck. See the Office exceptions card below.
xrays[]: one item per required X-ray type, carrying the best-matching image found; a blank item
(imageId "", imageConfidence 0) means no image matched. The item is
RcmXrayItem in the OpenAPI schema and is the same shape the multi-code endpoint returns. Its fields, in response order:
| Field | Type | Meaning |
|---|---|---|
xrayType |
string | X-ray type this image is returned as. Values come from the X-ray taxonomy: Bitewing, Periapical, Occlusal, Partial Mount, Full Mouth Series (FMX), Panoramic Film, Cephalometric, CBCT; in practice one of the six types a payer rule can require. Equals originalSelectionType on an exact match. On a hierarchy stand-in it is the stand-in's own type (for example a Bitewing returned for a Periapical requirement). On an "fmx_group" member it is "Full Mouth Series (FMX)" and the member's own type is in originalClassifiedType. On a blank item (no image matched) it is the required type. |
category |
string | Timing the payer rule attaches to this X-ray requirement: "pre-operative", "post-operative" or "in-between". Comes from the rule for the procedure code (System 1), not from comparing the image date with the date of service. "" when the rule states no timing. Not present on the /images endpoint, which has no rule context. |
xrayDate |
string | Acquisition date of the image as XVWeb reports it (the instance's acquisitionDate), normally an ISO date such as 2026-03-10. Drives the recency check, and is the fallback key for same-visit FMX grouping when the images carry no DICOM study UID. "" when no image matched. |
imageId |
string | DICOM SOP Instance UID of the selected image as held by XVWeb, for example 1.2.840.113619.2.55.3.12345. The key for fetching and attaching the image, and the key the multi-code endpoint deduplicates xrays[] on. "" when no image matched the requirement. |
imageModality |
string | DICOM modality code of the image as stored in XVWeb, upper-cased (IO, CR, DX, PX, CT, XC, OT and others). Informational only: source modality codes are often wrong, so the classifier treats this as a weak hint and xrayType is the reliable type. "" when XVWeb carries no modality or no image matched. |
toothNumbers |
string | Teeth labelled on the image, comma-separated Universal numbers: the XVWeb tooth tags when present, else the vision model's reading on the LLM-ensemble path, else "". On the CNN-only default an untagged image stays "". On a blank item (no image matched) the single-code endpoint echoes the requested tooth here instead. |
seriesId |
string | DICOM series identifier of the image. "" on the XVWeb gateway path, which is how every RCM request reads images unless it carries Apteryx credentials; populated only when the legacy direct Apteryx client serves the images (a single-code request with apteryx_username, or the production fallback after the gateway refuses with 401 or 403). Always "" on the multi-code endpoint, whose classification path carries no series id, and on a blank item. |
imageConfidence |
integer | 0-100 score that this image satisfies the requirement. Starts from the classifier's confidence that the image is of the returned type. When a tooth was requested, a tooth adjustment follows: a bonus when the image's known teeth include it, a penalty when they do not, and an image with no known teeth counts as not including it; Panoramic and FMX images never take the penalty, and FMX group members take no tooth adjustment at all. Which teeth are known depends on the request: a multi-code procedures[] request reads the XVWeb tooth tags with the vision model as fallback, every other request reads only the vision model, and the CNN-only default leaves that empty, so there every Periapical and Bitewing takes the penalty when a tooth is requested. Then a penalty when the image is a hierarchy stand-in rather than the exact type, a penalty for poor image quality, and a clamp to 0-100. Images below the minimum match score are not returned at all. 0 on a blank item (no image matched, imageId is ""). |
originalSelectionType |
string | X-ray type the procedure's rule required, before any hierarchy fallback. Equals xrayType on an exact match. When the two differ the image is a stand-in: the walk starts at the required type and continues down Periapical, Bitewing, Full Mouth Series (FMX), Panoramic Film, so a Bitewing requirement never falls back to a Periapical, and a requirement for a type outside that order (Partial Mount, Cephalometric, Occlusal) tries that type and then Panoramic Film. On a blank item (no image matched) it is "" when the image search did not run, failed, or found no images for the patient, and the required type when the search ran and found nothing usable for this requirement. |
selectionCriteria |
string | How the image was chosen for this requirement: "default" (an image of the exact required type), "hierarchy" (no usable image of the required type, so a stand-in further down Periapical, Bitewing, Full Mouth Series (FMX), Panoramic Film was returned with a confidence penalty), or "fmx_group" (an intraoral image returned as a member of a same-visit full mouth series; its own type is in originalClassifiedType). The intraoral members of an FMX reached by fallback report "fmx_group" rather than "hierarchy" and still carry the stand-in penalty. "default" on a blank item. |
originalClassifiedType |
string or null | For "fmx_group" members only: the member image's own classified type ("Periapical", "Bitewing" or "Partial Mount"), since xrayType reads "Full Mouth Series (FMX)" for the whole group. null for "default" and "hierarchy" selections and on blank items. |
orientation |
string | DXC imageOrientationType: "LEFT" (image left = patient left) or "RIGHT" (image left = patient right). Inferred from toothNumbers via the eClaim heuristic (KB: Image Attachment Orientation); on a procedures[] request an image with no tooth label falls back to requestedToothNumbers. Defaults to "RIGHT" on empty or unparseable input. |
orientationConfidence |
string | Confidence in the orientation prediction: "high" (all teeth on one side), "medium" (mixed teeth with a clear first-to-last direction), "low" (empty input, unparseable, or an ambiguous mix, which falls back to the default RIGHT). |
forCodes |
string[] | ADA/CDT codes on the claim this image was selected for. Populated only on a multi-code procedures[] request; one image may serve several lines and then lists each of their codes. [] on legacy ada_codes requests and on the single-code endpoint. |
requestedToothNumbers |
string | Normalized tooth number(s) of the procedure line(s) this image satisfies, comma-separated: the ledger tooth Denticon sent, as distinct from toothNumbers (the teeth labelled on the image). Populated only on a multi-code procedures[] request; "" otherwise. |
/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": "other", "required": true, "confidence": 100, "additionalInfo": "Pathology report" }
]
}
{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).
office_id (optional): the Denticon office whose own DXC exceptions are applied; the response then carries officeCheck. See the Office exceptions card below.
/api/RCM/v1/GetAttachmentInfo/images
System 2
Image classification + selection. Given the required X-ray types from System 1 and a patient’s XVWeb ID,
resolves candidate images, classifies them via the CNN classifier (Model #2), and selects the best match for each type.
Typical latency ~2–8s. Only call this when the /rules response indicates X-ray attachments are needed.
Ops can flip to the legacy 3-LLM ensemble via the RCM_CNN_ONLY_MODE config flag.
Example Request
{
"requiredXrayTypes": ["Periapical", "Bitewing", "Full Mouth Series (FMX)"],
"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": "",
"imageConfidence": 87,
"originalSelectionType": "Periapical",
"selectionCriteria": "default",
"originalClassifiedType": null,
"orientation": "LEFT",
"orientationConfidence": "high"
},
{
"xrayType": "Bitewing",
"xrayDate": "2026-03-10",
"imageId": "1.2.840.113619.2.55.3.67890",
"imageModality": "IO",
"toothNumbers": "14,15,16",
"seriesId": "",
"imageConfidence": 92,
"originalSelectionType": "Bitewing",
"selectionCriteria": "default",
"originalClassifiedType": null,
"orientation": "LEFT",
"orientationConfidence": "high"
},
{
"xrayType": "Full Mouth Series (FMX)",
"xrayDate": "2026-03-10",
"imageId": "1.2.840.113619.2.55.3.24680",
"imageModality": "IO",
"toothNumbers": "13,14",
"seriesId": "",
"imageConfidence": 85,
"originalSelectionType": "Full Mouth Series (FMX)",
"selectionCriteria": "fmx_group",
"originalClassifiedType": "Periapical",
"orientation": "LEFT",
"orientationConfidence": "high"
}
]
}
/rules response (e.g. ["Periapical", "Bitewing"]).
xrays[]: best-matching image for each requested type. A Full Mouth Series requirement returns one item per image in the series;
its intraoral members carry selectionCriteria "fmx_group", as in the third example above. The item is
RcmSystem2XrayItem in the OpenAPI schema: the single-code item without category, forCodes and
requestedToothNumbers, since this endpoint has no rule context. Its fields, in response order:
| Field | Type | Meaning |
|---|---|---|
xrayType |
string | X-ray type this image is returned as. Values come from the X-ray taxonomy: Bitewing, Periapical, Occlusal, Partial Mount, Full Mouth Series (FMX), Panoramic Film, Cephalometric, CBCT; in practice one of the six types a payer rule can require. Equals originalSelectionType on an exact match. On a hierarchy stand-in it is the stand-in's own type (for example a Bitewing returned for a Periapical requirement). On an "fmx_group" member it is "Full Mouth Series (FMX)" and the member's own type is in originalClassifiedType. |
xrayDate |
string | Acquisition date of the image as XVWeb reports it (the instance's acquisitionDate), normally an ISO date such as 2026-03-10. Drives the recency check, and is the fallback key for same-visit FMX grouping when the images carry no DICOM study UID. |
imageId |
string | DICOM SOP Instance UID of the selected image as held by XVWeb, for example 1.2.840.113619.2.55.3.12345. The key for fetching and attaching the image, and the key the multi-code endpoint deduplicates xrays[] on. |
imageModality |
string | DICOM modality code of the image as stored in XVWeb, upper-cased (IO, CR, DX, PX, CT, XC, OT and others). Informational only: source modality codes are often wrong, so the classifier treats this as a weak hint and xrayType is the reliable type. "" when XVWeb carries no modality. |
toothNumbers |
string | Teeth labelled on the image, comma-separated Universal numbers: the XVWeb tooth tags when present, else the vision model's reading on the LLM-ensemble path, else "". On the CNN-only default an untagged image stays "". |
seriesId |
string | DICOM series identifier of the image. "" on the XVWeb gateway path, which is how this endpoint always reads images; populated only when production falls back to the legacy direct Apteryx client after the gateway refuses with 401 or 403. |
imageConfidence |
integer | 0-100 score that this image satisfies the requirement. Starts from the classifier's confidence that the image is of the returned type. When a tooth was requested, a tooth adjustment follows: a bonus when the image's known teeth include it, a penalty when they do not, and an image with no known teeth counts as not including it; Panoramic and FMX images never take the penalty, and FMX group members take no tooth adjustment at all. On this endpoint only the vision model's reading counts as known teeth, and the CNN-only default leaves that empty, so every Periapical and Bitewing takes the penalty when a tooth is requested. Then a penalty when the image is a hierarchy stand-in rather than the exact type, a penalty for poor image quality, and a clamp to 0-100. Images below the minimum match score are not returned at all. |
originalSelectionType |
string | X-ray type the procedure's rule required, before any hierarchy fallback. Equals xrayType on an exact match. When the two differ the image is a stand-in: the walk starts at the required type and continues down Periapical, Bitewing, Full Mouth Series (FMX), Panoramic Film, so a Bitewing requirement never falls back to a Periapical, and a requirement for a type outside that order (Partial Mount, Cephalometric, Occlusal) tries that type and then Panoramic Film. |
selectionCriteria |
string | How the image was chosen for this requirement: "default" (an image of the exact required type), "hierarchy" (no usable image of the required type, so a stand-in further down Periapical, Bitewing, Full Mouth Series (FMX), Panoramic Film was returned with a confidence penalty), or "fmx_group" (an intraoral image returned as a member of a same-visit full mouth series; its own type is in originalClassifiedType). The intraoral members of an FMX reached by fallback report "fmx_group" rather than "hierarchy" and still carry the stand-in penalty. |
originalClassifiedType |
string or null | For "fmx_group" members only: the member image's own classified type ("Periapical", "Bitewing" or "Partial Mount"), since xrayType reads "Full Mouth Series (FMX)" for the whole group. null for "default" and "hierarchy" selections. |
orientation |
string | DXC imageOrientationType: "LEFT" (image left = patient left) or "RIGHT" (image left = patient right). Inferred from toothNumbers via the eClaim heuristic (KB: Image Attachment Orientation). Defaults to "RIGHT" on empty or unparseable input. |
orientationConfidence |
string | Confidence in the orientation prediction: "high" (all teeth on one side), "medium" (mixed teeth with a clear first-to-last direction), "low" (empty input, unparseable, or an ambiguous mix, which falls back to the default RIGHT). |
/api/RCM/v1/GetAttachmentInfoWithMultipleCodes
Claim-level
Claim-level rollup across the procedure lines of one claim for one payer. Send the lines as
procedures[], each an ada_code with its own optional tooth_numbers
(the legacy ada_codes[] plus one claim-level tooth_numbers is still accepted).
System 1 runs per line in parallel with that line's tooth. System 2 fetches and classifies the patient's images
once for the whole claim and then selects per (X-ray type, tooth) requirement, so a Periapical of the
wrong tooth is excluded from a line that asked for a different tooth. Returns the OR'd booleans, a per-line
requiredXrayTypesByCode[] with toothNumbers, the PWK01 requiredAttachmentTypes[],
and the deduplicated xrays[] in which each image says which codes it satisfied. Omit
xvweb_primary_id to skip images, or use the /rules variant.
Example Request
{
"pgid": "2937",
"payer_id": "60054",
"xvweb_url": "https://test.xvweb.dev",
"xvweb_primary_id": "PAT001",
"date_of_service": "2026-04-22",
"procedures": [
{ "ada_code": "D2740", "tooth_numbers": "14" },
{ "ada_code": "D2740", "tooth_numbers": "19" },
{ "ada_code": "D7140", "tooth_numbers": "30" },
{ "ada_code": "D0150" }
]
}
Example Response
{
"attachmentNeeded": true,
"xray": true,
"periochart": false,
"eob": false,
"narrative": true,
"other": true,
"additionalInfo": "Pathology report",
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"requiredXrayTypesByCode": [
{ "code": "D2740", "toothNumbers": "14", "requiredXrayTypes": [
{ "type": "Periapical", "category": "pre-operative" },
{ "type": "Bitewing", "category": "pre-operative" } ] },
{ "code": "D2740", "toothNumbers": "19", "requiredXrayTypes": [
{ "type": "Periapical", "category": "pre-operative" },
{ "type": "Bitewing", "category": "pre-operative" } ] },
{ "code": "D7140", "toothNumbers": "30", "requiredXrayTypes": [] },
{ "code": "D0150", "toothNumbers": "", "requiredXrayTypes": [] }
],
"requiredAttachmentTypes": [
{ "code": "RB", "label": "X-Rays" },
{ "code": "03", "label": "Narrative" },
{ "code": "OZ", "label": "Operative report" },
{ "code": "OZ", "label": "Pathology report" }
],
"xrays": [
{
"xrayType": "Periapical",
"category": "pre-operative",
"xrayDate": "2026-04-22",
"imageId": "1.2.840.113654.2.55.00001",
"imageModality": "IO",
"toothNumbers": "14",
"seriesId": "",
"imageConfidence": 90,
"originalSelectionType": "Periapical",
"selectionCriteria": "default",
"originalClassifiedType": null,
"orientation": "LEFT",
"orientationConfidence": "high",
"forCodes": ["D2740"],
"requestedToothNumbers": "14"
},
{
"xrayType": "Bitewing",
"category": "pre-operative",
"xrayDate": "2026-04-22",
"imageId": "1.2.840.113654.2.55.00002",
"imageModality": "IO",
"toothNumbers": "14,15,16",
"seriesId": "",
"imageConfidence": 88,
"originalSelectionType": "Bitewing",
"selectionCriteria": "default",
"originalClassifiedType": null,
"orientation": "LEFT",
"orientationConfidence": "high",
"forCodes": ["D2740"],
"requestedToothNumbers": "14"
},
{
"xrayType": "Periapical",
"category": "pre-operative",
"xrayDate": "2026-04-22",
"imageId": "1.2.840.113654.2.55.00003",
"imageModality": "IO",
"toothNumbers": "19,20",
"seriesId": "",
"imageConfidence": 86,
"originalSelectionType": "Periapical",
"selectionCriteria": "default",
"originalClassifiedType": null,
"orientation": "LEFT",
"orientationConfidence": "high",
"forCodes": ["D2740"],
"requestedToothNumbers": "19"
}
]
}
procedures[] — one entry per procedure line: ada_code plus an optional tooth_numbers
(comma-separated, quadrants UL/UR/LL/LR, child letters A–T; normalized per line, so "UL" expands to 9–16 for that line only).
A line without a tooth inherits the claim-level tooth_numbers. Legacy ada_codes[] is still accepted;
sending both with different code sets, sending neither, or sending any unknown field returns 422.
Booleans (all OR'd across lines):
attachmentNeeded = true if any of the 5 type booleans is true.
xray / periochart / eob / narrative / other = true if any line requires that type.
additionalInfo = unique additionalInfo strings from all lines joined with "; " (DXC free-text describing what attachment is needed).
xray_pa / xray_bw / xray_fmx / xray_pano / xray_pm / xray_ceph = true if any line requires that subtype.
requiredXrayTypesByCode[]: one entry per procedure line in request order, each with the line's normalized toothNumbers;
two lines of the same code on different teeth give two entries. Legacy requests collapse to one entry per unique code.
requiredAttachmentTypes[]: claim-level PWK01 {code, label} pairs for the 837D PWK segment.
xrays[]: deduplicated by imageId (SOP UID): each unique image appears at most once, with
forCodes (every line it satisfied) and requestedToothNumbers (the teeth those lines asked for).
Each item is the same RcmXrayItem as on the single-code endpoint, so the field table under
/api/RCM/v1/GetAttachmentInfo above applies here field for field; since 2026-10-02 that includes the three selection fields
originalSelectionType, selectionCriteria and originalClassifiedType, with the same meaning as there.
seriesId is always "" on this endpoint.
toothNumbers is the image's own XVWeb tooth tag (the adult and deciduous teeth on the image label, normalized to Universal numbers), with the LLM reading as fallback when the tag is blank;
since 2026-09-21 every returned image whose XVWeb label carries teeth echoes them on this endpoint (the field was always blank here before); an image with no tag stays blank on the CNN-only default.
Fetch scope: a single tooth is applied as a server-side XVWeb filter; a claim with two or more distinct teeth, like the example above, or with an X-ray requirement that has no tooth,
fetches the patient's full image set and is filtered client-side against the image tags (the gateway filter is an intersection, so 14,30 sent server-side matches nothing).
forCodes and requestedToothNumbers are [] and "" on legacy ada_codes[] requests.
xrays[] itself is empty when xvweb_primary_id is omitted or no matches found.
/rules variant: POST /api/RCM/v1/GetAttachmentInfoWithMultipleCodes/rules takes the same
procedures[] shape (no XVWeb fields) and returns everything above except xrays[].
office_id (optional, claim level) on either endpoint: the Denticon office whose own DXC exceptions are applied; the response then carries one officeCheck for the claim. See the Office exceptions card below.
Office exceptions: office_id and officeCheck
Optional
An office's own DXC exceptions, applied on request. Added by RRCM2-70 on 2026-10-11 to
GetAttachmentInfo, GetAttachmentInfo/rules, GetAttachmentInfoWithMultipleCodes and
GetAttachmentInfoWithMultipleCodes/rules. GetAttachmentInfo/images has no office layer.
When a request names the office, AutoAttach reads that office's DentalXChange exceptions through the Artemis API and applies the ones that match a line
on top of the insurer rule and any practice rule. A request without office_id gets exactly the answer it got before, with no officeCheck.
Send office_id to an environment only after a build that includes this change is live there. This has not yet been run against the real Artemis API or DXC.
Example Request (GetAttachmentInfo/rules)
{
"pgid": "9990001",
"office_id": "4001",
"ada_code": "D0220",
"payer_id": "53473"
}
Example Response, exception applied (other fields omitted)
{
"code": "D0220",
"payerId": "53473",
"source": "custom",
"officeCheck": { "status": "applied" }
}
Example Response, office could not be checked (multi-code, other fields omitted)
{
"attachmentNeeded": true,
"xray": true,
"officeCheck": { "status": "unavailable", "reason": "timeout" }
}
office_id sits at the top level of the body on GetAttachmentInfo and GetAttachmentInfo/rules,
and at the claim level (beside pgid and payer_id, not inside a procedures[] item) on the two multi-code endpoints.
"4001" and 4001 are both accepted, and "007" is the same office as 7. There are no aliases:
oid and officeId get a 422 on the three bodies that reject unknown fields and are dropped without an error on GetAttachmentInfo/rules.
officeCheck sits at the top level of the response, once for the whole request.
| Field | Type | Meaning |
|---|---|---|
office_id |
string | null | Denticon office whose own DXC attachment exceptions are applied on top of the insurer and practice rules (claim level on the multi-procedure bodies). A whole number from 1 to 9223372036854775807, sent as a string of digits or as a JSON number. Omit it to get today's answer unchanged: the response then carries no officeCheck. Any other value is rejected with 422. |
officeCheck |
object | Present only when the request carried office_id and the claim had at least one procedure line. Says whether the office's own DXC exceptions were applied, found not to apply, or could not be checked. |
officeCheck.status |
string | applied: at least one office exception matched a line of the request and replaced that line's requirement. no_exceptions: the office was checked and no exception matched any line. unavailable: the office could not be checked, so every line carries the normal answer. For a claim with several lines the status is for the claim as a whole. |
officeCheck.reason |
string | Present only when status is unavailable: timeout (no answer within the wait limit), error (the lookup failed), paused (an earlier failure is still pausing lookups for this office) or not_configured (office lookups are not set up in this environment). Omitted otherwise. |
ALL or the line's code and its insurer is blank or the claim's insurer, compared after trimming and upper-casing.
Only the highest tier that has any rule is used, and within a tier a requirement is Yes when any rule says Yes, with the distinct notes joined by "; ".
| Tier | The rule names | Example |
|---|---|---|
| 1 | the code and the insurer | D0220 for insurer 53473 |
| 2 | the code, any insurer | D0220 for every insurer |
| 3 | the insurer, any code | insurer 53473 for every code |
| 4 | neither | every code, every insurer |
source: "custom" on the single-code endpoints,
and officeCheck.status set to applied is the signal on all four. The office's "other" requirement is reported as other only, with eob left false.
When the office cannot be checked. The normal answer is returned with officeCheck set to unavailable and a reason.
A saved copy of an office's exceptions lasts one day (10 minutes when DXC answered with an empty list or when some of its rules could not be read) and is never used after it expires.
A claim with no fresh copy waits up to 10 seconds by default, and a lookup still running then carries on for up to 30 seconds and saves its answer for later claims.
A failure is never saved as "no exceptions". After one, the office is not asked again for 30 seconds, doubling up to 30 minutes, and claims for it get paused at once; after DXC rejects the office's login the pause starts at 15 minutes and doubles up to 2 hours.
/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,
"other": true,
"additional_info": "Pathology report",
"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,
"other": false,
"additional_info": null,
"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,
"other": false,
"additional_info": null,
"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,
"other": false,
"additional_info": null,
"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,
"other": false,
"additional_info": null,
"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/AddCustomRuleForAllPayers
Apply one practice-wide override to every payer for a given ADA code.
Same body as AddCustomRule but without payer_id — the handler upserts a custom rule for every payer that has a default rule for the code. Use exclude_payer_ids to leave specific payers untouched (e.g., a payer the practice already has a different override for).
Idempotent: re-running the same body just refreshes the existing custom rules. Returns counts so the caller knows the blast radius (no need to ListCustomRules afterward).
Example Request
{
"pgid": "2937",
"ada_code": "D2740",
"xray": true,
"eob": false,
"perio": false,
"narrative": true,
"other": false,
"additional_info": null,
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Practice-wide override: require BW + PA + narrative",
"exclude_payer_ids": ["60054"]
}
Example Response (201 Created)
{
"ada_code": "D2740",
"pgid": "2937",
"eligible_payer_count": 312,
"excluded_payer_ids": ["60054"],
"applied": 311,
"inserted": 308,
"updated": 3
}
404 if no default rules exist for the code; 400 if every eligible payer is in exclude_payer_ids or pgid/ada_code is empty.
/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,
"other": false,
"additional_info": null,
"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": false,
"perio": false,
"narrative": true,
"other": true,
"additional_info": "Pathology report",
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Updated: now also require Other (pathology report)"
}
Example Response
{
"rule_id": 42,
"pgid": "2937",
"payer_id": "60054",
"code": "D2740",
"xray": true,
"eob": false,
"perio": false,
"narrative": true,
"other": true,
"additional_info": "Pathology report",
"xray_pa": true,
"xray_bw": true,
"xray_fmx": false,
"xray_pano": false,
"xray_pm": false,
"xray_ceph": false,
"notes": "Updated: now also require Other (pathology report)",
"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
}