Sounds like you keep making requests even after getting a “Rate Limit Exceeded” or other error - if i’m reading that right.
Is there maybe some code that keeps retrying on errors that’s causing this? What rate limits are you working on - the ratelimits from the https://dev.twitter.com/rest/reference/get/application/rate_limit_status endpoint or the HTTP headers?
I’ve always used the HTTP header ratelimits, and never had any problems with those (rate_limit_status response sometimes shows you have a few requests remaining when you don’t, it’s “slower” to update in my experience, but useful to fill in initial values for rate limits)
Another thing to check is if you’re making requests in parallel - this is a bad idea, i tried it before, and you end up with very unpredictable results, and lots of rate limit exceeded errors. ie: if you have 15 calls in a 15 min window to make for a user, make those one after another, never in parallel, and keep an eye on the ratelimit http headers, also a good idea to always add a few extra seconds of wait time on top of what twitter reports as the “reset time” to be on the safe side.
Also, given 100 users - i’m sure some of them will end up revoking access, invalidating their tokens. Making requests on behalf of those users will also look like “abusive API usage”. You should check that with https://dev.twitter.com/rest/reference/get/account/verify_credentials before launching a bunch of API calls on behalf of that user, since they might have revoked app access at some point between signing up - where you got their access token, and began making API calls.
Sounds like you should be fine if you manage to fix the rate limited calls.