Fair use

Limits and errors

A free service has limits. Here they are in one place, together with what to do when you meet one.

Size and counts

LimitValue
package.json size256 KB
dependencies300
focus entries50
minAgeDays0 to 365

A file over the size limit is answered with 413 payload_too_large, a file with too many dependencies with too_many_dependencies. For a monorepo, plan one package.json at a time, as in the guide.

A white speed limit sign reading 9 and a half in front of dark trees

Rate limit

About 30 requests per minute with a burst of 10, over REST. Beyond that you get 429 rate_limited. The limit protects the service for everyone, so a script that runs in a loop should pause between calls. Retrying after a short wait is safe: a plan changes nothing on your side.

Time

A plan has 60 seconds. The first plan for a project can be slow, because the package data has to be loaded from the registry. If the time runs out you get 504 plan_timeout over REST, or the same code in an MCP error. Call again with the same request: the data loaded so far is cached, so the second call is much faster. Set your own client timeout above 60 seconds, and the script exits with code 3 so a CI step can retry once.

Package data

The data comes from the public npm registry and is cached for 10 minutes. A package published a minute ago may not be visible yet. When the registry is briefly unavailable, expired data may be served, and meta.stale is true. If the registry cannot be reached and nothing is cached, you get registry_unreachable.

Only stable versions are used, and only package data that the registry's JSON API provides. Ripedeps downloads no package archives.

Files from a URL

With packageJsonUrl the service downloads your file, so the address is checked. Only https on port 443 is accepted, with no credentials in the URL, at most 2048 characters, at most 3 redirects and 10 seconds. Private and reserved addresses are blocked, including after DNS resolution and redirects. Use the raw file URL: an HTML page is rejected. The URL is not stored and is logged without its query string.

What it does not do

  • It reads no lockfile and no workspace configuration. The only input is package.json.
  • It has no vulnerability data. See what the age gate is not.
  • It proposes no prerelease versions and never tightens or loosens your range prefix.
  • It adds and removes no @types entries.
  • It has no exception list for single packages. A focus does the job.

The reasons are in the FAQ, and privacy lists what is kept.

Errors

Every error has the same shape and a stable code; the message is for people. The same codes come back over REST, MCP and the script (--json). The full format is on the API page.

CodeHTTPMeaning
invalid_json400The request body is not valid JSON.
invalid_request400Unknown or invalid parameters, or the wrong content type.
invalid_package_json400The package.json text is not valid JSON.
invalid_ripedeps_config400The ripedeps entry in the file has an invalid value. The message names the key.
invalid_input_url400Bad packageJsonUrl, or both or neither of packageJson and packageJsonUrl were sent.
too_many_focus_entries400More than 50 focus entries.
payload_too_large413The file is larger than 256 KB.
too_many_dependencies413More than 300 dependencies.
no_processable_dependency422Nothing in the file can be planned (every entry is skipped).
input_url_blocked422The URL, or a redirect target, points to an address that is not allowed.
input_fetch_failed422The URL could not be downloaded: DNS, timeout, connection or a non-2xx answer.
input_not_package_json422The downloaded file is HTML, or not a JSON object. Use the raw file URL.
not_found404Unknown path.
method_not_allowed405Wrong method for a known path. The Allow header lists the right one.
rate_limited429Too many requests. Slow down and retry.
registry_unreachable502The npm registry could not be reached and there is no cached data.
plan_timeout504The plan did not finish in time. Retry: what was loaded stays cached.
unhealthy503Returned by /healthz when the database is not reachable.
internal_error500Unexpected error.