Revenue Cycle ManagementHealthcare InteroperabilityEDI Integration

Stedi API Integration Guide: Access, Cost, Limits (2026)

November 14, 202645 min readUpdated Nov 14, 2026
Written by
Jitendra Choudhary
Jitendra Choudhary

CTO & Co-Founder

CTO & Co-Founder at Nirmitee.io. Architects healthcare integrations across FHIR, SMART on FHIR, ABDM and NHCX, writing from production experience taking hospital software from sandbox to go-live.

Stedi API Integration Guide: Access, Cost, Limits (2026)

Stedi is a US healthcare clearinghouse, a company that carries insurance transactions between providers and payers. Its eligibility API accepts JSON and converts it to X12, the standard format for US healthcare transactions, and a second API accepts X12 directly. The developer documents are public: 192 pages, 66 of which each describe one endpoint with its method and path.

This guide is for the product lead who has to decide on Stedi and for the engineer who will build on it. It lists every use case Stedi supports today, every documented endpoint, the published limits and the published prices. It also lists what Stedi leaves unpublished and what to ask before you commit. Last checked: Nov 14, 2026.

Stedi API at a glance

Question Short answer
Who grants access? Stedi, through self-serve sign-up on its portal. Production is an upgrade inside the portal.
Who signs? The person who upgrades the account accepts a Business Associate Agreement (BAA) online. A BAA is the HIPAA contract for a company that handles patient data. Stedi does not name the role that must sign.
Are there public documents? Yes. 192 docs pages, 66 endpoint reference pages, and OpenAPI files on GitHub.
Which routes exist? JSON APIs, raw X12 APIs, a SOAP endpoint for eligibility, SFTP for claims, event destinations and legacy webhooks, the portal, an MCP server for AI agents, two SDKs and OAuth apps.
What does it cost? Pay as you go, with no monthly minimum. An eligibility check costs $0.30 down to $0.08 and a claim $0.30 down to $0.10, by monthly volume, as published on Nov 14, 2026.
How long does it take? Stedi says sign-up takes less than two minutes. Most transaction enrollments finish in 24 to 48 hours, and some payers take up to 30 days.
What is the biggest limit? Stedi's documents show no 278 prior authorization endpoint. Enrolling a provider for remittances through Stedi stops them at the previous clearinghouse.

What can you build with the Stedi API?

You can build twelve things on Stedi today, from a real-time eligibility check to a full claim cycle with remittances. Each use case below is one documented capability, and each points to a row in the read and write table in section 6.

Twelve use cases for the Stedi API. Build complexity is our own rating. Open a use case below for the detail.

Build complexity is our own rating, and this guide gives no build estimate.

1. Check eligibility in real time in an intake or scheduling flow

low to medium
  • Who it is for: EHR, practice management, telehealth and patient intake software companies.
  • The value: staff see whether coverage is active, and what the patient owes, while the patient books or checks in.
  • Build complexity: low to medium.
  • How well it works: well, with speed set by the payer. An eligibility check is the X12 270 request and its 271 response. Stedi names in-person visits and telehealth appointments as the fit for real-time checks. Most checks complete in 1 to 2 seconds, and the slowest can take up to a minute. A payer search endpoint lets patients pick their insurer in an intake form. A response that shows active coverage is not a guarantee of payment. See row P1 and P21.

2. Refresh eligibility in batches before visits

medium
  • Who it is for: practices, billing companies and revenue cycle platforms that hold a schedule or a patient list.
  • The value: coverage is checked again for every patient before the visit, without staff running checks one by one.
  • Build complexity: medium.
  • How well it works: well, as a background job. One request holds up to 10,000 checks. Most batches complete in 15 to 30 minutes. Batch checks do not count toward the concurrency limit for real-time checks. Stedi names monthly or weekly coverage refreshes as a use for batch checks. Test mode does not support batch checks. See row P5.

3. Find insurance for a patient with no card

low to medium
  • Who it is for: urgent care and hospital registration teams, and companies that recover revenue on self-pay accounts.
  • The value: active coverage is found from the patient's name and date of birth when the payer is unknown.
  • Build complexity: low to medium.
  • How well it works: as a backup, and never as the first step. Stedi's example is a patient in an urgent care situation who has no insurance card. Stedi recommends insurance discovery when an eligibility check fails or is not possible, and tells customers not to rely on it as the primary method. It needs an NPI, the national ID number of a US provider, so it cannot run for providers that have none. It can request only general medical coverage or general dental coverage. False positives are possible, so you match results to your own records. Stedi also names revenue recovery as a use for discovery checks. See row P7.

4. Check coordination of benefits before billing

low
  • Who it is for: billing teams and revenue cycle platforms that bill patients with more than one health plan.
  • The value: the claim goes to the plan that pays first.
  • Build complexity: low.
  • How well it works: for supported payers only, and not for Medicare. Coordination of benefits (COB) is the set of rules for which plan pays first. Stedi recommends a COB check for every new patient covered by a supported payer. COB checks do not support Medicare plans. Results can be partial or negative and can miss some of a patient's plans. See row P8.

5. Look up a Medicare MBI

low to medium
  • Who it is for: providers and platforms that serve patients aged 65 or older.
  • The value: the patient's Medicare Beneficiary Identifier (MBI), which is the Medicare ID, is found when the patient does not know it.
  • Build complexity: low to medium.
  • How well it works: well, after enrollment. An MBI lookup is an eligibility check sent to a special payer ID, with or without a Social Security Number. It always needs transaction enrollment. Stedi calls it a targeted alternative to insurance discovery for patients who are likely covered by Medicare. See row P9.

6. Submit professional, institutional and dental claims

high
  • Who it is for: EHR, practice management and billing software companies, and billing services.
  • The value: claims go from your product to the payer with no separate clearinghouse screen.
  • Build complexity: high.
  • How well it works: well, once you pick the endpoint. A claim is the X12 837 transaction: 837P for professional, 837I for institutional and 837D for dental claims. Stedi documents JSON and raw X12 endpoints for all three. The new professional endpoint lets you build a CMS-1500 form in your own application. It does not send secondary or tertiary claims, which need the legacy JSON endpoint or the raw X12 endpoint. A validation endpoint finds errors before a claim is sent. A claim that fails Stedi's checks is not sent to the payer. See row P10, P11, P12 and P13.

7. Track claim status

medium
  • Who it is for: billing companies and revenue cycle platforms that follow up on unpaid claims.
  • The value: staff see where each claim stands without calling the payer.
  • Build complexity: medium.
  • How well it works: in two ways, with different reach. The claim record endpoints return a claim's current status and its history of submissions, acknowledgments and payments. Stedi names a claims dashboard as a use for the claim list. A real-time claim status check, the X12 276 request and 277 response, asks the payer directly. It works only for claims the payer has received and accepted into its system. Payers generally let a provider organization check only the claims it submitted. See row P16 and P19.

8. Handle 277CA claim acknowledgments

medium
  • Who it is for: every team that submits claims through Stedi.
  • The value: a rejected claim is caught and fixed early, before anyone waits for a payment that will never come.
  • Build complexity: medium.
  • How well it works: well, and at no charge. A 277CA is the acknowledgment that says whether a claim was accepted or rejected. The first one comes from Stedi within about 30 minutes of submission. You can receive several for one claim. No enrollment is needed to receive them. Stedi lists them as free. See row P17, P20 and P25.

9. Take in 835 ERAs and post payments

high
  • Who it is for: practice management and billing software companies, and revenue cycle platforms.
  • The value: payments and adjustments post to the patient account without keying from paper.
  • Build complexity: high.
  • How well it works: well once enrollment is live, and enrollment is the gate. An 835 ERA (Electronic Remittance Advice) is the payer's statement of what it paid on each claim. Enrollment is always needed for ERAs. ERA enrollment is exclusive to one clearinghouse. A rejected claim never produces an ERA. Duplicate ERAs happen, and the check or EFT trace number identifies one. An ERA is also available as a PDF for staff to read. See row P18 and P23.

10. Send claim attachments

medium
  • Who it is for: dental, surgical and specialty billing software companies.
  • The value: supporting documents travel with the claim.
  • Build complexity: medium.
  • How well it works: for unsolicited attachments only, and only to payers that support them. Stedi's examples are X-rays for a dental crown and an operative report for a surgery. Only unsolicited attachments can go through the APIs and SFTP. Stedi blocks an attachment sent to a payer that does not support them. Support for dental attachments is limited to a subset of dental payers. See row P14.

11. Search payers and automate transaction enrollment

