Skip to main content
For who owns checkout, scheduling, and the member experience, start with Is this API right for you?. Before using this guide you need a sandbox and an access token. Request keys from Get API keys. How to send Authorization is in Authentication. Use synthetic data only on the initial sandbox. Listing imaging centers, searching or creating practices or law firms, and submitting an order-form-only referral may be off until Scan enables them for your account. If you only have the patient and physician order — no safety answers or preferred times — use Submit a medical referral instead. If the referral already exists and you only need to send safety answers, use Submit medical questions. If the referral already exists and you only need to send preferred times, use Submit preferred times. What you will build. One referral that arrives at Scan ready to schedule: the patient on file, the physician order attached, the safety questions answered, and a preferred imaging center with the times that work for the patient. What Scan does after. We book the appointment from the preference you send, confirm it with the patient, and file the radiology report back to you. You never pick a timeslot yourself in this flow.

Terms you will see

  • Referral — the request for imaging. Holds one or more visits.
  • Visit — one trip to an imaging center, carrying the orders for that trip (modality, body part).
  • Order form — the physician’s signed order PDF, sent as order_form. There is no separate medical-referral object.
  • Medical safety questions — the intake questionnaire. A yes on a blocking question, metal implants for example, rules some scanners out.
  • Preferred center and availability — where and when the patient wants to be seen. We book from this.

1. Tell us who the patient is

Register the person being scanned so the rest of the flow can refer to them. Patients are scoped to your group, so you only ever see your own. If you would rather send everything at once, you can nest these same fields as referral.patient in the next step instead. POST /api/v2/patients
What you get back. The patient id. Hold onto it as patient_id for the next step. Full payload: Creates a patient.

2. Send the referral with the physician order

This is the step that creates the imaging request. It carries three things: the patient, the signed physician order, and what is being scanned. The order is the PDF the referring physician signed, sent as order_form in a base64 data URL shaped like data:<content_type>;name=<filename>;base64,<payload>. What is being scanned lives in visits, and each visit carries its orders. Look up the exact procedure first with CPT codes, then send its id as cpt_code_id. We infer modality, body part, contrast, laterality, modifier, and number of views from that mapping. Diagnosis IDs come from ICD-10 codes. You can still send the legacy modality and body-part fields instead. POST /api/v2/referrals
What you get back. The full referral, including its id. Every remaining step is addressed to that id. Full payload: Creates a referral.

3. Record the patient’s safety answers

These are the screening questions an imaging center asks before an MRI — claustrophobia, metal implants, and similar. Ask them however suits your product, then send the answers here. Do this before you list centers. The answers change which centers can take the patient: claustrophobia points to open scanners, and a yes on a blocking question rules some equipment out entirely. List centers first and you may show the patient somewhere they cannot go. Fetch the questions, which come back with any answers already on file: GET /api/v2/referrals/{referral_id}/medical_questionnaire
Then send the answers back, using each question’s id: PUT /api/v2/referrals/{referral_id}/medical_questionnaire
What you get back. The question set with your answers applied, so you can show the patient what is on file. Full payloads: Returns medical safety questions and Submits medical safety answers.

4. Show the patient nearby imaging centers

Get the centers that can perform this scan, closest first. The search starts from the patient’s address unless you pass a different address, and it already accounts for the safety answers from the previous step. These are candidate centers, not appointment times. Availability is not part of this response. GET /api/v2/locations?referral_id={id}
What you get back. A ranked list with each center’s name, address, and distance in miles. Keep the id of whichever one the patient picks. Full payload: Returns nearby imaging centers.

5. Send the center and times the patient wants

Tell us how to book. There are two ways to answer, depending on how particular the patient is. If they are flexible on both place and time, send anytime_anywhere and nothing else — we find the soonest good option. If they are not, send time_preferences with the location_id they picked in the previous step, plus either the days and times that work (preferred_times) or asap: true to take the soonest opening at that center. POST /api/v2/referrals/{referral_id}/scheduling_preferences
What you get back. The updated referral, with preferred_location and scheduling_mode reflecting what you just sent. The referral is now with our scheduling team. Full payload: Submits preferred center and availability.

6. Follow the referral to the report

You have two ways to stay current. Subscribe to the status changed webhook and we push each change to you, or poll the referral when you need a snapshot. GET /api/v2/referrals/{referral_id}
What you get back. Once we book, visits[].location and visits[].start_time tell you where and when the patient is going. The snapshot also carries answered_medical_questionnaire, preferred_location, and scheduling_mode, so you can confirm every step above landed. When the scan is read, pull the radiology report PDF with GET /api/v2/order_documents/report. Full payload: Returns a referral by ID.