Changelog

Claim edit: Invalid taxonomy code

Stedi now rejects 837P professional, 837D dental, and 837I institutional claims that include a provider taxonomy code with an invalid format.

How the edit works

A taxonomy code identifies a provider's classification and specialization, such as cardiology or orthodontics.

Taxonomy codes are defined by the National Uniform Claim Committee (NUCC) and follow a strict format: exactly 10 alphanumeric characters, ending with the letter X.

If a claim contains a taxonomy code that doesn’t follow the format, the payer may reject the claim.

This edit catches the issue before the claim reaches the payer. It prevents payer rejections, which are slower and delay payment for the provider.

Rejection errors

If you submit a claim using Stedi's Claim Submission API endpoints and the claim fails the edit, you'll get back an error response in real time. The response includes details in the errors array:

{
  "errors": [
    {
      "code": "33",
      "description": "Invalid Taxonomy Code. The taxonomy code for Billing Provider does not meet the required format. Taxonomy codes must be 10 alphanumeric characters ending with 'X'. Correct and resubmit.",
      "followupAction": "Please Correct and Resubmit"
    }
  ]
}

If you submit a claim using SFTP and the claim fails the edit, Stedi will reject the claim with a 277CA claim acknowledgment. The acknowledgment will include a related claim status category code, claim status code, entity identifier code, and error message:

STC*A7>145>85*[DATE]*U*[AMOUNT]******A7>569**Invalid Taxonomy Code. The taxonomy code for Billing Provider does not meet the required format. Taxonomy codes must be 10 alphanumeric characters ending with 'X'. Correct and resubmit.~

Introducing pagination for the List Payers API

You can now paginate List Payers API responses using the pageSize and pageToken query parameters.

Stedi's Payer Network includes thousands of payers. Previously, List Payers responses always included all of them in one response. The pageSize parameter lets you retrieve them in smaller pages. The pageToken parameter lets you navigate pages using cursor-based pagination.

If you omit pageSize, the List Payers API still returns all payers in a single response. Existing integrations aren't affected.

How to paginate List Payers responses

Pass pageSize in your List Payers API request. The value must be 10 or greater.

curl --request GET \
  --url "https://healthcare.us.stedi.com/2024-04-01/payers?pageSize=100" \
  --header "Authorization: <api_key>"

If more results are available, the response includes a nextPageToken.

{
  "items": [...],
  "nextPageToken": "yrZ3we9982etYlMgmw==" // Pass this as pageToken in your next request
}

Pass nextPageToken as the pageToken parameter to retrieve the next page:

curl --request GET \
  --url "https://healthcare.us.stedi.com/2024-04-01/payers?pageSize=100&pageToken=yrZ3we9982etYlMgmw==" \
  --header "Authorization: <api_key>"

When the response contains no nextPageToken, you've retrieved the last page.

For more information, see our List Payers API reference.

Introducing aggregation preferences for ERA enrollments

You can now set an aggregation preference – NPI or tax ID (TIN) – on ERA transaction enrollment requests. The preference tells the payer how you’d like them to group payment information in ERAs.

Selecting the right aggregation preference means ERAs arrive grouped the way your billing system expects. Without it, mismatched grouping can require manual reconciliation to match payments to providers or practices.

What is ERA aggregation?

An Electronic Remittance Advice (ERA) contains payment and adjudication information for one or more claims. Providers use ERAs for payment reconciliation, where they match claims to their payments.

Payers group the information inside an ERA and route ERAs based on one of two identifiers in the related claims:

  • Tax identification number (TIN) – A 9-digit tax ID, either a Social Security Number (SSN) or Employer Identification Number (EIN).

  • National Provider Identifier (NPI) – A 10-digit ID assigned to individual providers and organizations.

TIN vs. NPI-based aggregation

TINs are sometimes shared across multiple billing providers within the same organization. For example, a clinic may submit claims for several doctors using a single TIN.

NPIs always uniquely identify a single provider entity, either an individual provider or an organization. For example, a doctor employed by multiple clinics may use the same NPI to submit claims across multiple TINs.

Most payers default to TIN-based aggregation. For more background, see How payers route ERAs.

How aggregation preferences work

Aggregation preferences are a request to the payer, not a guarantee. The payer, not Stedi, controls how ERAs are grouped and routed.

Checking payer support

Not all payers support both aggregation types. You can check which types a payer supports using the Payers API or the Stedi Payer Network before submitting an enrollment request.

In the Stedi Payer Network:

In Payers API responses, the supportedAggregationPreferences field lists the supported types. The field is omitted when Stedi has yet to determine a payer's supported aggregation types.

