UMTenantConfig
Custom resource that configures forwarding of Prior Auth submissions to a payer's utilization management (UM) system. Its StructureDefinition is registered by Payerbox at startup; instances are managed over the FHIR REST API at <base>/fhir/UMTenantConfig.
One instance per payer per UM system. Instances are re-read about once a minute, so changes apply without a restart. Narrative overview: UM System Integration.
Authentication
UMTenantConfig is an administrative resource — access is governed by the same Aidbox access policies as any other resource, and is not part of the PAS partner-facing scope set. See Authentication.
Routing
| Element | Card. | Type | Description |
|---|---|---|---|
connector | 1..1 | code | guidingcare or pas-passthrough. Any other value invalidates the config |
insurer.reference | 0..1 | string | Organization reference matched against Claim.insurer |
insurer.identifier.system | 0..1 | uri | Identifier system matched against the submitted insurer Organization |
insurer.identifier.value | 0..1 | string | Identifier value |
Identifier match is attempted first and requires the insurer Organization to be present in the submitted Bundle. Reference match compares the last two path segments, so Organization/payer-1 and http://example.org/fhir/Organization/payer-1 are equivalent.
Endpoint and delivery policy
| Element | Card. | Type | Default | Description |
|---|---|---|---|---|
endpoint.baseUrl | 0..1 | url | — | Base URL of the UM API |
endpoint.timeoutMs | 0..1 | integer | 30000 | Per-attempt request timeout |
endpoint.connectTimeoutMs | 0..1 | integer | 10000 | Connect timeout |
endpoint.retry.maxAttempts | 0..1 | integer | 5 | Delivery attempts before the Task fails |
endpoint.retry.backoffSeconds | 0..* | integer | [30, 120, 600, 1800] | Delay per attempt; the last value repeats |
endpoint.reconcile.maxAttempts | 0..1 | integer | 5 | Reconciliation attempts for an ambiguous delivery |
endpoint.reconcile.delaySeconds | 0..1 | integer | 300 | Delay between reconciliation attempts |
endpoint.headers.name | 1..1 | string | — | Gateway header name |
endpoint.headers.value | 0..1 | string | — | Literal header value |
endpoint.headers.valueEnv | 0..1 | string | — | Environment variable holding the value |
Each header entry needs exactly one of value or valueEnv.
Authentication to the UM system
| Element | Card. | Type | Description |
|---|---|---|---|
endpoint.auth.type | 0..1 | code | oauth2-client-credentials, api-key, or none (default when absent) |
endpoint.auth.tokenUrl | 0..1 | url | OAuth2 token endpoint |
endpoint.auth.clientId | 0..1 | string | OAuth2 client id, literal |
endpoint.auth.clientIdEnv | 0..1 | string | Environment variable holding the client id |
endpoint.auth.clientSecretEnv | 0..1 | string | Environment variable holding the client secret |
endpoint.auth.scope | 0..1 | string | OAuth2 scope, literal |
endpoint.auth.scopeEnv | 0..1 | string | Environment variable holding the scope |
endpoint.auth.headerName | 0..1 | string | Header carrying the key, for api-key |
endpoint.auth.valueEnv | 0..1 | string | Environment variable holding the key value |
Secrets are always referenced by environment-variable name. There is no element that stores a secret value.
Transform
| Element | Card. | Type | Description |
|---|---|---|---|
insurerReference | 0..1 | string | Organization reference stamped on the outgoing UM Claim. Required in practice — a blank value invalidates the config |
defaults.authRequester | 0..1 | string | Fallback authRequester. Without it, delivery fails unless the request supplies the value |
defaults.authType | 0..1 | string | Fallback authType |
defaults.treatmentType | 0..1 | string | Fallback treatmentType |
defaults.authCurrentOwner | 0..1 | string | Sent only when present |
requiredSupplemental.name | 1..1 | string | Supplemental field the UM tenant template requires |
requiredSupplemental.value | 0..1 | string | Fallback value when the request carries no matching Claim.supportingInfo entry |
lobBenId.identifierSystem | 0..1 | uri | Coverage.identifier system carrying the member's line-of-business benefit id |
conceptMaps.name | 1..1 | string | Mapping name from the table below |
conceptMaps.reference | 1..1 | string | ConceptMap reference |
inquireRefresh | 0..1 | boolean | Fetch the live decision from the UM system on Claim/$inquire (default false) |
passThroughExtensions | 0..1 | boolean | Forward vendor extensions already present on the inbound Claim (default false) |
The transform elements above are consumed by the guidingcare connector. pas-passthrough forwards the PAS Bundle unchanged and uses only routing, endpoint and inquireRefresh.
ConceptMap names
conceptMaps.name | Translates | Notes |
|---|---|---|
claimType->authClass | Claim.type → UM authorization class | Falls back to outpatient |
service->authType | Claim.item[0].productOrService → authType | Overridden by Claim.subType; falls back to defaults.authType |
service->treatmentType | Claim.item[0].productOrService → treatmentType | Falls back to defaults.treatmentType |
priority->authPriority | Claim.priority → UM priority | Required — no mapping and no unmapped default fails delivery |
pos->label | Claim.item[0].locationCodeableConcept → place-of-service label | May depend on the resolved auth class via dependsOn on property urn:prior-auth:um:authClass |
careTeamRole->slot | Claim.careTeam.role → referred-by, referred-to, rendering, facility, admitting | Target system urn:prior-auth:um:provider-slot |
providerNpi->gcId | NPI → the UM system's internal provider id | Falls back to the NPI when unmapped |
decisionStatus->reviewAction | UM decision status → X12 005010/306 reviewAction | Falls back to A4 (Pended) |
A ConceptMap group may declare unmapped with mode: "fixed" to supply a default target. Targets with equivalence unmatched or disjoint are ignored.
Examples
{
"resourceType": "UMTenantConfig",
"id": "payer-1-um",
"connector": "pas-passthrough",
"insurer": {
"reference": "Organization/payer-1",
"identifier": { "system": "http://hl7.org/fhir/sid/us-npi", "value": "1234567893" }
},
"endpoint": {
"baseUrl": "https://um.example.org/fhir",
"timeoutMs": 30000,
"retry": { "maxAttempts": 5, "backoffSeconds": [30, 120, 600, 1800] },
"auth": {
"type": "oauth2-client-credentials",
"tokenUrl": "https://um.example.org/auth/token",
"clientIdEnv": "UM_PAYER1_CLIENT_ID",
"clientSecretEnv": "UM_PAYER1_CLIENT_SECRET",
"scopeEnv": "UM_PAYER1_SCOPE"
}
},
"insurerReference": "Organization/payer-1",
"inquireRefresh": true
}
{
"resourceType": "UMTenantConfig",
"id": "payer-2-guidingcare",
"connector": "guidingcare",
"insurer": {
"reference": "Organization/payer-2",
"identifier": { "system": "http://hl7.org/fhir/sid/us-npi", "value": "9876543210" }
},
"endpoint": {
"baseUrl": "https://um-gateway.example.net/epa",
"timeoutMs": 90000,
"retry": { "maxAttempts": 5, "backoffSeconds": [30, 120, 600, 1800] },
"auth": {
"type": "oauth2-client-credentials",
"tokenUrl": "https://login.example.net/oauth2/v2.0/token",
"clientIdEnv": "UM_PAYER2_CLIENT_ID",
"clientSecretEnv": "UM_PAYER2_CLIENT_SECRET",
"scopeEnv": "UM_PAYER2_SCOPE"
},
"headers": [
{ "name": "ocp-apim-subscription-key", "valueEnv": "UM_PAYER2_SUBSCRIPTION_KEY" },
{ "name": "tenant-id", "value": "payer-2-tenant" }
]
},
"insurerReference": "Organization/payer2.example.net",
"defaults": {
"authRequester": "CONTRACTED PROVIDER",
"authType": "Durable Medical Equipment Medicaid (MLTC)",
"treatmentType": "Durable Medical Equipment"
},
"requiredSupplemental": [{ "name": "AOR on File?", "value": "Yes" }],
"lobBenId": { "identifierSystem": "https://example.net/lobBenID" },
"conceptMaps": [
{ "name": "claimType->authClass", "reference": "ConceptMap/um-payer2-authclass" },
{ "name": "priority->authPriority", "reference": "ConceptMap/um-payer2-authpriority" },
{ "name": "pos->label", "reference": "ConceptMap/um-payer2-pos" },
{ "name": "careTeamRole->slot", "reference": "ConceptMap/um-payer2-provider-roles" },
{ "name": "providerNpi->gcId", "reference": "ConceptMap/um-payer2-provider-npi" },
{ "name": "decisionStatus->reviewAction", "reference": "ConceptMap/um-payer2-reviewaction" }
],
"inquireRefresh": false,
"passThroughExtensions": false
}
Readiness
Each config compiles to ready or invalid. An invalid config is excluded from routing: its payer's submissions are stored and returned as queued, but never delivered. Check GET /health:
{
"um": {
"tenants": {
"payer-1-um": { "status": "ready", "gaps": [], "warnings": [] },
"payer-2-guidingcare": {
"status": "invalid",
"gaps": ["env UM_PAYER2_CLIENT_SECRET not set", "ConceptMap/um-payer2-pos not found"],
"warnings": []
}
}
}
}
| Condition | Effect |
|---|---|
connector unknown | Gap — invalid |
insurerReference blank | Gap — invalid |
Environment variable named by clientSecretEnv, valueEnv or a header valueEnv not set | Gap — invalid |
oauth2-client-credentials with neither clientId nor clientIdEnv | Gap — invalid |
Referenced ConceptMap missing or not compilable | Gap — invalid |
defaults.authRequester absent | Warning — config stays ready; delivery fails unless the request supplies the value |
Gaps found at delivery time rather than at load time (for example a Coverage without the lobBenId identifier system) fail that Task and are recorded in ClaimResponse.error[].
Header and auth values are read from the environment of the Prior Auth service. Adding a new environment variable requires a restart; changing anything inside the resource does not.