medium
  • Who it is for: platforms that onboard many providers, such as EHR vendors and billing companies.
  • The value: providers are enrolled with payers from your own onboarding flow, and staff see the status of each request.
  • Build complexity: medium.
  • How well it works: well, and both APIs are free. The payer record states the enrollment process for each transaction type. Stedi publishes the expected enrollment time for each payer and transaction type. For one-click payers, the request is all that is needed. Where a payer needs the provider to act, the enrollment waits until the task is done. Stedi cannot cancel an enrollment that is provisioning or live. Stedi points to batch enrollments for onboarding a provider group. See row P21, P22, P23 and P24.

12. Give an AI agent eligibility checks through the MCP server

low
  • Who it is for: companies that build voice agents and revenue cycle workflow agents.
  • The value: an agent verifies benefits in seconds in place of a phone call to the payer.
  • Build complexity: low.
  • How well it works: for one check at a time. MCP (Model Context Protocol) is a standard way for an AI agent to call an outside tool. Stedi's MCP server gives agents tools to perform and troubleshoot eligibility checks. Stedi's example is a voice agent that verifies benefits during a call. It is not intended for bulk checks or for interpreting the benefits in a response. It is available only for production accounts. Stedi says a third-party AI tool used with the server likely needs its own BAA with your organization. See row P28 and P21.

The Stedi use cases compared

Use case Who it is for Build complexity (our rating) Row in the read and write table
1. Check eligibility in real time in an intake or scheduling flow EHR, practice management, telehealth and intake software Low to medium P1, P21
2. Refresh eligibility in batches before visits Practices, billing companies and revenue cycle platforms Medium P5
3. Find insurance for a patient with no card Registration teams and revenue recovery companies Low to medium P7
4. Check coordination of benefits before billing Billing teams and revenue cycle platforms Low P8
5. Look up a Medicare MBI Providers and platforms serving patients 65 or older Low to medium P9
6. Submit professional, institutional and dental claims EHR, practice management and billing software, billing services High P10, P11, P12, P13
7. Track claim status Billing companies and revenue cycle platforms Medium P16, P19
8. Handle 277CA claim acknowledgments Every team that submits claims Medium P17, P20, P25
9. Take in 835 ERAs and post payments Practice management and billing software, revenue cycle platforms High P18, P23
10. Send claim attachments Dental, surgical and specialty billing software Medium P14
11. Search payers and automate transaction enrollment Platforms that onboard many providers Medium P21, P22, P23, P24
12. Give an AI agent eligibility checks through the MCP server Voice agent and workflow agent companies Low P28, P21

Stedi's documents name more builds on the same endpoints. An eligibility response gives patient responsibility amounts, such as copays and deductibles. It also shows whether prior authorization is required for specific services. A stored claim can pre-fill a resubmission form. A billing agency can check the status of a claim that its provider customer submitted. Claims can go to secondary or tertiary payers, to payers that take only paper, and for atypical providers that have no NPI. An existing system that generates X12 files can connect over SFTP with no API integration. A revenue cycle workflow agent can validate coverage before scheduling or before a claim. For health systems, Stedi says it finds coverage for up to 60% of self-pay accounts from demographic data.

How do you get access to the Stedi API?

You sign up yourself on the Stedi portal and start with a free sandbox account. Production access is an upgrade inside the portal, where you set up multi-factor authentication and agree to a BAA.

The steps, in order

  1. Sign up. The sign-up has three parts: a form, email confirmation and a company name. Stedi says it takes less than two minutes, needs no credit card and gives test API keys right away.
  2. Build in the sandbox. A new account is a free sandbox account, limited to test mode. You build and test an eligibility integration with test API keys.
  3. Upgrade to production. Click Upgrade account in the portal and follow the upgrade flow.
  4. Set up MFA and accept the BAA. The upgrade makes you set up multi-factor authentication (MFA) and agree to a BAA. Once MFA is enabled for an account, it cannot be disabled.
  5. Fund the account. On the pay-as-you-go plan you add a credit card and fund a starting balance of at least $25.
  6. Create API keys. There are two types, test and production. Stedi shows a key once, at creation. A production key inherits the permissions of the member who created it and keeps them if that member's role changes. Keys do not expire automatically.
  7. Enroll providers where the payer requires it. For 835 ERAs enrollment is always required. For other transactions it depends on the payer.

The BAA and who signs

The BAA is accepted through Stedi's online enrollment process or through an order form that references it. Stedi's service terms are accepted the same way. The pricing page lists a signed BAA as part of the pay-as-you-go plan. The Trust Center gives a second route, a request through the contact form. The current BAA is public and carries an effective date of Apr 14, 2025.

Stedi does not name a job title for the signer on the customer side. Decide inside your company who has the authority to accept a BAA before someone clicks through the upgrade.

Authority to sign payer forms

By submitting an enrollment request, the customer grants Stedi limited authority to complete, sign and submit payer enrollment forms. The customer can revoke that authority by written notice, and the revocation applies to the future only.

The Medicare attestation for each NPI

Medicare eligibility checks need one more step. Each provider completes an attestation with CMS, the federal agency that runs Medicare. Stedi cannot complete it for the provider, there is no bulk attestation across NPIs, and it takes about 5 to 15 minutes per NPI. After attestation the provider can send checks immediately, even if the enrollment status is not yet Live. Without it, CMS rejects the check with AAA error 41.

The US-only IP rule for Medicare checks

Stedi blocks eligibility requests to CMS when any IP address in the chain is outside the United States. That covers the originating address and every address in the X-Forwarded-For header. This matters for any team or server outside the United States.

A platform that calls Stedi on behalf of providers must collect the IP addresses of upstream requests and pass them in the X-Forwarded-For header.

Platforms: OAuth apps and integrated accounts

A software vendor can give each provider or practice its own Stedi account, with its own credentials. Stedi's example is an EHR that builds eligibility checks and claim submission into its own screens. The vendor's app connects to each account with the OAuth 2.1 authorization code flow and PKCE. OAuth is a standard way for an app to get a token to act in someone's account. New apps must use OAuth.

An app starts in development mode, unlisted, with at most 5 active installs. To lift the limit you submit the app for review, and after Stedi approves it you switch it to live mode. Customers can install an app only in a new Stedi account. Stedi does not publish the review criteria or how long the review takes.

The custom plan

Volume discounts, single sign-on, directory sync and consolidated billing sit on a custom plan, which you request by contacting Stedi.

What Stedi does not do

Stedi does not handle credentialing or payer enrollment, which providers complete directly with each payer or through a credentialing service. Transaction enrollment, which Stedi does handle, registers a provider to exchange specific transaction types with a payer.

Ask Stedi:

  • Who on our side must accept the BAA and the service terms, and can we sign by order form?
  • What are the review criteria for an OAuth app, and how long does review take?
  • Which of our providers need the CMS attestation before go-live?

What does Stedi API access give you?

A sandbox account gives you test mode, mock eligibility checks, the portal and test API keys. A production account processes real transactions with payers and keeps test mode available.

What opens at each stage

Stage What Stedi documents
Sandbox account Free, and limited to test mode. Mock eligibility checks with test API keys. No test claims through the API or SFTP.
Production account Unlimited real transactions with payers. Unlimited user seats and providers. The Transaction Enrollment API. The MCP server for AI agents.
Custom plan Volume discounts, SSO, SCIM and consolidated billing, on request.

Test mode

Test mode is a separate test environment inside the account. It holds no patient data and sends nothing to payers. Stedi decides whether a request is test or production from the type of API key.

Eligibility testing uses mock requests. These are predefined requests for well-known payers, and the page names Aetna, Cigna, UnitedHealthcare and CMS. They work with the JSON, raw X12 and SOAP endpoints. You cannot supply your own mock data or choose the payer.

Event destinations created in test mode receive only test events. Test transactions are free. Stedi applies fair use limits to test volume and can reject, throttle or disable traffic above them. The limits are not published.

Test claims

Test claims need a production account. Two workflows exist:

  • Any payer, acknowledgment only. You submit a test claim to any payer and receive a test 277CA from Stedi.
  • Stedi Test Payer, full cycle. Only test claims sent to the Stedi Test Payer generate a test 835 ERA. The provider must first be enrolled with the Stedi Test Payer, and that enrollment is made in production, not with a test key. Stedi sets it to Live within one minute. A prefix on the member ID, such as STEDI_DENIED_, selects the outcome.

New accounts can no longer mark a claim as a test inside production. They submit test claims with a test API key, test SFTP credentials or test mode in the portal.

People and roles

Admins assign account members to one of five roles. The portal requires every user to sign in again every 12 hours.

Support

Support requests go by email to support@stedi.com, and Stedi sets up a dedicated Slack or Teams channel on request. The pricing page lists support as free.

