Text in, vectors out.
An OpenAI-compatible embeddings API over bge-m3. Point any OpenAI client at it, send a batch, get your vectors back. Your key carries its own limits and its own token budget.
https://embed.ituoga.lt01 Quickstart
One request, one vector. Swap in the key your operator issued you.
curl https://embed.ituoga.lt/v1/embeddings \
-H "Authorization: Bearer sk-rag-…" \
-H "Content-Type: application/json" \
-d '{"model":"bge-m3","input":"hello world"}'02 Batching
Send an array to embed up to 25 texts in one call — far faster than one request each. Over that limit the request is refused with 400 rather than silently truncated.
curl https://embed.ituoga.lt/v1/embeddings \
-H "Authorization: Bearer sk-rag-…" \
-H "Content-Type: application/json" \
-d '{"model":"bge-m3","input":["first text","second text","third text"]}'Vectors come back in the same order you sent them, so you can zip them straight back onto your rows.
03 Ollama's native endpoint
If your client speaks Ollama rather than OpenAI, use /api/embed. Same key, same limits, same batching — only the response shape differs.
curl https://embed.ituoga.lt/api/embed \
-H "Authorization: Bearer sk-rag-…" \
-H "Content-Type: application/json" \
-d '{"model":"bge-m3","input":["first text","second text"]}'04 From the OpenAI SDK
No special client needed — set the base URL and carry on.
from openai import OpenAI
client = OpenAI(base_url="https://embed.ituoga.lt/v1", api_key="sk-rag-…")
vectors = client.embeddings.create(
model="bge-m3",
input=["first text", "second text"],
)
print(len(vectors.data), "vectors")05 What your key allows
Those are the defaults a new key is issued with; yours may differ — your operator sets them per key. Every response to a budgeted key carries X-Token-Budget-Remaining, so you can watch your own consumption without asking anyone.
06 When the pool is busy
Requests are queued, not dropped. Under load your call waits for a free slot instead of failing, so a burst shows up as latency rather than errors — no retry storm needed. Nobody is starved: a request that has been waiting is promoted ahead of higher-priority traffic.
07 What the statuses mean
| Code | Meaning | What to do |
|---|---|---|
| 200 | Embeddings returned | — |
| 400 | Bad JSON, or more inputs than your batch limit | Fix the request |
| 401 | Missing, invalid or revoked key | Check your key |
| 402 | Token budget spent | Wait for the monthly reset, or ask for a top-up |
| 429 | Too many requests this minute | Retry after the Retry-After header |
| 502 | Embedding backend unavailable | Retry shortly |
| 503 | Cancelled while queued | Retry |
Errors use the OpenAI envelope ({"error":{"message","type"}}), so an OpenAI SDK surfaces them through its normal error handling.
08 Getting a key
Keys are issued by the operator — there is no self-service signup. Email us and say roughly how much you expect to embed, so your batch, rate and budget can be set sensibly.
Keep the key secret: only its hash is stored here, so a lost key cannot be recovered, only replaced.