Skip to main content

Error codes

A consolidated reference for every error code you might see, across the surfaces: the dig RPC (JSON-RPC), the dig-store CLI (process exit codes), DIGHUb (the web app's user-facing codes), and the chia:// content loader (the DIG Browser / extension). Look up the code you got; each row says what it means and what to do.

For step-by-step fixes, see Troubleshooting.

Machine-readable

This catalog is also published as error-codes.json — a flat [{surface, code, http_or_exit, description}] list (plus a bySurface index) so an agent can branch on a code without scraping this table. It is generated from the same source as the tables below and drift-checked against them on every build, so the two can never disagree.

dig RPC (JSON-RPC)

The dig RPC uses the standard JSON-RPC 2.0 error codes plus the protocol-specific -32004, -32005, the node-profile -32003 / -32006 / -32007 / -32008 / -32009, the shell/staging codes -32010 (upstream) and -32011-32014 (dig.stage), the metadata-response bound -32015 (dig.getMetadata), the push-reassembly bound -32016 (cache.pushCapsule), the private-retrieval codes -32020 / -32021 / -32022, the local control-plane codes -32030 / -32031 / -32032, and the wallet chain-read/broadcast codes -32040-32043. A content miss is never an error — the capsule returns its own indistinguishable, non-verifying response (there is no decoy field on the wire), and the client discovers the miss by inclusion-proof and/or decryption failure (see the blind host model). For any well-formed body the HTTP status is 200; the error is carried in the JSON envelope.

CodeMeaningWhat to do
-32700Parse error — the request body isn't valid JSON.Fix the JSON you're sending; ensure Content-Type: application/json.
-32600Invalid request — not a request object/array, an empty batch, or a missing method.Send a valid JSON-RPC request with a method field.
-32601Method not found — this node doesn't implement the method.Check the name against Methods; call dig.methods to see what the node supports.
-32602Invalid params — missing/malformed store_id, root, or retrieval_key, or "latest" on a store with no confirmed generation.Verify each identifier is the right length of lower-case hex; confirm the store has at least one capsule.
-32603Internal error — the node failed to satisfy a well-formed call.Retry; if it persists, try another node or report it.
-32003Content miss rate limited — this node does not hold the requested content, and this requestor is driving the miss → provider-lookup path too fast. A per-requestor token bucket (burst 16, refill 4/s) fronts the DHT lookup and the proxy fetch, keyed by requestor identity (mTLS peer_id / connection IP / a shared loopback bucket); over budget the miss is refused with this code, while a different requestor draws from its own bucket and is unaffected. A well-formed error, never a silent empty success. Returned by the node-profile content methods (dig.getContent, dig.fetchRange) on a rate-limited miss.Back off and retry the same request after a short delay — it is transient (distinct from the holder-fatal -32009). Slow your miss/lookup rate; a caller that names concrete content it actually wants stays under budget.
-32004Resource not available at the requested root — a genuine infrastructure miss (no host seed, the module absent in both buckets, bad magic, oversize, a wasmtime trap, or an undecodable envelope). Distinct from a content miss, which is an indistinguishable decoy and is never an error.Confirm the root is a confirmed generation (dig.listCapsules); retry or try another node.
-32005Root not chain-anchored — the requested or served generation is not the store's current on-chain root. A content read is pinned to the CHIP-0035 singleton's on-chain root (resolved live from the chain, never trusted from the serving node): if the requested root is not the on-chain root, or the chain cannot be reached, or the store has no confirmed generation, the read fails closed with this code rather than serving an unverified generation.Read against the store's current on-chain root (omit root to take the chain tip, or resolve it yourself); if the chain was unreachable, retry.
-32006Peer unreachable — no connection to the named peer could be established: every NAT-traversal strategy (direct, UPnP/NAT-PMP/PCP mapping, relay-coordinated hole-punch, and relayed fallback) failed, or the peer is not registered on this network. Returned by the node-profile peer methods (dig.getPeers / dig.announce / dig.getNetworkInfo).Confirm the peer is online and on the same network; retry — a relayed path may become available, or a hole-punch may succeed on a later attempt.
-32007Range not satisfiable — the requested byte range lies outside the resource (offset ≥ its length) or is otherwise unsatisfiable. Returned by the node-profile dig.fetchRange (the streaming byte-range / multi-source content fetch).Re-request within total_length (read it from any range frame or dig.getMetadata); align ranges to the resource size.
-32008Content held elsewhere — redirect — this node does not hold the requested content, but it located peers that DO. Not a not-found: error.data.redirect names the holder(s) (providers[] = peer_id + candidate addresses), the content requested, and the redirect budget (redirect_depth, max_redirects). The named candidate set is capped — a redirect never lists every holder the node knows of, only a small bounded set — so a caller should treat the list as "enough candidates to proceed," not "every holder." The node names holders but never dials or probes them itself; reaching them is the caller's own job over its own reachability ladder, IPv6-first. Returned by the node-profile content methods (dig.getContent, dig.fetchRange) on a local miss when a provider exists.Re-request the same content against a peer in data.redirect.providers, echoing redirect_depth in your params so the hop budget stays bounded; stop when redirect_depth reaches max_redirects. If none of the named candidates are reachable from where you are, retry the original request with proxy: true to have the node fetch the bytes on your behalf instead.
-32009Range metadata unrepresentable — the metadata for a byte range alone cannot fit a frame (an inclusion proof whose base64 exceeds the 4096-byte cap), so this holder has no conforming range stream for the resource and streams no frames. Returned by the node-profile dig.fetchRange.Treat the holder as fatal for that range: fetch the range from a different holder and do not re-request it from this one. Do not count it as a transport failure — counted that way, your client retries a peer that can never succeed.
-32010Upstream error — a node acting as a thin shell relayed a method it does not resolve locally to its upstream DIG RPC, and the upstream was unreachable or returned a non-JSON response.Retry; if it persists the upstream (e.g. rpc.dig.net) may be unavailable — try another node.
-32011Stage: source directory unreadable (dig.stage, local control) — the source directory could not be read.Confirm the directory exists and is readable; re-run.
-32012Stage: no files to stage — the source directory contains no files.Point dig.stage at a directory with content.
-32013Stage: content exceeds the capsule size cap — the staged content is over the size limit.Reduce the content to within the capsule size cap.
-32014Stage: compile/IO failure — building the module hit a compile or IO error.Check the source + disk; re-run with --verbose for detail.
-32015Metadata too large — a dig.getMetadata capsule's publisher metadata section is larger than the 3 MiB response ceiling. This section is returned whole (it cannot be paged like content), and its custom/links fields are publisher-controlled, so an oversized section is refused with this bounded error rather than returned as one very large response. A normal store's metadata is well within the ceiling.Read the store's public file surface with dig.getManifest / individual files with dig.getContent instead of the whole metadata blob; if you publish, keep the metadata custom/links fields small.
-32016Push pending-reassembly limit reachedcache.pushCapsule refused this window: the node's in-flight pending-reassembly bound is exceeded (a per-requestor or global concurrent-push cap, the global pending-bytes budget, or an abandoned-partial TTL).Wait for your in-flight pushes to complete, then retry the window.
-32020Onion circuit unavailable — a mode:"privacy" content read could not be served privately (no circuit could be built, or one died mid-fetch). The node fails closed rather than downgrading to a direct fetch — a silent downgrade would deanonymize the very reader who asked for privacy.Retry (a fresh circuit may build); or explicitly choose a fast mode:"speed" fetch if you accept revealing the read.
-32021Privacy requires a local nodemode:"privacy" was requested but the caller is not the node's own trusted local originator. A node will not fetch privately for a remote/anonymous caller (that would hand it the caller's identity and query).Run a local DIG node (in-process browser node or the OS-service node on loopback) and issue the private read to it.
-32022Onion hop count out of range — the requested privacy.hops (circuit length) is outside the allowed range [2, 5] (default 3).Request a hop count within [2, 5].
-32030Unauthorized (control) — a control.* method was called without a valid local control token. Control methods are loopback-only. (These codes are -32030+ so they never collide with the onion codes above.)Call control methods from the local machine with the node's control token.
-32031Not supported (control) — a control operation this build/pin cannot perform (e.g. §21 whole-store sync with no loaded identity).Ensure the required capability/identity is present, or use a build that supports it.
-32032Control error — a control operation failed at runtime (distinct from bad input or an absent capability).Retry; check the node's logs; report if it persists.
-32040Wallet: no chain source (WALLET_NO_CHAIN_SOURCE) — one of the control.wallet.* methods (balance, coins, peak, coinById, broadcast) had no live chain source able to answer. Reported instead of a fabricated result.Attach/allow a chain source (a synced local node or the coinset fallback), then retry.
-32041Wallet: not synced (WALLET_NOT_SYNCED) — a control.wallet.* read hit a wallet that is still syncing, with no live fallback available yet.Wait for the node to finish syncing, then retry.
-32042Wallet: read failed (WALLET_READ_FAILED) — a control.wallet.* call failed at the underlying DB / chain-source layer.Retry; check the node's logs; report if it persists.
-32043Wallet: rate limited (WALLET_RATE_LIMITED) — the open coinset-fallback rate limit is exhausted (too many arbitrary-address/coin reads in a short window).Back off and retry; the cheap local-DB fast path is never rate-limited.

