Here's how I ended up doing this:
- Upload contacts to shared lists (one for subscribe and one for unsubscribe) using the Bulk API
- Use a program feeder to add those contacts to a program every hour
- The program then subscribes/unsubscribes the contact, removes them from the shared list, and then removes them from the program
It works OK, but there are more moving parts than I like. If anyone has a simpler approach, I'd love to hear it.