MD Integrations

Test Test

AK · Male · 1929-04-04 (97yo)
[email protected] · (212) 555-1235
MD Integrations Completed
Weight 113 kg
Height 152 cm
BMI (computed) 48.9
Allergies No - I affirm I have no medication allergies
Current medications No - I affirm I take no medications
Medical conditions No - I affirm I have no medical conditions
Driver's license on file (mock)
Case
3ac7a303-527a-3356-8db4-0e7c3a4f6ce8
Completed · 12d
Created 2026-09-25T14:11:42.935Z
Completed 2026-10-08T05:14:08.532Z
This is an example of metadata field.
Status timeline
  1. completed 2026-10-08T05:14:08.532Z
Requested Treatments
This case references offering id(s) that aren't in the offerings catalog, so they're left out of the response rather than invented: e5b46ce8-5a37-4b98-bb00-b9b6d392152f dbd74a14-55e9-4159-8435-6bab35446f35 Re-import them on Import to make them show up again.

No offerings attached.

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Webhook Sender — doc-net-faker</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="/assets/app.css" rel="stylesheet">
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class="bg-body-tertiary">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container">
        <a class="navbar-brand" href="/dashboard.php">doc-net-faker</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNav">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="mainNav">
            <ul class="navbar-nav">
                <li class="nav-item"><a class="nav-link" href="/dashboard.php">Dashboard</a></li>

                                                        <li class="nav-item dropdown" style="--net-color: #1f6feb">
                        <a class="nav-link dropdown-toggle nav-net-toggle" href="#" role="button" data-bs-toggle="dropdown">
                            <span class="net-dot"></span> MD Integrations                        </a>
                        <ul class="dropdown-menu net-menu">
                            <li><h6 class="dropdown-header net-menu-header">🩺 MD Integrations</h6></li>
                                                            <li><a class="dropdown-item" href="/console.php">Console — all tabs</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#casesTab">Cases</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#patientsTab">Patients</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#cliniciansTab">Clinicians</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#offeringsTab">Offerings catalog</a></li>
                                                            <li><a class="dropdown-item" href="/import.php">Import offerings</a></li>
                                                                                        <li><div class="dropdown-item-text small text-muted net-menu-note">The Console also lists TelegraMD patients &amp; products.</div></li>
                                                        <li><hr class="dropdown-divider"></li>
                            <li><h6 class="dropdown-header">Shared tools, filtered to MDI</h6></li>
                                                            <li><a class="dropdown-item" href="/index.php?network=md_integrations">Send a webhook</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php?network=md_integrations">API endpoints &amp; overrides</a></li>
                                                            <li><a class="dropdown-item" href="/history.php?network=md_integrations">Webhook history</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php?network=md_integrations">API request log</a></li>
                                                    </ul>
                    </li>
                                                        <li class="nav-item dropdown" style="--net-color: #8250df">
                        <a class="nav-link dropdown-toggle nav-net-toggle" href="#" role="button" data-bs-toggle="dropdown">
                            <span class="net-dot"></span> TelegraMD                        </a>
                        <ul class="dropdown-menu net-menu">
                            <li><h6 class="dropdown-header net-menu-header">📡 TelegraMD</h6></li>
                                                            <li><a class="dropdown-item" href="/console.php#patientsTab">Patients (in the Console)</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#offeringsTab">Products (in the Console)</a></li>
                                                                                        <li><div class="dropdown-item-text small text-muted net-menu-note">TelegraMD has no cases — its data lives in the shared Console.</div></li>
                                                        <li><hr class="dropdown-divider"></li>
                            <li><h6 class="dropdown-header">Shared tools, filtered to TelegraMD</h6></li>
                                                            <li><a class="dropdown-item" href="/index.php?network=telegramd">Send a webhook</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php?network=telegramd">API endpoints &amp; overrides</a></li>
                                                            <li><a class="dropdown-item" href="/history.php?network=telegramd">Webhook history</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php?network=telegramd">API request log</a></li>
                                                    </ul>
                    </li>
                                                        <li class="nav-item dropdown" style="--net-color: #0e9f9a">
                        <a class="nav-link dropdown-toggle nav-net-toggle" href="#" role="button" data-bs-toggle="dropdown">
                            <span class="net-dot"></span> Beluga Health                        </a>
                        <ul class="dropdown-menu net-menu">
                            <li><h6 class="dropdown-header net-menu-header">🐋 Beluga Health</h6></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#visitsTab">Visits</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#patientsTab">Patients</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#favoritesTab">Favorites (medIds)</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#mappingTab">AutoRx mapping</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#pharmaciesTab">Pharmacies</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#settingsTab">Settings</a></li>
                                                                                    <li><hr class="dropdown-divider"></li>
                            <li><h6 class="dropdown-header">Shared tools, filtered to Beluga</h6></li>
                                                            <li><a class="dropdown-item" href="/index.php?network=beluga">Send a webhook</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php?network=beluga">API endpoints &amp; overrides</a></li>
                                                            <li><a class="dropdown-item" href="/history.php?network=beluga">Webhook history</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php?network=beluga">API request log</a></li>
                                                    </ul>
                    </li>
                
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle active" href="#" role="button" data-bs-toggle="dropdown">⚙ Shared tools</a>
                    <ul class="dropdown-menu">
                                                    <li><h6 class="dropdown-header">Send · all networks</h6></li>
                                                            <li><a class="dropdown-item active" href="/index.php">Webhook Sender</a></li>
                                                            <li><a class="dropdown-item" href="/scenarios.php">Scenarios</a></li>
                                                            <li><a class="dropdown-item" href="/endpoints.php">Endpoints</a></li>
                                                            <li><a class="dropdown-item" href="/test-receiver.php">Test Receiver</a></li>
                                                                                <li><h6 class="dropdown-header">Inspect · all networks</h6></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php">Partner API Mock</a></li>
                                                            <li><a class="dropdown-item" href="/history.php">Webhook History</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php">API Log</a></li>
                                                                        </ul>
                </li>
            </ul>
        </div>
    </div>
