Skip to main content
Version 4.0.0 changes how the SDK retries, so that it only repeats what is safe to repeat. No method, option or export was renamed or removed.

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:
The one exception is 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 and 5xx 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().
Retry a write yourself only when repeating it is safe for you, for example a 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:
This does not bring back retries on 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 GET calls and multipart parts, and otherwise the original fetch error is thrown (it used to be UNKNOWN_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.