v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Insurance Prior Authorization

Automated system that evaluates insurance requirements for medical services based on carrier rules, diagnosis codes, and service details.

Solution

This insurance authorization system streamlines healthcare administrative workflows by automatically determining when prior approval is needed for medical services. The solution evaluates multiple factors including the patient's insurance type (Medicaid, Medicare, or Commercial), specific diagnosis codes, service category, CPT/HCPCS codes, and associated costs.

For each insurance type, the system applies carrier-specific rules to determine authorization requirements. Medicaid evaluations focus on service costs, with thresholds varying by service type. Medicare determinations analyze procedure codes and service categories, while Commercial insurance assessments include specialty medication indicators and specific procedure code lists. The system also identifies clinical exceptions where authorization requirements are waived, such as chemotherapy encounters, pregnancy-related services, and COVID-19 imaging studies, regardless of the initial determination.

How it works

The system follows a structured decision process:

  1. Input Processing: Captures patient insurance information, diagnosis codes, service type, and details including CPT/HCPCS code, cost, and emergency status.
  2. Insurance Classification: Routes the request to the appropriate ruleset based on insurance type (Medicaid, Medicare, or Commercial).
  3. Rule Application: Applies carrier-specific criteria based on service type and details:
    • Medicaid: Evaluates service cost thresholds
    • Medicare: Reviews procedure codes and service categories
    • Commercial: Checks specific procedure lists and specialty designations
  4. Clinical Exclusion Review: Examines diagnosis codes to identify exceptions that waive authorization requirements, such as chemotherapy, pregnancy, or COVID-19 related services.
  5. Final Determination: Generates a timestamped decision with clear reasoning for the authorization requirement or exemption.

Where teams use it

  • Hospital admissions departments
  • Outpatient imaging centers
  • Medical practice management
  • Insurance verification systems
  • Revenue cycle management
  • Pharmacy benefit management

Inside the decision model

Insurance Prior Authorization ships as a JDM decision graph with 7 nodes, 4 decision tables and 20 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph7 nodes · read-only
input requestswitch Insurance Type Checktable Medicaid Rulestable Medicare Rulestable Commercial Rulestable Diagnosis Code Exclusionsexpression Final Determination
01

Request

input

Authorization requests carry four blocks: patientInfo.insuranceType (limited by the schema to Medicaid, Medicare, or Commercial), an array of diagnosisCodes, a serviceType, and serviceDetails holding the billing code, cost, and emergency flag.

Sample requestJSON
{
  "patientInfo": {
    "insuranceType": "Commercial"
  },
  "diagnosisCodes": [
    "M54.5",
    "M51.26"
  ],
  "serviceType": "Imaging",
  "serviceDetails": {
    "code": "70551",
    "cost": 1200,
    "isEmergency": false
  }
}
02

Insurance Type Check

switch

Carrier routing happens before any rule fires: patientInfo.insuranceType == 'Medicaid' takes the first branch, 'Medicare' the second, 'Commercial' the third, and an unconnected isDefault statement catches unrecognized carriers. Splitting by payer up front keeps each ruleset small enough to be owned by the team that manages that contract.

Branches4 paths
patientInfo.insuranceType == 'Medicaid' Medicaid Rules
patientInfo.insuranceType == 'Medicare' Medicare Rules
patientInfo.insuranceType == 'Commercial' Commercial Rules
otherwise
03

Medicaid Rules

table

Cost thresholds do most of the work in the Medicaid branch: 'Medication' over 200 and 'Procedure' over 500 require authorization, 'Equipment' over 300 triggers the 'DME over threshold' reason, and 'Imaging' requires authorization at any price since its serviceDetails.cost cell is empty. The final blank row returns requiresAuthorization false with the standard-service reason, and under the first hit policy it only fires when no service-specific row matched.

State Medicaid programs run on constrained budgets and lean on utilization management harder than most payers, so dollar-threshold gates and blanket prior authorization for imaging are realistic levers. Durable medical equipment gets its own threshold because DME is a recurring focus of Medicaid program-integrity reviews; the specific 200/500/300 amounts are sensible plan-level choices rather than mandated figures.

Decision tablefirst hit policy
Service TypeserviceTypeCostserviceDetails.costRequires AuthorizationrequiresAuthorizationReasonauthorizationReason
'Medication'> 200true'High-cost medication requires prior authorization'
'Procedure'> 500true'High-cost procedure requires prior authorization'
'Imaging'-true'All imaging services require prior authorization'
'Equipment'> 300true'DME over threshold requires prior authorization'
--false'Standard service does not require prior authorization'
04

Medicare Rules

table