</nav>

    <div class="net-ribbon" style="--net-color: #6c757d">
        <div class="container d-flex align-items-center gap-2 flex-wrap">
            <span>⚙</span><strong>Shared tool</strong>
                            <span class="text-muted small">· works across MD Integrations, TelegraMD and Beluga Health</span>
                    </div>
    </div>

<div class="container pb-5">
    <div class="mb-4">
    <h1 class="h3 mb-1">Webhook Sender</h1>
    <p class="text-muted mb-0">Generate a fake webhook payload and send it to a local endpoint.</p>
</div>

<div class="row g-4">
    <div class="col-lg-7">
        <div class="card mb-3">
            <div class="card-body">
                <div class="row g-3">
                    <div class="col-md-4">
                        <label class="form-label">Network</label>
                        <select id="network" class="form-select">
                                                            <option value="md_integrations" >MD Integrations</option>
                                                            <option value="telegramd" >TelegraMD</option>
                                                            <option value="beluga" >Beluga Health</option>
                                                    </select>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label">Event</label>
                        <select id="event" class="form-select"></select>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label mb-1">Target Endpoint</label>
                        <select id="endpoint" class="form-select">
                                                            <option
                                    value="1"
                                                                    >Local Test Receiver</option>
                                                    </select>
                        <input
                            type="url" id="endpointUrl" class="form-control d-none"
                            placeholder="http://localhost:3000/webhooks/md-integrations"
                        >
                        <div class="form-check form-switch mt-1 mb-0">
                            <input class="form-check-input" type="checkbox" id="customUrlToggle">
                            <label class="form-check-label small text-muted" for="customUrlToggle">
                                Use a custom URL instead of a saved endpoint
                            </label>
                        </div>
                                            </div>
                </div>

                <div class="mt-3">
                    <label class="form-label d-flex justify-content-between align-items-center">
                        <span>Payload (JSON)</span>
                        <button id="generateBtn" type="button" class="btn btn-sm btn-outline-primary">Generate</button>
                    </label>
                    <textarea id="payload" class="form-control payload-editor" spellcheck="false"></textarea>
                </div>
            </div>
        </div>

        <div class="card mb-3">
            <div class="card-body">
                <h6 class="card-title">Edge-case simulation</h6>
                <div class="row g-2 align-items-end">
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperMalformed">
                        <label class="form-check-label" for="tamperMalformed">Malformed JSON</label>
                    </div>
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperOmitSig">
                        <label class="form-check-label" for="tamperOmitSig">Omit signature</label>
                    </div>
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperBadSig">
                        <label class="form-check-label" for="tamperBadSig">Bad signature</label>
                    </div>
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperDuplicate">
                        <label class="form-check-label" for="tamperDuplicate">Send twice (duplicate)</label>
                    </div>
                    <div class="col-md-4 mt-2">
                        <label class="form-label mb-0" for="tamperDelay">Delay before sending (seconds, max 30)</label>
                        <input type="number" min="0" max="30" value="0" class="form-control form-control-sm" id="tamperDelay">
                    </div>
                </div>
            </div>
        </div>

        <div class="d-flex gap-2">
            <button id="sendBtn" type="button" class="btn btn-primary">Send</button>
            <button id="saveScenarioBtn" type="button" class="btn btn-outline-secondary">Save as Scenario</button>
        </div>
    </div>

    <div class="col-lg-5">
        <h6>Results</h6>
        <div id="results"></div>
    </div>
</div>

