> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Stedi

The Stedi connector lets your AI agent act in each user's Stedi account. Each user connects their own Stedi API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 17 tools.

**Authentication:** API Key
**Categories:** Healthcare
**Tools:** 17: 16 read, 1 write, 0 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=STEDI)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Stedi connection

   In **AgentKit > Connections**, create a Stedi connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

   **Console steps with screenshots:**

   Stedi connections use a Stedi API key. One key works for every Stedi API the tools call: payers, eligibility, claim status, claims and reports.

   1. ### Create a Stedi API key

      In the Stedi portal, open **API keys** and create a key in **Test** or **Production** mode.

      - **Test** keys return mock responses: for eligibility checks, send only Stedi's mock request payloads, never real patient data; for claims, use payer ID `STEDI`.
      - **Production** keys reach real payers. Real-time claim status (`stedi_check_claim_status`) accepts only production keys, for claims a payer has accepted.

   2. ### Create the connection

      In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** > **Create Connection**, find **Stedi** and click **Create**. The connection name is the `connection_name` your code passes.

   3. ### Add a connected account

      To test, open the connection, click the **Connected Accounts** tab > **Add Account**, enter the user's identifier, such as `user_123`, and paste the key as **API Key**. Paste the key only, without a `Bearer` prefix.

      In production, each user opens the authorization link and enters the key there.

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'stedi'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Stedi:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'stedi_list_claims',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "stedi"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Stedi:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="stedi_list_claims",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Stedi credentials there. If your app already has a user's credentials, add the account from your backend instead, as the console steps above show. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'stedi_check_claim_status',
  toolInput: {
    providers: [{
        providerType: 'BillingProvider',
        npi: '1999999984',
        organizationName: 'Example Clinic',
      }],
    subscriber: {
      memberId: 'TEST12345',
      firstName: 'Test',
      lastName: 'Patient',
      dateOfBirth: '19800101',
    },
    trading_partner_service_id: '<trading_partner_service_id>',
  },
  connector: 'stedi',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="stedi_check_claim_status",
    tool_input={
        "providers": [{
                "providerType": "BillingProvider",
                "npi": "1999999984",
                "organizationName": "Example Clinic",
            }],
        "subscriber": {
            "memberId": "TEST12345",
            "firstName": "Test",
            "lastName": "Patient",
            "dateOfBirth": "19800101",
        },
        "trading_partner_service_id": "<trading_partner_service_id>",
    },
    connection_name="stedi",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `stedi_check_claim_status`

Check Claim Status · Read-only

Send a real-time 276/277 claim status request to a payer through Stedi for a claim the payer has already accepted.
Returns the payer's 277 response as JSON: a claims array where each matching claim has claimStatus (status category and codes, payer claim number, charge and paid amounts, dates) and serviceDetails, plus payer, providers, subscriber, errors and the raw X12.
Use when a 277CA or 835 ERA has not arrived in the expected time. Use stedi_list_claims or stedi_get_claim_timeline to see what Stedi has already received. Works with production API keys only.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `providers` (`array`, required): The billing provider (exactly one) and optionally service providers on the claim. Each entry has providerType (BillingProvider or ServiceProvider), npi, and organizationName or firstName and lastName; tin is sometimes required by the payer. Example: [{"providerType": "BillingProvider", "npi": "1999999984", "organizationName": "Example Clinic"}].
- `subscriber` (`object`, required): The subscriber on the claim: memberId, firstName and lastName are required; add dateOfBirth (YYYYMMDD) and gender (M or F) when the subscriber is the patient. Example: {"memberId": "TEST12345", "firstName": "Test", "lastName": "Patient", "dateOfBirth": "19800101"}.
- `trading_partner_service_id` (`string`, required): The payer ID the claim was sent to (primary payer ID, Stedi payer ID or alias).
- `dependent` (`object`, optional): The patient, when the patient is a dependent on the subscriber's policy: firstName, lastName, dateOfBirth (YYYYMMDD) and gender (M or F). Example: {"firstName": "Test", "lastName": "Child", "dateOfBirth": "20150101"}.
- `encounter` (`object`, optional): Identifies the claim. Stedi recommends a date-of-service range (beginningDateOfService and endDateOfService, YYYYMMDD); you can also pass the payer's claim number (tradingPartnerClaimNumber), patientAccountNumber or submittedAmount. Sending too much detail can hide matches. Example: {"beginningDateOfService": "20260101", "endDateOfService": "20260107"}.
- `trading_partner_name` (`string`, optional): The payer's name, such as Cigna or Aetna. Optional.

