Promise rejections and callback errors carry message and http_code. In debug mode,
errors from API calls also include the Cloudinary request ID — include it in support
tickets:
const cloudinary = require('cloudinary').v2;
cloudinary.config({ debug: true }); // adds request IDs to errors and logsConfiguration never loaded. Set CLOUDINARY_URL before the first call, or call
cloudinary.config({...}) explicitly. See Configure Cloudinary.
Key and secret do not match the cloud name. Re-copy all three from Console > Settings > API Keys. If you use multiple environments, check which one your process actually loaded.
A signed request included parameters that were not part of the signature, or values changed after signing. Sign every parameter the client sends. See Sign a browser upload.
You are calling management APIs in a request path. Batch the work and cache results.
Successful Admin responses carry rate_limit_remaining, so you can slow down before you
are cut off. Delivery URLs are never rate-limited this way.
Switch to chunked upload (upload_large).
The asset is still being processed and is not yet available for the operation you
requested — common right after uploading a large video, or while an eager or
add-on-driven transformation is still running. This is transient: retry with backoff
rather than treating it as a failure. For long jobs, prefer eager_async with a
notification_url over polling.
The reason is in the X-Cld-Error response header of the failing URL (lowercase
x-cld-error over HTTP/2):
curl -sI "https://res.cloudinary.com/<cloud_name>/image/upload/w_abc/sample.jpg" | grep -i '^x-cld-error'
# x-cld-error: Invalid width in transformation: abcTypical values: Resource not found - <public_id> (wrong public ID, folder, or
resource type in the URL path), Invalid <param> in transformation: <value>, and
Unknown transformation <name> (the named transformation is missing on this
environment). The header is CORS-exposed, so browser code can read it from a failed
image fetch as well.
The asset was uploaded as raw — upload_large defaults to resource_type: 'raw'.
Re-upload with resource_type: 'video'.
The feature or add-on (for example the Analyze API or Visual Search) requires a subscription or account enablement. Check the add-ons page in the console; these are account capabilities, not SDK flags.
Pass timeout (milliseconds) in the call options. For uploads on unstable links, use
chunked upload; chunks retry independently.
CDN-cached URLs do not update instantly. Deliver with the new version from the upload
response, which changes the URL immediately. See
Transform and deliver an image or
a video.
- Platform status: https://status.cloudinary.com — check this first. A widespread incident explains failures that look like a bug in your code.
- SDK bugs: https://github.com/cloudinary/cloudinary_npm/issues
- Account issues: https://support.cloudinary.com (include the request ID from debug mode)