The error#
The client looks for an error that starts with:
(326) Authorization: Denied by access controlIt logs Ban detected: plus the status line, closes the account with inactive=True, stores the error text as the account's message, and raises HandledError.
Error strings are built as ({code}) {message} from each object in the JSON errors array.
What triggers it#
A GraphQL body whose errors include code 326 and that message prefix. The source groups it with the code-88 path: both set inactive=True. Code 88 is the rate-limit page. Code 326 is this one.
How to confirm#
The log contains (326) Authorization: Denied by access control and Ban detected:. The account's error_msg is that string. The account's active flag is false.
Fixes#
HandledError rotates to the next account. The deactivated one stays out until you log it in again or replace it. The library does not send an unlock call for code 326. Unlocking is whatever X shows that account in the official client. After that, the pool needs a fresh login or fresh cookies. The comment on cookie accounts says they wait for another add_cookie.
SocialScrape#
Profile is GET /v1/twitter/profile. One post is GET /v1/twitter/tweet. A profile's posts are GET /v1/twitter/profile/tweets. These read what X shows logged out.
Failed requests cost 0 credits. New accounts get 100 credits on signup, no card. Suspended accounts come back as removed, unknown ones as not_found.