Create embeddings
POST/embeddings
Turns one text or many into vectors, in OpenAI's format: one vector per input, in the order you sent them. Same key, same credit as chat; only input tokens are billed.
SoonOpening soon: what follows describes the service as it will work.
https://evanesca.app/api/v1/embeddingsOpens at launchBearer $EVANESCA_API_KEYAuthorizationstringrequiredBearer followed by your key, which starts with sk-eva-.
Content-Typestringrequiredapplication/json: the body is JSON.
Request body
application/jsonmodelstringrequiredAn embedding model. Chat and embedding models are separate lists: a chat model sent here answers 404, and so does an embedding model sent to /chat/completions.
inputstring | array of stringsrequiredOne text or an array of texts, each within the model's context window (the models).
Where it runs, what it costs
Evanesca · on the record
- Runs in
- Scaleway · Paris, France
qwen3-embedding-8b,bge-multilingual-gemma2
- Scaleway · Paris, France
- Operator keeps
Scaleway may keep and read requests that cause errors or look abusive, for up to 14 days (Scaleway's data privacy page).
- Costs
- Per million input tokens, VAT included — no output price:
qwen3-embedding-8b€0.168,bge-multilingual-gemma2€0.168. - Response headers
x-evanesca-operator: scalewayx-evanesca-location: paris
Search and RAG
Keep the same model for indexing and for queries: vectors from two different models cannot be compared. How to choose a model, its dimensions and the RAG pattern: Embeddings.
Errors
| Status | type | Meaning |
|---|---|---|
| 400 | invalid_ | The body is not valid JSON, or model or input is missing. |
| 401 | invalid_ | No key, a malformed key, or a revoked one. |
| 402 | insufficient_ | Your credit is at zero or below. Add credit to continue. |
| 404 | model_ | Unknown ID, a model Evanesca does not serve, or a chat model sent here. |
| 502 | upstream_ | The operator could not be reached, sent an unreadable answer, or turned down Evanesca's own account. Your key is not the problem: retry. |
Other operator errors reach you with its status and body, and Retry-After when it sends one (errors).
curl https://evanesca.app/api/v1/embeddings \
-H "Authorization: Bearer $EVANESCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-embedding-8b",
"input": ["Contract clause 4.2", "Payroll export, March"]
}'import os
from openai import OpenAI
client = OpenAI(base_url="https://evanesca.app/api/v1", api_key=os.environ["EVANESCA_API_KEY"])
vectors = client.embeddings.create(
model="qwen3-embedding-8b",
input=["Contract clause 4.2", "Payroll export, March"],
)
print(len(vectors.data[0].embedding)) # 4096import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://evanesca.app/api/v1", apiKey: process.env.EVANESCA_API_KEY });
const vectors = await client.embeddings.create({
model: "qwen3-embedding-8b",
input: ["Contract clause 4.2", "Payroll export, March"],
});
console.log(vectors.data[0].embedding.length); // 4096package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{"model": "qwen3-embedding-8b", "input": ["Contract clause 4.2", "Payroll export, March"]}`)
req, err := http.NewRequest("POST", "https://evanesca.app/api/v1/embeddings", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("EVANESCA_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}{
"object": "list",
"model": "qwen3-embedding-8b",
"data": [
{ "object": "embedding", "index": 0, "embedding": [ … ] },
{ "object": "embedding", "index": 1, "embedding": [ … ] }
],
"usage": { "prompt_tokens": 14, "total_tokens": 14 }
}{
"error": {
"message": "Insufficient credit balance. Add credit to your account to continue.",
"type": "insufficient_credit"
}
}