# Selling inference

> List a self-hosted OpenAI-compatible endpoint on Inferit at your own price in µ per 1M tokens: licences, registration, health checks and payouts to your own wallet (test ITC on the testnet).

Sellers serve open-weight models from hardware they control, at their own price in µ per 1M tokens. A seller is paid per request, to the payout wallet it registers, whenever it is the cheapest healthy offer: test ITC on the testnet.

Today every seller is a team wallet: the founder's Mac serving Qwen 2.5 14B (while it is listed and online) and a labelled demo seller that returns canned responses. Which offers are listed and healthy right now is on [the models page](https://inferit.app/models).

## What you can list

-   **Your own endpoint (default).** Any OpenAI-compatible server: vLLM, Ollama, SGLang, or the Inferit `seller-node` sidecar. You give a base URL and an optional bearer token; the token is stored AES-256-GCM encrypted. It must be a server you run: URLs on known hosted providers are rejected. Putting a hosted provider's API behind a proxy on your own domain is still key resale and is not allowed, even though the API cannot prove where an endpoint runs.
-   **An upstream API key (gated).** Only for providers on the resale allowlist, each with a public link to terms that permit resale. The default allowlist is empty, so this is closed unless the operator adds a provider.

Every listing and the traffic it serves must follow the [acceptable use policy](https://inferit.cc/legal/acceptable-use.md), including its seller rules: no logging, retaining or training on buyer requests, and no inflated usage.

## Licences

Every catalog model has a licence class. **Permissive** (Apache-2.0, MIT) lists freely. **Conditional** (for example the Llama community licence, Qwen licence, Gemma terms, modified MIT) requires you to acknowledge the conditions. **Not allowed** (non-commercial weights, closed models) is rejected. The summaries on this site are not legal advice; read the linked licence.

## Steps

1.  Get a little test WBT, Whitechain's gas token, from the [Whitechain faucet](https://faucet.testnet.whitechain.io). Checked 2026-10-06: it asks for a GitHub account at least 30 days old and gives 0.5 WBT per 24 h, so an autonomous seller needs a person with such an account, or WBT from another wallet. Registration and withdrawals are transactions your wallet sends; payouts arrive in ITC.
2.  Register your payout wallet on the escrow: `registerSeller(payout)`, sent from your own wallet on Whitechain Sepolia. An offer cannot go live before this.
3.  Sign in with the same wallet (one sign-in serves both workspaces) and list an offer: the model, your endpoint URL and bearer token, your price in µ per 1M input and output tokens, and an optional daily cap.
4.  The API checks the licence, resolves your host and rejects private and link-local addresses (SSRF guard), then sends a live 1-token probe. If it answers, the offer is active.

**App:** [Sell workspace](https://inferit.app/sell) · **Contract:** [`registerSeller(payout)`](https://inferit.cc/docs/payments/whitechain.md#calls) · **API:** [`POST /v1/seller/offers`](https://inferit.cc/docs/api-reference.md#post-v1-seller-offers)

_seller-node_

```bash
# Reference sidecar in front of Ollama (or vLLM / SGLang).
# The seller-node package ships with the Inferit repository
# (access on request while it is private); any OpenAI-compatible
# server with bearer auth works too.
# MODEL_MAP maps catalog ids to upstream model names (example values).
UPSTREAM_BASE_URL=http://localhost:11434/v1 \
MODEL_MAP='{"qwen/qwen-2.5-14b-instruct":"qwen2.5:14b-instruct"}' \
SELLER_TOKEN="$(openssl rand -hex 24)" \
pnpm --filter @inferit/seller-node start
# MOCK=1 serves deterministic canned responses for testing
# (MOCK_LATENCY_MS, MOCK_FAIL_RATE)
```

## API path (no browser)

The same steps without the app, for a script or an agent. The escrow address is on [Whitechain escrow](https://inferit.cc/docs/payments/whitechain.md#live); the request and response fields are in the [API reference](https://inferit.cc/docs/api-reference.md#post-v1-seller-offers).

_register (on chain)_

```bash
# 1. Register the payout wallet on MarketEscrow
#    (a transaction from the seller wallet: needs a little WBT).
#    Foundry's cast; any EVM client works (viem: writeContract).
cast send 0x705dD9eCffa888FbcF2849eAE2D3b136eb78B7e0 \
  "registerSeller(address)" 0xYourPayoutAddress \
  --rpc-url https://rpc.testnet.whitechain.io \
  --private-key "$SELLER_KEY"
```

_sign in_

```bash
# 2. Sign in with the same wallet: an off-chain EIP-4361 text signature, no gas.
curl -s -X POST https://api-production-c74b9.up.railway.app/v1/auth/evm/challenge \
  -H 'content-type: application/json' \
  -d '{"address":"0xYourSellerAddress"}'
# -> {"message": "...", "nonce": "...", "expiresAt": "..."}
# Sign "message" with the seller key (an EIP-191 signature), then:
curl -s -X POST https://api-production-c74b9.up.railway.app/v1/auth/evm/verify \
  -H 'content-type: application/json' \
  -d '{"message":"<message>","signature":"0x<signature>"}'
# -> a session token: export SESSION=...
```

_list an offer_

```bash
# 3. List an offer. Prices are integer µ per 1M tokens (string or number).
curl -s -X POST https://api-production-c74b9.up.railway.app/v1/seller/offers \
  -H "Authorization: Bearer $SESSION" \
  -H 'content-type: application/json' \
  -d '{
    "model": "qwen/qwen-2.5-14b-instruct",
    "kind": "endpoint",
    "endpointUrl": "https://gpu.example.com/v1",
    "authToken": "<your SELLER_TOKEN>",
    "pricing": {
      "mode": "per_token",
      "inputPerM": "70000",
      "outputPerM": "140000"
    },
    "capDailyMicro": null,
    "licenseAck": true
  }'
# licenseAck: boolean; true acknowledges a conditional licence (false is
# enough for a permissive one). The API probes the endpoint before it
# activates the offer; 409 seller_not_registered until step 1 lands.
```

## Pricing

Set a price in µ per 1M tokens for input, output and, optionally, cache reads (µ is a micro-ITC on the testnet: 1 µ = 0.000001 ITC), or a percentage of the catalog list price. That is what you are paid. Buyers pay your price plus the platform fee (5% by default); the contract caps the fee at 10% of your price. A daily cap limits how much you take per day; the order book shows it summed with the other offers at your price level.

## Health and routing

Buyers are routed to the cheapest healthy offer that meets their filters. A failed request or probe marks your offer unhealthy and schedules the next probe on a backoff ladder of 1, 2, 5, 10, 30 and then 60 minutes; one success restores it. Failover happens only before the first byte, so a stream you start is never handed to someone else midway.

## What buyers see

From the API and the order book: price levels, offer counts and the combined daily caps per level. Never your wallet, endpoint URL or your individual volume. The `x-inferit-offer` header is an opaque hash.

Settlement is a separate matter: **on Whitechain, settlement is public.** Every `LineSettled` event names the buyer and your seller address with the amount, and `sellerState` shows your unwithdrawn earnings, so anyone can total your volume and a buyer can match its own requests to your address. If you prefer to keep marketplace payments separate from your other on-chain activity, use a dedicated business wallet for selling. See [On-chain visibility](https://inferit.cc/docs/security-trust.md#on-chain).

## Payouts

Usage settles in batches on chain. What you are owed accrues in the escrow, and `withdrawEarnings()` sends it to your payout wallet; only your wallet can change that address. Every settlement and withdrawal is a transaction you can open on the explorer from the Sell workspace. On the testnet, payouts are ITC (Inferit Test Credit), a test token with no monetary value.

**App:** [Sell workspace](https://inferit.app/sell) · **Contract:** [`withdrawEarnings()`](https://inferit.cc/docs/payments/whitechain.md#calls) · **API:** [`GET /v1/seller/earnings`](https://inferit.cc/docs/api-reference.md#get-v1-seller-earnings)

---

Canonical page: https://inferit.cc/docs/sellers
All pages as markdown: https://inferit.cc/llms.txt
Testnet demo: test tokens, no monetary value.
