Update Credentialing Row
Updates a credentialing row and returns the updated record.
Endpoint
PATCH /v2/credentialing/{credentialing_id}
Path Parameters
| Parameter |
Type |
Required |
Description |
credentialing_id |
string |
Yes |
The credentialing row's id. |
| Header |
Required |
Description |
If-Match |
Yes |
ETag from a prior read, or *. A missing value returns 428; a stale one 412. |
Request Body
| Parameter |
Type |
Required |
Description |
in_network |
boolean or null |
No |
Whether the provider is in-network with this payer. On a billing-profiles organisation it's derived, like network_status. |
network_status |
string or null |
No |
Whether the relationship is in-network or out-of-network. On a billing-profiles organisation it's derived: IN_NETWORK when the row is in network on its dates, OUT_OF_NETWORK otherwise. Writing OUT_OF_NETWORK there ends a row that covered past dates today; otherwise it marks a provider row not_credentialed and clears a GROUP row's dates. |
effective_from |
string or null |
No |
|
effective_to |
string or null |
No |
|
submitted_at |
string or null |
No |
Date the application was submitted, YYYY-MM-DD. |
approved_at |
string or null |
No |
When the payer approved the application. Drives derived_status. |
committee |
boolean or null |
No |
Whether this row went through committee review. On a billing-profiles organisation it reads true exactly when committee_date is set, and true sent without a date sets committee_date to today. |
claim_hold |
object or null |
No |
Puts claims on hold for this row. null releases the hold. Not accepted on a GROUP row. |
cosigner |
object or null |
No |
The co-signer covering this row. null removes it. Not accepted on a GROUP row. |
committee_date |
string or null |
No |
The date the committee approved the provider, YYYY-MM-DD. Billing-profiles organisations only; left out of responses when unset. |
not_credentialed |
boolean or null |
No |
Provider rows: the payer refused to credential this provider. Billing-profiles organisations only; left out of responses unless true. |
not_accepted |
boolean or null |
No |
GROUP rows: the payer does not accept the clinic. Billing-profiles organisations only; left out of responses unless true. |
Request
Send only the fields to change:
curl --location '{base_url}/v2/credentialing/3a6d2f8b-1c4e-4b7a-8e2d-5f9c0a1b3d7e' \
--request PATCH \
--header 'Authorization: Bearer JWT_TOKEN' \
--header 'If-Match: "<etag>"' \
--header 'Content-Type: application/merge-patch+json' \
--data '{
"approved_at": "2026-07-15"
}'
Response
Success Response
Code: 200 OK
{
"id": "3a6d2f8b-1c4e-4b7a-8e2d-5f9c0a1b3d7e",
"billing_profile_id": "b7e4c1a2-6f3d-4e9b-9a51-2c8d0f7e3a14",
"payer_id": "9f1c8a2e-4b31-4d0a-9c77-2f5ab8e10c44",
"payer_name": null,
"entity": "d27a6b10-9f34-4e82-b5c1-7a03e8946fd2",
"entity_name": "Morgan Delgado",
"npi_type": "INDIVIDUAL",
"in_network": true,
"network_status": "IN_NETWORK",
"effective_from": "2026-01-01",
"effective_to": null,
"submitted_at": "2026-06-01",
"approved_at": "2026-07-15",
"committee": false,
"claim_hold": {
"from": "2026-09-01",
"to": null
},
"cosigner": {
"provider_id": "d27a6b10-9f34-4e82-b5c1-7a03e8946fd2",
"effective_from": "2026-01-01",
"effective_to": null
},
"derived_status": "ACTIVE",
"retroactive": {
"applies": true,
"days": 30
},
"profile_payer_credentialing_id": null,
"plan": "DEFAULT",
"credentialing_status": "CREDENTIALED",
"group_network_status": "IN_NETWORK"
}
Response Fields
| Field |
Type |
Description |
id |
string |
The credentialing row's id. |
billing_profile_id |
string or null |
The billing profile this record belongs to. |
payer_id |
string or null |
The billing-profile payer row's id — from List Billing Profile Payers. Not the payer registry id. |
payer_name |
string or null |
|
entity |
string |
Who this row is for: the literal string GROUP for the org-level row, or a provider id for an individual row. |
entity_name |
string or null |
Display name for entity — "Group" for the GROUP row, otherwise the provider's name. |
npi_type |
string or null |
Whether this is a group NPI or an individual NPI. One of GROUP, INDIVIDUAL. |
in_network |
boolean or null |
Whether the provider is in-network with this payer. On a billing-profiles organisation it's derived, like network_status. |
network_status |
string or null |
Whether the relationship is in-network or out-of-network. On a billing-profiles organisation it's derived: IN_NETWORK when the row is in network on its dates, OUT_OF_NETWORK otherwise. Writing OUT_OF_NETWORK there ends a row that covered past dates today; otherwise it marks a provider row not_credentialed and clears a GROUP row's dates. One of IN_NETWORK, OUT_OF_NETWORK. |
effective_from |
string or null |
|
effective_to |
string or null |
|
submitted_at |
string or null |
Date the application was submitted, YYYY-MM-DD. |
approved_at |
string or null |
When the payer approved the application. Drives derived_status. |
committee |
boolean |
Whether this row went through committee review. On a billing-profiles organisation it reads true exactly when committee_date is set, and true sent without a date sets committee_date to today. |
claim_hold |
object or null |
Puts claims on hold for this row. null releases the hold. Set through Hold Claims / Release Claims, or inline on create and update. See Claim Hold. |
cosigner |
object or null |
The co-signer covering this row while credentialing is in progress. null removes it. The co-signer must hold an ACTIVE credentialing row on the same billing profile and payer. See Cosigner. |
derived_status |
string |
Computed from submitted_at, approved_at, effective_from and effective_to — never set directly. One of NONE, SUBMITTED, DUE, ACTIVE, EXPIRED. |
retroactive |
object or null |
Derived from the payer's retroactive credentialing rules. Never set directly. See Retroactive. |
profile_payer_credentialing_id |
integer or null |
A stable id in the downstream billing system, once published. null before publish. |
plan |
string |
DEFAULT (every plan) or the card plan type this row overrides. Billing-profiles organisations only; absent elsewhere. |
credentialing_status |
string |
Computed from the row's dates and refusal flag — never set directly. A GROUP row: IN_NETWORK, PENDING, NOT_ACCEPTED or NO_CONTRACT. A provider row: CREDENTIALED, PENDING, NOT_CREDENTIALED, ENDED or NONE. Billing-profiles organisations only. One of IN_NETWORK, PENDING, NOT_ACCEPTED, NO_CONTRACT, CREDENTIALED, NOT_CREDENTIALED, ENDED, NONE. |
group_network_status |
string |
The credentialing_status of the clinic (GROUP) row for this row's billing profile, payer and plan, falling back to its DEFAULT row; NO_CONTRACT when there is none. Billing-profiles organisations only. One of IN_NETWORK, PENDING, NOT_ACCEPTED, NO_CONTRACT. |
not_credentialed |
boolean |
Provider rows: the payer refused to credential this provider. Billing-profiles organisations only; left out of responses unless true. |
not_accepted |
boolean |
GROUP rows: the payer does not accept the clinic. Billing-profiles organisations only; left out of responses unless true. |
committee_date |
string or null |
The date the committee approved the provider, YYYY-MM-DD. Billing-profiles organisations only; left out of responses when unset. |
Claim Hold
| Field |
Type |
Description |
from |
string or null |
When the hold starts. |
to |
string or null |
When the hold ends. null for an open-ended hold. |
Cosigner
| Field |
Type |
Description |
provider_id |
string or null |
The co-signing provider. |
effective_from |
string or null |
|
effective_to |
string or null |
|
Retroactive
| Field |
Type |
Description |
applies |
boolean |
Whether a retroactive grace period applies to this row. |
days |
integer |
Length of the retroactive window in days; 0 when applies is false. |
Error Response
Code: 400 Bad Request
{
"code": "bad_request",
"message": "Validation failed",
"errors": [
{
"field": "patient_id",
"message": "must be a string"
}
]
}
Every error has the same shape — a machine-readable code, a message, and an errors[] array that's empty when there's nothing field-specific to report. The HTTP status is authoritative.
| Status |
code |
Meaning |
400 Bad Request |
bad_request |
The request body or parameters failed validation. errors[] names the offending fields. |
401 Unauthorized |
unauthorized |
The access token is missing, malformed or expired. |
403 Forbidden |
forbidden |
The request references a resource outside the token's organisation or clinic scope. |
404 Not Found |
not_found |
No such resource, or it's outside your scope. |
409 Conflict |
conflict |
The record conflicts with existing state — see the endpoint's notes. |
412 Precondition Failed |
precondition_failed |
If-Match is stale. Re-read the resource and retry. |
423 Locked |
locked |
The organisation has a publish in progress. Retry once it finishes. |
428 Precondition Required |
precondition_required |
If-Match is required on this write. |
429 Too Many Requests |
rate_limited |
Rate limit exceeded. Back off and retry. |
500 Internal Server Error |
internal_error |
Unexpected server error. |
502 Bad Gateway |
upstream_error |
Upstream service failed or timed out. |
Notes
PATCH is a JSON Merge Patch (RFC 7386): an omitted field is left alone, an explicit null clears it, and an array replaces the existing one wholesale.
- Send at least one field — an empty body returns
400.
- Send
If-Match with the ETag from a prior read. * opts into last-writer-wins. A stale value returns 412; a missing one returns 428.
claim_hold: null releases the hold; cosigner: null removes the co-signer.
- Only the fields listed above are accepted; any other returns
400.
committee_date, not_credentialed (provider rows) and not_accepted (GROUP rows) are for billing-profiles organisations: elsewhere sending any of them — even as null or false — returns 400 BILLING_PROFILES_ONLY. network_status: "OUT_OF_NETWORK" on a billing-profiles organisation ends a row that covered past dates today; otherwise it marks a provider row not_credentialed and clears a GROUP row's dates.
- A history row (one ended by a delete, a payer detach or a provider delete) is re-opened by moving its
effective_to past the clinic-local today, or clearing it. A history row can't be edited (400 CRED_ROW_READ_ONLY) when its provider was deleted, its payer is no longer on its billing profile, or it is a plan override row whose plan had its own payer row when the row ended and that payer row has since been removed.
plan, include_plan_overrides, credentialing_status, group_network_status, committee_date, not_credentialed and not_accepted arrive with the payer-credentialing release. Until it reaches your environment they are absent from responses and refused on writes (400).
- When onboarding refuses a write, each
errors[] entry carries a code naming the rule that failed, and field names the field in snake_case, as this API spells it (an empty field means the whole row, or the whole create, not one field). A 400 for a body that fails this API's own schema check (an unknown field, a wrong type, a value outside the listed ones) has no code; its field is the JSON pointer of the offending value (/effective_from) or the name of the missing field. Codes from this endpoint: PAST_COVERAGE_LOCKED, CRED_ROW_READ_ONLY, REFUSAL_WITH_DATES, COSIGNER_NOT_AFFILIATED, COSIGNER_NO_EMR_ID, COSIGNER_SELF, COSIGNER_NOT_CREDENTIALED, FORBIDDEN_WHEN (a provider-row field on a GROUP row, or the reverse), BILLING_PROFILES_ONLY.