Claim Scrubber
Scrubber rules describe problems that should stop or flag an insurance claim before it is submitted to a clearinghouse. Every claim is scrubbed against the account's active rules when it is submitted, and a claim can also be scrubbed on demand.
The scrubber rule model
A rule is a name and a set of conditions describing a problem. When the conditions hold for a claim, or for one of its billing items, the claim is flagged with the rule's message. A rule that mentions a billing item field (procedure, modifiers, units, and so on) runs once per billing item; a rule that only mentions claim fields runs once per claim.
Properties
- Name
id- Type
- string
- Description
Unique identifier for the scrubber rule.
- Name
object- Type
- string
- Description
Always 'scrubber_rule'.
- Name
name- Type
- string
- Description
Name of the rule.
- Name
description- Type
- string
- Description
Description of what the rule checks.
- Name
severity- Type
- string
- Description
An 'error' finding blocks submission of the claim. A 'warning' finding is recorded but does not hold the claim back.
errorwarning
Possible values:- Name
source- Type
- string
- Description
'system' rules are standard rules provided by Avon. Their conditions cannot be edited. Rules created through the API are 'custom'.
systemcustom
Possible values:- Name
conditions- Type
- array of arrays of objects
- Description
The problem the rule looks for, as an OR of AND blocks: the outer array is OR, each inner array is AND. Each condition object has an
idstring, afield, acondition(operator), and avalue. See the condition grammar below.
- Name
message- Type
- string
- Description
The message shown on a finding raised by this rule.
- Name
start_date- Type
- date
- Description
Optional. The rule only evaluates claims with service dates on or after this date.
- Name
end_date- Type
- date
- Description
Optional. The rule only evaluates claims with service dates on or before this date.
- Name
status_history- Type
- array of objects
- Description
- Status history of the scrubber rule.
- Name
created_by- Type
- string
- Description
Creator of the scrubber rule.
- Name
created_at- Type
- date-time
- Description
Timestamp (in ISO 8601 format) of when the scrubber rule was created.
- Name
last_updated_at- Type
- date-time
- Description
Timestamp (in ISO 8601 format) of when this scrubber rule was last updated.
Response
{
"id": "scrb_02DCBCXf3BglWGW0eC3H",
"object": "scrubber_rule",
"name": "Telehealth 99213 requires modifier 95",
"description": "Office visits billed with place of service 02 must carry the telehealth modifier.",
"severity": "error",
"source": "custom",
"conditions": [
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99213" },
{ "id": "c2", "field": "place_of_service", "condition": "equal_to", "value": "02" },
{ "id": "c3", "field": "modifiers", "condition": "not_in", "value": ["95"] }
]
],
"message": "Add modifier 95 for telehealth visits.",
"start_date": "2026-01-01",
"end_date": null,
"status_history": [
{
"status": "draft",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-01T13:20:21.724Z"
},
{
"status": "active",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-02T09:04:11.102Z"
}
],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-01T13:20:21.724Z",
"last_updated_at": "2026-09-02T09:04:11.102Z"
}
The condition grammar
Each condition compares one field of the claim, or of one of its billing items, against a value. Which operators a field accepts is fixed per field.
Fields
- Name
payer- Type
- string
- Description
The payer on the claim. Operators: equal_to, not_equal_to, in, not_in.
- Name
procedure- Type
- CPT code
- Description
Procedure on the billing item. Operators: equal_to, not_equal_to, in, not_in.
- Name
modifiers- Type
- array of modifiers
- Description
Modifiers on the billing item. A list field matches on any entry, so
modifiers not_in ["95"]means the billing item does not carry 95. Operators: in, not_in, exists, missing.
- Name
units- Type
- number
- Description
Quantity on the billing item. Operators: exists, missing, greater_than, greater_than_or_equal, less_than, less_than_or_equal.
- Name
service_start- Type
- number of days
- Description
Days between the billing item's service start date and today. Operators: greater_than, greater_than_or_equal, less_than, less_than_or_equal.
- Name
service_end- Type
- number of days
- Description
Days between the billing item's service end date and today. Same operators as service_start.
- Name
place_of_service- Type
- string
- Description
Place of service on the billing item. Operators: equal_to, not_equal_to, in, not_in.
- Name
line_diagnoses- Type
- array of ICD-10 codes
- Description
Diagnoses associated with the billing item. Operators: in, not_in, exists, missing.
- Name
same_day_procedures- Type
- array of CPT codes
- Description
Procedures on other billing items with the same date of service. Operators: in, not_in, exists, missing.
- Name
claim_procedures- Type
- array of CPT codes
- Description
Every procedure on the claim. Operators: in, not_in, exists, missing.
- Name
claim_diagnoses- Type
- array of ICD-10 codes
- Description
Every diagnosis on the claim. Operators: in, not_in, exists, missing.
- Name
primary_diagnosis- Type
- ICD-10 code
- Description
The first diagnosis on the claim. Operators: equal_to, not_equal_to, in, not_in. Also
secondary_diagnosisandtertiary_diagnosis.
- Name
prior_authorization_number- Type
- string
- Description
Operators: exists, missing.
- Name
referral_number- Type
- string
- Description
Operators: exists, missing.
- Name
service_facility- Type
- string
- Description
Service facility on the claim. Operators: in, not_in, exists, missing.
- Name
billing_provider- Type
- string
- Description
Billing provider on the claim. Operators: in, not_in, exists, missing.
- Name
sex- Type
- string
- Description
Patient sex. Operators: equal_to, not_equal_to, exists, missing.
- Name
patient_age- Type
- number of years
- Description
Patient age in years. Operators: exists, missing, greater_than, greater_than_or_equal, less_than, less_than_or_equal.
- Name
patient_state- Type
- string
- Description
Patient address state. Operators: equal_to, not_equal_to, in, not_in.
Operators
- Name
equal_to- Type
- single value
- Description
The field is the value.
- Name
not_equal_to- Type
- single value
- Description
The field is not the value.
- Name
in- Type
- array of values
- Description
The field is one of the values. For a list field, any entry matches.
- Name
not_in- Type
- array of values
- Description
The field is not one of the values. For a list field, no entry matches.
- Name
exists- Type
- no value
- Description
The field is present.
- Name
missing- Type
- no value
- Description
The field is absent or empty.
- Name
greater_than- Type
- number
- Description
Also
greater_than_or_equal,less_than, andless_than_or_equal.
Unit cap
[
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99213" },
{ "id": "c2", "field": "units", "condition": "greater_than", "value": 2 }
]
]
Add-on code
[
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99354" },
{ "id": "c2", "field": "same_day_procedures", "condition": "not_in", "value": ["99213"] }
]
]
Authorization
[
[
{ "id": "c1", "field": "procedure", "condition": "in", "value": ["97110", "97140"] },
{ "id": "c2", "field": "prior_authorization_number", "condition": "missing", "value": null }
]
]
Timely filing (OR)
[
[
{ "id": "c1", "field": "payer", "condition": "equal_to", "value": "00019" },
{ "id": "c2", "field": "service_start", "condition": "greater_than", "value": 90 }
],
[
{ "id": "c3", "field": "payer", "condition": "equal_to", "value": "00039" },
{ "id": "c4", "field": "service_start", "condition": "greater_than", "value": 180 }
]
]
Create a scrubber rule
Creates a new scrubber rule. A rule starts as a draft unless status is set to 'active'. Drafts are saved as-is and do not run. Activating a rule validates it: it must have at least one condition, every condition needs a field and an operator, and every condition needs a value unless the operator is 'exists' or 'missing'. A rule that fails validation returns a 400 with code invalid_scrubber_rule.
Required attributes
- Name
name- Type
- string
- Description
Name of the rule.
Optional attributes
- Name
description- Type
- string
- Description
Description of what the rule checks.
- Name
severity- Type
- string
- Description
Defaults to 'error'.
errorwarning
Possible values:- Name
conditions- Type
- array of arrays of objects
- Description
The problem the rule looks for. Defaults to an empty set, which is allowed on a draft but not on an active rule.
- Name
message- Type
- string
- Description
The message shown on a finding raised by this rule.
- Name
start_date- Type
- date
- Description
The rule only evaluates claims with service dates on or after this date.
- Name
end_date- Type
- date
- Description
The rule only evaluates claims with service dates on or before this date.
- Name
status- Type
- string
- Description
Defaults to 'draft'.
draftactive
Possible values:
Request
curl -X POST "https://{{base_subdomain}}.avonhealth.com/v2/scrubber_rules" \
-H "Authorization: Bearer {{token}}" \
-H "x-jwt: {{jwt}}" \
-H "account: {{account}}" \
-H "Content-Type: application/json" \
--data '{
"name": "Telehealth 99213 requires modifier 95",
"severity": "error",
"message": "Add modifier 95 for telehealth visits.",
"status": "active",
"conditions": [
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99213" },
{ "id": "c2", "field": "place_of_service", "condition": "equal_to", "value": "02" },
{ "id": "c3", "field": "modifiers", "condition": "not_in", "value": ["95"] }
]
]
}'
Response
{
"id": "scrb_02DCBCXf3BglWGW0eC3H",
"object": "scrubber_rule",
"name": "Telehealth 99213 requires modifier 95",
"description": null,
"severity": "error",
"source": "custom",
"conditions": [
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99213" },
{ "id": "c2", "field": "place_of_service", "condition": "equal_to", "value": "02" },
{ "id": "c3", "field": "modifiers", "condition": "not_in", "value": ["95"] }
]
],
"message": "Add modifier 95 for telehealth visits.",
"start_date": null,
"end_date": null,
"status_history": [
{
"status": "active",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-01T13:20:21.724Z"
}
],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-01T13:20:21.724Z",
"last_updated_at": "2026-09-01T13:20:21.724Z"
}
Retrieve a scrubber rule
Retrieves the specified scrubber rule.
Request
curl "https://{{base_subdomain}}.avonhealth.com/v2/scrubber_rules/:id" \
-H "Authorization: Bearer {{token}}" \
-H "x-jwt: {{jwt}}" \
-H "account: {{account}}"
Response
{
"id": "scrb_02DCBCXf3BglWGW0eC3H",
"object": "scrubber_rule",
"name": "Telehealth 99213 requires modifier 95",
"description": "Office visits billed with place of service 02 must carry the telehealth modifier.",
"severity": "error",
"source": "custom",
"conditions": [
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99213" },
{ "id": "c2", "field": "place_of_service", "condition": "equal_to", "value": "02" },
{ "id": "c3", "field": "modifiers", "condition": "not_in", "value": ["95"] }
]
],
"message": "Add modifier 95 for telehealth visits.",
"start_date": "2026-01-01",
"end_date": null,
"status_history": [
{
"status": "draft",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-01T13:20:21.724Z"
},
{
"status": "active",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-02T09:04:11.102Z"
}
],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-01T13:20:21.724Z",
"last_updated_at": "2026-09-02T09:04:11.102Z"
}
Update a scrubber rule
Updates the specified scrubber rule by setting the values of the parameters passed. Any other parameters not provided will not be modified. Setting status to 'active' validates the rule's conditions before it goes live. The conditions of a 'system' rule cannot be changed; attempting to returns a 400 with code immutable_scrubber_rule.
Required attributes
Optional attributes
- Name
name- Type
- string
- Description
Name of the rule.
- Name
description- Type
- string
- Description
Description of what the rule checks.
- Name
severity- Type
- string
- Description
Severity of findings raised by this rule.
errorwarning
Possible values:- Name
conditions- Type
- array of arrays of objects
- Description
Replaces the rule's condition set. Not editable on 'system' rules.
- Name
message- Type
- string
- Description
The message shown on a finding raised by this rule.
- Name
start_date- Type
- date
- Description
Pass null to clear.
- Name
end_date- Type
- date
- Description
Pass null to clear.
- Name
status- Type
- string
- Description
Status of the rule. Setting this appends an entry to the rule's status history.
draftactivearchived
Possible values:
Request
curl -X POST "https://{{base_subdomain}}.avonhealth.com/v2/scrubber_rules/:id" \
-H "Authorization: Bearer {{token}}" \
-H "x-jwt: {{jwt}}" \
-H "account: {{account}}" \
-H "Content-Type: application/json" \
--data '{
"severity": "warning",
"status": "active"
}'
Response
{
"id": "scrb_02DCBCXf3BglWGW0eC3H",
"object": "scrubber_rule",
"name": "Telehealth 99213 requires modifier 95",
"description": "Office visits billed with place of service 02 must carry the telehealth modifier.",
"severity": "warning",
"source": "custom",
"conditions": [
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99213" },
{ "id": "c2", "field": "place_of_service", "condition": "equal_to", "value": "02" },
{ "id": "c3", "field": "modifiers", "condition": "not_in", "value": ["95"] }
]
],
"message": "Add modifier 95 for telehealth visits.",
"start_date": "2026-01-01",
"end_date": null,
"status_history": [
{
"status": "draft",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-01T13:20:21.724Z"
},
{
"status": "active",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-02T09:04:11.102Z"
}
],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-01T13:20:21.724Z",
"last_updated_at": "2026-09-02T09:04:11.102Z"
}
List all scrubber rules
Returns a list of all scrubber rules, newest first.
Optional query parameters
- Name
status- Type
- string
- Description
Only return rules whose current status matches.
draftactivearchived
Possible values:- Name
source- Type
- string
- Description
Only return standard or custom rules.
systemcustom
Possible values:- Name
search- Type
- string
- Description
Free-text search on name.
Request
curl "https://{{base_subdomain}}.avonhealth.com/v2/scrubber_rules?status=active" \
-H "Authorization: Bearer {{token}}" \
-H "x-jwt: {{jwt}}" \
-H "account: {{account}}"
Response
{
"object": "list",
"data": [
{
"id": "scrb_02DCBCXf3BglWGW0eC3H",
"object": "scrubber_rule",
"name": "Telehealth 99213 requires modifier 95",
"description": "Office visits billed with place of service 02 must carry the telehealth modifier.",
"severity": "error",
"source": "custom",
"conditions": [
[
{ "id": "c1", "field": "procedure", "condition": "equal_to", "value": "99213" },
{ "id": "c2", "field": "place_of_service", "condition": "equal_to", "value": "02" },
{ "id": "c3", "field": "modifiers", "condition": "not_in", "value": ["95"] }
]
],
"message": "Add modifier 95 for telehealth visits.",
"start_date": "2026-01-01",
"end_date": null,
"status_history": [
{
"status": "active",
"changed_by": "user_idjkvxZTqfJD734feQHa",
"changed_at": "2026-09-02T09:04:11.102Z"
}
],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-01T13:20:21.724Z",
"last_updated_at": "2026-09-02T09:04:11.102Z"
},
]
}
Archive a scrubber rule
Archives the specified scrubber rule. The rule stops running but is not removed, so findings it already raised keep pointing at it.
Required attributes
Optional attributes
Request
curl -X DELETE "https://{{base_subdomain}}.avonhealth.com/v2/scrubber_rules/:id" \
-H "Authorization: Bearer {{token}}" \
-H "x-jwt: {{jwt}}" \
-H "account: {{account}}"
Response
{
"id": "scrb_02DCBCXf3BglWGW0eC3H",
"object": "scrubber_rule",
"archived": true
}
The scrub result model
A scrub result is one run of the active rules against one insurance claim. Each unmet rule produces a finding. The rule's name is copied onto the finding, so an archived or edited rule never rewrites what a claim was flagged for. Required-field checks always run regardless of configured rules; their findings have a null rule.
Properties
- Name
id- Type
- string
- Description
Unique identifier for the scrub result.
- Name
object- Type
- string
- Description
Always 'scrub_result'.
- Name
insurance_claim- Type
- string
- Description
The insurance claim that was scrubbed.
- Name
trigger- Type
- string
- Description
What started the scrub.
manualsubmitautomation
Possible values:- Name
status- Type
- string
- Description
'passed' when there were no findings. 'failed' when there was at least one. 'overridden' when a failed submit-time scrub was forced through.
passedfailedoverridden
Possible values:- Name
findings- Type
- array of objects
- Description
One entry per unmet rule. Each finding has:
id,object('scrub_finding'),result,rule(null for built-in required-field checks),rule_name,billing_item(null for claim-level findings),severity,message,outcome('open', 'dismissed', or 'overridden'),resolved_by, andresolved_at.
- Name
created_by- Type
- string
- Description
User who ran the scrub.
- Name
created_at- Type
- date-time
- Description
Timestamp (in ISO 8601 format) of when the scrub ran.
Response
{
"id": "scrs_9g36hEN5wgew2M59eIrF",
"object": "scrub_result",
"insurance_claim": "iclm_GHY5mso3NpQP90bNHhpp",
"trigger": "manual",
"status": "failed",
"findings": [
{
"id": "scrf_tJFm1YU2tWDhpgUhXSZ5",
"object": "scrub_finding",
"result": "scrs_9g36hEN5wgew2M59eIrF",
"rule": "scrb_02DCBCXf3BglWGW0eC3H",
"rule_name": "Telehealth 99213 requires modifier 95",
"billing_item": "bitm_Z1zXZKvqrpwxbznuW6lJ",
"severity": "error",
"message": "Add modifier 95 for telehealth visits.",
"outcome": "open",
"resolved_by": null,
"resolved_at": null
}
],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-08T16:42:03.511Z"
}
Scrub an insurance claim
Runs the account's active scrubber rules against the specified insurance claim and returns the result. Nothing is submitted.
Claims are also scrubbed automatically by POST /v2/insurance_claims/submit. Claims with an 'error' finding are held back and moved to 'missing_information'; passing force: true to the submit endpoint overrides the hold and records the findings as overridden.
Required attributes
Optional attributes
Request
curl -X POST "https://{{base_subdomain}}.avonhealth.com/v2/insurance_claims/:id/scrub" \
-H "Authorization: Bearer {{token}}" \
-H "x-jwt: {{jwt}}" \
-H "account: {{account}}"
Response
{
"id": "scrs_9g36hEN5wgew2M59eIrF",
"object": "scrub_result",
"insurance_claim": "iclm_GHY5mso3NpQP90bNHhpp",
"trigger": "manual",
"status": "failed",
"findings": [
{
"id": "scrf_tJFm1YU2tWDhpgUhXSZ5",
"object": "scrub_finding",
"result": "scrs_9g36hEN5wgew2M59eIrF",
"rule": "scrb_02DCBCXf3BglWGW0eC3H",
"rule_name": "Telehealth 99213 requires modifier 95",
"billing_item": "bitm_Z1zXZKvqrpwxbznuW6lJ",
"severity": "error",
"message": "Add modifier 95 for telehealth visits.",
"outcome": "open",
"resolved_by": null,
"resolved_at": null
}
],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-08T16:42:03.511Z"
}
Retrieve scrub results
Returns the most recent scrub results for the specified insurance claim, newest first.
Optional query parameters
- Name
limit- Type
- number
- Description
Maximum number of results to return. Defaults to 1, the latest run.
Request
curl "https://{{base_subdomain}}.avonhealth.com/v2/insurance_claims/:id/scrub?limit=5" \
-H "Authorization: Bearer {{token}}" \
-H "x-jwt: {{jwt}}" \
-H "account: {{account}}"
Response
{
"object": "list",
"data": [
{
"id": "scrs_9g36hEN5wgew2M59eIrF",
"object": "scrub_result",
"insurance_claim": "iclm_GHY5mso3NpQP90bNHhpp",
"trigger": "submit",
"status": "passed",
"findings": [],
"created_by": "user_idjkvxZTqfJD734feQHa",
"created_at": "2026-09-09T10:15:44.020Z"
},
]
}