{
  "payer": {
    "enrollment": {
      "transactionEnrollmentProcesses": {
        "claimPayment": {
          "supportedAggregationPreferences": ["NPI", "TIN"], // Payer supports ERA aggregation by NPI and TIN
          ...
        }
      }
    },
    ...
  }
}

Enrollments API

Setting aggregation preferences

You can now pass the optional aggregationPreference object in Create Enrollment API requests. In almost all cases, the NPI or TIN should belong to the provider being enrolled.

To request NPI-based aggregation, provide an NPI in the aggregationPreference.npi property. For example, in a Create Enrollment API request body:

{
  "transactions": {
    "claimPayment": {
      "enroll": true    // ERA enrollment
    }
  },
  "aggregationPreference": {
    "npi": "1234567890" // Aggregate by the provided NPI
  },
  ...
}

To request TIN-based aggregation, use the aggregationPreference.taxId property:

{
  "transactions": {
    "claimPayment": {
      "enroll": true    // ERA enrollment
    }
  },
  "aggregationPreference": {
    "taxId": "999888777" // Aggregate by the provided tax ID (TIN)
  },
  ...
}

The aggregationPreference object is only supported for ERA transaction enrollments.

Updating existing enrollments

You can update the aggregationPreference object using an Update Enrollment API request if the enrollment is in the DRAFT status.

Payer support for aggregation preference

Before accepting an enrollment request, Stedi checks whether the payer supports the provided aggregationPreference. If not, Stedi rejects the request with an error.

If you omit the aggregationPreference field, the payer’s default aggregation method is used.

Viewing aggregation preferences

The Retrieve Enrollment API and List Enrollment API responses now return the submitted aggregationPreference object in enrollment records. For example, in a Retrieve Enrollment API response:

{
  "id": "db6675c5-7be7-4af9-8c68-a54a336d2911",
  "aggregationPreference": {
    "npi": "1234567890"
  },
  ...
}

The object is omitted for enrollments created before this feature was available.

Stedi portal

You can now use the optional TIN or NPI selectors to indicate an aggregation preference when creating an ERA enrollment request in the Stedi portal. By default, the TIN and NPI values in the selectors belong to the provider being enrolled.

Each ERA enrollment’s details page shows the aggregation preference.

Availability

Transaction enrollment is free on all Stedi plans.

To learn more, check out our transaction enrollment docs.

Claim edit: Missing property and casualty claim number

Stedi now rejects 837P professional claims that include a property and casualty date of first contact without a related claim number.

How the edit works

Property and casualty (P&C) insurance claims cover injuries from accidents or liability events like auto accidents, Workers' Compensation, personal injury, and liability cases. These claims go to a P&C insurer rather than a healthcare payer.

In P&C claims, the date of first contact notes when a healthcare provider first treated the patient for the injury. 

Property and casualty date of first contact

Claim typeJSON API fieldX12 element
837P professionalclaimInformation.claimDateInformation.firstContactDateDTP (Date - Property and Casualty Date of First Contact) of Loop 2300 (Claim Information)

The insurer opens an incident file and assigns a related claim number before it can process any billing.

Property and casualty claim number

Claim typeJSON API fieldX12 element
837P professionalclaimInformation.propertyCasualtyClaimNumberREF (Property and Casualty Claim Number) of Loop 2010BA (Subscriber Name)

If a P&C claim includes the date of first contact but not the claim number, the payer may reject the claim.

This edit catches the issue before the claim reaches the payer. It prevents payer rejections, which are slower and delay payment for the provider.

Rejection errors

If you submit a claim using Stedi's Claim Submission API endpoints and the claim fails the edit, you'll get back an error response in real time. The response includes details in the errors array:

{
  "errors": [
    {
      "code": "33",
      "description": "Missing Property Casualty Claim Number. When the Property and Casualty Date of First Contact is submitted (20260101), the Property and Casualty Claim Number must also be present. Correct and resubmit.",
      "followupAction": "Please Correct and Resubmit"
    }
  ]
}

If you submit a claim using SFTP and the claim fails the edit, Stedi will reject the claim with a 277CA claim acknowledgment. The acknowledgment will include a related claim status category code, claim status code, and error message:

STC*A6>629*[DATE]*U*[AMOUNT]********Missing Property Casualty Claim Number. When the Property and Casualty Date of First Contact is submitted (20260101), the Property and Casualty Claim Number must also be present. Correct and resubmit.~

Filter batch eligibility results by search outcome

You can now filter batch eligibility results in the Stedi portal and API by search outcome: whether the payer returned active insurance coverage, no coverage, or an error.

