API Reference
Search API
Hybrid search endpoint — full specification.
Search API
Search entities using hybrid search (semantic + keyword + identifier detection).
POST /search/{vertical}
curl -X POST https://api.qanatix.com/api/v1/search/manufacturing \
-H "Authorization: Bearer sk_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"query": "stainless M8 bolt ISO 4017",
"limit": 20,
"offset": 0,
"rerank": true,
"format": "json",
"filters": {
"in_stock": true,
"price_eur_max": 0.20
}
}'Path parameters
| Parameter | Description |
|---|---|
vertical | The vertical to search within |
Request body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | yes | — | Search query (1-500 chars) |
limit | integer | no | 20 | Max results (1-100) |
offset | integer | no | 0 | Pagination offset |
rerank | boolean | no | true | Enable cross-encoder reranking |
format | string | no | json | Response format: json, compact, yaml |
filters | object | no | {} | Filters on vertical_data fields |
Filter operators
| Suffix | Operator | Example |
|---|---|---|
| (none) | = | "country": "DE" |
_min | >= | "price_eur_min": 0.05 |
_max | <= | "price_eur_max": 0.20 |
_gt | > | "stock_gt": 0 |
_lt | < | "lead_time_days_lt": 10 |
Maximum 20 filters per query. Multiple filters use AND logic.
Response (200) — JSON format
{
"results": [
{
"entity_id": "550e8400-...",
"name": "Stainless Steel Hex Head Bolt M8x40 ISO 4017",
"score": 0.87,
"vertical": "manufacturing",
"entity_type": "fastener",
"vertical_data": {
"part_number": "SS-M8-40-A2",
"material": "Stainless Steel A2",
"standard": "ISO 4017",
"price_eur": 0.12,
"in_stock": true
},
"description_llm": "...",
"source_type": "file_upload",
"updated_at": "2026-03-05T14:30:00Z"
}
],
"pagination": {
"offset": 0,
"limit": 20,
"has_more": false
},
"metadata": {
"search_mode": "hybrid",
"query_type": "keyword",
"processing_time_ms": 42,
"total_estimate": 1,
"zero_result_fallback_used": false,
"reranked": true,
"cache_hit": false,
"timings": {
"embed_ms": 18.2,
"search_ms": 12.4,
"rerank_ms": 5.0,
"hydrate_ms": 8.1
}
}
}Response fields
| Field | Description |
|---|---|
results[].entity_id | Entity UUID |
results[].score | Relevance score (0-1, DBSF normalized). Identifier matches = 1.0 |
results[].vertical_data | Your structured data |
results[].description_llm | Auto-generated LLM-optimized description |
results[].source_type | How data was ingested: api, file_upload, webhook, connector |
metadata.search_mode | hybrid, identifier, degraded, or error |
metadata.query_type | identifier, keyword, or semantic |
metadata.processing_time_ms | Total server-side latency |
metadata.reranked | Whether cross-encoder reranking was applied |
metadata.cache_hit | Whether response was served from 30-second cache |
metadata.timings | Per-phase latency breakdown |
pagination.has_more | Whether more results exist |
Response — Compact format
When format: "compact", returns plain text markdown table:
| # | Name | Score | Key Data |
|---|------|-------|----------|
| 1 | Stainless Steel Bolt M8x40 A2 | 0.87 | part_number: SS-M8-40-A2, material: Stainless Steel A2 |~120 tokens per result. Best for LLM context windows.
Response — YAML format
When format: "yaml", returns plain text YAML:
- name: Stainless Steel Bolt M8x40 A2
score: 0.87
part_number: SS-M8-40-A2
material: Stainless Steel A2~200 tokens per result.
GET /search/{vertical}
Same search via query parameters. Convenience endpoint for simple queries.
curl "https://api.qanatix.com/api/v1/search/manufacturing?q=M8+bolt&limit=5" \
-H "Authorization: Bearer sk_live_abc123..."| Parameter | Maps to | Default |
|---|---|---|
q | query | — (required) |
limit | limit | 20 |
offset | offset | 0 |
Filters, rerank, and format are not supported via GET — use POST.