> ## Documentation Index
> Fetch the complete documentation index at: https://docs.teamcaredental.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Post claim payments

> Creates insurance claim payments from a Stedi claim status response and posts them to the PMS.

Send the claim status response exactly as returned by Stedi in `stedi_response`. **One claim payment is created for each entry in `claims` that matches a claim** (see Matching), using that claim's:

- `claimStatus.amountPaid` as the check amount
- `claimStatus.checkNumber` and `claimStatus.checkIssueDate`
- `payer.organizationName` as the carrier name

#### Matching

- **Claim:** `claimStatus.clearingHouseClaimNumber` is matched to the claim's `clearinghouse_claim_id`. Set it first with `PATCH /locations/{location_id}/insurance_claims/{insurance_claim_id}`. Entries with no `clearingHouseClaimNumber`, or one that matches no claim in the location, are skipped: no claim payment is created and they are not included in the response.
- **Procedures:** each `serviceDetails[].service.procedureId` must be the PMS procedure ID (Open Dental `ProcNum`) of a procedure on that claim that is not yet attached to a payment. Its `amountPaid` is posted as the insurance payment for that procedure.

#### PMS writeback

Each claim payment is written to the PMS in the background. For Open Dental:

1. Each matched procedure is marked Received with its paid amount.
2. The claim is marked Received.
3. The check is created and attached to the claim. Offices with Open Dental's `ClaimPaymentBatchOnly` preference use the batch claim payment endpoint.

The check amount must equal the total paid across the claim's received procedures. Write-offs and deductibles are not posted: a claim status response does not include them.

Writeback runs only for Open Dental practices. If a procedure cannot be matched to an unpaid procedure on the claim, the writeback stops at that procedure and records an error; procedures before it may already be marked Received.

Requires an API key with **RCM enabled**. Keys without it receive `401` with `{"errors": "RCM is not enabled for this API key"}`; contact TeamCare support to enable it.



## OpenAPI

