XODIAK / Developers
Documentation
An HTTP RPC node, a signing step, and a bridge into your own database. That is the whole integration surface.
Four calls to a settled transaction.
Create an account, fund it, sign, submit. The node verifies the signature, the balance and the nonce before the transaction is admitted to the mempool, so a malformed transaction fails at submit rather than silently later.
- Create an account and receive an xdk1 address
- Sign the transaction hash with your ML-DSA-65 key
- Submit to the mempool and get a transaction hash back
- Read the transaction once its block is committed
# 1. create an account curl -X POST "$NODE/account/create" # 2. inspect it curl "$NODE/account/xdk1czx..." # 3. submit a signed transaction curl -X POST "$NODE/tx/submit" \ -H "content-type: application/json" \ -d '{"type":"transfer","to":"xdk1...", "amount":"250000000","nonce":3, "signature":"..."}' # 4. read it back curl "$NODE/tx/0x9c41..."
Libraries.
The node speaks plain HTTP with JSON bodies, so anything that can make a request can integrate. There is no proprietary transport and no required SDK.
TypeScript and Deno
The node itself is TypeScript on Deno. The signing and address helpers it uses are the same ones you would call from a client.
Anything with HTTP
Python, Go, Rust, Java, a shell script. If you can POST JSON and hold a key, you can submit a transaction.
Postgres reads
If you would rather not poll a node, read the mirrored state out of Postgres and let the bridge keep it current.
The chain is the source of truth. Your database is the read replica.
Applications should not have to talk to a node to render a screen. On every committed block the bridge writes blocks, transactions, accounts and chain state into Postgres, and your application reads normal rows with normal indexes.
The direction matters. Nothing in the replica is authoritative, so a corrupted or stale replica is a rebuild rather than a loss.
- Chain writes forward into Postgres on every committed block
- Application reads never block on consensus
- Replica is disposable and rebuildable from the chain
- Row-level security applies to the mirrored tables
Errors.
Every rejection names the check that rejected it. There is no generic failure.
| Condition | When it fires | What to do |
|---|---|---|
| invalid_signature | The signature does not verify against the transaction hash and the account's public key. | Re-derive the hash. Confirm you signed the hash, not the plaintext body. |
| bad_nonce | The nonce is not the account's next expected value. | Read the account, use the returned nonce, resubmit. |
| insufficient_balance | The account cannot cover the amount plus fees. | Fund the account, or reduce the amount. |
| tier_insufficient | The account's verification tier does not permit this action. | Raise the tier through the compliance flow. |
| limit_exceeded | The transaction exceeds the limit configured for the tier. | Split the transaction, or raise the tier. |
| no_proposer | No validator is currently eligible to propose a block. | This is a network condition, not a client error. Check network status. |
Ready to get started?
Create an account instantly, or talk to us about a settlement design for your business.
See what you'll pay
Per-settlement pricing tied to what actually moves. No seat licences, no hidden spread.
Pricing detailsStart building
Open an account, sign a transaction, read a block. About ten minutes end to end.
Integration options