Procedure codes, not prices, drive this branch. A 'Medication' whose code contains 'J' is flagged as a 'Part B medication', 'Imaging' codes that start with 'CT' or 'MRI' count as advanced imaging, and the 'Procedure' and 'Equipment' rows convert the code with number($) and compare it against 1000 and 500. Anything else drops to the blank row and clears as a standard Medicare service.

J-codes are real HCPCS billing codes for drugs administered in clinical settings, which is the population Medicare Part B actually covers, and singling out CT and MRI mirrors how utilization management concentrates on advanced imaging rather than plain films. Treating the code itself as a number in the procedure and equipment rows is a simplified stand-in for the code-range lookups a production Medicare ruleset would maintain.

Decision tablefirst hit policy
Service TypeserviceTypeCodeserviceDetails.codeRequires AuthorizationrequiresAuthorizationReasonauthorizationReason
'Medication'contains($, 'J')true'Part B medication requires prior authorization'
'Procedure'number($) > 1000true'High-cost procedure requires prior authorization'
'Imaging'startsWith($, 'CT') or startsWith($, 'MRI')true'Advanced imaging requires prior authorization'
'Equipment'number($) > 500true'DME over threshold requires prior authorization'
--false'Standard Medicare service does not require prior authorization'
05

Commercial Rules

table

Explicit code lists define the commercial checks: 'Medication' codes containing 'SPE' mark specialty drugs, 'Procedure' matches the contiguous CPT block 33361 through 33364, and 'Imaging' matches 70450 through 70553, the head CT and brain MRI families that include the sample request's 70551. 'Equipment' switches back to a serviceDetails.cost > 1000 test, and two closing rows clear everything else: serviceDetails.isEmergency == true returns false with the emergency reason, and the final blank row clears standard services.

Specialty-drug gating and short lists of high-cost procedures are the standard shape of commercial utilization management, and 33361 to 33364 are genuine transcatheter aortic valve replacement codes, the kind of intervention plans review case by case. The emergency carve-out reflects the prudent layperson standard that governs emergency coverage under the ACA, though in this table it only applies once no specific code rule has already fired.

Decision tablefirst hit policy
Service TypeserviceTypeAdditional CheckRequires AuthorizationrequiresAuthorizationReasonauthorizationReason
'Medication'contains(serviceDetails.code, 'SPE')true'Specialty medication requires prior authorization'
'Procedure'serviceDetails.code in ['33361', '33362', '33363', '33364']true'Specific procedures require prior authorization'
'Imaging'serviceDetails.code in ['70450', '70460', '70470', '70551', '70552', '70553']true'Advanced imaging requires prior authorization'
'Equipment'serviceDetails.cost > 1000true'High-cost equipment requires prior authorization'
-serviceDetails.isEmergency == truefalse'Emergency services do not require prior authorization'
--false'Standard commercial service does not require prior authorization'
06

Diagnosis Code Exclusions

table

After the carrier tables run, this override scans the diagnosisCodes array with some() expressions: codes starting with 'Z51', the encounter-for-chemotherapy prefix, flip requiresAuthorization back to false, as do the O09.51 supervision-of-pregnancy codes, and 'U07.1' does the same when the second column confirms serviceType == 'Imaging'. Each exemption row also requires requiresAuthorization == true, and the final row passes requiresAuthorization and authorizationReason through untouched.

Layering exemptions after the payer tables means they hold regardless of carrier, which is how clinical carve-outs work in practice: oncology and pregnancy care are time-sensitive, and delaying them for paperwork is a common target of prior-authorization reform. The codes are real ICD-10 entries, Z51 for chemotherapy encounters, O09.51 for supervision of pregnancy, and U07.1 as the COVID-19 diagnosis code, so coders can maintain the exemption list without touching payer logic.

Decision tablefirst hit policy
Diagnosis CodesdiagnosisCodesCurrent Authorization StatusFinal Authorization RequiredrequiresAuthorizationFinal ReasonauthorizationReason
some($, startsWith(#, 'Z51'))requiresAuthorization == truefalse'Encounter for chemotherapy exempt from prior authorization'
some($, # in ['O09.511', 'O09.512', 'O09.513', 'O09.519'])requiresAuthorization == truefalse'Pregnancy-related services exempt from prior authorization'
some($, # in ['U07.1'])requiresAuthorization == true and serviceType == 'Imaging'false'COVID-19 related imaging exempt from prior authorization'
--requiresAuthorizationauthorizationReason
07

Final Determination

expression

Output shrinks to three keys because passThrough is off: requiresAuthorization, the human-readable reason, and a timestamp set with date('now'). Recording when the determination was made matters for prior-authorization audit trails, where decision turnaround times can be contractually and legally bound.

Expressions3 fields
requiresAuthorizationrequiresAuthorization
reasonauthorizationReason
timestampdate('now')

Make this template
your own.

Load Insurance Prior Authorization into GoRules, adjust the rules to your policy, and ship it behind your own API.