home / skills / vm0-ai / vm0-skills / qdrant
This skill helps you store, search, and manage vector embeddings with Qdrant REST API for efficient RAG and semantic search.
npx playbooks add skill vm0-ai/vm0-skills --skill qdrantReview the files below or copy the command above to add this skill to your agents.
---
name: qdrant
description: Qdrant vector database REST API via curl. Use this skill to store, search, and manage vector embeddings.
vm0_secrets:
- QDRANT_API_KEY
vm0_vars:
- QDRANT_URL
---
# Qdrant API
Use the Qdrant REST API via direct `curl` calls to **store and search vector embeddings** for RAG, semantic search, and recommendations.
> Official docs: `https://qdrant.tech/documentation/`
---
## When to Use
Use this skill when you need to:
- **Store vector embeddings** for semantic search
- **Search for similar vectors** using cosine, dot product, or euclidean distance
- **Build RAG applications** with retrieval from vector store
- **Implement recommendations** based on similarity
- **Filter search results** by metadata/payload
---
## Prerequisites
### Option 1: Qdrant Cloud (Recommended)
1. Sign up at [Qdrant Cloud](https://cloud.qdrant.io/)
2. Create a cluster and get your URL and API key
3. Store credentials in environment variables
```bash
export QDRANT_URL="https://xyz-example.aws.cloud.qdrant.io:6333"
export QDRANT_API_KEY="your-api-key"
```
### Option 2: Self-hosted
Run Qdrant locally with Docker:
```bash
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant
```
```bash
export QDRANT_URL="http://localhost:6333"
export QDRANT_API_KEY="" # Optional for local
```
---
> **Important:** When using `$VAR` in a command that pipes to another command, wrap the command containing `$VAR` in `bash -c '...'`. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.
> ```bash
> bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"'
> ```
## How to Use
All examples below assume you have `QDRANT_URL` and `QDRANT_API_KEY` set.
---
### 1. Check Server Status
Verify connection to Qdrant:
```bash
bash -c 'curl -s -X GET "${QDRANT_URL}" --header "api-key: ${QDRANT_API_KEY}"'
```
---
### 2. List Collections
Get all collections:
```bash
bash -c 'curl -s -X GET "${QDRANT_URL}/collections" --header "api-key: ${QDRANT_API_KEY}"'
```
---
### 3. Create a Collection
Create a collection for storing vectors:
Write to `/tmp/qdrant_request.json`:
```json
{
"vectors": {
"size": 1536,
"distance": "Cosine"
}
}
```
Then run:
```bash
bash -c 'curl -s -X PUT "${QDRANT_URL}/collections/my_collection" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
**Distance metrics:**
- `Cosine` - Cosine similarity (recommended for normalized vectors)
- `Dot` - Dot product
- `Euclid` - Euclidean distance
- `Manhattan` - Manhattan distance
**Common vector sizes:**
- OpenAI `text-embedding-3-small`: 1536
- OpenAI `text-embedding-3-large`: 3072
- Cohere: 1024
---
### 4. Get Collection Info
Get details about a collection:
```bash
bash -c 'curl -s -X GET "${QDRANT_URL}/collections/my_collection" --header "api-key: ${QDRANT_API_KEY}"'
```
---
### 5. Upsert Points (Insert/Update Vectors)
Add vectors with payload (metadata):
Write to `/tmp/qdrant_request.json`:
```json
{
"points": [
{
"id": 1,
"vector": [0.05, 0.61, 0.76, 0.74],
"payload": {"text": "Hello world", "source": "doc1"}
},
{
"id": 2,
"vector": [0.19, 0.81, 0.75, 0.11],
"payload": {"text": "Goodbye world", "source": "doc2"}
}
]
}
```
Then run:
```bash
bash -c 'curl -s -X PUT "${QDRANT_URL}/collections/my_collection/points" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
---
### 6. Search Similar Vectors
Find vectors similar to a query vector:
Write to `/tmp/qdrant_request.json`:
```json
{
"query": [0.05, 0.61, 0.76, 0.74],
"limit": 5,
"with_payload": true
}
```
Then run:
```bash
bash -c 'curl -s -X POST "${QDRANT_URL}/collections/my_collection/points/query" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
**Response:**
```json
{
"result": {
"points": [
{"id": 1, "score": 0.99, "payload": {"text": "Hello world"}}
]
}
}
```
---
### 7. Search with Filters
Filter results by payload fields:
Write to `/tmp/qdrant_request.json`:
```json
{
"query": [0.05, 0.61, 0.76, 0.74],
"limit": 5,
"filter": {
"must": [
{"key": "source", "match": {"value": "doc1"}}
]
},
"with_payload": true
}
```
Then run:
```bash
bash -c 'curl -s -X POST "${QDRANT_URL}/collections/my_collection/points/query" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
**Filter operators:**
- `must` - All conditions must match (AND)
- `should` - At least one must match (OR)
- `must_not` - None should match (NOT)
---
### 8. Get Points by ID
Retrieve specific points:
Write to `/tmp/qdrant_request.json`:
```json
{
"ids": [1, 2],
"with_payload": true,
"with_vector": true
}
```
Then run:
```bash
bash -c 'curl -s -X POST "${QDRANT_URL}/collections/my_collection/points" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
---
### 9. Delete Points
Delete by IDs:
Write to `/tmp/qdrant_request.json`:
```json
{
"points": [1, 2]
}
```
Then run:
```bash
bash -c 'curl -s -X POST "${QDRANT_URL}/collections/my_collection/points/delete" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
Delete by filter:
Write to `/tmp/qdrant_request.json`:
```json
{
"filter": {
"must": [
{"key": "source", "match": {"value": "doc1"}}
]
}
}
```
Then run:
```bash
bash -c 'curl -s -X POST "${QDRANT_URL}/collections/my_collection/points/delete" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
---
### 10. Delete Collection
Remove a collection entirely:
```bash
bash -c 'curl -s -X DELETE "${QDRANT_URL}/collections/my_collection" --header "api-key: ${QDRANT_API_KEY}"'
```
---
### 11. Count Points
Get total count or filtered count:
Write to `/tmp/qdrant_request.json`:
```json
{
"exact": true
}
```
Then run:
```bash
bash -c 'curl -s -X POST "${QDRANT_URL}/collections/my_collection/points/count" --header "api-key: ${QDRANT_API_KEY}" --header "Content-Type: application/json" -d @/tmp/qdrant_request.json'
```
---
## Filter Syntax
Common filter conditions:
```json
{
"filter": {
"must": [
{"key": "city", "match": {"value": "London"}},
{"key": "price", "range": {"gte": 100, "lte": 500}},
{"key": "tags", "match": {"any": ["electronics", "sale"]}}
]
}
}
```
**Match types:**
- `match.value` - Exact match
- `match.any` - Match any in list
- `match.except` - Match none in list
- `range` - Numeric range (gt, gte, lt, lte)
---
## Guidelines
1. **Match vector size**: Collection vector size must match your embedding model output
2. **Use Cosine for normalized vectors**: Most embedding models output normalized vectors
3. **Add payload for filtering**: Store metadata with vectors for filtered searches
4. **Batch upserts**: Insert multiple points in one request for efficiency
5. **Use score_threshold**: Filter out low-similarity results in search
This skill provides direct curl-based access to the Qdrant vector database REST API to store, search, and manage vector embeddings. It focuses on practical commands for creating collections, upserting vectors with payload, performing similarity searches, applying filters, and managing lifecycle operations. Use it when you want a lightweight, shell-friendly way to integrate a vector store into retrieval-augmented generation (RAG), semantic search, or recommendation workflows. Examples assume QDRANT_URL and QDRANT_API_KEY are set in the environment.
The skill issues curl requests against Qdrant endpoints to perform collection management, point upserts, queries, deletes, and counts. It uses JSON request files for payloads and supports distance metrics (Cosine, Dot, Euclid, Manhattan), filters by payload, and options to return vectors and metadata. Commands are wrapped with bash -c to preserve environment variables when piping. Basic responses include matching point IDs, scores, and payload fields.
Do I need a Qdrant Cloud account?
No — you can use Qdrant Cloud with a URL and API key or self-host Qdrant locally (e.g., Docker). Local instances may not require an API key.
How do I choose a distance metric?
Use Cosine for normalized vectors (common for modern embeddings). Use Dot for unnormalized similarity or Euclid/Manhattan for spatial distance depending on your model and use case.