@@ -61,6 +61,10 @@ This library provides a range of features to interact with the CLAIM.MD API:
6161- [ ** Realtime Eligibility JSON** ] ( #realtime-parameter-eligibility-check ) : Validate and check the eligibility of a claim
6262 via parameters. Receiving the response in JSON format.
6363
64+ ### [ Webhook] ( #webhook )
65+
66+ - [ ** Parse Webhook Payload** ] ( #parse-webhook-payload ) : Parse inbound webhook events for provider enrollment updates and appeal form creation/updates.
67+
6468### [ Payer] ( #payers )
6569
6670- [ ** Fetch Payers** ] ( #list-payers ) : Retrieve a list of payers or a specific payer.
@@ -75,6 +79,7 @@ This library provides a range of features to interact with the CLAIM.MD API:
7579- [ ** ProviderEnrollmentDTO** ] ( #providerenrollmentdto )
7680- [ ** EligibilityDTO** ] ( #eligibilitydto )
7781- [ ** ERADTO** ] ( #eradto )
82+ - [ ** WebhookPayloadDTO** ] ( #webhookpayloaddto )
7883
7984### Utility Features
8085
@@ -327,6 +332,51 @@ $eligDto = new EligibilityDTO(
327332$response = $eligibilityRequest->checkEligibilityJSON($eligDto);
328333```
329334
335+ ### Webhook
336+
337+ #### Parse Webhook Payload
338+
339+ ``` php
340+ use Nextvisit\ClaimMD\DTO\WebhookPayloadDTO;
341+
342+ // Parse directly from the raw JSON request body
343+ $json = file_get_contents('php://input');
344+ $webhook = WebhookPayloadDTO::fromJsonString($json);
345+
346+ // Or from a decoded array
347+ $webhook = WebhookPayloadDTO::fromArray($decodedData);
348+
349+ // Access top-level fields
350+ $webhook->utcTime; // UTC current time
351+ $webhook->acctNumber; // Claim.MD Account Number
352+ $webhook->remoteAcctNumber; // Customer assigned account number
353+
354+ // Iterate over events
355+ foreach ($webhook->events as $event) {
356+ $event->eventId; // Unique event identifier
357+ $event->eventType; // "enroll" or "appeal"
358+ $event->eventTime; // UTC time of event
359+
360+ if ($event->eventType === 'enroll') {
361+ $event->enroll->enrollId; // Enrollment ID
362+ $event->enroll->event; // "enrolled", "received", "completed", "rejected"
363+ $event->enroll->enrollType; // "era", "1500", "ub", "elig", "attach"
364+ $event->enroll->provNpi; // Provider NPI
365+ $event->enroll->payerId; // Payer ID
366+ }
367+
368+ if ($event->eventType === 'appeal') {
369+ $event->appeal->appealId; // Appeal ID
370+ $event->appeal->event; // "created", "mailed", "update", "faxed", "transmitted", "failure"
371+ $event->appeal->appealType; // "electronic", "mail", "fax", "download"
372+ $event->appeal->claimId; // Associated Claim.MD claim ID
373+ $event->appeal->remoteClaimId; // User-assigned claim ID
374+ $event->appeal->serviceFee; // Service fees
375+ $event->appeal->pages; // Number of pages
376+ }
377+ }
378+ ```
379+
330380### Payers
331381
332382#### List Payers
@@ -544,6 +594,41 @@ $data = [
544594$eraDto = ERADTO::fromArray($data);
545595```
546596
597+ #### WebhookPayloadDTO
598+
599+ ``` php
600+ use Nextvisit\ClaimMD\DTO\WebhookPayloadDTO;
601+
602+ // Parse from a raw JSON string (e.g., webhook request body)
603+ $json = file_get_contents('php://input');
604+ $webhookPayload = WebhookPayloadDTO::fromJsonString($json);
605+
606+ // Or from a decoded array
607+ $data = [
608+ 'UTCTime' => '2026-03-13T12:00:00Z',
609+ 'acct_number' => 'ACCT-001',
610+ 'remote_acct_number' => 'REMOTE-001',
611+ 'events' => [
612+ [
613+ 'eventid' => 'EVT-001',
614+ 'event_type' => 'enroll',
615+ 'event_time' => '2026-03-13T11:00:00Z',
616+ 'event_data' => [
617+ 'enroll' => [
618+ 'enrollid' => 'ENR-001',
619+ 'event' => 'enrolled',
620+ 'enroll_type' => 'era',
621+ 'prov_npi' => '1234567890',
622+ 'payerid' => 'PAYER-001',
623+ ],
624+ ],
625+ ],
626+ ],
627+ ];
628+
629+ $webhookPayload = WebhookPayloadDTO::fromArray($data);
630+ ```
631+
547632## 🤝 Contributing
548633
549634Contributions are welcome! If you find any issues or have suggestions for improvements, feel free to open an issue or
0 commit comments