Example input: `{"providers":[{"providerType":"BillingProvider","npi":"1999999984","organizationName":"Example Clinic"}],"subscriber":{"memberId":"TEST12345","firstName":"Test","lastName":"Patient","dateOfBirth":"19800101"},"trading_partner_service_id":"<trading_partner_service_id>"}`

### `stedi_check_coordination_of_benefits`

Check Coordination of Benefits · Read-only

Check whether a patient has other active health coverage and which payer is primary, using Stedi's coordination of benefits (COB) database.
Returns coordinationOfBenefits (whether COB applies and the payer responsibility sequence, such as primary or secondary), benefitsInformation for the other active plans found, plan dates, and payer, subscriber and errors details.
Use when a patient may have more than one plan, before billing. Use stedi_check_eligibility for benefits under one known plan; the payer must support COB checks (filter stedi_search_payers by coordination_of_benefits).

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `encounter` (`object`, required): The date of service (YYYY-MM-DD) and the service type code; use 30 (health benefit plan coverage). Example: {"dateOfService": "2026-01-15", "serviceTypeCode": "30"}.
- `provider` (`object`, required): The provider requesting the check: organizationName (or firstName and lastName for an individual) and npi. Example: {"organizationName": "Example Clinic", "npi": "1999999984"}.
- `subscriber` (`object`, required): The primary policyholder, or a dependent with their own member ID: memberId, firstName, lastName and dateOfBirth (YYYY-MM-DD). Example: {"memberId": "TEST12345", "firstName": "Test", "lastName": "Patient", "dateOfBirth": "1980-01-01"}.
- `trading_partner_service_id` (`string`, required): The payer ID of a Stedi-supported COB payer the patient is known to have coverage with.
- `dependent` (`object`, optional): A dependent listed on the subscriber's policy who has no member ID of their own: firstName, lastName and dateOfBirth. Example: {"firstName": "Test", "lastName": "Child", "dateOfBirth": "2015-01-01"}.

Example input: `{"encounter":{"dateOfService":"2026-01-15","serviceTypeCode":"30"},"provider":{"organizationName":"Example Clinic","npi":"1999999984"},"subscriber":{"memberId":"TEST12345","firstName":"Test","lastName":"Patient","dateOfBirth":"1980-01-01"},"trading_partner_service_id":"<trading_partner_service_id>"}`

### `stedi_check_eligibility`

Check Eligibility · Read-only

Run a real-time 270/271 insurance eligibility and benefits check with a payer through Stedi.
Returns the payer's 271 response as JSON: payer, provider and subscriber details, plans with their benefits (coverage status, copays, coinsurance, deductibles), errors and warnings, plus the raw X12.
Use before a visit to confirm active coverage and patient responsibility. Use stedi_check_coordination_of_benefits to find other coverage; use stedi_search_payers first to get the payer ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `payer_id` (`string`, required): The payer ID to send the check to: the primary payer ID, Stedi payer ID or any payer ID alias from the Payer Network. Test API keys only accept Stedi's mock payer requests.
- `provider` (`object`, required): The provider requesting the check. It needs a name, given as an organization name or a person's first and last name, and usually the provider's 10-digit NPI. Tax ID and other identifiers are only needed when a payer asks for them. Example: {"name": {"organization": "Example Clinic"}, "npi": "1999999984"}.
- `subscriber` (`object`, required): The primary policyholder, or a dependent who has their own member ID. Send the member ID, the name as a person (firstName, lastName) and the date of birth (YYYY-MM-DD); payers match on these. Gender (MALE or FEMALE) and address are optional. Example: {"memberId": "TEST12345", "name": {"person": {"firstName": "Test", "lastName": "Patient"}}, "dateOfBirth": "1980-01-01"}.
- `dependent` (`object`, optional): A dependent to check, only when the patient is listed under the subscriber's policy and has no member ID of their own. One dependent per check. Give the name (person firstName and lastName), date of birth and relationship to the subscriber (SPOUSE, CHILD or OTHER_ADULT). Example: {"name": {"person": {"firstName": "Test", "lastName": "Child"}}, "dateOfBirth": "2015-01-01", "relationToSubscriber": "CHILD"}.
- `eligibility_search_id` (`string`, optional): Identifier that groups several eligibility checks for the same patient into one eligibility search record in the Stedi portal.
- `encounter` (`object`, optional): What benefits to ask about. List services as code system plus value: STC service type codes (for example 30 for general health plan coverage), CPT or HCPCS codes. Optionally add a service date or date range (dates.service); without one the payer uses today. Example: {"services": [{"system": "STC", "value": "30"}]}.
- `external_patient_id` (`string`, optional): Your own unique identifier for the patient. Stedi uses it to correlate past eligibility checks for the same person; recommended on every request.
- `payer_name` (`string`, optional): The payer's name, such as Cigna or Aetna. Optional and informational.