````yaml https://app.teamcaredental.com/openapi-vendors.json post /locations/{location_id}/claim_payments
openapi: 3.1.0
info:
  title: TeamCare Vendor API
  version: 1.0.0
  description: >-
    > ⚠️ **Deprecation notice:** Support for the v1 Vendor API ends on
    **November 7, 2026** (end of the first week of November). Please migrate to
    **v2**, which moves to `https://api.teamcaredental.com/api/v2/vendors` and
    replaces the per-request `location_id` in the URL with a slot-based model:
    request a location's slot once, then pull all of its data using the
    `X-Vendor-Request-Key` header. See the
    [changelog](https://docs.teamcaredental.com/changelog) for the full
    migration guide.


    Vendor APIs for integrating dental office data. HIPAA-compliant and opt-in.
servers:
  - url: https://app.teamcaredental.com/api/v1/vendors
security:
  - bearerAuth: []
paths:
  /locations/{location_id}/claim_payments:
    post:
      tags:
        - Claim Payments
      summary: Post claim payments
      description: >-
        Creates insurance claim payments from a Stedi claim status response and
        posts them to the PMS.


        Send the claim status response exactly as returned by Stedi in
        `stedi_response`. **One claim payment is created for each entry in
        `claims` that matches a claim** (see Matching), using that claim's:


        - `claimStatus.amountPaid` as the check amount

        - `claimStatus.checkNumber` and `claimStatus.checkIssueDate`

        - `payer.organizationName` as the carrier name


        #### Matching


        - **Claim:** `claimStatus.clearingHouseClaimNumber` is matched to the
        claim's `clearinghouse_claim_id`. Set it first with `PATCH
        /locations/{location_id}/insurance_claims/{insurance_claim_id}`. Entries
        with no `clearingHouseClaimNumber`, or one that matches no claim in the
        location, are skipped: no claim payment is created and they are not
        included in the response.

        - **Procedures:** each `serviceDetails[].service.procedureId` must be
        the PMS procedure ID (Open Dental `ProcNum`) of a procedure on that
        claim that is not yet attached to a payment. Its `amountPaid` is posted
        as the insurance payment for that procedure.


        #### PMS writeback


        Each claim payment is written to the PMS in the background. For Open
        Dental:


        1. Each matched procedure is marked Received with its paid amount.

        2. The claim is marked Received.

        3. The check is created and attached to the claim. Offices with Open
        Dental's `ClaimPaymentBatchOnly` preference use the batch claim payment
        endpoint.


        The check amount must equal the total paid across the claim's received
        procedures. Write-offs and deductibles are not posted: a claim status
        response does not include them.


        Writeback runs only for Open Dental practices. If a procedure cannot be
        matched to an unpaid procedure on the claim, the writeback stops at that
        procedure and records an error; procedures before it may already be
        marked Received.


        Requires an API key with **RCM enabled**. Keys without it receive `401`
        with `{"errors": "RCM is not enabled for this API key"}`; contact
        TeamCare support to enable it.
      operationId: locations_resources_claim_payments_create
      parameters:
        - name: location_id
          in: path
          required: true
          description: The ID of the location for which claim payments are posted.
          schema:
            type: string
            example: '58'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - claim_payment
              properties:
                claim_payment:
                  type: object
                  required:
                    - stedi_response
                  properties:
                    stedi_response:
                      type: object
                      description: >-
                        The Stedi claim status response, unchanged. TeamCare
                        reads `controlNumber`, `payer.organizationName` and, for
                        each entry in `claims`, `claimStatus` and
                        `serviceDetails`.
                      additionalProperties: true
            example:
              claim_payment:
                stedi_response:
                  claims:
                    - claimStatus:
                        amountPaid: '68.00'
                        checkIssueDate: '2025-07-17'
                        checkNumber: '123456789'
                        clearingHouseClaimNumber: CH-0098431
                        patientAccountNumber: 17/3
                        statusCategoryCode: F1
                        statusCategoryCodeValue: Finalized/Payment - The claim/line has been paid.
                        statusCode: '65'
                        submittedAmount: '68.00'
                      serviceDetails:
                        - service:
                            procedureId: '21'
                            amountPaid: '60.00'
                            submittedAmount: '60.00'
                            submittedUnits: '1'
                        - service:
                            procedureId: '23'
                            amountPaid: '8.00'
                            submittedAmount: '8.00'
                            submittedUnits: '1'
                  controlNumber: '123456789'
                  payer:
                    organizationName: UNITEDHEALTHCARE
                    payerIdentification: '87726'
      responses:
        '201':
          description: >-
            The created claim payments, one per matched claim in the Stedi
            response. Empty when no claim matches.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        type:
                          type: string
                          example: claim_payment
                        attributes:
                          type: object
                          properties:
                            deleted:
                              type: boolean
                            check_date:
                              type:
                                - string
                                - 'null'
                              format: date
                              description: Date the check was entered in the PMS.
                            date_issued:
                              type:
                                - string
                                - 'null'
                              format: date
                              description: Date the payer issued the check.
                            check_amount:
                              type:
                                - string
                                - 'null'
                              description: Check amount, as a decimal string.
                              example: '68.0'
                            check_number:
                              type:
                                - string
                                - 'null'
                            carrier_name:
                              type:
                                - string
                                - 'null'
                            note:
                              type:
                                - string
                                - 'null'
                            updated_at:
                              type: string
                              format: date-time
              example:
                data:
                  - id: '301'
                    type: claim_payment
                    attributes:
                      deleted: false
                      check_date: null
                      date_issued: '2025-07-17'
                      check_amount: '68.0'
                      check_number: '123456789'
                      carrier_name: UNITEDHEALTHCARE
                      note: Posted through Stedi 123456789
                      updated_at: '2026-10-09T09:15:02.000Z'
        '401':
          description: >-
            Missing, invalid or expired token, or the API key does not have RCM
            enabled.
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: string
              examples:
                not_authorized:
                  value:
                    errors: not authorized
                rcm_not_enabled:
                  value:
                    errors: RCM is not enabled for this API key
        '403':
          description: The credential may not access this resource.
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: string
              example:
                errors: access Denied
        '404':
          description: Resource not found.
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: string
              example:
                errors: resource not found
        '422':
          description: The request could not be processed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: string
              example:
                errors: ...
        '429':
          description: >-
            Concurrency limit exceeded. The request was not executed; retry is
            safe.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: string
                  sync_type:
                    type: string
                    enum:
                      - initial
                      - incremental
                  max_concurrent_locations:
                    type: integer
                  active_location_ids:
                    type: array
                    items:
                      type: integer
                  retry_after_seconds:
                    type: integer
              example:
                errors: >-
                  Too many locations syncing concurrently. At most 5 locations
                  may have initial sync requests in flight at a time.
                sync_type: initial
                max_concurrent_locations: 5
                active_location_ids:
                  - 101
                  - 102
                  - 103
                  - 104
                  - 105
                retry_after_seconds: 1
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT returned by POST /auth/token. Valid for six hours.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.