What are the ways to integrate with Stedi?

Stedi offers JSON APIs, raw X12 APIs, a SOAP endpoint, SFTP, events, the portal, an MCP server, SDKs and OAuth apps. Every REST call carries the API key in the Authorization header.

The "Fits when" column below is our reading.

Route What Stedi documents Fits when
JSON APIs Stedi accepts JSON and converts it to X12 behind the scenes. You are building new and have no X12 in house.
Raw X12 APIs For an existing system that generates X12 files. Stedi offers raw X12 endpoints for eligibility, claim status, the three claim types and attachments. Your system already writes X12 and you want one HTTPS call per transaction.
SOAP endpoint Real-time eligibility over SOAP with the CAQH CORE XML schema. Sign-in details go inside the XML, not in a header. A partner or rule requires CAQH CORE connectivity.
SFTP SFTP is a secure way to move files. Stedi's server takes 837 claims and unsolicited 275 claim attachments and returns responses as files. The host is transfer.us.stedi.com on port 22. Responses arrive in the from-stedi directory. A billing system exports claim files on a schedule and you want no API build.
Event destinations A webhook is a call that a service makes to your server when something changes. Event destinations are Stedi's current form of it. Events are thin: they carry no resource data, so you call the API for it. You want to be told when a 277CA, an 835 or an enrollment change arrives.
Webhooks (legacy) A legacy feature that Stedi continues to support. You already run on them.
Polling The alternative to events for finding new 277CAs and 835 ERAs. You cannot expose a public endpoint.
Stedi portal Requests can be submitted by hand through the portal. Staff need to run a check, fix a claim or manage enrollments without your product.
MCP server Tools that AI agents use to perform and troubleshoot eligibility checks. It accepts an API key or OAuth. You run an AI agent that needs single checks.
SDKs Official SDKs for TypeScript and Python. The SDK page lists the APIs they support, and the list does not cover every endpoint. You build in one of the two languages and use the newer endpoints.
OpenAPI files Downloadable OpenAPI specifications. You generate your own client.
OAuth apps An app gets its own token in each customer's Stedi account. You are a platform and each practice needs its own Stedi account.
Paper claims A claim sent electronically with the receiver ID set to PAPER is printed and mailed by Stedi. The payer accepts only paper.

Three notes on the table.

The event types cover transaction enrollment, file processing and OAuth apps. To learn about new 277CAs and 835 ERAs, a destination subscribes to the transaction.processed event type.

For a firewall allow list, Stedi publishes two static IP addresses for its SFTP server.

Every docs page is also offered in a form made for AI coding tools.

Want a second opinion on the route before you build? See our payer and clearinghouse integration service.

What can you read and write with the Stedi API?

The API reference documents 66 endpoints. Rows P1 to P25 below list every one with its method and path, and rows P26 to P28 cover functions that run through other routes.

Base addresses

Each path below sits under a base address with a dated version.

Base address Used by
https://healthcare.us.stedi.com/2026-06-01 The redesigned JSON eligibility endpoint.
https://healthcare.us.stedi.com/2024-04-01 Legacy and raw X12 eligibility, insurance discovery, COB, legacy professional claims, institutional and dental claims, claim status, reports and PDFs.
https://healthcare.us.stedi.com/2025-06-01 The SOAP eligibility endpoint.
https://claims.us.stedi.com/2025-03-07 CMS-1500 professional claims, claim attachments and claim records.
https://manager.us.stedi.com/2024-04-01 Batch eligibility and the eligibility PDF.
https://core.us.stedi.com/2023-08-01 Transactions and file executions.
https://payers.us.stedi.com/2024-04-01 Payers.
https://enrollments.us.stedi.com/2024-09-01 Providers, enrollments, tasks and documents.
https://events.us.stedi.com/2026-02-01 Event destinations and events.

Which endpoints are new and which are legacy

Three groups of endpoints were announced on Sep 9, 2026: the redesigned JSON eligibility endpoint (row P1), the CMS-1500 professional claim endpoints (row P10) and the claim record endpoints (row P19). Stedi labels two endpoints "Legacy": the older JSON eligibility endpoint (row P2) and the older 837P JSON claim endpoint (the first path in row P11). Every other endpoint carries no such label.

The column "X12 transaction (our mapping)" is our reading of each reference page. Stedi does not print that column itself.

Row Function Method and path X12 transaction (our mapping) Read or write Evidence
P1 Real-time eligibility check, JSON (redesigned, Sep 9, 2026) POST /eligibility-check 270 request, 271 response Write a request, read the answer A real-time 270/271 check in JSON.
P2 Real-time eligibility check, JSON (legacy) POST /change/medicalnetwork/eligibility/v3 270 request, 271 response Write a request, read the answer Stedi recommends the new endpoint for new integrations.
P3 Real-time eligibility check, raw X12 POST /change/medicalnetwork/eligibility/v3/raw-x12 270 request, 271 response Write a request, read the answer A real-time check in raw X12.
P4 Real-time eligibility check, SOAP POST /protocols/caqh-core 270 and 271 inside a CAQH CORE envelope Write a request, read the answer SOAP with the CAQH CORE vC2.2.0 XML schema.
P5 Batch eligibility checks POST /eligibility-manager/batch-eligibility, GET /eligibility-manager/batch/{batchId}, GET /eligibility-manager/batch/{batchId}/items and GET /eligibility-manager/polling/batch-eligibility 270 in, 271 results Write and read Submit many checks for Stedi to process asynchronously. Read the batch status. Read the status of every check in the batch. Retrieve the results.
P6 Eligibility response as a PDF GET /eligibility-manager/eligibility-checks/{eligibilityCheckId}/pdf 271 as a PDF Read A PDF version of the 271 benefits response.
P7 Insurance discovery POST /insurance-discovery/check/v1 and GET /insurance-discovery/check/v1/{discoveryId} No single transaction Write a request, read the answer Submit a discovery check in JSON. Retrieve the results by discoveryId.
P8 Coordination of benefits check POST /coordination-of-benefits COB check Write a request, read the answer Submit a COB check in JSON.
P9 Medicare MBI lookup The eligibility endpoints, with the payer ID set to MBILU (with a Social Security Number) or MBILUNOSSN (without) 270 request, 271 response Write a request, read the answer Runs with and without a Social Security Number.
P10 Professional claim, CMS-1500 JSON (new, Sep 9, 2026) POST /professional-claim-submissions, POST /professional-claim-submissions/validate and GET /professional-claim-submissions/{id} 837P Write and read Submit a professional claim in JSON modeled on the CMS-1500 form. Validate a claim without submitting it. Retrieve a claim's data in the CMS-1500 JSON format.
P11 Professional claim, 837P JSON (legacy) and raw X12 POST /change/medicalnetwork/professionalclaims/v3/submission and POST /change/medicalnetwork/professionalclaims/v3/raw-x12-submission 837P Write Submit an 837P claim in JSON. Submit one in raw X12.
P12 Institutional claim, JSON and raw X12 POST /change/medicalnetwork/institutionalclaims/v1/submission and POST /change/medicalnetwork/institutionalclaims/v1/raw-x12-submission 837I Write Submit an 837I claim in JSON. Submit one in raw X12.
P13 Dental claim, JSON and raw X12 POST /dental-claims/submission and POST /dental-claims/raw-x12-submission 837D Write Submit an 837D claim in JSON. Submit one in raw X12.
P14 Claim attachments POST /claim-attachments/file and POST /claim-attachments/raw-x12-submission 275 Write Generate a pre-signed URL to upload an attachment file. Submit a 275 attachment in X12.
P15 CMS-1500 claim form as a PDF GET /export/{transactionId}/1500/pdf and GET /export/pdf 837P as a PDF Read By transaction ID. By business identifier.
P16 Real-time claim status, JSON and raw X12 POST /change/medicalnetwork/claimstatus/v2 and POST /change/medicalnetwork/claimstatus/v2/raw-x12 276 request, 277 response Write a request, read the answer A real-time 276/277 check in JSON. The same in raw X12.
P17 277CA claim acknowledgment GET /change/medicalnetwork/reports/v2/{transactionId}/277 277CA Read Retrieve a 277CA in JSON.
P18 835 ERA, as JSON and as a PDF GET /change/medicalnetwork/reports/v2/{transactionId}/835 and GET /electronic-remittance-advice/{transactionId}/pdf 835 Read Retrieve an 835 ERA in JSON. Retrieve the generated PDF.
P19 Claim records (new, Sep 9, 2026) GET /claims, GET /claims/{id} and GET /claims/{id}/timeline None. Records built from the 837, 277CA and 835 Read A paginated list of claim records. Summary and current status for one claim. The claim's timeline of submissions, acknowledgments and payments.
P20 Transactions and their documents GET /polling/transactions, GET /transactions, GET /transactions/{transactionId}, GET /transactions/{transactionId}/input, GET /transactions/{transactionId}/output and GET /executions/{executionId}/input Any processed transaction Read Poll for new transactions. List transactions. Fetch one. Its input document. Its output document. A file execution's input before translation.
P21 Payers GET /payers, GET /payers/csv, GET /payers/search and GET /payer/{stediId} None Read The supported payers in JSON. The same in CSV. Search by name, ID or alias. One payer record by its Stedi payer ID.
P22 Provider records for enrollment POST /providers, GET /providers, GET /providers/{providerId}, POST /providers/{providerId} and DELETE /providers/{providerId} None Read and write Create. List. Retrieve. Update, except NPI and tax ID. Delete, only with no enrollments attached.
P23 Transaction enrollments POST /enrollments, GET /enrollments, GET /enrollments/{enrollmentId}, POST /enrollments/{enrollmentId} and DELETE /enrollments/{enrollmentId} None Read and write Create. List. Retrieve. Update, in DRAFT status only. Delete, in DRAFT status only.
P24 Enrollment tasks and documents POST /tasks/{taskId}, POST /enrollments/{enrollmentId}/documents, GET /documents/{documentId}/download and DELETE /documents/{documentId} None Read and write Update a task on an enrollment. Get a pre-signed URL to upload a PDF. Get one to download a document. Delete a document.
P25 Event destinations and events POST /destinations, GET /destinations, GET /destinations/{destinationId}, POST /destinations/{destinationId}, DELETE /destinations/{destinationId}, GET /destinations/{destinationId}/secret, POST /destinations/{destinationId}/secret/rotate, GET /events and GET /events/{eventId} None Read and write Create a destination and receive a signing secret. List. Retrieve. Update. Delete. Read the signing secret. Rotate it. List events. Retrieve one event.
P26 Paper claims The claim endpoints, with the receiver ID set to PAPER 837 printed and mailed Write PAPER tells Stedi to print and mail the claim.
P27 SFTP file exchange Files placed on transfer.us.stedi.com 837 and 275 in, responses out Write and read Submit 837 claims and unsolicited 275 attachments, and retrieve responses.
P28 MCP server for AI agents https://mcp.us.stedi.com/2025-07-11/mcp 270 request, 271 response Write a request, read the answer Tools to perform and troubleshoot eligibility checks. The address is in the configuration example.