<script>
var NETWORKS = {"md_integrations":{"label":"MD Integrations","events":[{"key":"case_status_transitions.case_created","label":"Case Created","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_support","label":"Case Support","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_waiting","label":"Case Waiting","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_approved","label":"Case Approved","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_processing","label":"Case Processing","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_completed","label":"Case Completed","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_cancelled","label":"Case Cancelled","category":"Case > Status Transitions"},{"key":"case_file.case_file_added","label":"Case File Added","category":"Case > File"},{"key":"case_file.case_file_deleted","label":"Case File Deleted","category":"Case > File"},{"key":"case_file.medical_necessity_letter_generated","label":"Medical Necessity Letter Generated","category":"Case > File"},{"key":"case_file.case_file_lab_results_processed","label":"Case File Lab Results Processed","category":"Case > File"},{"key":"case_assignment.case_assigned_to_clinician","label":"Case Assigned to Clinician","category":"Case > Assignment"},{"key":"case_clinical_note.clinical_note_added","label":"Clinical Note Added","category":"Case > Clinical Note"},{"key":"case_tag.case_tag_attached","label":"Case Tag Attached","category":"Case > Tag"},{"key":"case_charges.case_cancelled_amount_charge","label":"Case Cancelled Amount Charge","category":"Case > Charges"},{"key":"case_charges.case_completed_amount_charge","label":"Case Completed Amount Charge","category":"Case > Charges"},{"key":"case_charges.case_change_chargeable_amount_charge","label":"Case Change Chargeable Amount Charge","category":"Case > Charges"},{"key":"case_offering.offering_submitted","label":"Offering Submitted","category":"Case > Offering"},{"key":"case_offering.prescription_insurance_coverage_updated","label":"Prescription Insurance Coverage Updated","category":"Case > Offering"},{"key":"case_prior_auth.prior_auth_initiated","label":"Prior Auth Initiated","category":"Case > Prior Auth"},{"key":"case_order.case_order_updated","label":"Case Order Updated","category":"Case > Order"},{"key":"case_order.case_order_created","label":"Case Order Created","category":"Case > Order"},{"key":"case_order.case_order_prescription_created","label":"Case Order Prescription Created","category":"Case > Order"},{"key":"case_order.case_order_prescription_updated","label":"Case Order Prescription Updated","category":"Case > Order"},{"key":"case_order.case_order_status_changed","label":"Case Order Status Changed","category":"Case > Order"},{"key":"case_order.case_order_tracking_number_changed","label":"Case Order Tracking Number Changed","category":"Case > Order"},{"key":"voucher.voucher_created","label":"Voucher Created","category":"Voucher"},{"key":"voucher.voucher_updated","label":"Voucher Updated","category":"Voucher"},{"key":"voucher.voucher_used","label":"Voucher Used","category":"Voucher"},{"key":"voucher.voucher_reminder_sent","label":"Voucher Reminder Sent","category":"Voucher"},{"key":"voucher.voucher_expired","label":"Voucher Expired","category":"Voucher"},{"key":"patient_workflows.drivers_license_requested","label":"Drivers License Requested","category":"Patient > Workflows"},{"key":"patient_workflows.intro_video_requested","label":"Intro Video Requested","category":"Patient > Workflows"},{"key":"patient_workflows.file_upload_requested","label":"File Upload Requested","category":"Patient > Workflows"},{"key":"patient_workflows.exam_update_requested","label":"Exam Update Requested","category":"Patient > Workflows"},{"key":"patient_workflows.preferred_pharmacy_requested","label":"Preferred Pharmacy Requested","category":"Patient > Workflows"},{"key":"patient_tag.patient_tag_attached","label":"Patient Tag Attached","category":"Patient > Tag"},{"key":"patient.patient_created","label":"Patient Created","category":"Patient"},{"key":"patient.patient_deleted","label":"Patient Deleted","category":"Patient"},{"key":"patient.patient_modified","label":"Patient Modified","category":"Patient"},{"key":"patient.patient_email_sms_opt_in_out","label":"Patient Email\/SMS Opt-in\/out","category":"Patient"},{"key":"patient.patient_insurance_coverage_updated","label":"Patient Insurance Coverage Updated","category":"Patient"},{"key":"message.message_created","label":"Message Created","category":"Message"},{"key":"notification.notification_sent","label":"Notification Sent","category":"Notification"},{"key":"text_message.text_message_amount_charge","label":"Text Message Amount Charge","category":"Text Message"},{"key":"charges.partner_additional_charge_amount","label":"Partner Additional Charge Amount","category":"Charges"},{"key":"vouched.vouched_amount_charge","label":"Vouched Amount Charge","category":"Vouched"},{"key":"prescription_prior_auth.prior_auth_status_updated","label":"Prior Auth Status Updated","category":"Prescription > Prior Auth"}]},"telegramd":{"label":"TelegraMD","events":[{"key":"billing.consultation_billed_to_affiliate","label":"Consultation Payment Paid By Affiliate","category":"Billing"},{"key":"billing.consultation_billed_to_patient","label":"Consultation Payment Paid By Patient","category":"Billing"},{"key":"message.message_from_admin_practitioner_received","label":"Message from Clinical Team Received","category":"Message"},{"key":"order.order_created","label":"Order Created","category":"Order"},{"key":"order.order_expedited","label":"Order Expedited","category":"Order"},{"key":"order.new_status_set_to_request","label":"Order Status Updated","category":"Order"},{"key":"order.order_submitted","label":"Order Submitted","category":"Order"},{"key":"order.order_updated","label":"Order Updated","category":"Order"},{"key":"pharmacy.pharmacy_bundle_fax_sent","label":"Pharmacy Bundle Sent","category":"Pharmacy"},{"key":"pharmacy.shipping_details_set","label":"Pharmacy Tracking Received","category":"Pharmacy"},{"key":"prescription.provider_was_reassigned","label":"Prescription Reassigned","category":"Prescription"},{"key":"prescription.prescription_refill","label":"Prescription Refilled","category":"Prescription"},{"key":"prescription.prescription_sent_to_pharmacy","label":"Prescription Sent To Pharmacy","category":"Prescription"}]},"beluga":{"label":"Beluga Health","events":[{"key":"rx.RX_WRITTEN","label":"Prescription written","category":"Visit"},{"key":"consult.CONSULT_CONCLUDED","label":"Consult concluded","category":"Visit"},{"key":"consult.CONSULT_CANCELED","label":"Consult canceled","category":"Visit"},{"key":"chat.DOCTOR_CHAT","label":"Doctor messages patient","category":"Chat"},{"key":"cs.CS_MESSAGE","label":"Beluga messages customer service","category":"Customer Service"},{"key":"patient.NAME_UPDATE","label":"Patient name update","category":"Customer Service"},{"key":"pharmacy.PHARMACY_ORDER_IN_FULFILLMENT","label":"Pharmacy order in fulfillment","category":"Status Update > Pharmacy"},{"key":"pharmacy.PHARMACY_ORDER_SHIPPED","label":"Pharmacy order shipped","category":"Status Update > Pharmacy"},{"key":"pharmacy.PHARMACY_ORDER_DELIVERED","label":"Pharmacy order delivered","category":"Status Update > Pharmacy"},{"key":"package.PACKAGE_IN_TRANSIT","label":"Package in transit","category":"Status Update > Tracking"},{"key":"package.PACKAGE_OUT_FOR_DELIVERY","label":"Package out for delivery","category":"Status Update > Tracking"},{"key":"package.PACKAGE_DELIVERED","label":"Package delivered","category":"Status Update > Tracking"},{"key":"package.PACKAGE_DELIVERY_FAILED","label":"Package delivery failed","category":"Status Update > Tracking"},{"key":"booking.BOOKING_CREATED","label":"Patient schedules video visit","category":"Video Visit Scheduling"},{"key":"booking.BOOKING_RESCHEDULED","label":"Patient reschedules video visit","category":"Video Visit Scheduling"},{"key":"booking.BOOKING_CANCELLED","label":"Patient cancels video visit","category":"Video Visit Scheduling"},{"key":"booking.NO_SHOW","label":"Patient does not show up for video visit","category":"Video Visit Scheduling"}]}};
var DEFAULT_ENDPOINT_BY_NETWORK = {"md_integrations":null,"telegramd":null,"beluga":null};

