Skip to content

Public Gateway

The public gateway provides rate-limited, anonymous access to the mycellm network. No API key required.

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
{
"messages": [{"role": "user", "content": "Hello"}],
"stream": true
}

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"}}
StatusMeaning
429Rate limit exceeded
503No models available
400Invalid request

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”.

POST /v1/public/chat/completions accepts either — never both:

Terminal window
# a quality floor: the gateway chooses, but not below this tier
curl -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 model
curl -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.

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}]
}