Requirements
Unchanged: Node.js 20 or newer, or a browser; ESM and CommonJS.Breaking changes summary
429 is no longer retried
RATE_LIMITED covers both a per-route window and an account or IP block that can last about 30 minutes, so the SDK no longer retries it. This includes the simple upload limit and TOO_MANY_CONCURRENT_UPLOADS. Handle it yourself, and wait before trying again:
TOO_MANY_CONCURRENT_CHUNKS on a multipart part: the server refuses the part before reading it, so the SDK sends it again within maxRetries.
Writes get a single attempt
Network errors and5xx are now retried only on GET calls and on multipart upload parts. These calls get one attempt:
- simple
put(), and starting, completing and aborting a multipart upload; update(),copy(),move(),delete();rules.set(),uploadTokens.create(),shares.create(),shares.revoke().
put() to the same name with overwrite: true. See Retrying writes yourself.
Fewer retries, shorter backoff
maxRetries now defaults to 2 (was 5), and the backoff is capped at 8 seconds (was 30). To keep the old budget on reads and multipart parts:
429 or on writes.
SavedRule.active_from is optional
The API only sends active_from for rules with delete_after_days. In TypeScript, handle undefined:
delete([id]) with a single id
A batch with one id now reports PREFIX_NOT_ALLOWED in failed, like any other batch, instead of throwing:
delete(id) with a plain string still throws.
RATE_LIMIT is deprecated
The service no longer sends RATE_LIMIT: the account or IP block is RATE_LIMITED. The old code stays in BlobErrorCode so existing comparisons still compile; switch them to RATE_LIMITED. DUPLICATE_RULE_PREFIX was added.
Fixes
- A response body cut off mid-read is now a network error: it is retried on
GETcalls and multipart parts, and otherwise the originalfetcherror is thrown (it used to beUNKNOWN_ERROR). - A failed multipart upload now waits for the parts still in flight before aborting, so no part lands after the abort and no request outlives
put().
Checklist
1
Handle 429 yourself
Catch
RATE_LIMITED and back off; the SDK no longer retries it.2
Review writes
Add your own retry only to writes that are safe to repeat.
3
Pick a retry budget
Pass
{ maxRetries: 5 } if you relied on the old number of attempts on reads and multipart parts.4
Update types
Handle
active_from being undefined, and replace RATE_LIMIT with RATE_LIMITED.Next steps
Client
Install the SDK and create a client.
Errors
The retry policy in detail.

