Become a miner
Miners supply models through their own upstream: self-hosted models or an API provider they hold credentials for. Your upstream address, credentials and model mapping never leave your machine.
What you need
- A Terza Inference account and an invitation (early access is invitation-only).
- A Bittensor wallet with a hotkey registered on the Terza subnet. Routing requires live on-chain registration.
- A server that can run the miner service behind a public HTTPS address on port 443.
- Upstream capacity for the models you will quote, with honest usage reporting.
1. Request an invitation
Sign in to the console, open Miner, and fill in Request an invitation: how to reach you, how you will supply models, which models and roughly what capacity. Once approved, the invitation appears in the same place, bound to your account.
2. Prove your hotkey
Enter the invitation and your hotkey’s SS58 address. You receive a one-time message (valid 10 minutes) to sign locally with your wallet; your private key never leaves your device. One hotkey binds to one account, permanently.
3. Run the miner and apply
The miner package is provided to invited miners during early access. Its CLI sets up a private configuration, pins the gateway’s signing keys and submits your application:
terza-miner init --endpoint https://miner.example.com \
--model MODEL_ID --upstream-url https://your-upstream.example \
--input-price 0.30 --output-price 0.90 --wallet-name WALLET --hotkey HOTKEY
terza-miner login --username YOUR_ACCOUNT
terza-miner apply # binds your hotkey, pins gateway keys, submits quotes
terza-miner serve # runs the miner on loopback; put HTTPS in front- Quotes are USD per million input and output tokens (or per unit for media), valid for up to 30 days. One application can carry up to 100 models.
- Review: every submission, including a quote renewal, is reviewed before it receives traffic. Pause, resume and exit are available from the CLI and console.
- Use
terza-miner quote update,models addandmodels removeto change your offer. - Groups: quote one model several times, one quote per group, each with its own price and upstream key. Each quote declares a public tier (economy, standard or priority); the group name stays private to your miner.
Gateway signatures
Every request the gateway sends you carries an Ed25519 signature over the method, path, your hotkey, a timestamp, a single-use nonce and the exact body, in addition to a private bearer token. The miner rejects anything else: unsigned, replayed, older than 60 seconds, or addressed to another hotkey. Run terza-miner trust-gateway after a gateway key rotation.
Routing and health
- The gateway sends each request to the cheapest healthy eligible offer, weighted by your recent latency and reliability.
- Signed health checks run every 30 seconds. Three consecutive failures pause routing to your offer for 60 seconds.
- The pricing page shows each offer's success rate over the last 24 hours, measured by the gateway on real requests.
- Optional: set
upstream_status_urlinminer.jsonto your upstream's status feed and your miner reports each offer's 24-hour uptime with its health check. The URL stays on your server. The miner README describes the feed format.
Usage receipts
You report token usage; the gateway checks it before anyone is charged. A receipt is rejected (no charge, a health failure for you, and the reason recorded) when:
| Rule | Rejected when |
|---|---|
input_exceeds_request_bound | Input tokens exceed the request size plus 1,024. Typical cause: an upstream that injects a hidden prompt. |
output_exceeds_max_tokens | Output tokens exceed the request’s max_tokens. |
output_exceeds_delivered_text | Visible output tokens exceed the delivered text bytes plus 64. |
undeclared_reasoning | Hidden reasoning tokens are reported for an offer that does not declare reasoning. |
Test every model before you quote it. If more than 1% of your receipts are rejected over 24 hours, validators score that offer at zero.
Media models
To serve video, image, music or sound, declare the media protocol with the operations, accepted inputs and parameters, and rates of each model. Then add a recipe per operation to your private configuration. A recipe maps the neutral Terza request onto your upstream’s own API: where to submit, how to fill its fields, where the task ID is, how to poll, which status values mean done or failed, and where the output URLs or base64 data are. No provider-specific code is involved. See Media tasks for the request contract and billing.
Rewards
Miners earn subnet emissions according to validator weights. See Scoring and emissions for exactly how offers are scored.