Order Medication | Medplum
React hook: useScriptSureOrderMedication
Package:@medplum/scriptsure-react · GitHub Source Code
A thin wrapper around useMedicationOrder from @medplum/react-hooks that exposes two operations: drug search and order creation. The hook is vendor-neutral — the FHIR operations route to ScriptSure bots via OperationDefinition.
The patient must be synced before calling orderMedication. See Sync a Patient.
import { useState } from 'react';
import { useScriptSureOrderMedication } from '@medplum/scriptsure-react';
function OrderMedicationPanel({ patientId }: { patientId: string }) {
const { searchMedications, orderMedication } = useScriptSureOrderMedication();
const [iframeUrl, setIframeUrl] = useState<string>();
async function handleSearch() {
const medications = await searchMedications({ term: 'lisinopril', searchGeneric: true });
// medications is Medication[]
}
async function handleOrder() {
const result = await orderMedication({
patientId,
pharmacyOrganizationId: 'org-123',
diagnoses: [{ icdId: 'I10', name: 'Essential hypertension' }],
});
setIframeUrl(result.launchUrl); // render in an iframe for prescriber to review/sign
}
if (iframeUrl) {
return <iframe src={iframeUrl} width="100%" height="800px" />;
}
return (
<div>
<button onClick={handleSearch}>Search</button>
<button onClick={handleOrder}>Order</button>
</div>
);
}
searchMedications
Calls POST /fhir/R4/Medication/$drug-search. Returns Medication[].
| Parameter | Type | Description |
|---|---|---|
term |
string |
Free-text drug search term |
ndc |
string |
National Drug Code |
rxNorm |
string |
RxNorm code |
routedMedId |
number |
Vendor routed medication id — returns the drug's formulations |
gcnSeqnos |
number[] |
Vendor formulation keys under routedMedId, taken from the name-search hit. Used only when the drug has no formulations; see below |
searchOtc |
boolean |
Include over-the-counter drugs |
searchSupply |
boolean |
Include supplies |
searchBrand |
boolean |
Include brand-name drugs |
searchGeneric |
boolean |
Include generic drugs |
includeCode |
boolean |
Include coding in returned Medication resources |
quantityQualifiers |
boolean |
Return quantity qualifiers instead of Medication[] |
Drugs with no formulations
Some products — over-the-counter, topical, and multi-strength generics — have no rows in the vendor's dose-format table, so a routedMedId search alone returns nothing even though the drug exists and is prescribable. Each of the drug's formulation keys is a strength, so passing them resolves the strengths individually:
const strengths = await searchMedications({ routedMedId: 6143, gcnSeqnos: [8346, 22528, 22530] });
A name-search Medication carries one https://scriptsure.com/gcn-seqno identifier per key, so the caller can read them straight off the search hit. Expect fewer results than keys passed — discontinued formulations resolve to nothing and are omitted. These results carry a dispensable NDC but no pre-built sig lines, so the caller supplies the quantity and directions.
orderMedication
Calls POST /fhir/R4/MedicationRequest/$order-medication. Creates or updates a draft MedicationRequest and returns a launchUrl to embed as an iframe for the prescriber to review and sign.
Request fields:
| Field | Type | Required | Description |
|---|---|---|---|
patientId |
string |
yes | Medplum Patient resource id |
medicationRequestId |
string |
Existing draft MedicationRequest id to update |
|
drugs |
MedicationOrderDrugInput[] |
Drug lines for the order | |
combinationMed |
boolean |
Whether the order is a combination medication | |
compoundTitle |
string |
Title for a compound medication | |
compoundQuantity |
number |
Total quantity for a compound medication | |
compoundQuantityQualifier |
string |
Unit qualifier for compound quantity | |
compoundSigs |
{ sigOrder: number; line3: string; drugId?: number }[] |
Sig lines for compound medications | |
conditionIds |
string[] |
Medplum Condition resource ids |
|
coverageId |
string |
Medplum Coverage resource id |
|
payerOrganizationId |
string |
Medplum Organization resource id for the payer |
|
pharmacyOrganizationId |
string |
Medplum Organization resource id for the dispensing pharmacy |
|
pharmacyNcpdpId |
string |
NCPDP id of the dispensing pharmacy | |
pharmacyName |
string |
Display name of the dispensing pharmacy | |
diagnoses |
{ icdId: string; name: string }[] |
ICD diagnoses to associate with the order | |
writtenDate |
string |
Date the prescription was written (FHIR date) | |
fillDate |
string |
Requested fill date (FHIR date) | |
durationDays |
number |
Days supply | |
pharmacyNote |
string |
Notes to pharmacist | |
patientInstruction |
string |
Free-text patient instructions | |
appId |
string |
Vendor application id |
MedicationOrderDrugInput (one per drugs[] entry):
| Field | Type | Required | Description |
|---|---|---|---|
quantity |
number |
yes | Quantity to dispense |
ndc |
string |
National Drug Code — preferred drug identifier | |
rxNorm |
string |
RxNorm code | |
routedMedId |
number |
Vendor routed medication id | |
gcnSeqno |
number |
Vendor formulation key. Pair with routedMedId to order a drug that has no dose-level formulation to resolve an NDC from. Usually resolves to a real NDC anyway — see Drugs with no formulations — so this is a fallback for the rare product with no marketed package |
|
drugName |
string |
Drug name. Required with gcnSeqno, since there is no dose-level record to derive it from |
|
line1 |
string |
Dose text for a gcnSeqno-keyed line, e.g. "solution". Only send it when you hold dose text separate from drugName, such as a hand-entered form; a full product label duplicates itself in the rendered description. Omitted by both built-in order paths |
|
quantityQualifier |
string |
NCI unit code for the quantity (e.g. C48542 tablet) |
|
refill |
number |
Number of refills | |
drugOrder |
number |
1-based position within the order | |
sigLine3 |
string |
Patient directions (sig) | |
useSubstitution |
boolean |
Whether generic substitution is allowed |
Supply exactly one drug identity per line: ndc, rxNorm, or routedMedId (+ gcnSeqno when the drug has no formulations).
Response fields:
| Field | Type | Description |
|---|---|---|
orderId |
number |
Vendor-side order id |
vendorPatientId |
number |
Vendor-side patient id |
launchUrl |
string |
iFrame URL for the prescriber to review and sign the order |
medicationRequestId |
string |
Medplum MedicationRequest resource id created or updated |
pendingOrderStatus |
`'queued' | 'reused'` |