The Stedi portal also now displays the search outcome for each check directly in the batch results view.

Filter batch eligibility results by search outcome

Previously, the Stedi portal didn't show search outcomes for individual checks. To find patients with a specific outcome, you had to cross-reference the Eligibility searches page, which includes checks from all sources, not just your batch.

Filter using the API

Use the Retrieve Batch Check Statuses API endpoint’s eligibilitySearchOutcome query parameter to filter batch eligibility results by search outcome. You can pass multiple search outcomes as values.

For example, the following request returns all checks where the payer returned no coverage or an error:

curl "https://manager.us.stedi.com/2024-04-01/eligibility-manager/batch/{batchId}/items?eligibilitySearchOutcome=inactive&eligibilitySearchOutcome=failed" \
  -H "Authorization: Key <api_key>"

Claim edit: Missing first name

Stedi now rejects 837P professional, 837D dental, and 837I institutional claims that include a person entity with no first name.

How the edit works

In a claim, each entity, such as the billing provider or subscriber, is identified as either a person or a non-person using an entity type qualifier.

When an entity is a person, a first name is required. If the first name is missing, the payer may reject the claim.

This edit catches the issue before the claim reaches the payer. It prevents payer rejections, which are slower and delay payment for the provider.

How entity type qualifiers are specified

If you use Stedi's JSON Claim Submission API endpoints, Stedi sometimes infers the entity type qualifier. For example, if you provide a firstName and lastName for the billing provider in a JSON 837P Professional Claims API request, the entity is treated as a person. If you provide an organizationName, the entity is treated as an organization. Other entities, such as otherPayerBillingProvider, have an explicit entityTypeQualifier field.

If you use X12, you set the entity type qualifier directly in NM1-02 (Entity Type Qualifier), where 1 indicates a person and 2 indicates a non-person entity.

Rejection errors

If you submit a claim using Stedi's Claim Submission API endpoints and the claim fails the edit, you'll get back an error response in real time. The response includes details in the errors array:

{
  "errors": [
    {
      "code": "33",
      "description": "Missing First Name. When the Billing Provider entity is a person, as identified by the entity type qualifier 1, the entity first name is required. Correct and resubmit.",
      "followupAction": "Please Correct and Resubmit"
    }
  ]
}

If you submit a claim using SFTP and the claim fails the edit, Stedi will reject the claim with a 277CA claim acknowledgment. The acknowledgment will include a related claim status category code, claim status code, entity identifier code, and error message:

STC*A6>505>85*[DATE]*U*[AMOUNT]********Missing First Name. When the Billing Provider entity is a person, as identified by the entity type qualifier 1, the entity first name is required. Correct and resubmit.~

Claim edit: COB service lines must be balanced

Stedi now rejects 837P professional, 837D dental, and 837I institutional claims sent to a non-primary payer when a service line's coordination of benefits (COB) amounts don't balance.

How the edit works

When a patient has multiple insurance plans, the provider submits a claim to each payer in order. The first is the primary payer. Any that follow are secondary, tertiary, and so on. This process is called coordination of benefits (COB).

A service line is a line item for a specific service on a claim, like an office visit or X-ray.

When you submit a claim to a non-primary payer, you must include each previous payer's adjudications – their payments and adjustments. Include both claim-level and service line-level adjudications from each prior payer. Don't include the same amounts at both levels.

Balancing service lines

When you include prior payer adjudications at the service line level, the amounts must add up as follows:

Billed line charge

Claim typeJSON API fieldX12 element
837P professionalclaimInformation.serviceLines[].professionalService.lineItemChargeAmountSV1-02 (Line Item Charge Amount) of Loop 2400 (Professional Service)
837D dentalclaimInformation.serviceLines[].dentalService.lineItemChargeAmountSV3-02 (Line Item Charge Amount) of Loop 2400 (Dental Service)
837I institutionalclaimInformation.serviceLines[].institutionalService.lineItemChargeAmountSV2-03 (Line Item Charge Amount) of Loop 2400 (Institutional Service)

Prior payer line paid amount

Claim typeJSON API fieldX12 element
837P professionalclaimInformation.serviceLines[].lineAdjudicationInformation[].serviceLinePaidAmountSVD-02 (Service Line Paid Amount) of Loop 2430 (Line Adjudication Information)
837D dentalclaimInformation.serviceLines[].lineAdjudicationInformation[].serviceLinePaidAmountSVD-02 (Service Line Paid Amount) of Loop 2430 (Line Adjudication Information)
837I institutionalclaimInformation.serviceLines[].lineAdjudicationInformation[].serviceLinePaidAmountSVD-02 (Service Line Paid Amount) of Loop 2430 (Line Adjudication Information)