Functions with no endpoint of their own

Four functions run through the endpoints above.

  • Secondary and tertiary claims use the legacy 837P JSON endpoint or the 837P raw X12 endpoint.
  • Resubmitting or canceling a claim uses the claim endpoints with a claim frequency code that tells the payer the claim is an original, a replacement or a cancellation.
  • Dental insurance discovery is the discovery endpoint with service type code 35.
  • Enrollment requirements for each payer are fields on the payer record.

One reference page has no endpoint. It lists the mock requests for eligibility testing.

What is not possible with the Stedi API?

Stedi's documents show no 278 prior authorization endpoint. They also state limits on the new claim endpoint, on test mode and on ERA enrollment, and each one is listed below with its source.

No 278 prior authorization endpoint

The X12 278 is the transaction that requests a prior authorization from a payer. None of the 66 documented endpoints is for a 278. A keyword search of the 192 docs pages found one mention: the provider-facing test mode page lists "278 prior authorization" among the features that test mode does not support. No page says how to send a 278, and whether Stedi supports it at all is not answered in its public pages.

What the documents do offer is reading the benefit entries in an eligibility response to see whether prior authorization or a referral is required.

What the new CMS-1500 claim endpoint cannot do

  • No secondary or tertiary claims. The Create Professional Claim JSON endpoint does not support coordination of benefits.
  • No legacy webhooks and no PDF download by API. Stedi lists the endpoint as not compatible with legacy webhooks, programmatic PDF download, or secondary and tertiary claims.
  • A shorter insurance type list. The endpoint uses a simplified subset of the X12 values.

Test mode gaps

  • Test mode does not support transaction enrollment, Agentic Discovery, batch eligibility checks, insurance discovery, COB checks, real-time claim status, or custom mock data.
  • Sandbox accounts cannot submit test claims through the API or SFTP.
  • Real-time claim status checks run only for production claims that have entered the payer's system.
  • Paper claims can be submitted in test mode, but Stedi does not generate the test acknowledgment that says a claim was mailed.
  • Enrollment with the Stedi Test Payer cannot be submitted with a test API key or in test mode.
  • Stedi warns against sending test checks for fake patients to live payers. Some payers, CMS in particular, prohibit it and can block access.

ERA enrollment is exclusive

ERA enrollment is exclusive to one clearinghouse. Switching a provider to Stedi stops ERA delivery through the previous clearinghouse. Stedi cannot cancel an enrollment that is in PROVISIONING or LIVE status.

Three more rules shape a migration. You can send claims through Stedi without enrolling for ERAs, and the ERAs keep going to your current clearinghouse. A few payers require the claim to go through the same clearinghouse as the ERA enrollment. Some payers enroll by tax ID, so enrolling one NPI moves every NPI under that tax ID to Stedi. Stedi says payers do not always disclose how they scope enrollment. For a staged move, Stedi describes routing rules that send your top 10 to 20 payers to Stedi and keep the rest on the existing clearinghouse.

What else the documents rule out

  • No solicited attachments. Only unsolicited claim attachments go through the APIs and SFTP. Stedi does not say whether a payer's request for more documents reaches the customer through Stedi.
  • No attachments to payers that do not support them. Stedi blocks the submission before it reaches the payer.
  • No COB check for Medicare plans.
  • No payer order from insurance discovery. Discovery cannot determine which payer is primary.
  • No status for claims the payer has not accepted. Payers often archive claims older than 18 months.
  • No bulk checks through the MCP server. Its OAuth sign-in supports email and password only, not single sign-on.
  • No procedure code in a CSV batch upload. CSV uploads support fewer properties than the batch API.
  • No dependents for most Medicaid plans.
  • No edits to a submitted enrollment. Only enrollments in DRAFT status can be updated.
  • No change of NPI or tax ID on a provider record.
  • No OAuth app install into an existing Stedi account.
  • No attachment format other than PDF on paper claims.
  • No transaction a payer does not support. Some payers in the network do not support a given transaction type, and Stedi then returns an error.
  • No transaction type other than claims and attachments over SFTP.
  • No credentialing. Providers complete credentialing and payer enrollment with each payer.

Workers' compensation, auto and liability claims have a price on the pricing page. How to send them is not explained in Stedi's public pages.

The usual workarounds

  • Prior authorization. Read whether it is required from the eligibility response. Submitting the request needs a route outside the documented API.
  • Secondary claims. Build the legacy 837P JSON mapping or the raw X12 path beside the CMS-1500 endpoint.
  • Moving without losing ERAs. Start claims at Stedi and leave ERAs where they are, payer by payer.
  • A full test cycle. Send test claims to the Stedi Test Payer to get a test 835.
  • A payer that takes only paper. Set the receiver ID to PAPER and Stedi prints and mails the claim.
  • An unknown member or payer. Run insurance discovery as the backup.
  • A duplicate or wrong claim. Cancel it with a cancellation claim.

What are the Stedi API limits?

Stedi publishes rate limits for two endpoint groups and concurrency limits for the real-time endpoints. A request over either kind of limit is rejected with HTTP 429.

Concurrency means the number of requests in flight at the same moment.

Published numbers

