The Walgreens Scheduling API allows developers to integrate the ability to get eligibility, timeslots, hold appointment, attach patients, and confirm appointments for vaccines or immunizations at any Walgreens location.
Below are the technical steps you will need to go through in order to get your integration configured and branded correctly:
The services listed below make up the complete list of services that are required in order to complete all phases of the Scheduling experience. Please note that all of the service endpoints documented below are brand new for this version of the API.
This request will provide the eligibility of specific vaccination or immunization for a given state / dob.
Sandbox: https://services-qa.walgreens.com/api/vaccine/scheduling/eligibility/v1
Production: https://services.walgreens.com/api/vaccine/scheduling/eligibility/v1
Request format | JSON |
Response format | JSON |
Authentication | Yes |
Rate limited | Yes |
Requests Per Minute | 300 |
Name | Optionality | Description | Example |
---|---|---|---|
apiKey | required | Your API Key. | "AbCdEfGhIjKlMnOpQrStUvWxYz" |
affId | required | Your AffiliateID. | "AAAAAAAAAA" |
state | required | Two-character state code where the vaccination is being sought. | "IL" |
dob | required | The date of birth . | "User's date of birth in YYYY-MM-DD format." |
curl --request POST \
--location 'https://services-qa.walgreens.com/api/vaccine/scheduling/eligibility/v1' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "YOUR_API_KEY",
"affId": "YOUR_AFFILIATE_ID",
"state": "STATE_OF_PATIENT",
"dob": "DATE_OF_BIRTH_OF_PATIENT"
}' \
{
"state": "STATE_OF_PATIENT",
"age": 34,
"category": null,
"dob": "09/30/1990",
"eligibleVaccineList": [{
"vaccineCode": "VACCINE_CODE",
"displayName": "DISPLAY_NAME",
"eligible": ELIGIGIBILITY_FLAG,
"vaccineType": "VACCINE_TYPE",
"vaccineDisplayOrder": SUGGESTED_DISPLAY_ORDER,
"restrictions": [{
"code": "RESTRICTION_CODE",
"message": "RESTRICTION_MESSAGE",
"vaccineCode": "VACCINE_CODE",
"minimunAge": RESTRICTION_MIN_AGE,
"maximumAge": RESTRICTION_MAX_AGE
}],
"warnings": [{
"code": "WARNING_CODE",
"message": "WARNING_MESSAGE",
"vaccineCode": "VACCINE_CODE",
"minimunAge": WARNING_MIN_AGE,
"maximumAge": WARNING_MAX_AGE
}],
"multiDose": IS_MULTI_DOSE,
"seriesNumber": SERIES_NUMBER_META_DATA,
"group": "IS_GROUPED_META_DATA",
"serviceId": "SERVICE_ID_META_DATA"
},
...shortened for brevity
],
"inEligibleVaccineList": [{
"vaccineCode": "VACCINE_CODE",
"displayName": "DISPLAY_NAME",
"eligible": ELIGIGIBILITY_FLAG,
"vaccineType": "VACCINE_TYPE",
"vaccineDisplayOrder": SUGGESTED_DISPLAY_ORDER,
"restrictions": [{
"code": "RESTRICTION_CODE",
"message": "RESTRICTION_MESSAGE",
"vaccineCode": "VACCINE_CODE",
"minimunAge": RESTRICTION_MIN_AGE,
"maximumAge": RESTRICTION_MAX_AGE
}],
"warnings": [{
"code": "WARNING_CODE",
"message": "WARNING_MESSAGE",
"vaccineCode": "VACCINE_CODE",
"minimunAge": WARNING_MIN_AGE,
"maximumAge": WARNING_MAX_AGE
}],
"multiDose": IS_MULTI_DOSE,
"seriesNumber": SERIES_NUMBER_META_DATA,
"group": "IS_GROUPED_META_DATA",
"serviceId": "SERVICE_ID_META_DATA"
},
...shortened for brevity
]
}
Warnings & Restrictions:
Your application must contain a UI element that the customer must take an action on every vaccination or immunization which contains a "restrictions"
or "warnings"
:
"restrictions"
object or "warnings"
object will contain a "message"
that must be presented to the user before continuing further in the flow. In the case of some restrictions continuation should be blockedName | Optionality | Description | Example |
---|---|---|---|
state | always | State from the request. | IL |
age | always | Age calculate from dob in the request. | 23 |
category | always | Category Metadata (not used today). | null |
dob | always | Date of Birth from the request. | 09/01/2001 |
eligibleVaccineList | always | List of Vaccinations or immunizations the patient is eligible to get. | EligibleVaccineList Objects |
inEligibleVaccineList | always | List of Vaccinations or immunizations the patient is NOT eligible to get. | IneligibleVaccineList Objects |
EligibleVaccineList objects are ones the patient is eligble to get, IneligibleVaccineList the patient is not eligible to get.
Name | Optionality | Description | Example |
---|---|---|---|
vaccineCode | always | The string to identifiy a specific vaccination / immunization. | "150" |
displayName | always | The name of the vaccine or immunization. | "Flu" |
eligible | always | Boolean, denoting eligibility of patient for the vaccine or immunization. false would mean patient not eligible. |
true/false |
vaccineType | always | Machine name of the vaccine / immunization | "Flu" |
vaccineDisplayOrder | always | The reccomended display order. | 5 |
multiDose | always | Boolean, for the vaccine or immunization taking multiple doses. | true / false |
seriesNumber | always | Meta Data that can be ignored. | "0" |
group | always | Meta Data that can be ignored. | "N" |
serviceId | always | Meta Data that can be ignored. | "99" |
restrictions | always | Resctions are rules that could prevent the patient from being eligible. Must be presented to patient. | Restrictions Objects |
warnings | always | Warning are rules that could prevent the patient from being eligible. Must be presented to patient. | Warnings Objects |
Restrictions objects prevent the patient from being elig, IneligibleVaccineList the patient is not eligible to get.
Name | Optionality | Description | Example |
---|---|---|---|
code | always | The Resctriction or Warning ID | "WAG_FC_VACCINE_SEASONAL_01" "WAG_FC_INCOMPATIBLE_01" "WAG_FC_AGERESTRICTION_01" "WAG_FC_PRESCRIPTIONNEEDED_01" |
message | always | The specific message that must be presented to the patient. | "This vaccine is seasonal. Appointments will be available again in late summer." "This vaccine can't be taken with the Hepatitis B vaccine." "The patient is too young to receive this vaccine in your state." "The patient is too old to receive this vaccine in your state." "Prescription is mandatory for the vaccine." |
vaccineCode | sometimes | The vaccine code that would prevent this vaccine from making the patient eligible, in the cases of incompatiblitiy | "104" |
minimunAge | sometimes | Minimun Age of patient to be eligible for vaccine or immunization | 7 |
maximumAge | sometimes | Maximum Age of patient to be eligible for vaccine or immunization | 19 |
This request will provide the timeslots of available appointments for a specific vaccination or immunization at specific Walgreens locations.
Sandbox: https://services-qa.walgreens.com/api/vaccine/scheduling/timeslots/v1
Production: https://services.walgreens.com/api/vaccine/scheduling/timeslots/v1
Request format | JSON |
Response format | JSON |
Authentication | Yes |
Rate limited | Yes |
Requests Per Minute | 300 |
Name | Optionality | Description | Example |
---|---|---|---|
apiKey | required | Your API Key. | "AbCdEfGhIjKlMnOpQrStUvWxYz" |
affId | required | Your AffiliateID. | "AAAAAAAAAA" |
state | required | Two-character state code where the vaccination is being sought. | "IL" |
zipCode | required | Zipcode of the location where the vaccination is being sought. | "60610" |
dob | required | The date of birth. | "User's date of birth in YYYY-MM-DD format." |
vaccine | required | A array of strings to identifiy specific vaccination / immunization ID's. Limit of 4 different ID's per request. | ["207"] Vaccination List |
appointmentAvailability | required | An appointmentAvailability object, used to filter specific dates. | Appointment Availability |
position | required | A position object, used to locate store results. | Position |
Name | Optionality | Description | Example |
---|---|---|---|
startDateTime | required | Start date for the timeslot search in YYYY-MM-DD format. | 2024-04-25 |
endDateTime | optional | End date for the timeslot search in YYYY-MM-DD format. | 2024-04-26 |
Name | Optionality | Description | Example |
---|---|---|---|
latitude | required | The Latitude coordinate of the user. | 41.876468 |
longitude | required | The Longitude coordinate of the user. | -87.639176 |
curl --request POST \
--location 'https://services-qa.walgreens.com/api/vaccine/scheduling/timeslots/v1' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "YOUR_API_KEY",
"affId": "YOUR_AFFILIATE_ID",
"state": "IL",
"zipCode": "94015",
"dob": "2001-01-01",
"vaccine": [
"207",
"150",
"93"
],
"isEligibility": false,
"appointmentAvailability": {
"startDateTime": "2024-04-28",
"endDateTime": "2024-04-29"
},
"position": {
"latitude": 42.0646736,
"longitude": -87.93838219999999
}
}' \
{
"locations": [{
"locationId": "THE_LOCATION_ID",
"name": "THE_LOCATION_NAME",
"storenumber": "THE_STORE_NUMBER",
"description": "THE_STORE_DESCRIPTION",
"position": {
"latitude": STORE_LATITUDE,
"longitude": STORE_LONGITUDE
},
"address": {
"line1": "STORE_STREET_ADDRESS",
"line2": "STORE_STREET_ADDRESS_2",
"city": "STORE_CITY",
"state": "STORE_STATE",
"country": "STORE_COUNTRY",
"zip": "STORE_ZIP"
},
"phone": [{
"type": "STORE_PHONE_TYPE",
"number": "STORE_PHONE_NUMBER"
},
...shortened for brevity
],
"distance": #.#,
"timeZone": "STORE_TIMEZONE_2_CHAR",
"appointmentAvailability": [{
"manufacturer": [{
"productId": "MANUFACTURER_PRODUCT_ID",
"vaccineCode": "WALGREENS_VACCINE_CODE",
"vaccineName": "WALGREENS_VACCINE_NAME",
"category": "WALGREENS_VACCINE_CATEGORY",
"prescriptionRequired": true or false
},
...shortened for brevity
],
"date": "YYYY-MM-DD",
"day": "DAY_OF_WEEK",
"slots": [
"HH:MM am",
"HH:MM pm",
...shortened for brevity
],
"numberOfSlotsAvailable": NUMBER_OF_SLOTS_AVAILABLE
},
...shortened for brevity
]
},
...shortened for brevity
]
}
This request enables users to hold vaccinations or immunization appointment timeslots at nearby Walgreens stores based on vaccine availability which were selected from the Timeslots request.
Sandbox: https://services-qa.walgreens.com/api/vaccine/scheduling/hold/v1
Production: https://services.walgreens.com/api/vaccine/scheduling/hold/v1
Request format | JSON |
Response format | JSON |
Authentication | Yes |
Rate limited | Yes |
Requests Per Minute | 300 |
Name | Optionality | Description | Example |
---|---|---|---|
apiKey | required | Your API Key. | "AbCdEfGhIjKlMnOpQrStUvWxYz" |
affId | required | Your AffiliateID. | "AAAAAAAAAA" |
locationId | required | ID of the location returned by the TimeSlot API. | "b8805d18-fb10-4833-ba43-3cc8df4d7c1d" |
appointmentDate | required | Date time stamp of the appointment in ISO format YYYY-MM-DDTHH:MM:SS-HH:MM. | "2024-04-25T09:30:00-06:00" |
slot | required | Appointment timeslot. | "09:30 am" |
channel | required | The channel in which the request is coming from. | "Web" or "Mobile" |
client | required | Your client name. | "AAAAAAAAAA" (contact us) |
engagementType | required | Your engagementType will always be "Guest". | "Guest" (static value) |
vaccines | required | A Vaccines Object array, used to specify the specific vaccinations or immunizations being requested. | Vaccines Object Array |
Name | Optionality | Description | Example |
---|---|---|---|
code | required | The code of the vaccination / immunization. | "150" |
productId | required | The product ID from the TimeSlot API. | "5fe2f39e8c6dd20dec60a594" |
curl --request POST \
--location 'https://services-qa.walgreens.com/api/vaccine/scheduling/hold/v1' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "YOUR_API_KEY",
"affId": "YOUR_AFFILIATE_ID",
"locationId": "USER_SELECTED_TIMESLOT_LOCATION_ID",
"appointmentDate": "USER_SELECTED_TIMESLOT_APPOINTMENT_DATE_TIME_STAMP",
"slot": "USER_SELECTED_TIMESLOT_TIME",
"channel": "Web",
"client": "YOUR_CLIENT_NAME",
"engagementType": "Guest",
"vaccines": [{
"code": "USER_SELECTED_TIMESLOT_VACCINATION_CODE",
"productId": "USER_SELECTED_TIMESLOT_VACCINATION_PRODUCT_ID"
}]
}' \
{
"engagementId": "USER_SESSION_ENGAGEMENT_ID"
}
This request creates a new patient record with personal identifiable information (PII) for a given engagementId retrieved from the Hold Appointment API. The response does not return a Patient ID, and the PII is used only to create vaccination or immunization appointment booking.
Sandbox: https://services-qa.walgreens.com/api/vaccine/scheduling/patient/v1
Production: https://services.walgreens.com/api/vaccine/scheduling/patient/v1
Request format | JSON |
Response format | JSON |
Authentication? | Yes |
Rate limited? | Yes |
Requests Per Minute | 300 |
Terms and Conditions:
Your application must contain a UI element that the customer must take an action on every single appointment booking with the following copy (Example: Checkbox, Toggle Switch, Verbal or written Agree/Yes):
Name | Optionality | Description | Example |
---|---|---|---|
apiKey | required | Your API Key. | "AbCdEfGhIjKlMnOpQrStUvWxYz" |
affId | required | Your AffiliateID. | "AAAAAAAAAA" |
engagementId | required | Your AffiliateID. | "662c410d1310e000648d6bae" |
partnerId | required | Your client name. | "AAAAAAAAAA" (contact us) |
firstName | required | Patient first name. | "John" |
middleName | optional | Patient middle name. | "David" or "" |
lastName | required | Patient last name. | "Smith" |
dob | required | Patient date of birth in "YYYY-MM-DD" format. | "1990-01-01" |
gender | required | Patient gender. | "male" or "female" or "other" or "unknown". |
contact | required | A Contact Object containing the information about the patients contact preferences. | Contact Object |
Name | Optionality | Description | Example |
---|---|---|---|
phones | required | A Phones Object array containing the phone number object. Used to send SMS confirmation of appointment. | Phones Object array |
emails | required | A Emails Object array containing the email object. Used to send Email confirmation of appointment. | Emails Object array |
Name | Optionality | Description | Example |
---|---|---|---|
type | required | The type of phone. We prefer this to be "Mobile" always so SMS appointment confirmation can be delivered. | "Mobile" |
number | required | The mobile phone number of the patient, format ###-###-####. | 111-111-1111 |
smsConsent | required | The patient's sms consent field. If set to Agree patient will get SMS appointment confirmation delivered. | "Agree" or "Disagree" |
Name | Optionality | Description | Example |
---|---|---|---|
type | required | The type of email address. | "Email" |
address | required | The address of the email | example@walgreens.com |
curl --request POST \
--location 'https://services-qa.walgreens.com/api/vaccine/scheduling/patient/v1' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "YOUR_API_KEY",
"affId": "YOUR_AFFILIATE_ID",
"engagementId": "USER_SESSION_ENGAGEMENT_ID",
"partnerId": "YOUR_CLIENT_NAME",
"firstName": "PATIENT_FIRST_NAME",
"middleName": "PATIENT_MIDDLE_NAME",
"lastName": "PATIENT_LAST_NAME",
"dob": "PATIENT_DOB",
"gender": "PATIENT_GENDER",
"contact": {
"phones": [{
"type": "Mobile",
"number": "PATIENT_PHONE_NUMBER",
"smsConsent": "Agree"
}],
"emails": [{
"type": "Email",
"address": "PATIENT_EMAIL"
}]
}
}' \
201 HTTP Status Code
This request enables users to confirm vaccination or immunization appointment based on engagementId. An appointment is not actually booked until a successful response is returned from this request.
Sandbox: https://services-qa.walgreens.com/api/vaccine/scheduling/confirm/v1
Production: https://services.walgreens.com/api/vaccine/scheduling/confirm/v1
Request format | JSON |
Response format | JSON |
Authentication | Yes |
Rate limited | Yes |
Requests Per Minute | 300 |
Name | Optionality | Description | Example |
---|---|---|---|
apiKey | required | Your API Key. | "AbCdEfGhIjKlMnOpQrStUvWxYz" |
affId | required | Your AffiliateID. | "AAAAAAAAAA" |
engagementId | required | Engagement ID received from the Hold Appointment API. | "AAAAAAAAAAAAAA1234567890" |
curl --request PATCH \
--location 'https://services-qa.walgreens.com/api/vaccine/scheduling/confirm/v1' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "YOUR_API_KEY",
"affId": "YOUR_AFFILIATE_ID",
"engagementId": "USER_SESSION_ENGAGEMENT_ID"
}' \
204 HTTP Status Code
Please find below the list of current vaccination or immunization codes and names.
Code | Name |
---|---|
03 | MMR |
10 | Polio |
18 | Rabies |
21 | Chickenpox |
33 | Pneumonia |
37 | Yellow Fever |
43 | Hepatitis B - Adult |
52 | Hepatitis A - Adult |
62 | HPV |
87 | Shingles |
93 | RSV |
101 | Typhoid |
104 | Hepatitis A/B Combo |
115 | Td/Tdap (Tetanus, diphtheria with or without pertussis (whooping cough)) |
134 | Japanese Encephalitis |
150 | Influenza |
163 | Meningitis B |
174 | Cholera |
206 | Mpox (Monkeypox) / Smallpox |
207 | COVID-19 |
223 | Tick-borne encephalitis (TBE) |
317 | Chikungunya |
Please see the various tables below mapping the various status codes and error codes across each endpoint.
ENDPOINT | HTTP STATUS CODE | DESCRIPTION |
---|---|---|
TIMESLOTS | 200 | Success, returns timeslots avilable based on requested filters. |
TIMESLOTS | 400 | Malformed request body. |
TIMESLOTS | 403 | Invalid apiKey. |
TIMESLOTS | 500 | Internal server error. |
TIMESLOTS | 502 | Bad gateway to internal server. |
HOLD | 200 | Appointment held successfully, returns engagementId. |
HOLD | 400 | Malformed request body. |
HOLD | 403 | Invalid apiKey. |
HOLD | 401 | The request is not authorized. |
HOLD | 409 | Error placing a hold for requested timeslot. |
HOLD | 500 | Internal server error. |
PATIENT | 201 | Patient attached to appointment successfully. |
PATIENT | 400 | Malformed request body. |
PATIENT | 401 | The request is not authorized. |
PATIENT | 403 | Invalid apiKey. |
PATIENT | 409 | Patient information already exists for engagementId. |
PATIENT | 500 | Internal server error. |
PATIENT | 502 | Bad gateway to internal server. |
CONFIRM | 204 | Appointment confirmed successfully. |
CONFIRM | 401 | The request is not authorized. |
CONFIRM | 403 | Invalid APIKey. |
CONFIRM | 409 | Error confirming the appointment. |
CONFIRM | 500 | Internal server error. |