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.

    Possible values:
    error
    warning
  • 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'.

    Possible values:
    system
    custom
  • 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 id string, a field, a condition (operator), and a value. 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_diagnosis and tertiary_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, and less_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 }
  ]
]

POST/v2/scrubber_rules

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'.

    Possible values:
    error
    warning
  • 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'.

    Possible values:
    draft
    active

Request

POST
/v2/scrubber_rules
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"
    }

GET/v2/scrubber_rules/:id

Retrieve a scrubber rule

Retrieves the specified scrubber rule.

Request

GET
/v2/scrubber_rules/:id
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"
    }

POST/v2/scrubber_rules/:id

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.

      Possible values:
      error
      warning
    • 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.

      Possible values:
      draft
      active
      archived

    Request

    POST
    /v2/scrubber_rules/:id
    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"
        }
    

    GET/v2/scrubber_rules

    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.

      Possible values:
      draft
      active
      archived
    • Name
      source
      Type
      string
      Description

      Only return standard or custom rules.

      Possible values:
      system
      custom
    • Name
      search
      Type
      string
      Description

      Free-text search on name.

    Request

    GET
    /v2/scrubber_rules
    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"
            },
          ]
        }
    

    DELETE/v2/scrubber_rules/:id

    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

        DELETE
        /v2/scrubber_rules/:id
        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.

          Possible values:
          manual
          submit
          automation
        • 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.

          Possible values:
          passed
          failed
          overridden
        • 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, and resolved_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"
        }
        

        POST/v2/insurance_claims/:id/scrub

        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

            POST
            /v2/insurance_claims/:id/scrub
            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"
                }
            

            GET/v2/insurance_claims/:id/scrub

            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

            GET
            /v2/insurance_claims/:id/scrub
            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"
                    },
                  ]
                }