Example input: `{"payer_id":"<payer_id>","provider":{"organizationName":"Example Clinic","npi":"1999999984"},"subscriber":{"memberId":"TEST12345","firstName":"Test","lastName":"Patient","dateOfBirth":"19800101"}}`

### `stedi_get_277ca_report`

Get 277CA Report · Read-only

Retrieve a processed 277CA claim acknowledgment from Stedi as JSON.
Returns a transactions array; each 277CA lists payers with their providers and claims, and each claim's status (accepted or rejected) with status category codes and rejection reasons.
Use to see whether a payer accepted or rejected submitted claims. Find the transaction ID with stedi_list_transactions (transaction_set_id 277) or stedi_poll_transactions.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `transaction_id` (`string`, required): Stedi's transaction ID of the processed 277 claim acknowledgment transaction. Find it with List Transactions (filter by transaction set 277), Poll Transactions or a claim's timeline.

Example input: `{"transaction_id":"<transaction_id>"}`

### `stedi_get_claim`

Get Claim · Read-only

Retrieve one claim record with a summary of its latest submission.
Returns the claim's id, status, statusReportedBy, patientControlNumber, patientName, stediPayerId, submittedAt, total charge and paid amounts, datesOfService and type.
Use to check a claim's current status. Use stedi_get_claim_timeline for every submission, acknowledgment and payment, and stedi_list_claims to find the claim ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `claim_id` (`string`, required): Stedi's claim ID: the claimId from Submit Professional Claim or the id of an item from List Claims.

Example input: `{"claim_id":"<claim_id>"}`

### `stedi_get_claim_timeline`

Get Claim Timeline · Read-only

List the timeline of one claim: its submissions, 277CA acknowledgments and ERA payment information, newest first.
Returns items (timeline entries for submissions, 277CA acknowledgments and ERA payments) and nextPageToken.
Use to follow a claim's full lifecycle or find the transaction ID of its 277CA or ERA. Use stedi_get_claim for the current status only.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `claim_id` (`string`, required): Stedi's claim ID: the claimId from Submit Professional Claim or the id of an item from List Claims.
- `page_size` (`integer`, optional): Maximum number of timeline entries per page. Stedi defaults to 100.
- `page_token` (`string`, optional): Opaque token from the nextPageToken field of a previous response, used to fetch the next page. Omit for the first page.

Example input: `{"claim_id":"<claim_id>"}`

### `stedi_get_era_report`

Get 835 ERA Report · Read-only

Retrieve a processed 835 Electronic Remittance Advice (ERA) from Stedi as JSON.
Returns a transactions array; each ERA has payer and payee, financialInformation (payment amount, method and date), paymentAndRemitReassociationDetails (check or EFT trace number), detailInfo with per-claim payment and adjustment details, and providerAdjustments.
Use to reconcile what a payer paid on claims. Find the transaction ID with stedi_list_transactions (transaction_set_id 835) or stedi_poll_transactions.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `transaction_id` (`string`, required): Stedi's transaction ID of the processed 835 ERA transaction. Find it with List Transactions (filter by transaction set 835), Poll Transactions or a claim's timeline.

Example input: `{"transaction_id":"<transaction_id>"}`

### `stedi_get_payer`

Get Payer · Read-only

Retrieve one payer record from Stedi's Payer Network by its Stedi payer ID.
Returns a payer object with stediId, displayName, primaryPayerId, aliases, names, coverage types, operating states, programs, supported transaction types and enrollment requirements.
Use when you already have the Stedi payer ID. Use stedi_search_payers to look a payer up by name, primary payer ID or alias; this endpoint does not accept those.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `stedi_id` (`string`, required): The Stedi payer ID, a permanent identifier Stedi assigns to each payer (the stediId field in search results). The primary payer ID and aliases are not accepted here.

Example input: `{"stedi_id":"<stedi_id>"}`

### `stedi_get_professional_claim_submission`

Get Professional Claim Submission · Read-only

Retrieve the data of one professional claim submission made through the CMS-1500 JSON endpoint, by its submission ID.
Returns claimId, submissionId, stediPayerId, processedAt and data, the claim fields as submitted (payer, submitter, billing, insured, patient, encounter, service lines).
Use to review exactly what was sent, for example before correcting a rejected claim. Use stedi_get_claim for the claim's current status.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `submission_id` (`string`, required): The submissionId returned by Submit Professional Claim. Each resubmission of a claim gets a new submission ID.

