Here is a weekend-sized project with a real payoff: a domain expiry and change monitor that emails you before a renewal lapses and tells you when a competitor's registration data moves. It needs no framework, no paid API, and about 150 lines of Python.
Classic whois example.com still works, but since the GDPR-driven redactions of 2018 most gTLD records return "REDACTED FOR PRIVACY" for registrant name, email and address. What remains public and useful is exactly what this project needs: registrar, creation date, updated date, expiry date, nameservers, and EPP status codes. Run whois -h whois.verisign-grs.com example.com for the registry's thin record, then follow the Registrar WHOIS Server field for the fuller one.
RDAP is the structured replacement for WHOIS and it is far easier to parse. curl -s https://rdap.org/domain/example.com returns JSON; rdap.org handles bootstrapping to the right registry for you. The fields you want are in the events array — look for eventAction values of registration, expiration and last changed — plus status and nameservers. No regex against free-text output, no per-registrar format differences.
The loop is small: read a list of domains from a text file, fetch RDAP for each, parse the expiration event into a date, and compare it to today. Store each result as a JSON file keyed by domain so the next run can diff against the last one. Alert on three conditions — expiry inside 45, 30 or 7 days; nameservers changed; status codes changed. That last one matters more than people expect: clientTransferProhibited disappearing means someone unlocked the domain for transfer, and redemptionPeriod or pendingDelete appearing means it already lapsed.
Run it daily from cron: 0 8 * * * /usr/bin/python3 /opt/domainwatch/check.py >> /var/log/domainwatch.log 2>&1. Registries rate-limit aggressively, so sleep a second between queries, cache results for at least 12 hours, and set a descriptive User-Agent. A hundred domains checked once a day is fine; the same hundred checked every five minutes will get your IP blocked.
ccTLDs are inconsistent — .de returns almost nothing, .uk uses Nominet's own format, and several ccTLDs have no RDAP endpoint at all, so keep a WHOIS fallback. Dates come back in several formats; parse to UTC immediately. And a domain in redemptionPeriod can still be recovered by its owner for a fee, so do not treat it as available.
Once the data is landing daily, the obvious extensions are a TLS certificate expiry check against the same host list (openssl s_client -connect host:443 | openssl x509 -noout -enddate), a DNS record snapshot so you can diff A and MX changes, and a small static HTML dashboard generated from the JSON files. If you want the lookup fundamentals first, start with the free WHOIS lookup guide.