Eight published Stedi API limits. A request over a limit is rejected with HTTP 429.
Limit Published value
Rate limit, claims processing endpoints 100 requests per second, as one shared pool
Rate limit, enrollment endpoints 100 requests per second, as one shared pool
Concurrency, real-time eligibility and claim status together 50 concurrent requests per account by default
Concurrency, claim submission and attachment endpoints together 100 concurrent requests
Concurrency, coordination of benefits 50
Concurrency, insurance discovery 5 for the check and 5 for the results endpoint
Raising a concurrency limit By request to Stedi support
Real-time eligibility hold Stedi holds the request open for up to 120 seconds and retries the payer in that time
Payer response time for eligibility Payers can take up to 60 seconds
Typical eligibility response time Most in 1 to 2 seconds, nine out of ten within 9 seconds
Claim status timeout Requests to payers typically time out at 1 minute
Batch eligibility size Up to 10,000 checks per batch, with no cap on the number of batches
Batch retry window on payer downtime 8 hours by default, up to 24
Batch results page 1 to 200 results per page. At most 6 MB per page.
Insurance discovery response Up to 120 seconds
Insurance discovery results kept 30 days
Attachment size, raw X12 API 6 MB per request
Attachment size, JSON upload or SFTP Stedi recommends 64 MB at most per file
Uploaded attachment file kept 45 days
SFTP claim file Up to 1,000 claims in one 837 transaction
Event destinations 16 per account
Event history 30 days by default
Event delivery retries Retries run for up to 48 hours. After all of them fail, Stedi temporarily disables the destination.
Legacy webhook error queue 14 days
Idempotency key memory 24 hours
Claim list page 100 records by default, 500 at most
Transaction polling Transactions from the last fifteen seconds are excluded
Download link for a raw X12 response 60 minutes
Enrollment documents PDF, 20 MB or less
ERA enrollment start date Today or up to 6 months ahead
Eligibility service dates Stedi recommends up to 12 months back or up to the end of the current month
Claim status date range 30 days or less
Portal claim exports Available for 30 days
OAuth app access token 15 minutes
MCP session signed in by OAuth 30 days
Cached payer list Stedi recommends a refresh at least once a day

Retry rules for AAA 42 and 80

A payer rejects an eligibility check with an AAA error that carries a code and a follow-up action. Before a retry, check the follow-up action.

Case What Stedi documents
AAA 42 (unable to respond), 42 with 79, and 80 (no response) Retry automatically.
AAA 42 with follow-up action C, N or S Do not retry. The request has a problem, so contact Stedi support.
AAA 79 alone Do not retry automatically.
A person is waiting Retry immediately and keep retrying for up to 2 minutes.
Background checks Retry for at least 8 hours.
AAA 42 with HTTP 429 Stedi rejected the request before processing, typically for exceeding the allowed concurrent requests.

Three design points follow. Canceling and resending before Stedi's own retry period ends can create several live requests and use more of the concurrency limit. For a slow payer, Stedi describes request hedging: send a second request at a cutoff such as 30 seconds, without canceling the first. Batch checks do not count toward the real-time concurrency limit.

What Stedi does not publish about limits

  • A per-second rate limit for eligibility, claim status, payers or events. The rate limit table has only the claims and enrollment groups.
  • Payload size limits for a claim request or a batch request. A large 835 ERA can exceed the response size limit and return HTTP 413, and the page gives no number.
  • How long eligibility checks, claims, acknowledgments and remittances stay retrievable. The Trust Center lists a data retention control by name only.
  • The fair use limits in test mode.

Ask Stedi:

  • What is the rate limit on the eligibility, claim status and payer endpoints?
  • What is the largest request body and the largest 835 response you return?
  • How long can we retrieve a claim, a 277CA and an 835 by API?
  • What are the fair use limits on test traffic?

How much does the Stedi API cost?

Stedi publishes per-transaction prices with no monthly minimum, no per-provider fee and no per-payer fee. All prices below are the pay-as-you-go rates as published on Nov 14, 2026.

Tiers are by monthly volume, and each unit is billed at the price of the tier it falls into.

Tiered prices

Stedi's pay-as-you-go prices by monthly volume, as published on November 14, 2026.
Transaction Tier 1 Tier 2 Tier 3 Tier 4
Eligibility check, real-time or batch $0.30 for 1 to 250 $0.15 for 251 to 3,500 $0.10 for 3,501 to 10,000 $0.08 above 10,000
Real-time claim status check $0.30 for 1 to 250 $0.15 for 251 to 3,500 $0.10 for 3,501 to 10,000 $0.08 above 10,000
Claim submission, 837P, 837I and 837D $0.30 for 1 to 500 $0.20 for 501 to 2,500 $0.12 for 2,501 to 10,000 $0.10 above 10,000
835 ERA, per adjudicated claim $0.20 for 1 to 500 $0.15 for 501 to 2,500 $0.10 for 2,501 to 10,000 $0.08 above 10,000
Insurance discovery $1.50 for 1 to 100 $1 for 101 to 750 $0.75 for 751 to 1,250 $0.65 above 1,250
MBI lookup $1 for 1 to 100 $0.75 for 101 to 750 $0.50 for 751 to 1,250 $0.40 above 1,250
Coordination of benefits check $1 for 1 to 100 $0.75 for 101 to 750 $0.50 for 751 to 1,250 $0.40 above 1,250
Agentic Discovery, an AI agent that looks for coverage $1 for 1 to 100 $0.75 for 101 to 750 $0.65 for 751 to 1,250 $0.55 above 1,250

Flat prices

Item Price
Electronic claim attachment (275) $0.75 each
Workers' compensation, auto and liability claim $0.30 each
CMS-1500 claim validation $0.05 each
Eligibility PDF, CMS-1500 PDF, ERA PDF $0.05 each
Paper claim (CMS-1500, UB-04, ADA dental) $1 for the first page and $0.20 for each further page
Paper claim attachment $0.20 a page
Member ID card payer lookup $0.20 each
Lockbox $49 per lockbox a month, $2 per mail item, $1 per check deposited
Treasury payment processing No published price

What is free

  • 277CA claim acknowledgments.
  • The Transaction Enrollment API and the Payers API.
  • The MCP server, test mode and support.
  • Test transactions.
  • A month with no transactions.

What is not billed

  • Eligibility. Checks that return AAA 42 or AAA 80 errors.
  • Claims and attachments. API calls that return 4xx or 5xx errors.
  • Claim status. Responses that hold only claim status codes 484, 494, 667 or 689.

A bulk SFTP file is billed per claim inside it. A batch eligibility check costs the same as the equal number of real-time checks.

How you pay

Pay-as-you-go is prepaid. You add a credit card and fund a starting balance of at least $25. An automatic recharge can be set, with a trigger balance of at least $10.

When the balance reaches $0, access is suspended immediately and no new transactions are processed. Treat a failed recharge as a production outage risk. After 30 consecutive days suspended, the account becomes eligible for closure.

Custom pricing

Stedi says that at $1,000 or more a month you pay less on a custom plan, which includes volume discounts. Custom prices are not published.

On order-form contracts, past due invoices carry interest of the lesser of 1.5% a month or the legal maximum. Order forms renew automatically unless either side gives notice at least 30 days before the term ends.

Before pay-as-you-go pricing, which Stedi announced on Jun 1, 2026, API and SFTP access needed a plan with a $500 monthly minimum. Older accounts stay on their plan unless they ask to switch. Treat any page that still quotes a monthly minimum as out of date.

What Stedi does not publish about cost

  • Custom plan prices and the size of the discount.
  • Which payers add their own fees, and how much. Stedi says a small number do, and that it bills those fees at cost.
  • Treasury payment processing fees.

Our clearinghouse API comparison also lists Stedi prices beside four other vendors. This guide carries the full dated table.

Ask Stedi:

  • What are the custom plan rates at our volume?
  • Which of our payers add a fee, and what is it?
  • What does Treasury payment processing cost?

How long does a Stedi API integration take?

The account takes minutes and enrollment takes days. Stedi says most transaction enrollments complete within 24 to 48 hours, and some payers take up to 30 days.

Published times

Step What Stedi states
Sign-up Less than two minutes, by Stedi's own figure.
Stedi Test Payer enrollment Live within one minute.
Transaction enrollment Most within 24 to 48 hours. Some payers take up to 30 days.
Enrollment time for one payer Published for each payer and transaction type in minutes, hours, days or weeks.
Automatic enrollment after a failed check Payers typically process these within 1 to 2 days.
CMS attestation About 5 to 15 minutes per NPI.
First 277CA Within about 30 minutes of submitting the claim.
SFTP rejection (999) Within minutes of the file submission.
Batch eligibility Most batches in 15 to 30 minutes.
Insurance discovery Usually between 3.5 and 13 seconds.
First claim status check Two waits on the same page. One line says at least 2 to 3 days after submission, or until a 277CA from the payer shows it has the claim. Another says at least a week after submission.
Chasing a missing ERA Check claim status at 21 days and again at 1 month.
Support reply An average under 10 minutes during business hours, by Stedi's own figure.

The per-payer enrollment times are estimates, based on Stedi's operational data and payer rules.

What holds enrollment up

  • Provider action. When a payer needs something from the provider, the enrollment waits in a provider-action status until the task is done.
  • Credentialing. A rejection usually means the provider is not credentialed with the payer. Stedi puts credentialing at 90 to 180 days and payer enrollment at 60 to 120 days after that. Both happen outside Stedi.
  • Drafts. Stedi does not process an enrollment until it is in STEDI_ACTION_REQUIRED status.
  • Status email timing. Stedi checks for enrollment status changes once an hour.

