Since the afternoon of 2026-10-23, every first upload of a new project gets 429 Too Many
Requests from upload.pypi.org (14 drivers). Without --verbose, twine does not print the
response body, so the reason and the wait it names are not in the log.
Changes
twine upload --verbose: PyPI's reason appears in the publish log.
--skip-existing: a re-run after a partly successful upload does not fail on "file already exists".
## Summary
Since the afternoon of 2026-10-23, every first upload of a new project gets 429 Too Many
Requests from upload.pypi.org (14 drivers). Without `--verbose`, twine does not print the
response body, so the reason and the wait it names are not in the log.
## Changes
- `twine upload --verbose`: PyPI's reason appears in the publish log.
- `--skip-existing`: a re-run after a partly successful upload does not fail on "file already exists".
## Related Issue
NAPALM/driver-standard#2
## Testing
YAML parses; only the upload command changes.
PyPI answered 429 to every first upload of a new project since the
afternoon of 2026-10-23; without --verbose the log does not say why or
for how long.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Since the afternoon of 2026-10-23, every first upload of a new project gets 429 Too Many
Requests from upload.pypi.org (14 drivers). Without
--verbose, twine does not print theresponse body, so the reason and the wait it names are not in the log.
Changes
twine upload --verbose: PyPI's reason appears in the publish log.--skip-existing: a re-run after a partly successful upload does not fail on "file already exists".Related Issue
NAPALM/driver-standard#2
Testing
YAML parses; only the upload command changes.