dig-store CLI (exit codes)

dig-store exits 0 on success and a distinct non-zero code per error kind, so scripts and CI can branch on the cause. Re-run with --verbose to see the full message; many errors also print a one-line fix hint.

ExitCodeMeaningWhat to do
0successThe command completed.
1otherAn unclassified error.Re-run with --verbose; see the printed message.
2invalid-argumentA flag or argument was invalid.Check dig-store <command> --help.
3no-storeNo store found here.Run digs init (or cd into a store's directory).
4not-foundA resource/URN/root wasn't found.Run digs log to list generations and keys.
5verification-failedContent failed cryptographic verification.Wrong salt/key, or the data was tampered with — recheck your URN/salt.
6networkA network/transport failure.Check your connection and that the remote is reachable (digs remote list).
7non-fast-forwardThe remote root has advanced past yours.Run digs pull first, then push.
8unauthorizedNot authorized for this action.Check your credentials / the store's signing key.
9no-seedNo wallet seed is set up.Run digs seed import or digs seed generate.
10bad-passphraseWrong passphrase for the seed.Re-run and enter the correct passphrase.
11invalid-mnemonicThe mnemonic is invalid.Check the word list and word count (12/24).
12insufficient-fundsNot enough XCH or DIG to cover the spend.Fund the printed receive address (you need the uniform capsule price in $DIG + an XCH fee per capsule), then retry.
13chainA Chia chain/coinset error.Check your connection to coinset.org and retry.
14confirm-timeoutThe on-chain confirmation timed out.The tx may still confirm — run digs anchor status.
15mint-failedMinting the store singleton failed.Retry; if it persists, check wallet funds and coinset.org.
16update-failedAnchoring the new root failed.Retry; if it persists, check wallet funds and coinset.org.

DIGHUb (web app)

When a publish or account action fails, DIGHUb shows a plain-language message and a stable code you can quote in a report. The codes below are the ones you're most likely to see.

CodeWhat it meansWhat to do
WALLET_DECLINEDYou declined the signature in your wallet. Nothing was signed or broadcast.Not an error — re-try and approve if you meant to publish.
DIG_INSUFFICIENTNot enough $DIG in your wallet to cover this capsule's price.Top up $DIG (the publish screen links where to get it), then retry.
COIN_CONFLICTThe coin was just spent elsewhere (double-spend / mempool conflict).Retry — DIGHUb rebuilds the spend with a fresh coin.
REG_PENDINGYour spend is on chain and will appear shortly.Wait a moment — do not sign or pay again.
WALLET_SESSIONYour wallet session can't sign (expired, watch-only, or missing method).Disconnect and reconnect your wallet; make sure Sage is up to date.
NET_OFFLINEYou appear to be offline.Check your connection and try again.
NET_TIMEOUTThe request timed out or couldn't reach the network.Try again.
SLUG_TAKENThat store name is already taken.Pick a different name.
OVER_QUOTAYou've reached the store limit for this account.Remove an unused store or contact support.
COIN_RESERVEDA coin is busy finishing another transaction.Wait a moment and try again.
UNAUTHORIZEDYour session isn't authorized for this.Reconnect your wallet and try again.
FORBIDDENYou don't have permission to do this.Use the account that owns the store.
NOT_FOUNDThe thing couldn't be found — it may have expired.Start over and try again.
INVALID_REQUESTSomething about the request wasn't valid.Try again; if it persists, report it with the code.
UNEXPECTEDAn unclassified error.Retry; if it persists, report it with the code.
Codes are stable; messages may improve

The code is the stable identifier — quote it in a report. The wording of a message may change as the copy gets clearer.

chia:// content loader

When you open chia:// content (in the DIG Browser, or via the extension) and it can't be served, the loader is fail-closed — it never shows unverified bytes — and surfaces a stable code so an agent can branch on why. These are catalogued in error-codes.json under the dig-loader surface.

CodeWhat it meansWhat to do
DIG_ERR_PROOF_MISMATCHThe served ciphertext did not verify against the on-chain generation root (tamper, or the wrong root).Refresh; if it persists the host is serving bad bytes — try another node.
DIG_ERR_DECRYPT_TAGThe AES-256-GCM-SIV authentication tag failed — wrong key/salt or corrupted bytes.Recheck the URN/salt you opened; the content may be private.
DIG_ERR_NOT_FOUNDA blind miss (decoy) — there is no resource at this address under this generation.Check the URN/path and that the capsule actually contains it.
DIG_ERR_NETWORKThe node or CDN was unreachable, or the transport failed.Check your connection; try again or point at another node.