$(function () {
    var $network = $('#network');
    var $event = $('#event');
    var $endpoint = $('#endpoint');
    var $endpointUrl = $('#endpointUrl');
    var $customUrlToggle = $('#customUrlToggle');
    var $payload = $('#payload');
    var $results = $('#results');
    var $sendBtn = $('#sendBtn');
    var $generateBtn = $('#generateBtn');
    var $saveScenarioBtn = $('#saveScenarioBtn');

    $customUrlToggle.on('change', function () {
        var useCustom = $customUrlToggle.is(':checked');
        $endpoint.toggleClass('d-none', useCustom);
        $endpointUrl.toggleClass('d-none', !useCustom);
        if (useCustom) {
            $endpointUrl.trigger('focus');
        }
    });

    // Returns {endpoint_id: ...} or {endpoint_url: ...} depending on the toggle,
    // or null if the current mode's field is empty (caller should show an error).
    function currentEndpointParams() {
        if ($customUrlToggle.is(':checked')) {
            var url = $endpointUrl.val().trim();
            return url ? {endpoint_url: url} : null;
        }
        return $endpoint.val() ? {endpoint_id: $endpoint.val()} : null;
    }

    function populateEvents() {
        var net = NETWORKS[$network.val()];
        $event.empty();
        if (!net) {
            return;
        }
        var groups = {};
        var order = [];
        net.events.forEach(function (e) {
            if (!groups[e.category]) {
                groups[e.category] = [];
                order.push(e.category);
            }
            groups[e.category].push(e);
        });
        order.forEach(function (category) {
            var $group = $('<optgroup>').attr('label', category);
            groups[category].forEach(function (e) {
                $group.append($('<option>').val(e.key).text(e.label));
            });
            $event.append($group);
        });
    }

    function clearPayload() {
        $payload.val('');
    }

    $network.on('change', function () {
        populateEvents();
        clearPayload();
        var defaultEndpoint = DEFAULT_ENDPOINT_BY_NETWORK[$network.val()];
        if (defaultEndpoint && $endpoint.find('option[value="' + defaultEndpoint + '"]').length) {
            $endpoint.val(String(defaultEndpoint));
        }
    });
    $event.on('change', clearPayload);
    populateEvents();

    function currentTamper() {
        return {
            malformed_json: $('#tamperMalformed').is(':checked'),
            omit_signature: $('#tamperOmitSig').is(':checked'),
            bad_signature: $('#tamperBadSig').is(':checked'),
            duplicate: $('#tamperDuplicate').is(':checked'),
            delay_seconds: parseInt($('#tamperDelay').val(), 10) || 0
        };
    }

    $generateBtn.on('click', function () {
        $generateBtn.prop('disabled', true).text('Generating…');
        $.ajax({
            url: '/api/generate.php',
            method: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({network: $network.val(), event_key: $event.val()})
        }).done(function (res) {
            if (res.ok) {
                $payload.val(JSON.stringify(res.payload, null, 2));
            } else {
                DNF.alert($results, res.error || 'Failed to generate payload');
            }
        }).fail(function () {
            DNF.alert($results, 'Request failed while generating payload');
        }).always(function () {
            $generateBtn.prop('disabled', false).text('Generate');
        });
    });

    function renderResults(res) {
        $results.empty();
        if (!res.ok) {
            DNF.alert($results, res.error || 'Send failed');
            return;
        }
        res.results.forEach(function (r) {
            var $body = $('<div class="card-body"></div>');
            $body.append(
                '<h6 class="card-title">Attempt ' + r.attempt + ' ' + DNF.statusBadge(r.status) +
                ' <span class="text-muted small">' + r.duration_ms + 'ms</span></h6>'
            );
            if (r.error) {
                $body.append('<div class="alert alert-danger py-1 px-2 small">' + DNF.escapeHtml(r.error) + '</div>');
            }
            $body.append(
                '<div class="small text-muted">Headers sent:</div>' +
                '<pre class="bg-light p-2 rounded log-block json-content">' + DNF.escapeHtml(JSON.stringify(r.headers_sent, null, 2)) + '</pre>'
            );
            $body.append(
                '<div class="small text-muted">Body sent:</div>' +
                '<pre class="bg-light p-2 rounded log-block json-content">' + DNF.escapeHtml(r.body_sent) + '</pre>'
            );
            if (r.body) {
                $body.append(
                    '<div class="small text-muted">Response body:</div>' +
                    '<pre class="bg-light p-2 rounded log-block json-content">' + DNF.escapeHtml(r.body) + '</pre>'
                );
            }
            $results.append($('<div class="card mb-2"></div>').append($body));
        });
        DNF.wireJsonBlocks($results);
    }

    $sendBtn.on('click', function () {
        var endpointParams = currentEndpointParams();
        if (!endpointParams) {
            var msg = $customUrlToggle.is(':checked')
                ? 'Enter a target URL first.'
                : 'Add a target endpoint first (see the Endpoints page), or toggle Custom URL.';
            DNF.alert($results, msg);
            return;
        }
        $sendBtn.prop('disabled', true).text('Sending…');
        $.ajax({
            url: '/api/send.php',
            method: 'POST',
            contentType: 'application/json',
            data: JSON.stringify($.extend({
                network: $network.val(),
                event_key: $event.val(),
                body: $payload.val(),
                tamper: currentTamper()
            }, endpointParams))
        }).done(renderResults).fail(function (xhr) {
            var msg = (xhr.responseJSON && xhr.responseJSON.error) || 'Send failed';
            DNF.alert($results, msg);
        }).always(function () {
            $sendBtn.prop('disabled', false).text('Send');
        });
    });

    $saveScenarioBtn.on('click', function () {
        var name = prompt('Scenario name:');
        if (!name) {
            return;
        }
        $.ajax({
            url: '/api/scenarios.php',
            method: 'POST',
            contentType: 'application/json',
            data: JSON.stringify($.extend({
                network: $network.val(),
                event_key: $event.val(),
                name: name,
                payload: $payload.val(),
                tamper: currentTamper()
            }, currentEndpointParams() || {}))
        }).done(function (res) {
            if (res.ok) {
                DNF.alert($results, 'Scenario saved — see it on the Scenarios page.', 'success');
            } else {
                DNF.alert($results, res.error || 'Failed to save scenario');
            }
        });
    });
});
</script>
</div>
<script src="/assets/app.js"></script>
<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"257e398f93a14fa2a5ec775cdccfc2b0","r":1,"spa":2}' crossorigin="anonymous"></script>
</body>
</html>
Pictures

