Please visit for more up to date information on vaccine availability.

November 13, 2021 Update: The raw, historical data is now available again for those looking to do data analysis.

October 26, 2021 Update: The website and APIs are now fully shutdown. Thanks for all the kind words, it's been a blast!

September 23, 2021 Update: The website is now shutdown, but I'm going to try and keep the underling data and APIs updating until October 26, 2021 to give other developers using this data time to figure out alternatives.

September 13, 2021 Update: Shutdown announcement.

Historical Data

If you're interested in historical analysis of the appointments data, I have been collecting raw data of all appointment changes that have been detected since 2021-02-26 until the website shutdown on 2021-10-26 (note, the website was non-functional for parts of August 2021, which is why those files are 0MB).

This historical data is based on PostgreSQL table auditing, so it captures any changes detected in the underlying database tables. This may not be the most ideal design for this, but it does capture all of the possible changes (changes in overall appointment availability, changes in the specific appointment slots available, etc).

  • UTC Date Files: The audit records are organized into separate files for each complete UTC date.
  • Gzipped JSON Lines Format: Each file is a gzipped JSON Lines file. This format is simply a file where each line is a JSON object (but it's not technically a JSON array to make it easier to read the sometime large files line-by-line).
  • Exclusions: Some change events were explicitly excluded from the audit records for the sake of space. If only the following fields were being updated on a record, then auditing was skipped: created_at, updated_at, metadata_raw, appointments_raw, appointments_last_fetched.
  • Fields:
    • transaction_timestamp: The time this audit change event occurred in the database.
    • action: Indicates whether a INSERT, UPDATE, or DELETE statement was responsible for the audit change.
    • previous_data: The complete data on this record as it existed just before the current transaction is about to take place and alter the record. Note that because some change events are excluded (see above), this previous data may contain data that wasn't previously in the audit history logs (so this is not necessarily the data that was previously audited for a record).
    • changed_data: The specific fields and data that is being updated on this record as part of this change.
    • data: The final set of data that exists after this transaction takes place.

Last API Snapshot (2021-10-26)

This may be of limited use, but it might help to understand the structure of the data, so I'm also providing the last snapshot of the live API with how the API data existed before the site was shutdown on 2021-10-26.

API Fields

  • features[] Vaccine Spotter's own unique ID for this location.
  • features[].properties.provider: A unique key representing the pharmacy or provider this location belongs to.
  • features[].properties.provider_location_id: The provider's own unique ID to represent this location (eg, store number, or other identifier). Unique in combination with provider.
  • features[].properties.appointments_available: Boolean value as to whether or not appointments are currently available at this location as of last check.
  • features[].properties.appointments: If appointments_available is true, then for some providers, this field contains an array of additional details on the specific appointment timeslots, vaccine types, etc. This more detailed information is not available for all providers, and the amount of detail varies for each provider.
  • features[].properties.appointments_last_fetched: ISO8601 time of when the appointment data was last fetched from the provider's website for this specific location.
  • features[].properties.appointments_last_modified: ISO8601 time of when the appointment data was last modified. In most cases, this will mirror appointments_last_fetched, but for some providers this may reflect an older time if we refresh the provider's website more frequently, but the provider's data indicates it is older.
  • features[].properties.carries_vaccine: This field is mostly for internal processing usage. Locations may carry the vaccine if this field is true or null (null just indicates this field isn't really used for a specific provider).