Endpoint
POST /llm/v1/embeddings
curl -X POST https://api.case.dev/llm/v1/embeddings \
-H "Authorization: Bearer sk_case_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/text-embedding-3-small",
"input": "Plaintiff alleges negligence in post-operative care"
}'
casedev llm:v1 create-embedding \
--model openai/text-embedding-3-small \
--input "Plaintiff alleges negligence in post-operative care"
import Casedev from 'casedev';
const client = new Casedev({ apiKey: 'sk_case_YOUR_API_KEY' });
const result = await client.llm.v1.createEmbedding({
model: 'openai/text-embedding-3-small',
input: 'Plaintiff alleges negligence in post-operative care'
});
console.log(result.data[0].embedding); // [0.016, -0.022, ...]
import casedev
client = casedev.Casedev(api_key='sk_case_YOUR_API_KEY')
result = client.llm.v1.create_embedding(
model='openai/text-embedding-3-small',
input='Plaintiff alleges negligence in post-operative care'
)
print(result.data[0].embedding) # [0.016, -0.022, ...]
result, _ := client.Llm.V1.NewEmbedding(ctx, casedev.LlmV1NewEmbeddingParams{
Model: casedev.F("openai/text-embedding-3-small"),
Input: casedev.F("Plaintiff alleges negligence in post-operative care"),
})
fmt.Println(result.Data[0].Embedding)
Response
{
"object": "list",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [-0.016, 0.022, -0.011, ...]
}
],
"model": "openai/text-embedding-3-small",
"usage": {
"prompt_tokens": 12,
"total_tokens": 12
}
}
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Embedding model ID |
input | string or array | Yes | Text(s) to embed |
Embedding models
| Model | Dimensions | Best for | $/1K tokens |
|---|---|---|---|
openai/text-embedding-3-small | 1536 | General purpose | $0.00002 |
openai/text-embedding-3-large | 3072 | Higher quality | $0.00013 |
voyage/voyage-law-2 | 1024 | Legal documents | $0.00012 |
voyage/voyage-3.5 | 1536 | General purpose | $0.00006 |
For legal documents, use
voyage/voyage-law-2. It’s specifically trained on legal text.Batch embeddings
Embed multiple texts in one request:casedev llm:v1 create-embedding \
--model openai/text-embedding-3-small \
--input "Plaintiff alleges negligence in post-operative care"
const result = await client.llm.v1.createEmbedding({
model: 'openai/text-embedding-3-small',
input: [
'Medical record from January 2024',
'Deposition transcript page 45',
'Expert witness report summary'
]
});
// result.data[0].embedding, result.data[1].embedding, ...
result = client.llm.v1.create_embedding(
model='openai/text-embedding-3-small',
input=[
'Medical record from January 2024',
'Deposition transcript page 45',
'Expert witness report summary'
]
)
# result.data[0].embedding, result.data[1].embedding, ...
result, _ := client.Llm.V1.NewEmbedding(ctx, casedev.LlmV1NewEmbeddingParams{
Model: casedev.F("openai/text-embedding-3-small"),
Input: casedev.F([]string{
"Text one",
"Text two",
"Text three",
}),
})
// result.Data[0].Embedding, result.Data[1].Embedding, ...
Use cases
Semantic search
# 1. Embed your query
casedev llm:v1 create-embedding \
--model voyage/voyage-law-2 \
--input "negligence in surgical procedure"
# 2. Compare to document embeddings (cosine similarity)
# 3. Return most similar documents
// 1. Embed your query
const queryResult = await client.llm.v1.createEmbedding({
model: 'voyage/voyage-law-2',
input: 'negligence in surgical procedure'
});
// 2. Compare to document embeddings (cosine similarity)
// 3. Return most similar documents
# 1. Embed your query
query_result = client.llm.v1.create_embedding(
model='voyage/voyage-law-2',
input='negligence in surgical procedure'
)
# 2. Compare to document embeddings (cosine similarity)
# 3. Return most similar documents
// 1. Embed your query
queryResult, _ := client.Llm.V1.NewEmbedding(ctx, casedev.LlmV1NewEmbeddingParams{
Model: casedev.F("voyage/voyage-law-2"),
Input: casedev.F("negligence in surgical procedure"),
})
// 2. Compare to document embeddings (cosine similarity)
// 3. Return most similar documents
Document similarity
# Compare two documents (embed each separately, then compute similarity)
casedev llm:v1 create-embedding \
--model voyage/voyage-law-2 \
--input "Plaintiff expert testimony on standard of care"
casedev llm:v1 create-embedding \
--model voyage/voyage-law-2 \
--input "Defense expert rebuttal on treatment protocols"
// Compare two documents
const result = await client.llm.v1.createEmbedding({
model: 'voyage/voyage-law-2',
input: [
'Plaintiff expert testimony on standard of care',
'Defense expert rebuttal on treatment protocols'
]
});
// Calculate cosine similarity:
// ~1.0 = very similar, ~0.5 = somewhat related, ~0.0 = unrelated
# Compare two documents
result = client.llm.v1.create_embedding(
model='voyage/voyage-law-2',
input=[
'Plaintiff expert testimony on standard of care',
'Defense expert rebuttal on treatment protocols'
]
)
# Calculate cosine similarity:
# ~1.0 = very similar, ~0.5 = somewhat related, ~0.0 = unrelated
// Compare two documents
result, _ := client.Llm.V1.NewEmbedding(ctx, casedev.LlmV1NewEmbeddingParams{
Model: casedev.F("voyage/voyage-law-2"),
Input: casedev.F([]string{
"Plaintiff expert testimony on standard of care",
"Defense expert rebuttal on treatment protocols",
}),
})
// Calculate cosine similarity:
// ~1.0 = very similar, ~0.5 = somewhat related, ~0.0 = unrelated
Tip: Use the same model for indexing and querying. Mixing models produces poor results.