No files were added.

Medical Intake

No intake questions on file.

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Webhook Sender — doc-net-faker</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="/assets/app.css" rel="stylesheet">
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class="bg-body-tertiary">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container">
        <a class="navbar-brand" href="/dashboard.php">doc-net-faker</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNav">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="mainNav">
            <ul class="navbar-nav">
                <li class="nav-item"><a class="nav-link" href="/dashboard.php">Dashboard</a></li>

                                                        <li class="nav-item dropdown" style="--net-color: #1f6feb">
                        <a class="nav-link dropdown-toggle nav-net-toggle" href="#" role="button" data-bs-toggle="dropdown">
                            <span class="net-dot"></span> MD Integrations                        </a>
                        <ul class="dropdown-menu net-menu">
                            <li><h6 class="dropdown-header net-menu-header">🩺 MD Integrations</h6></li>
                                                            <li><a class="dropdown-item" href="/console.php">Console — all tabs</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#casesTab">Cases</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#patientsTab">Patients</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#cliniciansTab">Clinicians</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#offeringsTab">Offerings catalog</a></li>
                                                            <li><a class="dropdown-item" href="/import.php">Import offerings</a></li>
                                                                                        <li><div class="dropdown-item-text small text-muted net-menu-note">The Console also lists TelegraMD patients &amp; products.</div></li>
                                                        <li><hr class="dropdown-divider"></li>
                            <li><h6 class="dropdown-header">Shared tools, filtered to MDI</h6></li>
                                                            <li><a class="dropdown-item" href="/index.php?network=md_integrations">Send a webhook</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php?network=md_integrations">API endpoints &amp; overrides</a></li>
                                                            <li><a class="dropdown-item" href="/history.php?network=md_integrations">Webhook history</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php?network=md_integrations">API request log</a></li>
                                                    </ul>
                    </li>
                                                        <li class="nav-item dropdown" style="--net-color: #8250df">
                        <a class="nav-link dropdown-toggle nav-net-toggle" href="#" role="button" data-bs-toggle="dropdown">
                            <span class="net-dot"></span> TelegraMD                        </a>
                        <ul class="dropdown-menu net-menu">
                            <li><h6 class="dropdown-header net-menu-header">📡 TelegraMD</h6></li>
                                                            <li><a class="dropdown-item" href="/console.php#patientsTab">Patients (in the Console)</a></li>
                                                            <li><a class="dropdown-item" href="/console.php#offeringsTab">Products (in the Console)</a></li>
                                                                                        <li><div class="dropdown-item-text small text-muted net-menu-note">TelegraMD has no cases — its data lives in the shared Console.</div></li>
                                                        <li><hr class="dropdown-divider"></li>
                            <li><h6 class="dropdown-header">Shared tools, filtered to TelegraMD</h6></li>
                                                            <li><a class="dropdown-item" href="/index.php?network=telegramd">Send a webhook</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php?network=telegramd">API endpoints &amp; overrides</a></li>
                                                            <li><a class="dropdown-item" href="/history.php?network=telegramd">Webhook history</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php?network=telegramd">API request log</a></li>
                                                    </ul>
                    </li>
                                                        <li class="nav-item dropdown" style="--net-color: #0e9f9a">
                        <a class="nav-link dropdown-toggle nav-net-toggle" href="#" role="button" data-bs-toggle="dropdown">
                            <span class="net-dot"></span> Beluga Health                        </a>
                        <ul class="dropdown-menu net-menu">
                            <li><h6 class="dropdown-header net-menu-header">🐋 Beluga Health</h6></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#visitsTab">Visits</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#patientsTab">Patients</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#favoritesTab">Favorites (medIds)</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#mappingTab">AutoRx mapping</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#pharmaciesTab">Pharmacies</a></li>
                                                            <li><a class="dropdown-item" href="/beluga-console.php#settingsTab">Settings</a></li>
                                                                                    <li><hr class="dropdown-divider"></li>
                            <li><h6 class="dropdown-header">Shared tools, filtered to Beluga</h6></li>
                                                            <li><a class="dropdown-item" href="/index.php?network=beluga">Send a webhook</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php?network=beluga">API endpoints &amp; overrides</a></li>
                                                            <li><a class="dropdown-item" href="/history.php?network=beluga">Webhook history</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php?network=beluga">API request log</a></li>
                                                    </ul>
                    </li>
                
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle active" href="#" role="button" data-bs-toggle="dropdown">⚙ Shared tools</a>
                    <ul class="dropdown-menu">
                                                    <li><h6 class="dropdown-header">Send · all networks</h6></li>
                                                            <li><a class="dropdown-item active" href="/index.php">Webhook Sender</a></li>
                                                            <li><a class="dropdown-item" href="/scenarios.php">Scenarios</a></li>
                                                            <li><a class="dropdown-item" href="/endpoints.php">Endpoints</a></li>
                                                            <li><a class="dropdown-item" href="/test-receiver.php">Test Receiver</a></li>
                                                                                <li><h6 class="dropdown-header">Inspect · all networks</h6></li>
                                                            <li><a class="dropdown-item" href="/partner-api.php">Partner API Mock</a></li>
                                                            <li><a class="dropdown-item" href="/history.php">Webhook History</a></li>
                                                            <li><a class="dropdown-item" href="/partner-api-log.php">API Log</a></li>
                                                                        </ul>
                </li>
            </ul>
        </div>
    </div>
</nav>

    <div class="net-ribbon" style="--net-color: #6c757d">
        <div class="container d-flex align-items-center gap-2 flex-wrap">
            <span>⚙</span><strong>Shared tool</strong>
                            <span class="text-muted small">· works across MD Integrations, TelegraMD and Beluga Health</span>
                    </div>
    </div>

<div class="container pb-5">
    <div class="mb-4">
    <h1 class="h3 mb-1">Webhook Sender</h1>
    <p class="text-muted mb-0">Generate a fake webhook payload and send it to a local endpoint.</p>
</div>