One-click enrollment removes the wait for provider action: Stedi handles the whole process after the request. Stedi says one-click ERA enrollment covers 1,500+ payers.

What Stedi does not publish about time

Stedi does not publish how long an OAuth app review, a custom plan negotiation or a concurrency limit increase takes. The support page gives no committed response time. Support hours are not defined in public.

Stedi's product pages say "Onboard in a day" and describe a working insurance verification app in under 30 minutes with its tutorial and a coding agent. Neither figure includes transaction enrollment.

Ask Stedi:

  • What is the expected enrollment time for each of our top payers, for ERAs and for eligibility?
  • Which of our payers need provider action, and what do they ask for?
  • How long does an OAuth app review take?

How do you build a Stedi API integration, step by step?

Stedi documents three build orders: an eligibility check, a claim from submission to remittance, and transaction enrollment. Each is below in the documented order, with Stedi's own sample requests.

(a) An eligibility check

The documented order for a real-time eligibility check on Stedi.
  1. Find the payer ID and check whether the payer needs enrollment. Use the Payer Network or the Payers API.
  2. Enroll if the payer requires it. Submit an enrollment request for real-time eligibility checks.
  3. Test with mock requests first. Stedi calls mock requests the best way to test real-time checks.
  4. Call the eligibility endpoint. Send POST /eligibility-check on https://healthcare.us.stedi.com/2026-06-01. Stedi lists the minimum information each request body must hold.
  5. Read the answer. Stedi recommends always starting with real-time checks when you integrate a new payer.
  6. Retry only on payer connectivity failures. Stedi strongly recommends automatic retries for every request that fails because of payer connectivity.
  7. Fall back to insurance discovery. Use it as a backup when a check fails or is not possible.

This is the sample request, copied from Stedi's eligibility guide.

curl --request POST \
  --url https://healthcare.us.stedi.com/2026-06-01/eligibility-check \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
      "payerId": "61101",
      "subscriber": {
        "dateOfBirth": "1975-05-05",
        "memberId": "HUMANA123",
        "name": {
          "person": {
            "firstName": "Jane",
            "lastName": "Doe"
          }
        }
      },
      "provider": {
        "name": {
          "organization": "Provider Name"
        },
        "npi": "1999999984"
      },
      "encounter": {
        "services": [
          {
            "value": "30",
            "system": "STC"
          }
        ]
      }
   }'

This is Stedi's shortest documented example of a response from the same endpoint, copied from its page on response shapes. It is not the answer to the request above: the payer ID differs, and Stedi prints the raw X12 value as three dots. The full sample response on the eligibility guide runs to 273 lines.

{
  "id": "ec_550e8400-e29b-41d4-a716-446655440000",
  "payerId": "87726",
  "payer": {
    "type": "PAYER",
    "name": { "organization": "HUMANA" }
  },
  "x12": "...",
  "subscriber": {
    "memberId": "123456789",
    "dates": {
      "plan": { "start": "2024-01-01" },
      "service": { "start": "2024-09-17" }
    }
  },
  "plans": [
    {
      "name": "Humana Gold Plan",
      "benefits": {
        "statuses": [
          {
            "status": "ACTIVE_COVERAGE",
            "coverageLevel": "EMPLOYEE_ONLY",
            "insuranceType": "PREFERRED_PROVIDER_ORGANIZATION_PPO",
            "network": { "indicator": "IN_AND_OUT_OF_NETWORK" },
            "service": {
              "system": "STC",
              "value": "30",
              "definition": "Health Benefit Plan Coverage"
            },
            "messages": ["Medicare PPO"]
          }
        ],
        "coPayment": [
          {
            "amount": "2000",
            "coverageLevel": "INDIVIDUAL",
            "insuranceType": "PREFERRED_PROVIDER_ORGANIZATION_PPO",
            "network": { "indicator": "IN_NETWORK" },
            "service": {
              "system": "STC",
              "value": "49",
              "definition": "Hospital - Room and Board"
            },
            "timePeriod": "ADMISSION",
            "messages": ["INPATIENT HOSPITAL ROOM AND BOARD"]
          }
        ]
      }
    }
  ]
}

Each check gets a Stedi ID in the form ec_ plus a UUID. The new JSON endpoint groups benefits under plans.

What to put in an eligibility request

  • Patient data. The API requires at least one of member ID, date of birth or last name. When you supply member ID, date of birth, first name and last name, the payer must return a response if the member is in its database. Some payers require the member ID, and Stedi returns a warning when you leave it out for one of them.
  • Provider name. A placeholder name in place of the provider's real name can make a payer return a limited set of benefits, or out-of-network benefits.
  • Service date. With no date, the payer uses the current date in its own time zone. Stedi recommends dates up to 12 months in the past or up to the end of the current month.
  • Names. Keep suffixes such as Jr. out of the first and last name properties.
  • Provider PIN. Three payers named on the troubleshooting page require the provider's Medi-Cal PIN in the request.

(b) A professional claim, from submission to 277CA to 835

Stedi lists the steps below as its example API implementation.

A professional claim on Stedi, from submission to the 277CA and the 835 ERA.
  1. Enroll the provider. Submit the required transaction enrollment requests through the Providers and Enrollments APIs.
  2. Set up event destinations. Listen for the events Stedi emits when it processes new 277CAs and 835 ERAs. Subscribe to the transaction.processed event type.
  3. Run a COB check. Stedi recommends one before submission so the claim goes to the correct payer.
  4. Submit the claim. Call POST /professional-claim-submissions on https://claims.us.stedi.com/2025-03-07, or the legacy 837P JSON endpoint. Include an idempotency key in the Idempotency-Key header. An idempotency key is a value that makes a repeated request safe, so a retry does not send a second claim.
  5. Fetch each 277CA. In the event, the transaction type tells a 277CA from an 835. Call GET /change/medicalnetwork/reports/v2/{transactionId}/277.
  6. Fix and resubmit a rejected claim. If the 277CA shows a rejection, correct the errors and submit again.
  7. Fetch the 835 ERA. Call GET /change/medicalnetwork/reports/v2/{transactionId}/835.
  8. Match responses to the claim. The payer returns your patient control number in the 277CA and the 835. The claim record endpoints do the matching for you.
  9. Check status when needed. Call the real-time claim status endpoint for claims that have entered the payer's system. Stedi's claim status page gives two waits before a first check: at least 2 to 3 days after submission, and at least a week after submission. Send only the data needed, because too much information in the request can hurt the results.

Without events, poll for transactions and start each polling window at least one day before your last processed transaction.

This is the sample request for the CMS-1500 endpoint, copied in full from Stedi's professional claims guide. It is the only sample request Stedi documents for this endpoint.

