Public Gateway
The public gateway provides rate-limited, anonymous access to the mycellm network. No API key required.
POST /v1/public/chat/completions
Section titled “POST /v1/public/chat/completions”Same request format as /v1/chat/completions with restrictions:
- Rate limit: 5,000 tokens/day per IP, 10 requests/minute
- Max tokens: 1,024 per response
- Max message length: 2,000 characters
- Model: auto-selected (best available), user cannot choose
- Metadata: stripped — no peer IDs, routing details, or credit info
Request
Section titled “Request”{ "messages": [{"role": "user", "content": "Hello"}], "stream": true}Streaming metadata
Section titled “Streaming metadata”The gateway includes mycellm metadata in streaming chunks:
// First chunk — node attribution{"mycellm": {"node": "99e58f4c", "served_by": "mycellm-public"}}
// Final chunk — latency{"mycellm": {"node": "99e58f4c", "latency_ms": 485, "served_by": "mycellm-public"}}Error responses
Section titled “Error responses”| Status | Meaning |
|---|---|
| 429 | Rate limit exceeded |
| 503 | No models available |
| 400 | Invalid request |
GET /v1/public/models
Section titled “GET /v1/public/models”What the public gateway can actually serve right now, with the tier of each. No authentication.
{ "object": "list", "data": [ { "id": "Qwen3.6-35B-A3B", "tier": "capable", "vision": false }, { "id": "Qwen3.5-9B", "tier": "fast", "vision": false } ], "tiers": { "frontier": 0, "capable": 1, "fast": 2, "tiny": 2 }}tiers counts how many models satisfy each floor — a floor admits its own
tier and everything above it, which is why a 35B counts toward both capable
and fast. A model whose size cannot be determined has no tier and counts
toward none: unknown means unknown, never “probably fine”.
Asking for a specific model or tier
Section titled “Asking for a specific model or tier”POST /v1/public/chat/completions accepts either — never both:
# a quality floor: the gateway chooses, but not below this tiercurl -X POST https://api.mycellm.dev/v1/public/chat/completions \ -H "Content-Type: application/json" \ -d '{"messages":[{"role":"user","content":"hi"}], "mycellm": {"min_tier": "capable"}}'
# or one named modelcurl -X POST https://api.mycellm.dev/v1/public/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"Qwen3.5-9B","messages":[{"role":"user","content":"hi"}]}'A floor that nothing meets is refused, not quietly downgraded:
{ "error": { "message": "No frontier-tier model is available right now (2 model(s) reachable below that tier).", "type": "no_candidate", "requested_tier": "frontier" } }The no_candidate type matters to clients: it is a 503 that retrying will not
fix, unlike the busy-503 above it. Backing off four times before reporting
“the network is down” is wrong when the network is up and simply does not hold
that model.
GET /v1/node/public/stats
Section titled “GET /v1/node/public/stats”Network stats — no auth required.
{ "network_name": "mycellm-public", "nodes": {"total": 3, "online": 3, "seeding": 3}, "compute": {"total_tps": 12.5, "total_vram_gb": 80.0, "total_ram_gb": 87.6}, "models": { "unique": 2, "names": ["Qwen2.5-3B-Instruct-Q8_0", "Mistral-Small-24B"], "by_tier": {"tier1": [...], "tier2": [...], "tier3": []} }, "activity": {"total_requests": 1542, "total_tokens": 89420}, "top_contributors": [{"name": "aurora", "tps": 12.3, "models": 2}]}