Webanto AI API self-hosted

OpenAI-compatible chat & embeddings plus a DINOv3 image-embedding route, on self-hosted GPUs. Same schema as api.webanto.com — no Vercel, no billing. Authenticate with a bearer key.

Base URL

https://llm.webanto.com/api/v1

Authentication

Send your key (format wba_local_…) as a bearer token or x-api-key. Server-side only.

Authorization: Bearer $WEBANTO_API_KEY
# or
x-api-key: $WEBANTO_API_KEY

Models

ModelEndpointKind
qwen/chatChat (reasoning; keep max_tokens ≥ ~1024)
nomic-embed-text/embeddingsText embeddings (768-d)
clip/embeddingsCLIP text embeddings (512-d, L2-normalized)
dinov3/image-embeddingsImage embeddings (1280-d, L2-normalized)

POST /api/v1/chat

curl https://llm.webanto.com/api/v1/chat \
  -H "Authorization: Bearer $WEBANTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen",
    "messages": [{ "role": "user", "content": "Explain embeddings in one sentence." }],
    "max_tokens": 1024, "temperature": 0.7
  }'

Response is a standard chat.completion (choices/message/usage) plus a credits field. Add "stream": true for SSE token streaming.

POST /api/v1/embeddings

curl https://llm.webanto.com/api/v1/embeddings \
  -H "Authorization: Bearer $WEBANTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "nomic-embed-text", "input": ["hello world"] }'

POST /api/v1/image-embeddings

Custom (non-OpenAI) contract. Send urls or images (base64), not both.

curl https://llm.webanto.com/api/v1/image-embeddings \
  -H "Authorization: Bearer $WEBANTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "urls": ["https://cdn.example.com/card.jpg"] }'

Status & health

GET /api/v1/statusno auth — liveness → {"status":"ok"}
GET /api/v1/healthauth — verifies your key → {"ok":true,"scopes":[…]}

Also: raw OpenAI endpoint

A pure OpenAI-compatible surface is also live at https://llm.webanto.com/v1 (model local-llm) — point any OpenAI SDK at it directly.

Errors

Bodies are { "error": … }. Check the HTTP status: 400 invalid, 401 bad/missing key, 403 wrong scope, 502 backend unavailable (safe to retry).