Content-Type: application/problem+json. Successful responses use plain application/json.
Slugs and status codes
Branch on type, not title
The type slug is stable and machine-readable. The title is human-friendly and may evolve. Branch on type if you want to recover from specific failure modes:
Common patterns
502 upstream_error from /stake for sol-liquid-stake
Usually means Sanctum could not route a swap for your wallet. Common causes:
- Wallet has no SOL on-chain (no associated account exists).
- Wallet has no associated token account for raSOL yet.
- Insufficient liquidity for the size you requested.
502 upstream_error from /broadcast
Typically means the transaction failed simulation. Common causes:
- Stale blockhash. Rebuild and re-sign.
- Insufficient fee budget.
- A missing signature slot.
- The signing path produced different message bytes than the build path.
403 forbidden from /broadcast
hubra_token mismatch. See Hubra token for the full list of causes. Fix is always: rebuild via /stake or /unstake, sign that new transaction, broadcast with the new token.
503 service_unavailable on a strategy
The strategy is announced in the manifest but not yet live. The response includes a Retry-After header (typically 3600 seconds). Plan around it; do not retry hot.
Retry policy
Recommended approach by slug:Reporting bugs
If you hitinternal_error repeatedly, or an upstream_error with a detail that does not match any documented upstream behavior, file an issue at github.com/block-sync-one/hubra or email hello@hubra.app.
Include:
- The full request body.
- The full response body (including
type,title,status,detail). - The
X-Hubra-Api-Versionand anycommitfrom/health. - The approximate time of the request.