Line adjustment amounts

Claim typeJSON API fieldX12 element
837P professionalclaimInformation.serviceLines[].lineAdjudicationInformation[].claimAdjustmentInformation[].adjustmentDetails[].adjustmentAmountCAS-03, CAS-06, CAS-09, CAS-12, CAS-15, and CAS-18 of Loop 2430 (Line Adjudication Information)
837D dentalclaimInformation.serviceLines[].lineAdjudicationInformation[].claimAdjustmentInformation[].adjustmentDetails[].adjustmentAmountCAS-03, CAS-06, CAS-09, CAS-12, CAS-15, and CAS-18 of Loop 2430 (Line Adjudication Information)
837I institutionalclaimInformation.serviceLines[].lineAdjudicationInformation[].lineAdjustment[].claimAdjustmentDetails[].adjustmentAmountCAS-03, CAS-06, CAS-09, CAS-12, CAS-15, and CAS-18 of Loop 2430 (Line Adjudication Information)

If the amounts don't balance for any service line adjudication, the payer may reject the claim.

This edit catches the issue before the claim reaches the payer. It prevents payer rejections, which are slower and delay payment for the provider.

We previously added a separate edit for claim-level COB balancing.

Rejection errors

If you submit a claim using Stedi's Claim Submission API endpoints and the claim fails the edit, you'll get back an error response in real time. The response includes details in the errors array:

{
  "errors": [
    {
      "code": "33",
      "description": "Coordination of Benefits (COB) balancing failed. For line 1, the total charged amount of $150.00 does not equal the sum of the paid amount of $0.00 and all adjustment amounts of $200.00 for payer STEDITEST. Correct and resubmit.",
      "followupAction": "Please Correct and Resubmit"
    }
  ]
}

If you submit a claim using SFTP and the claim fails the edit, Stedi will reject the claim with a 277CA claim acknowledgment. The acknowledgment will include a related claim status category code, claim status code, and error message:

STC*A7>551*[DATE]*U*[AMOUNT]********Coordination of Benefits (COB) balancing failed. For line 1, the total charged amount of $150.00 does not equal the sum of the paid amount of $0.00 and all adjustment amounts of $200.00 for payer STEDITEST. Correct and resubmit.~

Claim edit: Discharge hour on non-final institutional claims

Stedi now rejects 837I institutional claims that include a discharge hour but use a claim frequency code that indicates the patient has not been discharged.

How the edit works

In institutional claims, the discharge hour tells the payer when the patient left the facility.

Discharge hour

Claim typeJSON API fieldX12 element
837I institutionalclaimInformation.claimDateInformation.dischargeHourDTP-03 (Discharge Hour, qualifier 096) of Loop 2300 (Claim Information)

Institutional claims also include a claim frequency code that tells the payer where the claim falls in a patient's billing cycle.

Claim frequency code

Claim typeJSON API fieldX12 element
837I institutionalclaimInformation.claimFrequencyCodeCLM05-03 (Claim Frequency Type Code) of Loop 2300 (Claim Information)

Some claim frequency codes, such as 2 (Interim – First Claim), indicate the patient is still receiving care and has not yet been discharged. Claims with these frequency codes are called non-final claims.

A discharge hour should not be included on non-final claims. If it is, the payer may reject the claim.

This edit catches the issue before the claim reaches the payer. It prevents payer rejections, which are slower and delay payment for the provider.

Rejection errors

If you submit a claim using Stedi's Claim Submission API endpoints and the claim fails the edit, you'll get back an error response in real time. The response includes details in the errors array.

The error message references the claim’s bill type. This is a combination of the claim’s facility type code and claim frequency code.

For example, bill type 112 indicates facility type 11 (Hospital inpatient – general) with frequency code 2 (Interim – First Claim).

{
  "errors": [
    {
      "code": "33",
      "description": "Invalid Discharge Date/hour. Discharge information should not be present for the submitted bill type 112. These fields are only used for final inpatient claims. Correct and resubmit.",
      "followupAction": "Please Correct and Resubmit"
    }
  ]
}

If you submit a claim using SFTP and the claim fails the edit, Stedi will reject the claim with a 277CA claim acknowledgment. The acknowledgment will include a related claim status category code, claim status code, and error message:

STC*A7>190*[DATE]*U*[AMOUNT]********Invalid Discharge Date/hour. Discharge information should not be present for the submitted bill type 112. These fields are only used for final inpatient claims. Correct and resubmit.~