API reference
JSON-RPC methods grouped by access class, the OpenAI-compatible HTTP routes and the Web API served by every Tenzro node.
A Tenzro node serves four surfaces. This page covers the first three; MCP and A2A have their own pages.
| Surface | Public endpoint | Node default |
|---|---|---|
| JSON-RPC 2.0, REST gateway and OpenAI-compatible routes | https://rpc.tenzro.com | 127.0.0.1:8545 |
| Web API: health, status, verification, discovery | https://api.tenzro.com | 127.0.0.1:8080 |
| MCP (Streamable HTTP, OAuth 2.1 + DPoP) | https://mcp.tenzro.com/mcp | 127.0.0.1:3001 |
A2A (JSON-RPC and SSE, Agent Card at /.well-known/agent-card.json) | https://a2a.tenzro.com | 127.0.0.1:3002 |
See MCP server and A2A protocol.
Every method the node serves, with its access class, params, result, errors and an example request, is in the JSON-RPC reference, generated from the node's source for each release. The MCP tools are in MCP.md.
JSON-RPC
Send a JSON-RPC 2.0 request as POST / on the RPC endpoint. Parameters can be positional or named. Hex values are 0x-prefixed and amounts are in wei.
curl -s https://rpc.tenzro.com \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tenzro_getBlock","params":["latest"]}'The node is closed by default. Every method it serves is classified, and a method that is not classified is refused before dispatch. The authoritative list, with each method's access class, comes from the node itself:
curl -s https://rpc.tenzro.com \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tenzro_listRpcMethods","params":[{"contains":"validator"}]}'The same methods are reachable over REST: GET /rpc lists them and POST /rpc/{method} calls one with a JSON body of named parameters. REST calls go through exactly the same access checks. How each class authenticates is in RPC access.
Open
No credentials. Reads of public state, discovery and verification.
| Area | Methods |
|---|---|
| Chain | tenzro_blockNumber, tenzro_getBlock, tenzro_getBlockRange, tenzro_getFinalizedBlock, tenzro_getTransaction, tenzro_getTransactionHistory |
| Accounts | tenzro_getBalance, tenzro_getNonce, tenzro_getTokenBalance, tenzro_totalSupply, tenzro_getSupplyMetrics |
| Validators | tenzro_listValidators, tenzro_listActiveValidators, tenzro_getValidatorState |
| Verification | tenzro_verifyTeeAttestation, tenzro_verifyZkProof, tenzro_verifyDidEnvelope, tenzro_slaGetParams |
| Payments | tenzro_listPaymentProtocols, tenzro_paymentGatewayInfo, tenzro_listX402Schemes, tenzro_x402VerifyOffer |
| Discovery | tenzro_listRpcMethods |
EVM-compatible reads are open too: eth_chainId, eth_blockNumber, eth_getBalance, eth_getTransactionCount, eth_getBlockByNumber, eth_getBlockByHash, eth_getTransactionReceipt, eth_call, eth_estimateGas, eth_getCode, eth_getStorageAt, eth_getLogs, eth_gasPrice, eth_maxPriorityFeePerGas, eth_feeHistory, eth_syncing, net_version, net_peerCount, web3_clientVersion.
Operators of a private node may close open methods to callers their access policy does not admit; see RPC access.
Owner
These move money or change state that belongs to someone. Each needs proof from the account that owns or pays: a signed transaction, a DID envelope that names the method and binds its parameters, or a DPoP-bound session. A signature from anyone else, including the node operator, is refused.
| Area | Methods | Proof |
|---|---|---|
| Transactions | tenzro_sendRawTransaction, eth_sendRawTransaction | Composite hybrid signature in the transaction; for a passkey account, the passkey's WebAuthn assertion as its P-256 leg |
| Keys and recovery | tenzro_sendRawTransaction carrying a KeystoreUpdate (link or unlink a passkey, policy, recovery signers, recovery) | Approvals by the account's passkeys inside the update, or its recovery signers' for a recovery |
| Payments | tenzro_payX402, tenzro_payMpp, tenzro_openPaymentChannel, tenzro_closePaymentChannel, tenzro_setSettlementPreference | Payer's signature; the payee's for a settlement preference |
An action a delegated agent may only take with its root's approval runs as tenzro_agentAct carrying the root's step-up signature; see Agents.
Admin
Operator only. These change the policy of the node you are calling and need a DPoP-bound access token of the node's operator DID or an administrator its access policy names. They never change network-wide state; that goes through governance.
| Area | Methods |
|---|---|
| Stake and keys | tenzro_validatorSelfStake, tenzro_validatorPublicKeys |
| Devices | tenzro_bindDevice, tenzro_revokeBoundDevice, tenzro_transferMachineOwnership |
| Node | tenzro_exportConfig, tenzro_produceSnapshot, tenzro_gossipStats |
OpenAI-compatible routes
Served on the RPC endpoint. Generation routes are paid: sign in to a node that serves you on account, or pay per request when the route answers 402 Payment Required (x402 or MPP). See OpenAI-compatible APIs.
| Route | Purpose |
|---|---|
POST /v1/chat/completions | Chat, streaming with "stream": true |
POST /v1/responses | Responses API |
POST /v1/embeddings | Text embeddings |
POST /v1/images/generations, POST /v1/images/edits | Image generation and editing |
POST /v1/audio/transcriptions, POST /v1/audio/speech | Speech to text and text to speech |
POST /v1/videos | Video generation job |
POST /v1/tenzro/forecasts, /v1/tenzro/detections, /v1/tenzro/segmentations, /v1/tenzro/video/embeddings | Tenzro extensions for time series and vision |
Open, no payment:
| Route | Purpose |
|---|---|
GET /v1/models, GET /v1/models/{id} | Models this node can serve |
GET /v1/generation | Usage and cost of a finished generation |
GET /v1/videos/{id}, GET /v1/videos/{id}/content | Status and bytes of a paid video job |
GET /health | Liveness |
Tenant routes: /v1/files (upload, list, get, content, delete). Each file belongs to the DID the caller's access token proves, or to the payer of the x402 payment for the upload.
Web API
Served on https://api.tenzro.com. Liveness routes are never gated, so orchestrators and load balancers can always reach them.
| Route | Returns |
|---|---|
GET /health | { status, version, verification_service } |
GET /ready | { ready, block_height, network_tip, block_lag, peer_count, reason } |
GET /status | { node_state, roles, health, block_height, peer_count, uptime_secs, ready, status_message } |
curl -s https://api.tenzro.com/statusAlso on the Web API:
| Route | Purpose |
|---|---|
POST /verify/transaction, /verify/settlement, /verify/inference, /verify/zk-proof, /verify/did-envelope | Stateless verification |
GET /.well-known/did.json | The node's DID document |
GET /.well-known/jwks.json, GET /.well-known/http-message-signatures-directory | Public keys for HTTP message signature verification |
GET /1.0/identifiers/{did} | DID resolution in Universal Resolver format |
POST /oauth/token, /oauth/introspect, /oauth/revoke | OAuth 2.1 token endpoints |
GET /discovery/resources | Resources this node offers |
GET /metrics | Prometheus metrics |
Errors
| Code | Meaning |
|---|---|
-32601 | Method not found, or not served by this node |
-32602 | Invalid parameters |
-32001 | A required owner proof is missing or does not verify |
-32003 | Transaction signature invalid |
-32004 | Refused by the node's access policy: sign in, or sign in as an administrator |
HTTP 401 means a gate refused the request, and 402 means the route needs payment.