Perfuse

Free payer sandbox

A payer to test your prior authorization against, free and open now

Building the EHR or app side of CMS-0057-F? You need a payer that answers CDS Hooks, hands out questionnaires and decides PAS requests. test.perfuse.health is one: Da Vinci CRD, DTR and PAS on invented data, with published test keys, so you can start in a minute without asking anyone for an account.

In one minute

Order, documentation, request, decision

What it is

A public Perfuse server playing a health plan, the "Perfuse Test Plan". It runs the same code as a real deployment, with test data only: no real plan, member or person.

Why it exists

No live payer lets unknown code near its production endpoints, and you cannot test an EHR's prior authorization without someone on the other side.

How you use it

Sign with the sandbox's published keys, call the endpoints below, or run the example script, which does the whole round and prints what the plan answered.

  • Da Vinci CRD 2.2.1, DTR 2.2.0 and PAS 2.2.1, the same server Inferno's suites pass against (results), and the 2.1.0 of each: send CRD's davinci-crd.requestedVersion of 2.1, or PAS and DTR profiles ending |2.1.0, and the answers come back in 2.1.0
  • SMART Backend Services and SMART App Launch, so your client authorizes as it would with a real payer
  • Approve, pend, deny and "documentation needed" answers, chosen by the order's code
# Node 18 or newer, nothing to install
curl -O https://perfuse.health/sandbox/try-sandbox.mjs
node try-sandbox.mjs

1. token: ok, scopes system/*.rs system/Claim.c
2. CRD cards:
   - Home oxygen equipment: covered, prior authorization required
   - system action: update Record the coverage information on the order
3. DTR package: 200 Questionnaire "Home oxygen documentation (test plan)", QuestionnaireResponse
4. PAS $submit: 200 outcome complete, review action A1, authorization PA-9B1579A6

The script is about 100 lines you can read: a token, the CRD order-sign hook for a portable oxygen system, the DTR questionnaire package for the order CRD returned, and the PAS guide's own referral example submitted. Review actions are X12's: A1 approved, A3 denied, A4 pended, A6 modified.

Endpoints

Where to point your client

WhatAddress
FHIR base (R4)https://test.perfuse.health/fhir
CapabilityStatementhttps://test.perfuse.health/fhir/metadata
SMART configurationhttps://test.perfuse.health/fhir/.well-known/smart-configuration
Token endpointhttps://test.perfuse.health/auth/token
CRD (CDS Hooks discovery)https://test.perfuse.health/cds-services: order-sign, order-select, order-dispatch, appointment-book
DTRPOST /fhir/Questionnaire/$questionnaire-package, $next-question (adaptive forms), $log-questionnaire-errors
PASPOST /fhir/Claim/$submit, Claim/$inquire, subscriptions for pended answers
CDex attachmentsPOST /fhir/Claim/$submit-attachment

Signing in

Published test keys, so there is nothing to ask for

The sandbox has a client whose private keys are public on purpose, as Inferno publishes its own. Everything they reach is invented, and the client may read everything but write only what CRD, DTR and PAS send.

  • Backend Services token: client id sandbox, a client_credentials request with a JWT assertion signed by one of the keys (ES384 or RS384), audience the token endpoint
  • CRD hook calls: a CDS Hooks JWT with issuer https://perfuse.health/sandbox and audience the service's URL, for example https://test.perfuse.health/cds-services/crd-order-sign
  • Public keys: /sandbox/jwks.json. Private keys: /sandbox/private-jwks.json
  • Your own client (your JWKS URL, or redirect URIs for an app launch): open an issue and we add it

The test plan's member

Amy Shaw, born 1987-02-20, subscriber id 123, Coverage cmember, Patient pmember. Send her coverage in the hook's prefetch and the plan recognises her.

What the plan answers

OrderAnswer
Home oxygen, HCPCS E0424, E0431, E1390Covered, approval needed, a questionnaire (Amy already holds an approval for E0424)
Physical therapy evaluation, CPT 97161-97163Covered, no approval, keep notes on file
Office visit, CPT 99213, 99214Covered, no approval
Cosmetic procedure, CPT 15830Not covered
PAS: consultation (X12 service type 3)Approved (A1)
PAS: physical therapy (PT)Approved (A1), up to six visits
PAS: MRI (62)Modified (A6): an X-ray (4) approved instead
PAS: surgery (2)Pended (A4) for a clinician, documents asked for
PAS: dialysis (76)Denied (A3): not a benefit

The full rules are in the repository.

Plainly

What the sandbox is not

  • Not a real health plan, and not a place for real patient data: anything sent is visible to other testers. Use invented people only.
  • Not a guarantee about any real payer. Each plan has its own rules and its own documentation; passing here means your client speaks the standards, not that a given plan will approve.
  • Not certification. Perfuse is tested with Inferno in public; nothing here is an ONC certification or a CAQH CORE certification.
  • Shared and limited: writes are capped at 300 a minute from one address, and what testers send may be cleared when the server is upgraded.
  • Want the same thing on your own computer or network? Download Perfuse, free under Apache 2.0, and load the same rules with deploy/test-instance from the repository.