<div class="row g-4">
    <div class="col-lg-7">
        <div class="card mb-3">
            <div class="card-body">
                <div class="row g-3">
                    <div class="col-md-4">
                        <label class="form-label">Network</label>
                        <select id="network" class="form-select">
                                                            <option value="md_integrations" >MD Integrations</option>
                                                            <option value="telegramd" >TelegraMD</option>
                                                            <option value="beluga" >Beluga Health</option>
                                                    </select>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label">Event</label>
                        <select id="event" class="form-select"></select>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label mb-1">Target Endpoint</label>
                        <select id="endpoint" class="form-select">
                                                            <option
                                    value="1"
                                                                    >Local Test Receiver</option>
                                                    </select>
                        <input
                            type="url" id="endpointUrl" class="form-control d-none"
                            placeholder="http://localhost:3000/webhooks/md-integrations"
                        >
                        <div class="form-check form-switch mt-1 mb-0">
                            <input class="form-check-input" type="checkbox" id="customUrlToggle">
                            <label class="form-check-label small text-muted" for="customUrlToggle">
                                Use a custom URL instead of a saved endpoint
                            </label>
                        </div>
                                            </div>
                </div>

                <div class="mt-3">
                    <label class="form-label d-flex justify-content-between align-items-center">
                        <span>Payload (JSON)</span>
                        <button id="generateBtn" type="button" class="btn btn-sm btn-outline-primary">Generate</button>
                    </label>
                    <textarea id="payload" class="form-control payload-editor" spellcheck="false"></textarea>
                </div>
            </div>
        </div>

        <div class="card mb-3">
            <div class="card-body">
                <h6 class="card-title">Edge-case simulation</h6>
                <div class="row g-2 align-items-end">
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperMalformed">
                        <label class="form-check-label" for="tamperMalformed">Malformed JSON</label>
                    </div>
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperOmitSig">
                        <label class="form-check-label" for="tamperOmitSig">Omit signature</label>
                    </div>
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperBadSig">
                        <label class="form-check-label" for="tamperBadSig">Bad signature</label>
                    </div>
                    <div class="col-md-3 form-check">
                        <input class="form-check-input" type="checkbox" id="tamperDuplicate">
                        <label class="form-check-label" for="tamperDuplicate">Send twice (duplicate)</label>
                    </div>
                    <div class="col-md-4 mt-2">
                        <label class="form-label mb-0" for="tamperDelay">Delay before sending (seconds, max 30)</label>
                        <input type="number" min="0" max="30" value="0" class="form-control form-control-sm" id="tamperDelay">
                    </div>
                </div>
            </div>
        </div>

        <div class="d-flex gap-2">
            <button id="sendBtn" type="button" class="btn btn-primary">Send</button>
            <button id="saveScenarioBtn" type="button" class="btn btn-outline-secondary">Save as Scenario</button>
        </div>
    </div>

    <div class="col-lg-5">
        <h6>Results</h6>
        <div id="results"></div>
    </div>
</div>

