Resolves the location from the X-Vendor-Request-Key header (slot); no location_id in the path.
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:
Each matched procedure is marked Received with its paid amount.
The claim is marked Received.
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.
Request key returned by POST /locations/{location_id}/slots. Identifies the practice for a data request; valid for 6 hours (the access token's lifetime) and subject to the firm's concurrent-slot quota.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"TeamCare APIs","colors":{"primary":"#A67C00","light":"#FDCD0F","dark":"#8A6500"},"logo":{"light":"https://mintcdn.com/teamcare-dental/C9tikQPY1JpylSlb/logo/light.png?fit=max\u0026auto=format\u0026n=C9tikQPY1JpylSlb\u0026q=85\u0026s=f1b65ebedfb93ded01a7e1a65f291dbb","dark":"https://mintcdn.com/teamcare-dental/C9tikQPY1JpylSlb/logo/dark.png?fit=max\u0026auto=format\u0026n=C9tikQPY1JpylSlb\u0026q=85\u0026s=2d9b2d5e6d41fc3fc6f79d1f2d132cab"},"favicon":"https://mintcdn.com/teamcare-dental/KajxjrxLWTx1RX8g/favicon.png?fit=max\u0026auto=format\u0026n=KajxjrxLWTx1RX8g\u0026q=85\u0026s=519b83c5da513afc2c3dc325710f3fec","api":{"openapi":["https://app.teamcaredental.com/openapi-vendors.json","https://app.teamcaredental.com/openapi-ai-voice.json"],"mdx":{"server":"https://app.teamcaredental.com/api/v1/vendors"}},"navbar":{"links":[{"href":"https://app.teamcaredental.com","label":"Dashboard"}]},"footer":{"socials":{}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"teamcare-dental","hasAudioNarration":false,"actualSubdomain":"teamcare-dental","customDomains":["docs.teamcaredental.com"],"gitSource":{"type":"github","owner":"mintlify-community","repo":"docs-team-care-27871c41","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae1d4221b3fbf8078ed7d58","collectionId":"06742fb4-d19a-4188-8e8e-bbfef0a1fb4f","liveDeploymentHistoryId":"6ae1d4221b3fbf8078ed7d58","schemaVersion":"v3"},"entitlements":{},"buildId":"6ae1d4221b3fbf8078ed7d58","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"Core APIs","count":72},{"language":"default","tag":"Billing \u0026 Insurance","count":20},{"language":"default","tag":"Reporting","count":18},{"language":"default","tag":"AI Agent API","count":16},{"language":"default","tag":"Patients \u0026 Clinical","count":15},{"language":"default","tag":"Organization","count":10},{"language":"default","tag":"Stats","count":10},{"language":"default","tag":"Practice","count":10},{"language":"default","tag":"Foundations","count":9},{"language":"default","tag":"Patients","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"v2/api-reference/claim-payments/post-claim-payments","slug":"/v2/api-reference/claim-payments/post-claim-payments","pageMetadata":{"title":"Post claim payments","description":"Resolves the location from the `X-Vendor-Request-Key` header (slot); no `location_id` in the path.\n\nCreates insurance claim payments from a Stedi claim status response and posts them to the PMS.\n\nSend 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:\n\n- `claimStatus.amountPaid` as the check amount\n- `claimStatus.checkNumber` and `claimStatus.checkIssueDate`\n- `payer.organizationName` as the carrier name\n\n#### Matching\n\n- **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.\n- **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.\n\n#### PMS writeback\n\nEach claim payment is written to the PMS in the background. For Open Dental:\n\n1. Each matched procedure is marked Received with its paid amount.\n2. The claim is marked Received.\n3. The check is created and attached to the claim. Offices with Open Dental's `ClaimPaymentBatchOnly` preference use the batch claim payment endpoint.\n\nThe 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.\n\nWriteback 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.\n\nRequires 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.","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /claim_payments","href":"/v2/api-reference/claim-payments/post-claim-payments","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n h4: \"h4\",\n li: \"li\",\n ol: \"ol\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Resolves the location from the \", _jsx(_components.code, {\n children: \"X-Vendor-Request-Key\"\n }), \" header (slot); no \", _jsx(_components.code, {\n children: \"location_id\"\n }), \" in the path.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Creates insurance claim payments from a Stedi claim status response and posts them to the PMS.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send the claim status response exactly as returned by Stedi in \", _jsx(_components.code, {\n children: \"stedi_response\"\n }), \". \", _jsxs(_components.strong, {\n children: [\"One claim payment is created for each entry in \", _jsx(_components.code, {\n children: \"claims\"\n }), \" that matches a claim\"]\n }), \" (see Matching), using that claim’s:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"claimStatus.amountPaid\"\n }), \" as the check amount\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"claimStatus.checkNumber\"\n }), \" and \", _jsx(_components.code, {\n children: \"claimStatus.checkIssueDate\"\n })]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"payer.organizationName\"\n }), \" as the carrier name\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h4, {\n children: \"Matching\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Claim:\"\n }), \" \", _jsx(_components.code, {\n children: \"claimStatus.clearingHouseClaimNumber\"\n }), \" is matched to the claim’s \", _jsx(_components.code, {\n children: \"clearinghouse_claim_id\"\n }), \". Set it first with \", _jsx(_components.code, {\n children: \"PATCH /locations/{location_id}/insurance_claims/{insurance_claim_id}\"\n }), \". Entries with no \", _jsx(_components.code, {\n children: \"clearingHouseClaimNumber\"\n }), \", or one that matches no claim in the location, are skipped: no claim payment is created and they are not included in the response.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Procedures:\"\n }), \" each \", _jsx(_components.code, {\n children: \"serviceDetails[].service.procedureId\"\n }), \" must be the PMS procedure ID (Open Dental \", _jsx(_components.code, {\n children: \"ProcNum\"\n }), \") of a procedure on that claim that is not yet attached to a payment. Its \", _jsx(_components.code, {\n children: \"amountPaid\"\n }), \" is posted as the insurance payment for that procedure.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h4, {\n children: \"PMS writeback\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Each claim payment is written to the PMS in the background. For Open Dental:\"\n }), \"\\n\", _jsxs(_components.ol, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Each matched procedure is marked Received with its paid amount.\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"The claim is marked Received.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"The check is created and attached to the claim. Offices with Open Dental’s \", _jsx(_components.code, {\n children: \"ClaimPaymentBatchOnly\"\n }), \" preference use the batch claim payment endpoint.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"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.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"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.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Requires an API key with \", _jsx(_components.strong, {\n children: \"RCM enabled\"\n }), \". Keys without it receive \", _jsx(_components.code, {\n children: \"401\"\n }), \" with \", _jsx(_components.code, {\n children: \"{\\\"errors\\\": \\\"RCM is not enabled for this API key\\\"}\"\n }), \"; contact TeamCare support to enable it.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Post claim payments","description":"Resolves the location from the `X-Vendor-Request-Key` header (slot); no `location_id` in the path.\n\nCreates insurance claim payments from a Stedi claim status response and posts them to the PMS.\n\nSend 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:\n\n- `claimStatus.amountPaid` as the check amount\n- `claimStatus.checkNumber` and `claimStatus.checkIssueDate`\n- `payer.organizationName` as the carrier name\n\n#### Matching\n\n- **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.\n- **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.\n\n#### PMS writeback\n\nEach claim payment is written to the PMS in the background. For Open Dental:\n\n1. Each matched procedure is marked Received with its paid amount.\n2. The claim is marked Received.\n3. The check is created and attached to the claim. Offices with Open Dental's `ClaimPaymentBatchOnly` preference use the batch claim payment endpoint.\n\nThe 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.\n\nWriteback 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.\n\nRequires 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.","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /claim_payments","href":"/v2/api-reference/claim-payments/post-claim-payments","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Post claim payments","operationId":"locations_resources_claim_payments_create","tags":["Claim Payments"],"description":"Resolves the location from the `X-Vendor-Request-Key` header (slot); no `location_id` in the path.\n\nCreates insurance claim payments from a Stedi claim status response and posts them to the PMS.\n\nSend 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:\n\n- `claimStatus.amountPaid` as the check amount\n- `claimStatus.checkNumber` and `claimStatus.checkIssueDate`\n- `payer.organizationName` as the carrier name\n\n#### Matching\n\n- **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.\n- **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.\n\n#### PMS writeback\n\nEach claim payment is written to the PMS in the background. For Open Dental:\n\n1. Each matched procedure is marked Received with its paid amount.\n2. The claim is marked Received.\n3. The check is created and attached to the claim. Offices with Open Dental's `ClaimPaymentBatchOnly` preference use the batch claim payment endpoint.\n\nThe 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.\n\nWriteback 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.\n\nRequires 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.","parameters":[],"requestBody":"a55f9f0f-9d9f-47a9-980a-eb47beac0b22","responses":{"201":"e5a2adce-8dc2-4322-acc0-c2373db13b79","401":"936e520a-643d-4414-8743-d4d193b20385","403":"6a797ec3-8217-4063-bf29-ae24f47b4895","404":"45b721e9-3dff-47fa-abb5-fa815509d6c2","422":"85f6f244-b055-4c78-9d30-2ad9957c3818"},"security":["7f8aa6fb-2e95-4792-a1f3-18ab634cb768"],"method":"post","type":"path","servers":["3d52691d-7468-4300-888c-851159b27357"],"path":"/claim_payments","baseUrlOptions":["https://api.teamcaredental.com/api/v2/vendors"],"title":"Post claim payments","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"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,"isRequired":true,"uniqueKey":"claim_payment.stedi_response","typeLabel":"object"}},"isRequired":true,"uniqueKey":"claim_payment","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"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"}}}},"examples":{"Example":{"title":"Example","value":{"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"}}}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"e5a2adce-8dc2-4322-acc0-c2373db13b79":{"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","uniqueKey":"data.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","example":"claim_payment","uniqueKey":"data.items.[INDEX].type","typeLabel":"string"},"attributes":{"type":"object","properties":{"deleted":{"type":"boolean","uniqueKey":"data.items.[INDEX].attributes.deleted","typeLabel":"boolean"},"check_date":{"oneOf":[{"type":"string","format":"date","description":"Date the check was entered in the PMS.","uniqueKey":"data.items.[INDEX].attributes.check_date.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Date the check was entered in the PMS.","uniqueKey":"data.items.[INDEX].attributes.check_date.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].attributes.check_date","typeLabel":"string\u003cdate> | null"},"date_issued":{"oneOf":[{"type":"string","format":"date","description":"Date the payer issued the check.","uniqueKey":"data.items.[INDEX].attributes.date_issued.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Date the payer issued the check.","uniqueKey":"data.items.[INDEX].attributes.date_issued.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].attributes.date_issued","typeLabel":"string\u003cdate> | null"},"check_amount":{"oneOf":[{"type":"string","description":"Check amount, as a decimal string.","example":"68.0","uniqueKey":"data.items.[INDEX].attributes.check_amount.oneOf.0","typeLabel":"string"},{"type":"null","description":"Check amount, as a decimal string.","example":"68.0","uniqueKey":"data.items.[INDEX].attributes.check_amount.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].attributes.check_amount","typeLabel":"string | null"},"check_number":{"oneOf":[{"type":"string","uniqueKey":"data.items.[INDEX].attributes.check_number.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.items.[INDEX].attributes.check_number.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].attributes.check_number","typeLabel":"string | null"},"carrier_name":{"oneOf":[{"type":"string","uniqueKey":"data.items.[INDEX].attributes.carrier_name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.items.[INDEX].attributes.carrier_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].attributes.carrier_name","typeLabel":"string | null"},"note":{"oneOf":[{"type":"string","uniqueKey":"data.items.[INDEX].attributes.note.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.items.[INDEX].attributes.note.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].attributes.note","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","uniqueKey":"data.items.[INDEX].attributes.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"data.items.[INDEX].attributes","typeLabel":"object"}},"uniqueKey":"data.items.[INDEX]","typeLabel":"object"},"uniqueKey":"data","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"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"}}]},"examples":{"Example":{"title":"Example","value":{"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"}}]}}},"exampleType":"examples"}},"exampleType":"examples"},"936e520a-643d-4414-8743-d4d193b20385":{"description":"Missing/invalid/expired JWT, or missing/invalid/expired X-Vendor-Request-Key.","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"string","uniqueKey":"errors","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"not_authorized":{"title":"not_authorized","value":{"errors":"not authorized"}},"rcm_not_enabled":{"title":"rcm_not_enabled","value":{"errors":"RCM is not enabled for this API key"}}},"exampleType":"examples"}},"exampleType":"examples"},"6a797ec3-8217-4063-bf29-ae24f47b4895":{"description":"The credential may not access this resource.","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"string","uniqueKey":"errors","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"errors":"access Denied"},"examples":{"Example":{"title":"Example","value":{"errors":"access Denied"}}},"exampleType":"examples"}},"exampleType":"examples"},"45b721e9-3dff-47fa-abb5-fa815509d6c2":{"description":"Resource not found.","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"string","uniqueKey":"errors","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"errors":"resource not found"},"examples":{"Example":{"title":"Example","value":{"errors":"resource not found"}}},"exampleType":"examples"}},"exampleType":"examples"},"85f6f244-b055-4c78-9d30-2ad9957c3818":{"description":"The request could not be processed.","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"string","uniqueKey":"errors","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"errors":"..."},"examples":{"Example":{"title":"Example","value":{"errors":"..."}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"7f8aa6fb-2e95-4792-a1f3-18ab634cb768":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT returned by POST /auth/token. Valid for six hours.","scopes":[],"schemeName":"bearerAuth"},"vendorRequestKey":{"type":"apiKey","in":"header","name":"X-Vendor-Request-Key","description":"Request key returned by POST /locations/{location_id}/slots. Identifies the practice for a data request; valid for 6 hours (the access token's lifetime) and subject to the firm's concurrent-slot quota.","scopes":[],"schemeName":"vendorRequestKey"}}},"servers":{"3d52691d-7468-4300-888c-851159b27357":{"url":"https://api.teamcaredental.com/api/v2/vendors"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT returned by POST /auth/token. Valid for six hours.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"JWT returned by POST /auth/token. Valid for six hours.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"},{"scheme":{"type":"apiKey","in":"header","name":"X-Vendor-Request-Key","description":"Request key returned by POST /locations/{location_id}/slots. Identifies the practice for a data request; valid for 6 hours (the access token's lifetime) and subject to the firm's concurrent-slot quota.","scopes":[],"schemeName":"vendorRequestKey"},"schema":{"title":"X-Vendor-Request-Key","type":"string","description":"Request key returned by POST /locations/{location_id}/slots. Identifies the practice for a data request; valid for 6 hours (the access token's lifetime) and subject to the firm's concurrent-slot quota.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"vendorRequestKey","name":"X-Vendor-Request-Key"}],"title":"bearerAuth \u0026 vendorRequestKey"}]},"originalFileLocation":"https://app.teamcaredental.com/openapi-vendors-v2.json"},"subdomain":"teamcare-dental","siteName":"TeamCare APIs","title":"Post claim payments - TeamCare APIs","navMaps":{"firstHrefInVersion":{"v2":{"href":"/v2/api-reference/claim-payments/post-claim-payments","matchLevel":0},"v1":{"href":"/api-reference/claim-payments/post-claim-payments","matchLevel":1}},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T10:53:28.596Z","originalFileLocation":"v2/api-reference/claim-payments/post-claim-payments.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Resolves the location from the X-Vendor-Request-Key header (slot); no location_id in the path. 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\u0026#x27;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\u0026#x27;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\u0026#x27;s ClaimPaymentBatchOnly preference use the batch claim payment endpoint. The check amount must equal the total paid across the claim\u0026#x27;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 {\u0026quot;errors\u0026quot;: \u0026quot;RCM is not enabled for this API key\u0026quot;}; contact TeamCare support to enable it.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TeamCare APIs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Post claim payments - TeamCare APIs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Resolves the location from the X-Vendor-Request-Key header (slot); no location_id in the path. 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\u0026#x27;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\u0026#x27;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\u0026#x27;s ClaimPaymentBatchOnly preference use the batch claim payment endpoint. The check amount must equal the total paid across the claim\u0026#x27;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 {\u0026quot;errors\u0026quot;: \u0026quot;RCM is not enabled for this API key\u0026quot;}; contact TeamCare support to enable it.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TeamCare APIs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://teamcare-dental.mintlify.app/_mintlify/api/og/v2?division=Billing+%26+Insurance\u0026amp;title=Post+claim+payments\u0026amp;description=Resolves+the+location+from+the+%60X-Vendor-Request-Key%60+header+%28slot%29%3B+no+%60location_id%60+in+the+path.%0A%0ACreates+insurance+claim+payments+from+a+Stedi+claim+status+r\u0026amp;theme=3ccd0e1a60db7aabd74bc034\u0026amp;signature=11bfdb82685e3ae0382ed83aee8d9d263566f0bcd34c37edfd2ae91a0e312476\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Post claim payments - TeamCare APIs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Resolves the location from the X-Vendor-Request-Key header (slot); no location_id in the path. 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\u0026#x27;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\u0026#x27;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\u0026#x27;s ClaimPaymentBatchOnly preference use the batch claim payment endpoint. The check amount must equal the total paid across the claim\u0026#x27;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 {\u0026quot;errors\u0026quot;: \u0026quot;RCM is not enabled for this API key\u0026quot;}; contact TeamCare support to enable it.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://teamcare-dental.mintlify.app/_mintlify/api/og/v2?division=Billing+%26+Insurance\u0026amp;title=Post+claim+payments\u0026amp;description=Resolves+the+location+from+the+%60X-Vendor-Request-Key%60+header+%28slot%29%3B+no+%60location_id%60+in+the+path.%0A%0ACreates+insurance+claim+payments+from+a+Stedi+claim+status+r\u0026amp;theme=3ccd0e1a60db7aabd74bc034\u0026amp;signature=11bfdb82685e3ae0382ed83aee8d9d263566f0bcd34c37edfd2ae91a0e312476\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/teamcare-dental/wlYo3q_II6rf8LJ-/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TeamCare APIs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#A67C00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v2/api-reference/claim-payments/post-claim-payments.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.teamcaredental.com/#organization\",\"name\":\"TeamCare APIs\",\"url\":\"https://docs.teamcaredental.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/teamcare-dental/C9tikQPY1JpylSlb/logo/light.png?fit=max\u0026auto=format\u0026n=C9tikQPY1JpylSlb\u0026q=85\u0026s=f1b65ebedfb93ded01a7e1a65f291dbb\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.teamcaredental.com#website\",\"name\":\"TeamCare APIs\",\"url\":\"https://docs.teamcaredental.com\",\"publisher\":{\"@id\":\"https://docs.teamcaredental.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments#webpage\",\"url\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments\",\"name\":\"Post claim payments\",\"description\":\"Resolves the location from the X-Vendor-Request-Key header (slot); no location_id in the path. 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.\",\"dateModified\":\"2026-10-28T10:53:28.596Z\",\"isPartOf\":{\"@id\":\"https://docs.teamcaredental.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Core APIs\",\"item\":\"https://docs.teamcaredental.com/v2/core-apis\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Billing \u0026 Insurance\",\"item\":\"https://docs.teamcaredental.com/v2/api-reference/ledger-transactions/list-ledger-transactions\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Post claim payments\",\"item\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments#apireference\",\"headline\":\"Post claim payments\",\"name\":\"Post claim payments\",\"description\":\"Resolves the location from the X-Vendor-Request-Key header (slot); no location_id in the path. 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.\",\"url\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments\",\"mainEntityOfPage\":{\"@id\":\"https://docs.teamcaredental.com/v2/api-reference/claim-payments/post-claim-payments#webpage\"},\"dateModified\":\"2026-10-28T10:53:28.596Z\",\"publisher\":{\"@id\":\"https://docs.teamcaredental.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.teamcaredental.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TeamCare APIs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"TeamCare APIs","nav":{"global":null,"versions":[{"version":"v2","default":true,"groups":[{"group":"Getting Started","pages":[{"title":"TeamCare APIs","mode":"wide","href":""},{"title":"Getting Started","sidebarTitle":"Getting Started","href":"/getting-started"},{"title":"Environments","href":"/v2/environments"},{"title":"Quickstart","href":"/v2/quickstart"},{"title":"Changelog","href":"/changelog"}]},{"group":"Core APIs","pages":[{"title":"Core APIs","href":"/v2/core-apis"},{"group":"Authentication","pages":[{"title":"Create token","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /auth/token","href":"/v2/api-reference/authentication/create-token"}]},{"group":"Practice","expanded":false,"pages":[{"title":"List organizations","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /organizations","href":"/v2/api-reference/organizations/list-organizations"},{"title":"List locations","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /locations","href":"/v2/api-reference/locations/list-locations"},{"title":"Request a slot","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /locations/{location_id}/slots","href":"/v2/api-reference/slots/request-a-slot"},{"title":"List operatories","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /operatories","href":"/v2/api-reference/operatories/list-operatories"},{"title":"List employees","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /employees","href":"/v2/api-reference/employees/list-employees"},{"title":"Set third-party identifier","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /third_party_identifiers","href":"/v2/api-reference/externals/set-third-party-identifier"}]},{"group":"Patients \u0026 Clinical","expanded":false,"pages":[{"group":"Patients","pages":[{"group":"Metrics","pages":[{"title":"New patients","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /patients/new_patients","href":"/v2/api-reference/metrics/new-patients"},{"title":"Reactivation attended","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /patients/reactivation_attended","href":"/v2/api-reference/metrics/reactivation-attended"}]},{"title":"List patients","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /patients","href":"/v2/api-reference/patients/list-patients"}]},{"title":"List referrals","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /referrals","href":"/v2/api-reference/patients-referrals/list-referrals"},{"title":"List treatment plans","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /treatment_plans","href":"/v2/api-reference/treatment-plan/list-treatment-plans"},{"title":"List treatments","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /treatments","href":"/v2/api-reference/treatments/list-treatments"}]},{"group":"Scheduling","expanded":false,"pages":[{"title":"List appointments","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /appointments","href":"/v2/api-reference/appointments/list-appointments"},{"title":"List appointment types","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /appointment_types","href":"/v2/api-reference/appointment-types/list-appointment-types"},{"title":"List scheduling leads","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /scheduling_leads","href":"/v2/api-reference/scheduling-leads/list-scheduling-leads"}]},{"group":"Billing \u0026 Insurance","expanded":false,"pages":[{"title":"List ledger transactions","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /ledger_transactions","href":"/v2/api-reference/ledger-transactions/list-ledger-transactions"},{"title":"List insurance claims","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /insurance_claims","href":"/v2/api-reference/insurance-claims/list-insurance-claims"},{"title":"Update insurance claims","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json patch /insurance_claims/{insurance_claim_id}","href":"/v2/api-reference/insurance-claims/update-insurance-claims"},{"title":"List insurance verifications","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /insurance_verifications","href":"/v2/api-reference/insurance-verifications/list-insurance-verifications"},{"title":"Update insurance verifications","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json patch /insurance_verifications/{insurance_verification_id}","href":"/v2/api-reference/insurance-verifications/update-insurance-verifications"},{"title":"List claim payments","description":"Resolves the location from the `X-Vendor-Request-Key` header (slot); no `location_id` in the path.\n\nThis endpoint retrieves insurance claim payments (checks and EFTs) posted for a specific location with `POST /locations/{location_id}/claim_payments`.\n\n#### Parameters\n\n- after: A parameter to specify the cursor for pagination.\n- items: A parameter to specify the number of items to be returned.\n- The `q[fetch_modified_since]` is used to capture the delta changes, pass the datetime in UTC as shown in example below\n\n```json\n{\n \"q\": {\n \"fetch_modified_since\": \"2026-10-01T00:00:00.000Z\"\n }\n}\n```","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /claim_payments","href":"/v2/api-reference/claim-payments/list-claim-payments"},{"title":"Post claim payments","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /claim_payments","href":"/v2/api-reference/claim-payments/post-claim-payments"},{"title":"List insurance plans","description":"Resolves the location from the `X-Vendor-Request-Key` header (slot); no `location_id` in the path.\n\n**This endpoint is not yet available in production.**\n\nThis endpoint retrieves insurance plans for a specific location.\n\n#### Parameters\n\n- after: A parameter to specify the cursor for pagination.\n- items: A parameter to specify the number of items to be returned.\n- The `q[fetch_modified_since]` is used to capture the delta changes, pass the datetime in UTC as shown in example below\n\n```json\n{\n \"q\": {\n \"fetch_modified_since\": \"2025-12-02T01:58:00.164Z\"\n }\n}\n```","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /insurance_plans","href":"/v2/api-reference/insurance-plans/list-insurance-plans"},{"title":"List fee schedules","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /fee_schedules","href":"/v2/api-reference/fee-schedules/list-fee-schedules"},{"title":"List fee schedule items","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /fee_schedule_items","href":"/v2/api-reference/fee-schedule-items/list-fee-schedule-items"}]},{"group":"Reporting","expanded":false,"pages":[{"group":"Stats","pages":[{"group":"Daily","pages":[{"title":"Daily stats","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /daily/stats","href":"/v2/api-reference/daily/daily-stats"},{"title":"Daily schedule stats","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /daily/schedule_stats","href":"/v2/api-reference/daily/daily-schedule-stats"}]},{"group":"Monthly","pages":[{"title":"Monthly stats","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /monthly/stats","href":"/v2/api-reference/monthly/monthly-stats"},{"title":"Monthly schedule stats","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /monthly/schedule_stats","href":"/v2/api-reference/monthly/monthly-schedule-stats"}]},{"title":"Current stats","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json get /current/stats","href":"/v2/api-reference/stats/current-stats"}]},{"group":"Dashboard","pages":[{"title":"Lifetime stats","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /dashboard/lifetime_stats","href":"/v2/api-reference/dashboard/lifetime-stats"},{"title":"Dashboard goals","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /dashboard/goals","href":"/v2/api-reference/dashboard/dashboard-goals"},{"title":"Dashboard schedule","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /dashboard/schedule","href":"/v2/api-reference/dashboard/dashboard-schedule"},{"title":"Dashboard leaderboards","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors-v2.json post /dashboard/leaderboards","href":"/v2/api-reference/dashboard/dashboard-leaderboards"}]}]}]},{"group":"AI Agent API","pages":[{"title":"AI Agent APIs","sidebarTitle":"AI Agent APIs","href":"/ai-voice/index"},{"title":"Getting Started","sidebarTitle":"Getting Started","href":"/ai-voice/getting-started"},{"title":"Quickstart","sidebarTitle":"Quickstart","href":"/ai-voice/quickstart"},{"title":"Authentication","sidebarTitle":"Authentication","href":"/ai-voice/authentication"},{"title":"Error Codes","sidebarTitle":"Error Codes","href":"/ai-voice/error-codes"},{"title":"Versioning Strategy","sidebarTitle":"Versioning Strategy","href":"/ai-voice/versioning-strategy"},{"group":"Organization","pages":[{"group":"Patient","pages":[{"title":"Search patients","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json get /organizations/{organization_id}/patients/search","href":"/api-reference/patient/search-patients"},{"title":"List patient appointments","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json get /organizations/{organization_id}/patients/{patient_id}/appointments","href":"/api-reference/patient/list-patient-appointments"}]},{"group":"Appointment Types","pages":[{"title":"List appointment types","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-vendors.json get /locations/{location_id}/appointment_types","href":"/api-reference/appointment-types/list-appointment-types"},{"title":"Create appointment type","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json post /organizations/{organization_id}/appointment_types","href":"/api-reference/appointment-types/create-appointment-type"}]},{"group":"Available Slots","pages":[{"title":"List available slots","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json get /organizations/{organization_id}/available_slots","href":"/api-reference/available-slots/list-available-slots"}]},{"group":"Appointment","pages":[{"title":"Schedule appointment","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json post /organizations/{organization_id}/appointments/schedule","href":"/api-reference/appointment/schedule-appointment"},{"title":"Reschedule appointment","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json post /organizations/{organization_id}/appointments/{appointment_id}/reschedule","href":"/api-reference/appointment/reschedule-appointment"},{"title":"Confirm appointment","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json post /organizations/{organization_id}/appointments/{appointment_id}/confirm","href":"/api-reference/appointment/confirm-appointment"},{"title":"Cancel appointment","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json post /organizations/{organization_id}/appointments/{appointment_id}/cancel","href":"/api-reference/appointment/cancel-appointment"}]},{"title":"List organizations","deprecated":null,"version":null,"openapi":"https://app.teamcaredental.com/openapi-ai-voice.json get /organizations","href":"/api-reference/organizations/list-organizations"}]}]},{"group":"Foundations","pages":[{"title":"Authentication","sidebarTitle":"Authentication","href":"/authentication"},{"title":"Error Codes","href":"/v2/error-codes"},{"title":"Versioning Strategy","href":"/v2/versioning-strategy"},{"title":"Output Formats","sidebarTitle":"Output Formats","href":"/output-formats"},{"title":"Pagination","sidebarTitle":"Pagination","href":"/pagination"},{"title":"Filteration","sidebarTitle":"Filteration","href":"/filteration"},{"title":"Concurrency Limits","sidebarTitle":"Concurrency Limits","href":"/concurrency-limits"}]}]},{"version":"v1","pages":[{"title":"v1","href":"/api-reference/claim-payments/post-claim-payments"}]}]},"title":"Post claim payments - TeamCare APIs","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-DmVyH30O.js","utils-BHQqGGOd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CD-E4BIt.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp5Lq9Ds.js","snippetPresets-C4xAVCFP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-CBCH2P7b.js","ApiExamples-CgXVLxUC.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BF8I5oUf.js","shallow-Byd0lWnC.js","getApiPlaygroundDisplay-BGOZG1OK.js","CodeSnippet-CpvQL0CY.js","CodeSnippets-B8wkBKXa.js","getPastedJson-Ry3scI3Y.js","icon-D7a9HcdD.js","MethodPill-CJ8pmHhz.js","DuplicateIcon-rh1HJF0t.js","createIcon-DvGznqYs.js","DynamicMarkdown-Cc6AuSHS.js","SectionHeading-B4A0S-ep.js","axios-vUo_bRtp.js","Markdown-Cc16CX65.js","clsx-Cs6nMGht.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-zbf22OZA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C_fs-y5n.js"]}