Skip to main content

NC DMV Reservation Tools

Dealing with DMV is often a frustrating experience. But it doesn't have to be!

Automated availability checking and monitoring for DMV offices across the state of North Carolina, tested to work on Jan 2024.

No feature will be added unless I need it myself. If you need additional features, you're welcome to contribute a PR. :)

https://teddysc.me/blog/ncdmv-reservation

Background

DMVs within reasonable distance of where I live are always completely booked, so I made this tool to help me spot when someone cancelled their appointment so I could snag it.

Since the tool was made for self-use only, currently it's hard-coded to only checks for the appointment type of 1st time Driver License Test (over 18). If you need additional features, you're welcome to contribute a PR. :)

I've used it to spot availability slot twice after running it for a few hours, and secured my reservation. :)

Quick Start

Installation

# install google-chrome / google-chrome-stable, and
# install chromedriver with your favorite package manager and put it in your $PATH
brew install chromedriver
# or sudo pacman -S chromedriver

# python3.12+ required
pipx install ncdmv-reservation

Running

$ ncdmv-driver-license-office-availability | jq | tee ncdmv.json
[
  {
    "is_reservable": true,
    "office_name": "Aberdeen",
    "street_address": "521 S. Sandhills Blvd., Aberdeen, NC",
    "zip_code": "28315"
  },
  {
    "is_reservable": true,
    "office_name": "Ahoskie",
    "street_address": "242 N.C. 42 W., Ahoskie, NC",
    "zip_code": "27910"
  },
  {
    "is_reservable": true,
    "office_name": "Albemarle",
    "street_address": "611 Concord Road, Albemarle, NC",
    "zip_code": "28001"
  },
  {
    "is_reservable": true,
    "office_name": "Andrews",
    "street_address": "1440 Main St., Andrews, NC",
    "zip_code": "28901"
  },
  {
    "is_reservable": true,
    "office_name": "Asheboro",
    "street_address": "2754 U.S. 220 Business South, Asheboro, NC",
    "zip_code": "27205"
  },
  ...
]

Filtering for the DMV office you're interested in with jq:

$ <ncdmv.json jq '.[] | select(.office_name == "Raleigh West") | .is_reservable' -r
false
# so it's completely booked (the `Raleigh West` office)

How it works

ncdmv-driver-license-office-availability spins up a chrome instance to click through the very user friendly DMV site, scrap the page, and convert it to structured JSON.

Use the -H, --no-headless option to see the chrome instance in action.

Continuous Monitoring

On your local machine

I found this approach more convenient for me.

dmv () {
	ncdmv-driver-license-office-availability | jq '.[] | select(.office_name == "Raleigh West") | .is_reservable' -r

}

# replace `say` if you're not on macOS
# you can change the frequency of the check by changing the `sleep` duration
dmv_monitor() {
	(while :; do [[ $(dmv) == true ]] && say 'go to dmv and reserve now'; sleep 60; done)&
}

# start monitoring every 60s, in the background
# don't close your terminal tab :)
dmv_monitor

# to stop it, run
# kill %1
# or just close the terminal tab. :)

GitHub Actions

Email notification via sendgrid if the DMV office of your choice is reservable.

The workflow file

Thoughts

After I wrote this I remembered that I should check GitHub first to see if someone else has already done it.

Fortunately, their solutions are outdated, and I did not reinvent the wheel. :)

Develop

$ git clone https://github.com/tddschn/ncdmv-reservation.git
$ cd ncdmv-reservation
$ poetry install

Metadata

Release files for ncdmv-reservation 0.1.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ncdmv-reservation 0.1.8
File Size Uploaded
ncdmv_reservation-0.1.8.tar.gz 4.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ncdmv-reservation 0.1.8
File Interpreter ABI Platform
ncdmv_reservation-0.1.8-py3-none-any.whl Python 3 none any Details

Total release size: 10.1 kB

Release files / ncdmv_reservation-0.1.8.tar.gz

Download URL ncdmv_reservation-0.1.8.tar.gz
Size 4.6 kB
Tags Source
SHA-256 checksum
How to use checksums
4e733bedfec5104a6396c39e2b453cb3a3799a64566763b7fda65441f916139b
BLAKE2b-256 checksum
How to use checksums
8c646add9af1fbb65b65f531d3e69d8db99c51c2b61e3757ec0f44032e766afe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.12.1 Darwin/23.1.0

Release files / ncdmv_reservation-0.1.8-py3-none-any.whl

Download URL ncdmv_reservation-0.1.8-py3-none-any.whl
Size 5.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bd081dbe5ec5c1c1dfda292346ef34a96d80c123436794cb89b45897e6201b45
BLAKE2b-256 checksum
How to use checksums
d898459c308d2028ec3a2986845382ad7a23a2ddfdc70b0bb3e2c0d6c28585d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.12.1 Darwin/23.1.0

Release history Release notifications | RSS feed

This release

0.1.8 This release

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page