Example input: `{"submission_id":"<submission_id>"}`

### `stedi_get_transaction`

Get Transaction · Read-only

Retrieve the details of one processed transaction by its transaction ID.
Returns transactionId, status, direction, mode, processedAt, x12 metadata, businessIdentifiers, partnership, translationErrors, and artifacts with download URLs for the input and output documents.
Use to inspect a transaction found with stedi_list_transactions. Use stedi_get_era_report or stedi_get_277ca_report for the parsed ERA or acknowledgment.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `transaction_id` (`string`, required): Stedi's transaction ID, from List Transactions or Poll Transactions.

Example input: `{"transaction_id":"<transaction_id>"}`

### `stedi_list_claims`

List Claims · Read-only

List claim records in the Stedi account, newest submission first, with optional filters for status, patient control numbers and submission date range.
Returns items (each with id, status, statusReportedBy, patientControlNumber, patientName, stediPayerId, submittedAt, total charge and paid amounts, datesOfService and type, from the latest submission) and nextPageToken.
Use to monitor claims or find a claim ID. Use stedi_get_claim for one claim and stedi_get_claim_timeline for its full history.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page_size` (`integer`, optional): Maximum number of claims per page. Stedi defaults to 100.
- `page_token` (`string`, optional): Opaque token from the nextPageToken field of a previous response, used to fetch the next page. Omit for the first page.
- `patient_control_numbers` (`array`, optional): Only return claims with any of these patient control numbers (the identifier you assigned to the claim).
- `status` (`array`, optional): Only return claims in any of these processing statuses: SUBMITTED, RECEIVED, ACCEPTED, REJECTED, PROCESSED, DENIED or UNKNOWN.
- `submitted_after` (`string`, optional): Only return claims submitted after this time, as an ISO 8601 timestamp.
- `submitted_before` (`string`, optional): Only return claims submitted before this time, as an ISO 8601 timestamp.

Example input: `{}`

### `stedi_list_payers`

List Payers · Read-only

List payers in Stedi's Payer Network, one page at a time.
Returns items (each a payer record with stediId, displayName, primaryPayerId, aliases, supported transaction types and enrollment requirements) and nextPageToken.
Use to page through or sync the full payer list. Use stedi_search_payers to find a specific payer by name or ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page_size` (`integer`, optional): Maximum number of payers to return per page. This tool sends 100 by default; Stedi itself returns every payer in one very large response when no page size is sent. Default: `100`.
- `page_token` (`string`, optional): Opaque token from the nextPageToken field of a previous response, used to fetch the next page. Omit for the first page.

Example input: `{}`

### `stedi_list_transactions`

List Transactions · Read-only

List transactions Stedi has processed in the account, newest first, with optional filters such as transaction set (835 for ERAs, 277 for claim acknowledgments), direction, mode, status and date range.
Returns items (each with transactionId, status, direction, mode, processedAt, x12 metadata including the transaction set, businessIdentifiers, partnership and artifacts with download URLs) and nextPageToken.
Use to find ERAs or 277CAs and their transaction IDs. Use stedi_poll_transactions to fetch only transactions processed since a given time.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `business_identifier` (`string`, optional): Only return transactions containing a business identifier with this value, such as a patient control number or check number.
- `direction` (`string`, optional): INBOUND for transactions received from payers or partners, OUTBOUND for those you sent, or UNKNOWN. One of: `INBOUND`, `OUTBOUND`, `UNKNOWN`.
- `element_id` (`string`, optional): The X12 element ID the business identifier belongs to, such as 127 (Reference Identification). Only valid together with business_identifier.
- `from` (`string`, optional): Only return transactions created at or after this ISO 8601 timestamp.
- `mode` (`string`, optional): Only return test, production or other transactions. One of: `test`, `production`, `other`.
- `page_size` (`integer`, optional): Maximum number of transactions per page, up to 500. Stedi defaults to 100.
- `page_token` (`string`, optional): Opaque token from the nextPageToken field of a previous response, used to fetch the next page. Omit for the first page.
- `partnership_id` (`string`, optional): Only return transactions sent or received on this partnership.
- `status` (`string`, optional): Only return transactions Stedi processed successfully (succeeded) or not (failed). One of: `succeeded`, `failed`.
- `to` (`string`, optional): Only return transactions created up to and including this ISO 8601 timestamp.
- `transaction_set_id` (`string`, optional): Only return this type of transaction, as a 3-digit X12 transaction set code: 835 for ERAs, 277 for claim acknowledgments, 837 for claims, 270 or 271 for eligibility, 999 for implementation acknowledgments.