curl --request POST \
  --url https://claims.us.stedi.com/2025-03-07/professional-claim-submissions \
  --header 'Authorization: Key <YOUR-API-KEY>' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: 0e1f9a8d-6c5b-4a3f-9d2e-7b8c1a0f4e6d' \
  --data '{
  "purpose": "CHARGEABLE",
  "payer": {
    "id": "60054",
    "name": {
      "organization": "Aetna"
    }
  },
  "insured": {
    "memberId": "W123456789",
    "name": {
      "person": {
        "firstName": "June",
        "lastName": "Doe"
      }
    },
    "dateOfBirth": "1990-01-01",
    "gender": "FEMALE",
    "insuranceType": "OTHER",
    "paymentResponsibilityLevelCode": "PRIMARY",
    "address": {
      "addressLine1": "111 A Place",
      "city": "Somewhere",
      "postalCode": "123450000",
      "state": "IL"
    }
  },
  "patient": {
    "address": {
      "addressLine1": "111 A Place",
      "city": "Somewhere",
      "postalCode": "123450000",
      "state": "IL"
    },
    "dateOfBirth": "1900-02-02",
    "gender": "MALE",
    "name": {
      "person": {
        "firstName": "Liam",
        "lastName": "Doe"
      }
    },
    "relationshipToInsured": "CHILD"
  },
  "otherInsured": [
    {
      "address": {
        "addressLine1": "111 A Place",
        "city": "Somewhere",
        "postalCode": "123450000",
        "state": "IL"
      },
      "authorization": {
        "insuredAuthorizesAssignment": "YES",
        "patientReleasesMedicalInfo": "YES",
        "providerGeneratedPatientSignature": false
      },
      "claimFilingIndicator": "BLUE_CROSS_BLUE_SHIELD",
      "memberId": "BCBS-IL-554433221",
      "name": {
        "person": {
          "firstName": "Michael",
          "lastName": "Doe"
        }
      },
      "otherPayer": {
        "id": {
          "payerId": "00621"
        },
        "name": {
          "organization": "Blue Cross Blue Shield of Illinois"
        }
      },
      "planName": "BCBS PPO",
      "policyOrGroupNumber": "BCBS-GRP-3344",
      "relationshipToInsured": "SPOUSE",
      "responsibilityLevel": "SECONDARY"
    }
  ],
  "encounter": {
    "attachments": [
      {
        "attachmentControlNumber": "PWK-2026-0001",
        "reportTypeCode": "PROGRESS_REPORT",
        "transmissionCode": "ELECTRONICALLY_ONLY"
      }
    ],
    "claimCodes": [
      "AV"
    ],
    "claimNote": {
      "additionalInformation": "Patient presented with persistent cough and bronchospasm; treated in office."
    },
    "clinicalDates": {
      "hospitalization": {
        "end": "2026-03-06",
        "start": "2026-03-04"
      },
      "initialTreatment": "2026-03-03",
      "onsetOfCurrentIllness": "2026-03-02",
      "unableToWork": {
        "end": "2026-03-10",
        "start": "2026-03-03"
      }
    },
    "patientCondition": {
      "isAutoAccidentRelated": false,
      "isEmploymentRelated": false,
      "isOtherAccidentRelated": false
    },
    "primaryDiagnosisCode": "J0190",
    "priorReferringProvider": {
      "identifiers": {
        "npi": "1999999984"
      },
      "name": {
        "person": {
          "firstName": "John",
          "lastName": "Doe"
        }
      }
    },
    "referenceNumbers": {
      "clia": "14D2089999",
      "priorAuthorization": "PA-2026-11111",
      "referral": "REF-4321"
    },
    "referringProvider": {
      "identifiers": {
        "npi": "1999999984"
      },
      "name": {
        "person": {
          "firstName": "Jane",
          "lastName": "Doe"
        }
      }
    },
    "resubmission": {
      "code": "REPLACEMENT_OF_PRIOR_CLAIM",
      "originalReferenceNumber": "CLM-ORIG-998877"
    },
    "supervisingProvider": {
      "identifiers": {
        "npi": "1999999984"
      },
      "name": {
        "person": {
          "firstName": "Jane",
          "lastName": "Smith"
        }
      }
    }
  },
  "serviceLines": [
    {
      "procedureCode": {
        "code": "99213"
      },
      "lineItemChargeAmount": "100.00",
      "placeOfService": "11",
      "datesOfService": {
        "start": "2026-03-03",
        "end": "2026-03-03"
      },
      "diagnosisCodes": [
        "J0190"
      ],
      "units": "1"
    }
  ],
  "authorization": {
    "providerSignature": "ON_FILE",
    "providerAcceptsAssignment": "ASSIGNED",
    "insuredAuthorizesAssignment": "YES",
    "patientReleasesMedicalInfo": "YES"
  },
  "submitter": {
    "name": {
      "organization": "Test Submitter"
    },
    "etin": "TEST001",
    "contact": {
      "phoneNumber": "5555551234"
    }
  },
  "billing": {
    "billingProvider": {
      "name": {
        "organization": "Test Provider"
      },
      "identifiers": {
        "npi": "1999999984",
        "taxonomyCode": "207Q00000X"
      },
      "address": {
        "addressLine1": "123 St",
        "city": "City",
        "state": "IL",
        "postalCode": "12345"
      }
    },
    "taxId": {
      "ein": "123456789"
    },
    "patientControlNumber": "TEST-004",
    "totalCharge": "100.00"
  }
}'

The sample sends the key as Authorization: Key <YOUR-API-KEY>. Stedi supports that prefix for backward compatibility.

The response carries a claim ID that stays the same for the claim's whole life cycle.

If you send raw X12 or use SFTP

  • Name the implementation guide. For a professional claim, ST03 must be 005010X222A1.
  • Match the envelope to the SFTP user. ISA08 is STEDITEST for test claims or STEDI for production claims.
  • Give each claim a unique GS06. Without it you cannot tell which claim was rejected.
  • Expect one claim per transmission to the payer. Stedi splits a bulk 837 into single claims and sends each one separately.
  • Watch for 999 files. Stedi returns a 999 within minutes of the file submission. Without that check, a claim or attachment can fail silently, because Stedi does not send rejected transactions to the payer.

(c) Transaction enrollment

  1. Create a provider record. Call POST /providers.
  2. Create one enrollment request per transaction type. Call POST /enrollments for each provider, payer and transaction type. Each request needs a primary contact, where the payer sends communications about the enrollment.
  3. Submit it. A request can sit in draft. Stedi processes it only in STEDI_ACTION_REQUIRED status.
  4. Wait for provisioning. When Stedi begins the process with the payer, it sets the status to PROVISIONING.
  5. Complete any task. If the payer needs something from the provider, the status becomes PROVIDER_ACTION_REQUIRED and a task appears with instructions. Complete it in the portal or with POST /tasks/{taskId}.
  6. Go live. Once approved, the status is LIVE and the provider can exchange the enrolled transactions.
  7. Listen for enrollment events. Stedi emits an event when an enrollment is set to LIVE.

For many providers at once, the portal imports enrollment requests from a CSV file. A group that bills under one NPI and tax ID does not need separate requests for individual rendering providers. Providers with no NPI use the placeholder 1999999984.

Which Stedi API quirks should you know?

Eighteen details from Stedi's documents can change a design or a test plan. Each one below carries its source.

A payer can answer an eligibility check with a 999 in place of a 271

A 999 is an X12 rejection of the request itself. Stedi can usually translate it into a 271 with descriptive AAA errors. When it cannot, the response holds the raw 999 in the x12 property and an error with code 999. On the raw X12 endpoint, a request without BHT03 returns HTTP 200 with the status set to ERROR.

Only some AAA codes should be retried

Retry 42, 42 with 79, and 80. Do not retry a 42 whose follow-up action is C, N or S. Do not retry a 79 alone. A 42 that arrives with HTTP 429 is Stedi's own capacity limit and not the payer.

A failed check can return HTTP 200

An invalid NPI or missing portal credentials returns a Stedi-generated AAA error with an HTTP 200 status. A payer ID that Stedi cannot process returns HTTP 400. Read the body, not only the status code.

Three kinds of payer ID reach the same payer

You can send the primary payer ID, the Stedi payer ID or any alias in the payer record. Leading zeros must be kept. The Stedi payer ID does not change, even if the primary payer ID is updated. Aliases keep old IDs working after a payer changes its primary ID. Payers merge, rename and shut down, so a stored payer list goes stale. The coverage types on a payer record apply only to eligibility checks.

One service type code per request works best

A service type code tells the payer which kind of benefit you are asking about. With none, Stedi sends code 30, plan coverage and general benefits. Stedi recommends no more than one code in each request. Most medical payers do not support procedure codes, so a service type code is almost always needed.

Two generations of eligibility endpoint behave differently

Stedi returns one of two response shapes, depending on the endpoint. The new JSON endpoint groups benefits under plans. Batch checks, insurance discovery, the raw X12 endpoint and the legacy JSON endpoint return a flat benefitsInformation list. The new endpoint takes dates as YYYY-MM-DD. The legacy shape takes YYYYMMDD. The legacy endpoint ignores an unsupported property and warns, so a check can succeed without data you meant to send. The new endpoint rejects the request. The legacy endpoint still gets bug fixes and is no longer under active development.

Stedi's documents give two status codes for a claim that fails its checks

The professional claims guide says the new endpoint returns HTTP 201 whether Stedi's edits pass or fail. The claim edits page says Stedi returns HTTP 400 and includes the rejections in the errors array. The claim edits page does not say which endpoints its statement covers. Test both outcomes on the endpoint you use, and check the errors array in every response. Stedi also repairs small format problems on its own, and says it does not use repairs to change substantive or clinical content.

Idempotency keys last 24 hours

After 24 hours the same key lets the request run again. The same key with different request contents returns 422 inside that period. A repeat sent while the first request is still processing returns 409.

The idempotency key is the only documented guard against a duplicate claim

Stedi's public pages describe no duplicate detection when no key is sent. A duplicate sent in error is canceled with a cancellation claim. Stedi sends every API claim as a production claim unless you mark it as test data.

A dependent with their own member ID is sent as the subscriber

The subscriber is the policyholder, and a dependent is a person covered under that policy. In an eligibility check, a dependent who has their own member ID in the payer's database must be identified as the subscriber. That includes IDs that differ only by a suffix. A payer that does not support dependents can ignore them and return the subscriber's results. On a claim, a dependent with a unique member ID is treated as the insured. When the patient is the insured, send only the insured object.

