Multi-member match operations
EAP

 

$bulk-member-match

  • The $bulk-member-match operation is used to get matches for a Group of Patient resources in a asynchronous manner. The operation starts a batch job and the returns a polling url.
  • Once the batch job is completed, the response is generated in a Binary resource.
  • It is based off the spec link.
  • The underlying matching logic utilizes the same infrastructure for $member-match.
  • Sample kickoff request

The $bulk-member-match operation supports both asynchronous and synchronous processing. Include the Prefer: respond-async header for asynchronous execution; omit it for synchronous execution. The request body is a Parameters resource containing one or more MemberBundle parameter groups, each with a MemberPatient, CoverageToMatch, CoverageToLink, and optionally a Consent.

  • Sample asynchronous kickoff request
POST /Group/$bulk-member-match
Content-Type: application/fhir+json
Prefer: respond-async
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "MemberBundle",
      "part": [
        {
          "name": "MemberPatient",
          "resource": {
            "resourceType": "Patient",
            "identifier": [
              {
                "type": {
                  "coding": [
                    {
                      "system": "http://hl7.davinci.org",
                      "code": "MB"
                    }
                  ]
                },
                "system": "http://sourcehealthplan.example.com",
                "value": "55678"
              }
            ],
            "name": [
              {
                "use": "official",
                "family": "Person",
                "given": ["Patricia", "Ann"]
              }
            ],
            "gender": "female",
            "birthDate": "1974-12-25"
          }
        },
        {
          "name": "CoverageToMatch",
          "resource": {
            "resourceType": "Coverage",
            "id": "SOURCE_COVERAGE_ID",
            "identifier": [
              {
                "system": "http://sourcehealthplan.example.com",
                "value": "SOURCE_IDENTIFIER"
              }
            ],
            "status": "draft",
            "beneficiary": {
              "reference": "BENEFICIARY_PATIENT_ID"
            },
            "payor": [
              {
                "reference": "Organization/2"
              }
            ]
          }
        },
        {
          "name": "CoverageToLink",
          "resource": {
            "resourceType": "Coverage",
            "id": "AA87654",
            "identifier": [
              {
                "system": "http://targetealthplan.example.com",
                "value": "234567"
              }
            ],
            "status": "active",
            "beneficiary": {
              "reference": "Patient/1"
            },
            "payor": [
              {
                "reference": "Organization/3"
              }
            ]
          }
        },
        {
          "name": "Consent",
          "resource": {
            "resourceType": "Consent",
            "status": "active",
            "scope": {
              "coding": [
                {
                  "system": "http://terminology.hl7.org/CodeSystem/consentscope",
                  "code": "patient-privacy"
                }
              ]
            },
            "category": [
              {
                "coding": [
                  {
                    "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
                    "code": "IDSCL"
                  }
                ]
              }
            ],
            "patient": {
              "reference": "Patient/1"
            }
          }
        }
      ]
    }
  ]
}
  • Sample kickoff response

Upon a successful kickoff, the server responds with HTTP 202 Accepted and a Content-Location header containing the polling URL.

HTTP/1.1 202 Accepted
Content-Location: https://example.com/fhir/Group/$bulk-member-match-poll-status?_jobId=abc-123
  • Sample polling request
GET /Group/$bulk-member-match-poll-status?_jobId=abc-123
  • Sample response when process is in progress
HTTP/1.1 202 Accepted
X-Progress: Build in progress - Status set to IN_PROGRESS
Retry-After: 120
  • Sample response when process is complete
HTTP/1.1 200 OK
Content-Type: application/json
{
  "transactionTime": "2025-01-15T10:30:00.000+00:00",
  "request": "https://example.com/fhir/Group/$bulk-member-match",
  "requiresAccessToken": false,
  "output": [
    {
      "type": "Binary",
      "url": "https://example.com/fhir/Binary/abc-123"
    }
  ],
  "error": []
}

The output url points to a Binary resource containing the match results. The error array will contain entries if any errors occurred during processing. If the job fails entirely, the server responds with HTTP 500 and an OperationOutcome.

Example of the content with matched members:

{
  "resourceType": "Parameters",
  "meta": {
    "profile": [
      "http://hl7.org/fhir/us/davinci-pdex/StructureDefinition/pdex-parameters-multi-member-match-bundle-out"
    ]
  },
  "parameter": [
    {
      "name": "MatchedMembers",
      "resource": {
        "resourceType": "Group",
        "id": "6709",
        "meta": {
          "versionId": "1",
          "lastUpdated": "2025-12-05T10:52:01.349-05:00",
          "profile": [
            "http://hl7.org/fhir/us/davinci-pdex/StructureDefinition/pdex-member-match-group"
          ]
        },
        "contained": [
          {
            "resourceType": "Patient",
            "id": "M123",
            "identifier": [
              {
                "type": {
                  "coding": [
                    {
                      "system": "http://hl7.davinci.org",
                      "code": "MB"
                    }
                  ]
                },
                "system": "http://oldhealthplan.example.com",
                "value": "55678",
                "assigner": {
                  "reference": "Organization/org2"
                }
              },
              {
                "use": "usual",
                "type": {
                  "coding": [
                    {
                      "system": "http://terminology.hl7.org/CodeSystem/v2-0203",
                      "code": "MB",
                      "display": "Member Number",
                      "userSelected": false
                    }
                  ],
                  "text": "Member Number"
                },
                "system": "urn:uri:payer-org-target:eid",
                "value": "tgt-eid-value-100123"
              }
            ],
            "name": [
              {
                "use": "official",
                "family": "Person",
                "given": [
                  "Patricia",
                  "Ann"
                ]
              }
            ],
            "gender": "female",
            "birthDate": "1974-12-25"
          }
        ],
        "identifier": [
          {
            "system": "http://hl7.org/fhir/sid/us-npi",
            "value": "defaultS2sBusId"
          }
        ],
        "type": "person",
        "actual": true,
        "code": {
          "coding": [
            {
              "system": "http://hl7.org/fhir/us/davinci-pdex/CodeSystem/PdexMultiMemberMatchResultCS",
              "code": "match",
              "display": "Matched"
            }
          ]
        },
        "characteristic": [
          {
            "code": {
              "coding": [
                {
                  "system": "http://hl7.org/fhir/us/davinci-pdex/CodeSystem/PdexMultiMemberMatchResultCS",
                  "code": "match",
                  "display": "Matched"
                }
              ]
            },
            "valueReference": {
              "identifier": {
                "system": "http://hl7.org/fhir/sid/us-npi",
                "value": "defaultS2sBusId"
              }
            },
            "exclude": false,
            "period": {
              "start": "2025-12-05T10:52:01-05:00"
            }
          }
        ],
        "member": [
          {
            "entity": {
              "extension": [
                {
                  "url": "http://hl7.org/fhir/us/davinci-pdex/StructureDefinition/base-ext-match-parameters",
                  "valueReference": {
                    "reference": "#M123"
                  }
                }
              ],
              "reference": "Patient/P123"
            }
          }
        ]
      }
    }
  ]
}

Synchronous Processing

The $bulk-member-match operation also supports synchronous processing. To execute synchronously, omit the Prefer: respond-async header. The response will be returned directly as a Parameters resource containing matched, non-matched, and consent-constrained member Groups.

Synchronous processing must be explicitly enabled by setting the allow_synchronous_member_match configuration property to true on the System to System Data Exchange module. If this property is not enabled and the Prefer: respond-async header is omitted, the request will be rejected.

Synchronous processing is intended for development environments only (e.g. debugging and testing). It should not be enabled in production.

$provider-member-match

The $provider-member-match operation enables provider-initiated member matching. While $bulk-member-match is designed for payer-to-payer data exchange where a patient provides consent, $provider-member-match is used when a healthcare provider attests to treatment needs on behalf of the patient.

The key differences from $bulk-member-match are in the Consent resource within each MemberBundle:

Field$bulk-member-match (PDex Consent)$provider-member-match (Treatment Attestation)
scope.coding.codepatient-privacytreatment
performerPatient reference (patient consenting)Practitioner reference (provider attesting)

All other aspects of the operation are identical: the same MemberPatient, CoverageToMatch, and CoverageToLink parameters, the same matching logic, and the same response format.

Like $bulk-member-match, this operation supports both asynchronous and synchronous processing. Include the Prefer: respond-async header for asynchronous execution; omit it for synchronous execution.

  • Sample asynchronous kickoff request
