Skip to main content
Errors follow RFC 9457 problem-details:
Error responses use 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.
Try a smaller amount or verify the wallet is funded.

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 hit internal_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-Version and any commit from /health.
  • The approximate time of the request.