| Creating an SVG upload answers 400 unsupported_content_type or 413 file_too_large | SVG uploads are not enabled on this deployment (400), or the SVG is above 2 MB (413). | Upload the image as PNG or WebP, or reduce the SVG below 2 MB. |
| The PUT to put_url answers 403 from the storage host | The request headers differ from the signed ones, or the URL expired (15 minutes). | Send exactly the returned headers and the exact size_bytes; create a new session if it expired. |
| The browser PUT fails with a CORS or network error | A network or extension blocks the storage host. | Leave mode unset so the SDK falls back to the upload proxy, or pass mode: "proxy". |
| Multipart fails with etag_missing | The browser cannot read the ETag response header. | Use the SDK defaults; report it to support if it persists. |
| The session stays created | The bytes never arrived. | Check the PUT response, then call complete; the session expires after 15 minutes. |
| The session is failed | Processing refused the file; see error_code. | See the processing errors; animated images and HEIC are refused, as are JPEG and PNG images over 128 megapixels and other formats over 50 megapixels (AVIF and some WebP less). SVGs are refused with embedded bitmap images or a DOCTYPE, or when too complex to render safely. image_too_large can also mean the image is too costly to process, for example a palette PNG that becomes too large when re-encoded. |
| onUploadComplete ran twice | The browser repeated the complete call. | Make the hook idempotent, keyed on upload_id. |