POST /Group/$provider-member-match
Content-Type: application/fhir+json
Prefer: respond-async
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "MemberBundle",
      "part": [
        {
          "name": "MemberPatient",
          "resource": {
            "resourceType": "Patient",
            "identifier": [
              {
                "type": {
                  "coding": [
                    {
                      "system": "http://hl7.davinci.org",
                      "code": "MB"
                    }
                  ]
                },
                "system": "http://sourcehealthplan.example.com",
                "value": "55678"
              }
            ],
            "name": [
              {
                "use": "official",
                "family": "Person",
                "given": ["Patricia", "Ann"]
              }
            ],
            "gender": "female",
            "birthDate": "1974-12-25"
          }
        },
        {
          "name": "CoverageToMatch",
          "resource": {
            "resourceType": "Coverage",
            "id": "SOURCE_COVERAGE_ID",
            "identifier": [
              {
                "system": "http://sourcehealthplan.example.com",
                "value": "SOURCE_IDENTIFIER"
              }
            ],
            "status": "draft",
            "beneficiary": {
              "reference": "BENEFICIARY_PATIENT_ID"
            },
            "payor": [
              {
                "reference": "Organization/2"
              }
            ]
          }
        },
        {
          "name": "CoverageToLink",
          "resource": {
            "resourceType": "Coverage",
            "id": "AA87654",
            "identifier": [
              {
                "system": "http://targetealthplan.example.com",
                "value": "234567"
              }
            ],
            "status": "active",
            "beneficiary": {
              "reference": "Patient/1"
            },
            "payor": [
              {
                "reference": "Organization/3"
              }
            ]
          }
        },
        {
          "name": "Consent",
          "resource": {
            "resourceType": "Consent",
            "status": "active",
            "scope": {
              "coding": [
                {
                  "system": "http://terminology.hl7.org/CodeSystem/consentscope",
                  "code": "treatment"
                }
              ]
            },
            "category": [
              {
                "coding": [
                  {
                    "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
                    "code": "IDSCL"
                  }
                ]
              }
            ],
            "patient": {
              "reference": "Patient/1"
            },
            "performer": [
              {
                "reference": "Practitioner/1"
              }
            ],
            "policy": [
              {
                "uri": "http://hl7.org/fhir/us/davinci-hrex/StructureDefinition-hrex-consent.html#sensitive"
              }
            ],
            "provision": {
              "type": "permit",
              "period": {
                "start": "2024-01-01",
                "end": "2024-12-31"
              },
              "actor": [
                {
                  "role": {
                    "coding": [
                      {
                        "system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type",
                        "code": "performer"
                      }
                    ]
                  },
                  "reference": {
                    "identifier": {
                      "system": "http://hl7.org/fhir/sid/us-npi",
                      "value": "9876543210"
                    },
                    "display": "Provider Organization"
                  }
                },
                {
                  "role": {
                    "coding": [
                      {
                        "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
                        "code": "IRCP"
                      }
                    ]
                  },
                  "reference": {
                    "identifier": {
                      "system": "http://hl7.org/fhir/sid/us-npi",
                      "value": "0123456789"
                    },
                    "display": "Target Health Plan"
                  }
                }
              ],
              "action": [
                {
                  "coding": [
                    {
                      "system": "http://terminology.hl7.org/CodeSystem/consentaction",
                      "code": "disclose"
                    }
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  ]
}
  • Sample kickoff response
HTTP/1.1 202 Accepted
Content-Location: https://example.com/fhir/Group/$provider-member-match-poll-status?_jobId=abc-456
  • Polling and response

The polling mechanism and response format are identical to $bulk-member-match. Use the $provider-member-match-poll-status endpoint with the _jobId parameter:

GET /Group/$provider-member-match-poll-status?_jobId=abc-456

The completed response contains matched, non-matched, and consent-constrained member Groups in the same structure as described in the $bulk-member-match section above.

The `$provider-member-match` operation also supports synchronous processing by omitting the `Prefer: respond-async` header, identical to `$bulk-member-match`. The `allow_synchronous_member_match` configuration property must be enabled. Synchronous processing is intended for development environments only and should not be enabled in production.