Stedi writes its own control numbers

A control number is the ID an X12 file carries for itself. On the JSON endpoints Stedi ignores the controlNumber field. On raw X12 eligibility requests Stedi generates its own ISA and GS headers. What you control is the patient control number. Keep it at 17 characters or fewer, because some payers cut longer values. Avoid formats built from patient initials or the date of service, which can create duplicates.

Medicare checks carry rules of their own

Every check to payer ID CMS needs the patient's MBI. Without attestation, CMS rejects the check with AAA error 41. From Dec 1, 2026, CMS rejects checks for a suspended NPI with AAA error 97. Checks go through HETS, the CMS eligibility system, and all parties must follow the HETS Rules of Behavior. Stedi tells customers not to submit checks for Medicare Advantage plans to CMS.

Medicare checks are blocked from outside the United States

Stedi blocks a request to CMS when any IP address in the chain is outside the United States. A platform must pass upstream IP addresses in X-Forwarded-For. A separate case applies to every endpoint: a 403 can come from Stedi's firewall blocking an IP address, which Stedi has seen most often with requests sent from Google Cloud Platform.

Test mode does not behave like production

Mock eligibility requests are predefined, with no custom data or choice of payer. A test key can submit only test claims, with the usage indicator set to T. Only the Stedi Test Payer produces a test 835. Real-time claim status does not run for test claims.

Expect several 277CAs for one claim

You can receive multiple 277CAs for each claim. Some payers batch acknowledgments for several claims into one 277CA. A rejection is different from a denial, which appears only in the 835 ERA. Some payers truncate patient control numbers over 30 characters in the 277CA.

A paid amount of zero is not a status

You cannot reliably determine a claim's status from the amount paid in an 835. A claim status code of 19, 20 or 21 in the 835 means the payer forwarded the claim to another payer. An unsent attachment can stall a claim: some payers stall processing if the claim names an attachment that never arrives.

Characters outside the X12 sets cause errors

Use only the X12 Basic and Extended character sets in request data. Restricted delimiter characters used improperly return a 400. Stedi replaces delimiter characters inside values, so a name can come back changed. Stedi tells anyone who parses raw X12 responses to read the delimiters from the ISA segment.

Events can arrive twice, and a redirect counts as a failure

Your endpoint can receive the same event more than once. Stedi does not follow redirects, so a 3xx response is recorded as a failed delivery. Each delivery carries a signature to verify. When polling, use the page token and not the start time alone. Page tokens do not expire.

What should you check before you sign with Stedi?

Check four things before you sign: consent, security, testing and support. Then put the ten questions at the end of this section to Stedi in writing.

Consent

A claim carries indicators for whether the provider has the patient's and the insured's authorizations on file. Stedi's public pages give no guidance on patient consent for eligibility checks or insurance discovery. Under the service terms, the customer has sole responsibility for the accuracy, quality and legality of the data it sends.

Security and compliance

Stedi's statements about itself, as it publishes them:

  • Stedi states that it is HITRUST r2 certified, SOC 2 Type II compliant and HIPAA compliant. It announced the HITRUST r2 certification on Jun 19, 2026.
  • The Trust Center lists HITRUST r2, SOC 2 Type II, SOC 1 Type II, HIPAA and CAQH Core under compliance. The reports sit behind an access request. It also lists a penetration test report.
  • Under the BAA, Stedi reports a security incident involving patient data within five business days. It reports a breach within five business days of determining that one occurred.
  • Subcontractors that handle patient data enter a written agreement. The public pages do not name them, or the hosting regions.
  • At the end of the BAA, Stedi keeps no copies of patient data and can keep de-identified data.
  • The BAA allows data analysis to review, improve or validate a product, feature or service.
  • Stedi can end the BAA on 90 days' written notice.
  • Stedi says it runs entirely on AWS, across more than one region. The APIs sit behind the AWS web application firewall. Stedi says it offers redundant connections with automatic failover where possible.

Service terms that affect a production system:

  • The uptime commitment is 99.9% a month, on a commercially reasonable efforts basis. Only 500 and 503 responses count as errors. Outages at payers or external clearinghouses are excluded. Service credits run from 10% to 100% of the month's fees by uptime band, and must be claimed by opening a case.
  • Liability for direct damages is capped at the fees paid in the 12 months before the event.
  • The service terms carry an effective date of Sep 9, 2026.

Your own duties:

  • Rotate API keys yourself, because they do not expire. Event signing secrets can be rotated with an overlap period.
  • Keep patient data out of support requests, screenshots included.
  • Stedi advises against Postman for requests that hold patient data.

Testing

Build against mock requests and test claims before any live traffic. Do not send invented patients to live payers. Breaking changes come as a new dated version, so pin the version in your base address.

Support

Support runs by email and by a dedicated Slack or Teams channel. The support page promises a response as soon as possible and no fixed time. The status page has four components and publishes no historical uptime figure.

What named companies document about their own Stedi integrations

These are statements by each company about its own product. None is a statement by Stedi.

  • Medplum documents that it integrates with Stedi for billing and revenue cycle workflows. It documents that its claim integration supports professional claims only. It documents that its integration receives claim responses by webhook, with an optional poller as a safety net. It documents that its processing is idempotent on the Stedi transaction ID, not the webhook event ID. It tells its own users to test with its sample data, because the sandbox validates only a few payloads. Stedi's test mode page agrees that mock requests are predefined.
  • Candid Health documents that it is deprecating its Availity eligibility endpoint and recommends its own Stedi passthrough endpoint.
  • Scalekit documents that its Stedi connector for AI agents has 17 tools.
  • Medi states that its product routes claims, eligibility and ERAs through Stedi.

Questions to ask Stedi before you sign

  1. Do you support the 278 prior authorization transaction, and if so, through which route?
  2. How do we send workers' compensation, auto and liability claims, and to which payers?
  3. Does a payer's request for more documents reach us through Stedi, and how do we answer it?
  4. What are the rate limits on the eligibility, claim status, payer and event endpoints?
  5. How long do you keep eligibility checks, claims, 277CAs and 835s, and how do we export them if we leave?
  6. What are the custom plan prices at our volume, and which payers add their own fees?
  7. Which of our payers need the claim and the ERA at the same clearinghouse, and which enroll by tax ID?
  8. What are your support hours, and is there a committed response time?
  9. Where is our data hosted, and who are your subcontractors?
  10. Do you detect a duplicate claim when no idempotency key is sent?

Next step

Planning a Stedi API integration? We scope the route, the access steps and the build with you. Start at our payer and clearinghouse integration service.

Ready to scale?

Talk to our healthcare engineering team about building, integrating, and shipping faster.

Frequently Asked Questions

Does Stedi have a public API?

Yes. The docs index lists 192 pages, and 66 reference pages each describe one endpoint with its method and path. Sign-up is self-serve on the Stedi portal.

How do I get Stedi API access?

Sign up on the portal for a free sandbox account with test API keys. For production, click Upgrade account, set up MFA, agree to the BAA and fund a balance of at least $25.

How much does the Stedi API cost?

As published on Nov 14, 2026, an eligibility check costs $0.30 for the first 250 a month, falling to $0.08 above 10,000. A claim costs $0.30 for the first 500 a month, falling to $0.10 above 10,000. There is no monthly minimum.

What are the Stedi API rate limits?

Claims processing endpoints share 100 requests per second, and enrollment endpoints share another 100. Real-time eligibility and claim status share 50 concurrent requests per account by default. Stedi publishes no per-second limit for eligibility.

Does Stedi support prior authorization (278)?

Stedi's documents show no 278 endpoint. The only mention in the 192 docs pages is a line that lists it among features test mode does not support. The documents explain how to read from an eligibility response whether prior authorization is required.

How long does Stedi enrollment take?

Most enrollments complete within 24 to 48 hours, and some payers take up to 30 days. Stedi publishes an expected time for each payer and transaction type.

Does Stedi have a sandbox?

Yes. Sandbox accounts are free and limited to test mode. They run mock eligibility checks. Test claims need a production account.

Does Stedi sign a BAA?

Yes. You agree to a BAA when you upgrade to a paid plan. It is accepted online or by order form.

Does Stedi have an MCP server?

Yes. It gives AI agents tools to perform and troubleshoot eligibility checks. It is available only for production accounts. It is not intended for bulk checks.

How many payers does Stedi connect to?

Stedi's Payer Network page showed 3,680 total payers on Nov 14, 2026. Its product page says 3,500+ medical and dental payers. Not every payer in the network supports every transaction type, so check each payer you need.
Share