<script>
var NETWORKS = {"md_integrations":{"label":"MD Integrations","events":[{"key":"case_status_transitions.case_created","label":"Case Created","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_support","label":"Case Support","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_waiting","label":"Case Waiting","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_approved","label":"Case Approved","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_processing","label":"Case Processing","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_completed","label":"Case Completed","category":"Case > Status Transitions"},{"key":"case_status_transitions.case_cancelled","label":"Case Cancelled","category":"Case > Status Transitions"},{"key":"case_file.case_file_added","label":"Case File Added","category":"Case > File"},{"key":"case_file.case_file_deleted","label":"Case File Deleted","category":"Case > File"},{"key":"case_file.medical_necessity_letter_generated","label":"Medical Necessity Letter Generated","category":"Case > File"},{"key":"case_file.case_file_lab_results_processed","label":"Case File Lab Results Processed","category":"Case > File"},{"key":"case_assignment.case_assigned_to_clinician","label":"Case Assigned to Clinician","category":"Case > Assignment"},{"key":"case_clinical_note.clinical_note_added","label":"Clinical Note Added","category":"Case > Clinical Note"},{"key":"case_tag.case_tag_attached","label":"Case Tag Attached","category":"Case > Tag"},{"key":"case_charges.case_cancelled_amount_charge","label":"Case Cancelled Amount Charge","category":"Case > Charges"},{"key":"case_charges.case_completed_amount_charge","label":"Case Completed Amount Charge","category":"Case > Charges"},{"key":"case_charges.case_change_chargeable_amount_charge","label":"Case Change Chargeable Amount Charge","category":"Case > Charges"},{"key":"case_offering.offering_submitted","label":"Offering Submitted","category":"Case > Offering"},{"key":"case_offering.prescription_insurance_coverage_updated","label":"Prescription Insurance Coverage Updated","category":"Case > Offering"},{"key":"case_prior_auth.prior_auth_initiated","label":"Prior Auth Initiated","category":"Case > Prior Auth"},{"key":"case_order.case_order_updated","label":"Case Order Updated","category":"Case > Order"},{"key":"case_order.case_order_created","label":"Case Order Created","category":"Case > Order"},{"key":"case_order.case_order_prescription_created","label":"Case Order Prescription Created","category":"Case > Order"},{"key":"case_order.case_order_prescription_updated","label":"Case Order Prescription Updated","category":"Case > Order"},{"key":"case_order.case_order_status_changed","label":"Case Order Status Changed","category":"Case > Order"},{"key":"case_order.case_order_tracking_number_changed","label":"Case Order Tracking Number Changed","category":"Case > Order"},{"key":"voucher.voucher_created","label":"Voucher Created","category":"Voucher"},{"key":"voucher.voucher_updated","label":"Voucher Updated","category":"Voucher"},{"key":"voucher.voucher_used","label":"Voucher Used","category":"Voucher"},{"key":"voucher.voucher_reminder_sent","label":"Voucher Reminder Sent","category":"Voucher"},{"key":"voucher.voucher_expired","label":"Voucher Expired","category":"Voucher"},{"key":"patient_workflows.drivers_license_requested","label":"Drivers License Requested","category":"Patient > Workflows"},{"key":"patient_workflows.intro_video_requested","label":"Intro Video Requested","category":"Patient > Workflows"},{"key":"patient_workflows.file_upload_requested","label":"File Upload Requested","category":"Patient > Workflows"},{"key":"patient_workflows.exam_update_requested","label":"Exam Update Requested","category":"Patient > Workflows"},{"key":"patient_workflows.preferred_pharmacy_requested","label":"Preferred Pharmacy Requested","category":"Patient > Workflows"},{"key":"patient_tag.patient_tag_attached","label":"Patient Tag Attached","category":"Patient > Tag"},{"key":"patient.patient_created","label":"Patient Created","category":"Patient"},{"key":"patient.patient_deleted","label":"Patient Deleted","category":"Patient"},{"key":"patient.patient_modified","label":"Patient Modified","category":"Patient"},{"key":"patient.patient_email_sms_opt_in_out","label":"Patient Email\/SMS Opt-in\/out","category":"Patient"},{"key":"patient.patient_insurance_coverage_updated","label":"Patient Insurance Coverage Updated","category":"Patient"},{"key":"message.message_created","label":"Message Created","category":"Message"},{"key":"notification.notification_sent","label":"Notification Sent","category":"Notification"},{"key":"text_message.text_message_amount_charge","label":"Text Message Amount Charge","category":"Text Message"},{"key":"charges.partner_additional_charge_amount","label":"Partner Additional Charge Amount","category":"Charges"},{"key":"vouched.vouched_amount_charge","label":"Vouched Amount Charge","category":"Vouched"},{"key":"prescription_prior_auth.prior_auth_status_updated","label":"Prior Auth Status Updated","category":"Prescription > Prior Auth"}]},"telegramd":{"label":"TelegraMD","events":[{"key":"billing.consultation_billed_to_affiliate","label":"Consultation Payment Paid By Affiliate","category":"Billing"},{"key":"billing.consultation_billed_to_patient","label":"Consultation Payment Paid By Patient","category":"Billing"},{"key":"message.message_from_admin_practitioner_received","label":"Message from Clinical Team Received","category":"Message"},{"key":"order.order_created","label":"Order Created","category":"Order"},{"key":"order.order_expedited","label":"Order Expedited","category":"Order"},{"key":"order.new_status_set_to_request","label":"Order Status Updated","category":"Order"},{"key":"order.order_submitted","label":"Order Submitted","category":"Order"},{"key":"order.order_updated","label":"Order Updated","category":"Order"},{"key":"pharmacy.pharmacy_bundle_fax_sent","label":"Pharmacy Bundle Sent","category":"Pharmacy"},{"key":"pharmacy.shipping_details_set","label":"Pharmacy Tracking Received","category":"Pharmacy"},{"key":"prescription.provider_was_reassigned","label":"Prescription Reassigned","category":"Prescription"},{"key":"prescription.prescription_refill","label":"Prescription Refilled","category":"Prescription"},{"key":"prescription.prescription_sent_to_pharmacy","label":"Prescription Sent To Pharmacy","category":"Prescription"}]},"beluga":{"label":"Beluga Health","events":[{"key":"rx.RX_WRITTEN","label":"Prescription written","category":"Visit"},{"key":"consult.CONSULT_CONCLUDED","label":"Consult concluded","category":"Visit"},{"key":"consult.CONSULT_CANCELED","label":"Consult canceled","category":"Visit"},{"key":"chat.DOCTOR_CHAT","label":"Doctor messages patient","category":"Chat"},{"key":"cs.CS_MESSAGE","label":"Beluga messages customer service","category":"Customer Service"},{"key":"patient.NAME_UPDATE","label":"Patient name update","category":"Customer Service"},{"key":"pharmacy.PHARMACY_ORDER_IN_FULFILLMENT","label":"Pharmacy order in fulfillment","category":"Status Update > Pharmacy"},{"key":"pharmacy.PHARMACY_ORDER_SHIPPED","label":"Pharmacy order shipped","category":"Status Update > Pharmacy"},{"key":"pharmacy.PHARMACY_ORDER_DELIVERED","label":"Pharmacy order delivered","category":"Status Update > Pharmacy"},{"key":"package.PACKAGE_IN_TRANSIT","label":"Package in transit","category":"Status Update > Tracking"},{"key":"package.PACKAGE_OUT_FOR_DELIVERY","label":"Package out for delivery","category":"Status Update > Tracking"},{"key":"package.PACKAGE_DELIVERED","label":"Package delivered","category":"Status Update > Tracking"},{"key":"package.PACKAGE_DELIVERY_FAILED","label":"Package delivery failed","category":"Status Update > Tracking"},{"key":"booking.BOOKING_CREATED","label":"Patient schedules video visit","category":"Video Visit Scheduling"},{"key":"booking.BOOKING_RESCHEDULED","label":"Patient reschedules video visit","category":"Video Visit Scheduling"},{"key":"booking.BOOKING_CANCELLED","label":"Patient cancels video visit","category":"Video Visit Scheduling"},{"key":"booking.NO_SHOW","label":"Patient does not show up for video visit","category":"Video Visit Scheduling"}]}};
var DEFAULT_ENDPOINT_BY_NETWORK = {"md_integrations":null,"telegramd":null,"beluga":null};

