Stratum V1 numeric reject codes (20-25) and Stratum V2 string error reasons — message, cause and fix for the common "why is my miner rejecting shares?" question.
| Proto | Code | Message | Severity | Cause | Fix |
|---|---|---|---|---|---|
| V1 | 20 | Other / Unknown | Info | The pool's generic catch-all reject when no more specific code applies. | Check the pool dashboard and the miner log for the underlying reason; code 20 is usually a transient or pool-side condition rather than a hardware fault. |
| V1 | 21 | Job not found (stale) | Low | The share referenced a job_id the pool has already retired — typically a new block or a clean_jobs notify arrived while the miner was still solving the old job, so the work went stale. | A small percentage of stale rejects is normal. Persistently high rates point to latency between miner and pool — use a geographically closer stratum endpoint, reduce network hops, and check for an overloaded proxy. |
| V1 | 22 | Duplicate share | Low | The pool already received an identical share (same nonce and parameters); the miner submitted the same solution twice. | Usually a firmware/driver quirk or a reconnect replaying work. Update firmware; if it persists, look for a misbehaving stratum proxy or a duplicated worker process. |
| V1 | 23 | Low difficulty share | Medium | The submitted share does not meet the current share-difficulty target the pool set with mining.set_difficulty. | Confirm the miner honoured the latest set_difficulty. A steady stream of code 23 alongside hardware errors usually means overclock instability or failing ASIC chips/hashboards — back off the overclock and run a diagnostics pass. |
| V1 | 24 | Unauthorized worker | High | The worker was not authorized — mining.authorize failed or was skipped for this username. | Check the worker/username and password fields exactly match the pool account; many pools want the BTC payout address or an account.worker format. Nothing will be credited until this clears. |
| V1 | 25 | Not subscribed | High | The miner sent mining.submit before completing mining.subscribe — a protocol-sequence violation. | The client must subscribe (and usually authorize) before submitting shares. Update or repair the firmware or the proxy implementing Stratum. |
| V2 | unknown-user | Unknown user | High | The upstream does not recognise the supplied mining-account identity (the SV2 analogue of V1 code 24). | Verify the configured account/username on the Stratum V2 connection or job-declaration channel. |
| V2 | too-low-difficulty | Too low difficulty | Medium | The submitted share is below the channel's current target (the SV2 analogue of V1 code 23). | Check overclock stability and hardware-error rate, and confirm the miner is tracking target updates on the channel. |
| V2 | stale-share | Stale share | Low | The share is for work that is no longer valid because a newer template or prevhash superseded it. | Normal at a low rate during block changes; high rates indicate latency between the miner and the job source. |
| V2 | unsupported-feature-flags | Unsupported feature flags | Medium | During setup, a peer requested feature flags the other side does not support. | Align the SV2 feature flags or update the software on both ends so a common set is negotiated. |
| V2 | unsupported-protocol | Unsupported protocol | Medium | The requested SV2 sub-protocol is not supported by the peer. | Use a supported sub-protocol (Mining, Job Declaration, or Template Distribution) on both endpoints. |
| V2 | protocol-version-mismatch | Protocol version mismatch | High | The SV2 protocol versions advertised by the two peers do not overlap. | Update the miner, proxy, or pool so a common protocol version is available to negotiate. |
| V2 | invalid-mining-job-token | Invalid mining job token | Medium | The job token presented with a submit is not valid or known to the upstream. | Indicates a desync between job declaration and submission; reconnect or update the job-declaring proxy. |
| V2 | invalid-job-param-value-{field} | Invalid job parameter value | Medium | A specific job parameter value was invalid; the {field} placeholder is replaced with the offending field name. | Inspect the named field in the job declaration — almost always a bug in the job declarator software. |
| V2 | template-id-not-found | Template id not found | Low | The referenced block-template id is unknown to the upstream (Template Distribution Protocol). | The template expired or the connection desynced; the template provider should re-send current templates. |
| V2 | stale-template-id | Stale template id | Low | The block template referenced has been superseded by a newer one. | Normal during block changes; persistent occurrences indicate latency in template distribution. |
Stratum V1 reject codes follow the de-facto Slush/BIP convention; the exact string a pool returns can vary. V2 reasons follow the SV2 specification.
Source: D-Central Stratum Share-Rejection / Error-Code Reference (STRATUM_PROTOCOL_BIBLE). V1 codes follow the de-facto Slush/BIP convention; V2 reasons follow the SV2 spec.
Back to the source: Stratum Error-Code Reference · related guide · all reference cards · Open Mining Data hub
© 2026 D-Central Technologies, Laval, Quebec · Free to share under CC BY 4.0 with attribution to D-Central. A reference, not a guarantee — verify against your specific hardware.