Example input: `{}`

### `stedi_poll_transactions`

Poll Transactions · Read-only

Fetch transactions Stedi processed after a given time, oldest first, for incremental syncing.
Returns items (transaction summaries with transactionId, status, direction, mode, processedAt, x12 metadata and businessIdentifiers) and nextPageToken to continue from.
Use to pick up new ERAs and acknowledgments since the last check. Use stedi_list_transactions to browse or filter all transactions. Set start_date_time on the first call and page_token afterwards.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page_size` (`integer`, optional): Maximum number of transactions per page, up to 500. Stedi defaults to 100.
- `page_token` (`string`, optional): The nextPageToken from a previous poll, to continue where it left off. Supply this or start_date_time.
- `start_date_time` (`string`, optional): Return transactions processed after this ISO 8601 timestamp, which must be at least one minute in the past. Supply this or page_token.

Example input: `{}`

### `stedi_search_payers`

Search Payers · Read-only

Search Stedi's Payer Network by payer name, payer ID or alias, with fuzzy matching, and optionally filter by supported transactions, coverage type, state or insurance program.
Returns items ranked by relevance, each with the payer record (stediId, displayName, primaryPayerId, aliases, coverage types, supported transaction types and enrollment requirements), the matched text and a score, plus nextPageToken.
Use to find the payer ID for an eligibility check, claim or claim status request. Use stedi_get_payer when you already have the Stedi payer ID, and stedi_list_payers to export the whole network.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `claim_payment` (`string`, optional): Filter payers by 835 Electronic Remittance Advice (ERA) support: SUPPORTED, NOT_SUPPORTED, ENROLLMENT_REQUIRED (supported once the provider is enrolled with the payer) or EITHER (supported with or without enrollment). When several transaction filters are set, a payer must match all of them. One of: `SUPPORTED`, `NOT_SUPPORTED`, `ENROLLMENT_REQUIRED`, `EITHER`.
- `claim_status` (`string`, optional): Filter payers by real-time 276/277 claim status support: SUPPORTED, NOT_SUPPORTED, ENROLLMENT_REQUIRED (supported once the provider is enrolled with the payer) or EITHER (supported with or without enrollment). When several transaction filters are set, a payer must match all of them. One of: `SUPPORTED`, `NOT_SUPPORTED`, `ENROLLMENT_REQUIRED`, `EITHER`.
- `coordination_of_benefits` (`string`, optional): Filter payers by coordination of benefits (COB) check support: SUPPORTED, NOT_SUPPORTED, ENROLLMENT_REQUIRED (supported once the provider is enrolled with the payer) or EITHER (supported with or without enrollment). When several transaction filters are set, a payer must match all of them. One of: `SUPPORTED`, `NOT_SUPPORTED`, `ENROLLMENT_REQUIRED`, `EITHER`.
- `coverage_types` (`array`, optional): Only return payers that support all of these coverage types: medical, dental and/or vision. Payers Stedi has not classified are excluded.
- `dental_claim_submission` (`string`, optional): Filter payers by 837D dental claim submission support: SUPPORTED, NOT_SUPPORTED, ENROLLMENT_REQUIRED (supported once the provider is enrolled with the payer) or EITHER (supported with or without enrollment). When several transaction filters are set, a payer must match all of them. One of: `SUPPORTED`, `NOT_SUPPORTED`, `ENROLLMENT_REQUIRED`, `EITHER`.
- `eligibility_check` (`string`, optional): Filter payers by real-time 270/271 eligibility check support: SUPPORTED, NOT_SUPPORTED, ENROLLMENT_REQUIRED (supported once the provider is enrolled with the payer) or EITHER (supported with or without enrollment). When several transaction filters are set, a payer must match all of them. One of: `SUPPORTED`, `NOT_SUPPORTED`, `ENROLLMENT_REQUIRED`, `EITHER`.
- `institutional_claim_submission` (`string`, optional): Filter payers by 837I institutional claim submission support: SUPPORTED, NOT_SUPPORTED, ENROLLMENT_REQUIRED (supported once the provider is enrolled with the payer) or EITHER (supported with or without enrollment). When several transaction filters are set, a payer must match all of them. One of: `SUPPORTED`, `NOT_SUPPORTED`, `ENROLLMENT_REQUIRED`, `EITHER`.
- `operating_states` (`array`, optional): Only return payers that operate in all of these two-letter US state or territory codes. Use NATIONAL for payers operating in all 50 states; territories such as PR must be listed explicitly. Payers without state classifications are excluded.
- `page_size` (`integer`, optional): Maximum number of payers to return per page. Stedi defaults to 20.
- `page_token` (`string`, optional): Opaque token from the nextPageToken field of a previous response, used to fetch the next page. Omit for the first page.
- `professional_claim_submission` (`string`, optional): Filter payers by 837P professional claim submission support: SUPPORTED, NOT_SUPPORTED, ENROLLMENT_REQUIRED (supported once the provider is enrolled with the payer) or EITHER (supported with or without enrollment). When several transaction filters are set, a payer must match all of them. One of: `SUPPORTED`, `NOT_SUPPORTED`, `ENROLLMENT_REQUIRED`, `EITHER`.
- `programs` (`array`, optional): Only return payers that participate in any of these insurance programs: AUTOMOBILE_MEDICAL, COMMERCIAL, DISABILITY, LIABILITY_MEDICAL, MEDICAID, MEDICARE, MEDICARE_ADVANTAGE, TITLE_V, TRICARE, VETERANS_AFFAIRS, WORKERS_COMPENSATION.
- `query` (`string`, optional): Text to search the Payer Network for: a payer name, payer ID or alias. Case-insensitive with fuzzy matching, so 'cig', '62308' and 'SX071' all find Cigna. If omitted, only the filters are applied.

Example input: `{}`

### `stedi_validate_professional_claim`

Validate Professional Claim · Read-only

Validate an 837P professional claim (CMS-1500 JSON layout) against Stedi's payer checks, edits and mapping without sending it to the payer.
Returns an empty object when the claim passes, or an errors array describing each failed edit.
Use before stedi_submit_professional_claim, with the same inputs, to fix problems first. Nothing is submitted or stored.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `authorization` (`object`, required): Signature and assignment-of-benefits indicators (CMS-1500 boxes 12, 13, 27, 31). Example: {"patientReleasesMedicalInfo": "YES", "insuredAuthorizesAssignment": "YES", "providerAcceptsAssignment": "ASSIGNED", "providerSignature": "ON_FILE"}.
- `billing` (`object`, required): Billing details (CMS-1500 boxes 25, 26, 28, 32, 33): the billing provider (name, address, NPI and taxonomy code), the tax ID, your patientControlNumber and the totalCharge as a decimal string; optionally the service facility. Example: {"billingProvider": {"name": {"organization": "Example Clinic"}, "identifiers": {"npi": "1999999984", "taxonomyCode": "207Q00000X"}, "address": {"addressLine1": "123 Example St", "city": "Springfield", "state": "IL", "postalCode": "12345"}}, "taxId": {"ein": "123456789"}, "patientControlNumber": "TEST-001", "totalCharge": "100.00"}.
- `encounter` (`object`, required): Clinical details of the encounter: at least the primaryDiagnosisCode (ICD-10, without the dot), plus optional other diagnoses, referring or supervising providers, clinical dates, prior authorization and resubmission details. Example: {"primaryDiagnosisCode": "J0190"}.
- `insured` (`object`, required): The subscriber who holds the policy being billed (CMS-1500 boxes 1, 1a, 4, 7, 11). Required: name, insuranceType (MEDICARE, MEDICAID, TRICARE, CHAMPVA, FECA_BLK_LUNG or OTHER) and paymentResponsibilityLevelCode (PRIMARY). Also send the memberId, dateOfBirth (YYYY-MM-DD), gender and address. Example: {"memberId": "TEST12345", "name": {"person": {"firstName": "Test", "lastName": "Patient"}}, "dateOfBirth": "1980-01-01", "gender": "FEMALE", "insuranceType": "OTHER", "paymentResponsibilityLevelCode": "PRIMARY", "address": {"addressLine1": "1 Example Ave", "city": "Springfield", "state": "IL", "postalCode": "12345"}}.
- `payer` (`object`, required): The payer being billed: its payer ID and name. With a test API key, use STEDI as the payer ID. Example: {"id": "60054", "name": {"organization": "Aetna"}}.
- `purpose` (`string`, required): Why the claim is submitted: CHARGEABLE for a standard fee-for-service claim with at least one charge, REPORTING for an encounter report with no payment expected, SUBROGATION_DEMAND for a subrogation claim. One of: `CHARGEABLE`, `REPORTING`, `SUBROGATION_DEMAND`.
- `service_lines` (`array`, required): The services billed (CMS-1500 box 24), one object per line: datesOfService (start and end), procedureCode (code and optional modifiers), lineItemChargeAmount, units, placeOfService and the diagnosisCodes it relates to. Example: [{"datesOfService": {"start": "2026-01-15", "end": "2026-01-15"}, "procedureCode": {"code": "99213"}, "lineItemChargeAmount": "100.00", "units": "1", "placeOfService": "11", "diagnosisCodes": ["J0190"]}].
- `submitter` (`object`, required): The entity submitting the claim to Stedi: its name, a contact phone number or email, and its ETIN if one was assigned. Example: {"name": {"organization": "Example Billing"}, "contact": {"phoneNumber": "5555551234"}}.
- `other_insured` (`array`, optional): Other coverage the patient holds, for coordination of benefits (CMS-1500 boxes 9, 9a, 9d), one object per policy. Each needs memberId, name, otherPayer (payer ID and name), responsibilityLevel (PRIMARY, SECONDARY or TERTIARY), relationshipToInsured, claimFilingIndicator (such as COMMERCIAL_INSURANCE or BLUE_CROSS_BLUE_SHIELD) and authorization (insuredAuthorizesAssignment and patientReleasesMedicalInfo). Example: [{"memberId": "TEST67890", "name": {"person": {"firstName": "Test", "lastName": "Spouse"}}, "otherPayer": {"id": {"payerId": "00000"}, "name": {"organization": "Example Payer"}}, "responsibilityLevel": "SECONDARY", "relationshipToInsured": "SPOUSE", "claimFilingIndicator": "COMMERCIAL_INSURANCE", "authorization": {"insuredAuthorizesAssignment": "YES", "patientReleasesMedicalInfo": "YES"}}].
- `patient` (`object`, optional): The patient, only when they are not the insured. All of name, dateOfBirth (YYYY-MM-DD), gender, address and relationshipToInsured (for example CHILD or SPOUSE) are required. Example: {"name": {"person": {"firstName": "Test", "lastName": "Child"}}, "dateOfBirth": "2015-01-01", "gender": "MALE", "relationshipToInsured": "CHILD", "address": {"addressLine1": "1 Example Ave", "city": "Springfield", "state": "IL", "postalCode": "12345"}}.

Example input: `{"authorization":{"patientReleasesMedicalInfo":"YES","insuredAuthorizesAssignment":"YES","providerAcceptsAssignment":"ASSIGNED","providerSignature":"ON_FILE"},"billing":{},"encounter":{"primaryDiagnosisCode":"J0190"},"insured":{},"payer":{},"purpose":"CHARGEABLE","service_lines":[],"submitter":{}}`

### `stedi_submit_professional_claim`

Submit Professional Claim · Write

Submit an 837P professional claim to a payer through Stedi, using JSON fields laid out like the CMS-1500 form.
Returns claimId and submissionId when the claim passes Stedi's edits; otherwise also an errors array, and the claim is stored as REJECTED (HTTP 201 either way).
Use to bill a payer for professional services. Run stedi_validate_professional_claim first to catch errors without sending; track the result with stedi_get_claim and stedi_get_claim_timeline. With a test API key, set the payer id to STEDI.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `authorization` (`object`, required): Signature and assignment-of-benefits indicators (CMS-1500 boxes 12, 13, 27, 31). Example: {"patientReleasesMedicalInfo": "YES", "insuredAuthorizesAssignment": "YES", "providerAcceptsAssignment": "ASSIGNED", "providerSignature": "ON_FILE"}.
- `billing` (`object`, required): Billing details (CMS-1500 boxes 25, 26, 28, 32, 33): the billing provider (name, address, NPI and taxonomy code), the tax ID, your patientControlNumber and the totalCharge as a decimal string; optionally the service facility. Example: {"billingProvider": {"name": {"organization": "Example Clinic"}, "identifiers": {"npi": "1999999984", "taxonomyCode": "207Q00000X"}, "address": {"addressLine1": "123 Example St", "city": "Springfield", "state": "IL", "postalCode": "12345"}}, "taxId": {"ein": "123456789"}, "patientControlNumber": "TEST-001", "totalCharge": "100.00"}.
- `encounter` (`object`, required): Clinical details of the encounter: at least the primaryDiagnosisCode (ICD-10, without the dot), plus optional other diagnoses, referring or supervising providers, clinical dates, prior authorization and resubmission details. Example: {"primaryDiagnosisCode": "J0190"}.
- `insured` (`object`, required): The subscriber who holds the policy being billed (CMS-1500 boxes 1, 1a, 4, 7, 11). Required: name, insuranceType (MEDICARE, MEDICAID, TRICARE, CHAMPVA, FECA_BLK_LUNG or OTHER) and paymentResponsibilityLevelCode (PRIMARY). Also send the memberId, dateOfBirth (YYYY-MM-DD), gender and address. Example: {"memberId": "TEST12345", "name": {"person": {"firstName": "Test", "lastName": "Patient"}}, "dateOfBirth": "1980-01-01", "gender": "FEMALE", "insuranceType": "OTHER", "paymentResponsibilityLevelCode": "PRIMARY", "address": {"addressLine1": "1 Example Ave", "city": "Springfield", "state": "IL", "postalCode": "12345"}}.
- `payer` (`object`, required): The payer being billed: its payer ID and name. With a test API key, use STEDI as the payer ID. Example: {"id": "60054", "name": {"organization": "Aetna"}}.
- `purpose` (`string`, required): Why the claim is submitted: CHARGEABLE for a standard fee-for-service claim with at least one charge, REPORTING for an encounter report with no payment expected, SUBROGATION_DEMAND for a subrogation claim. One of: `CHARGEABLE`, `REPORTING`, `SUBROGATION_DEMAND`.
- `service_lines` (`array`, required): The services billed (CMS-1500 box 24), one object per line: datesOfService (start and end), procedureCode (code and optional modifiers), lineItemChargeAmount, units, placeOfService and the diagnosisCodes it relates to. Example: [{"datesOfService": {"start": "2026-01-15", "end": "2026-01-15"}, "procedureCode": {"code": "99213"}, "lineItemChargeAmount": "100.00", "units": "1", "placeOfService": "11", "diagnosisCodes": ["J0190"]}].
- `submitter` (`object`, required): The entity submitting the claim to Stedi: its name, a contact phone number or email, and its ETIN if one was assigned. Example: {"name": {"organization": "Example Billing"}, "contact": {"phoneNumber": "5555551234"}}.
- `idempotency_key` (`string`, optional): A unique string for this submission. Retrying with the same key within 24 hours returns the original result instead of submitting the claim twice.
- `other_insured` (`array`, optional): Other coverage the patient holds, for coordination of benefits (CMS-1500 boxes 9, 9a, 9d), one object per policy. Each needs memberId, name, otherPayer (payer ID and name), responsibilityLevel (PRIMARY, SECONDARY or TERTIARY), relationshipToInsured, claimFilingIndicator (such as COMMERCIAL_INSURANCE or BLUE_CROSS_BLUE_SHIELD) and authorization (insuredAuthorizesAssignment and patientReleasesMedicalInfo). Example: [{"memberId": "TEST67890", "name": {"person": {"firstName": "Test", "lastName": "Spouse"}}, "otherPayer": {"id": {"payerId": "00000"}, "name": {"organization": "Example Payer"}}, "responsibilityLevel": "SECONDARY", "relationshipToInsured": "SPOUSE", "claimFilingIndicator": "COMMERCIAL_INSURANCE", "authorization": {"insuredAuthorizesAssignment": "YES", "patientReleasesMedicalInfo": "YES"}}].
- `patient` (`object`, optional): The patient, only when they are not the insured. All of name, dateOfBirth (YYYY-MM-DD), gender, address and relationshipToInsured (for example CHILD or SPOUSE) are required. Example: {"name": {"person": {"firstName": "Test", "lastName": "Child"}}, "dateOfBirth": "2015-01-01", "gender": "MALE", "relationshipToInsured": "CHILD", "address": {"addressLine1": "1 Example Ave", "city": "Springfield", "state": "IL", "postalCode": "12345"}}.

Example input: `{"authorization":{"patientReleasesMedicalInfo":"YES","insuredAuthorizesAssignment":"YES","providerAcceptsAssignment":"ASSIGNED","providerSignature":"ON_FILE"},"billing":{},"encounter":{"primaryDiagnosisCode":"J0190"},"insured":{},"payer":{},"purpose":"CHARGEABLE","service_lines":[],"submitter":{}}`

## Related

Other Healthcare & life sciences connectors ([all 16](/agentkit/connectors/?category=healthcare)):

- [Synapse MCP server](/agentkit/connectors/synapsemcp/): Vendor MCP, OAuth, 48 tools
- [Availity](/agentkit/connectors/availity/): Scalekit connector, Service account, 11 tools
- [Healthie](/agentkit/connectors/healthie/): Scalekit connector, API key, 44 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