$(function () {
    var $network = $('#network');
    var $event = $('#event');
    var $endpoint = $('#endpoint');
    var $endpointUrl = $('#endpointUrl');
    var $customUrlToggle = $('#customUrlToggle');
    var $payload = $('#payload');
    var $results = $('#results');
    var $sendBtn = $('#sendBtn');
    var $generateBtn = $('#generateBtn');
    var $saveScenarioBtn = $('#saveScenarioBtn');

    $customUrlToggle.on('change', function () {
        var useCustom = $customUrlToggle.is(':checked');
        $endpoint.toggleClass('d-none', useCustom);
        $endpointUrl.toggleClass('d-none', !useCustom);
        if (useCustom) {
            $endpointUrl.trigger('focus');
        }
    });

    // Returns {endpoint_id: ...} or {endpoint_url: ...} depending on the toggle,
    // or null if the current mode's field is empty (caller should show an error).
    function currentEndpointParams() {
        if ($customUrlToggle.is(':checked')) {
            var url = $endpointUrl.val().trim();
            return url ? {endpoint_url: url} : null;
        }
        return $endpoint.val() ? {endpoint_id: $endpoint.val()} : null;
    }

    function populateEvents() {
        var net = NETWORKS[$network.val()];
        $event.empty();
        if (!net) {
            return;
        }
        var groups = {};
        var order = [];
        net.events.forEach(function (e) {
            if (!groups[e.category]) {
                groups[e.category] = [];
                order.push(e.category);
            }
            groups[e.category].push(e);
        });
        order.forEach(function (category) {
            var $group = $('<optgroup>').attr('label', category);
            groups[category].forEach(function (e) {
                $group.append($('<option>').val(e.key).text(e.label));
            });
            $event.append($group);
        });
    }

    function clearPayload() {
        $payload.val('');
    }

    $network.on('change', function () {
        populateEvents();
        clearPayload();
        var defaultEndpoint = DEFAULT_ENDPOINT_BY_NETWORK[$network.val()];
        if (defaultEndpoint && $endpoint.find('option[value="' + defaultEndpoint + '"]').length) {
            $endpoint.val(String(defaultEndpoint));
        }
    });
    $event.on('change', clearPayload);
    populateEvents();

    function currentTamper() {
        return {
            malformed_json: $('#tamperMalformed').is(':checked'),
            omit_signature: $('#tamperOmitSig').is(':checked'),
            bad_signature: $('#tamperBadSig').is(':checked'),
            duplicate: $('#tamperDuplicate').is(':checked'),
            delay_seconds: parseInt($('#tamperDelay').val(), 10) || 0
        };
    }

    $generateBtn.on('click', function () {
        $generateBtn.prop('disabled', true).text('Generating…');
        $.ajax({
            url: '/api/generate.php',
            method: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({network: $network.val(), event_key: $event.val()})
        }).done(function (res) {
            if (res.ok) {
                $payload.val(JSON.stringify(res.payload, null, 2));
            } else {
                DNF.alert($results, res.error || 'Failed to generate payload');
            }
        }).fail(function () {
            DNF.alert($results, 'Request failed while generating payload');
        }).always(function () {
            $generateBtn.prop('disabled', false).text('Generate');
        });
    });

    function renderResults(res) {
        $results.empty();
        if (!res.ok) {
            DNF.alert($results, res.error || 'Send failed');
            return;
        }
        res.results.forEach(function (r) {
            var $body = $('<div class="card-body"></div>');
            $body.append(
                '<h6 class="card-title">Attempt ' + r.attempt + ' ' + DNF.statusBadge(r.status) +
                ' <span class="text-muted small">' + r.duration_ms + 'ms</span></h6>'
            );
            if (r.error) {
                $body.append('<div class="alert alert-danger py-1 px-2 small">' + DNF.escapeHtml(r.error) + '</div>');
            }
            $body.append(
                '<div class="small text-muted">Headers sent:</div>' +
                '<pre class="bg-light p-2 rounded log-block json-content">' + DNF.escapeHtml(JSON.stringify(r.headers_sent, null, 2)) + '</pre>'
            );
            $body.append(
                '<div class="small text-muted">Body sent:</div>' +
                '<pre class="bg-light p-2 rounded log-block json-content">' + DNF.escapeHtml(r.body_sent) + '</pre>'
            );
            if (r.body) {
                $body.append(
                    '<div class="small text-muted">Response body:</div>' +
                    '<pre class="bg-light p-2 rounded log-block json-content">' + DNF.escapeHtml(r.body) + '</pre>'
                );
            }
            $results.append($('<div class="card mb-2"></div>').append($body));
        });
        DNF.wireJsonBlocks($results);
    }

    $sendBtn.on('click', function () {
        var endpointParams = currentEndpointParams();
        if (!endpointParams) {
            var msg = $customUrlToggle.is(':checked')
                ? 'Enter a target URL first.'
                : 'Add a target endpoint first (see the Endpoints page), or toggle Custom URL.';
            DNF.alert($results, msg);
            return;
        }
        $sendBtn.prop('disabled', true).text('Sending…');
        $.ajax({
            url: '/api/send.php',
            method: 'POST',
            contentType: 'application/json',
            data: JSON.stringify($.extend({
                network: $network.val(),
                event_key: $event.val(),
                body: $payload.val(),
                tamper: currentTamper()
            }, endpointParams))
        }).done(renderResults).fail(function (xhr) {
            var msg = (xhr.responseJSON && xhr.responseJSON.error) || 'Send failed';
            DNF.alert($results, msg);
        }).always(function () {
            $sendBtn.prop('disabled', false).text('Send');
        });
    });

    $saveScenarioBtn.on('click', function () {
        var name = prompt('Scenario name:');
        if (!name) {
            return;
        }
        $.ajax({
            url: '/api/scenarios.php',
            method: 'POST',
            contentType: 'application/json',
            data: JSON.stringify($.extend({
                network: $network.val(),
                event_key: $event.val(),
                name: name,
                payload: $payload.val(),
                tamper: currentTamper()
            }, currentEndpointParams() || {}))
        }).done(function (res) {
            if (res.ok) {
                DNF.alert($results, 'Scenario saved — see it on the Scenarios page.', 'success');
            } else {
                DNF.alert($results, res.error || 'Failed to save scenario');
            }
        });
    });
});
</script>
</div>
<script src="/assets/app.js"></script>
<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"257e398f93a14fa2a5ec775cdccfc2b0","r":1,"spa":2}' crossorigin="anonymous"></script>
</body>
</html>
Messages

No messages for this patient.


Any message sent here is from the Clinician; anything else in the thread is from the patient linked to this case.

Sends this text to the mock, then fires the real message_created webhook to the selected endpoint — MD Integrations' own webhook carries no text, so your app is expected to call back for it, exactly like this does.