API Reference
Search API
Search endpoint — full specification.
Search API
Search records using full-text search with structured filters and identifier detection.
POST /search/{collection}
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,
"format": "json",
"filters": {
"in_stock": true,
"price_eur_max": 0.20
}
}'Path parameters
| Parameter | Description |
|---|---|
collection | The collection to search within |
Request body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | no | — | Search query (1-500 chars). Optional when filters are provided. |
limit | integer | no | 20 | Max results (1-100) |
offset | integer | no | 0 | Pagination offset |
sort | string | no | — | Sort field. Prefix with - for descending. E.g. price_usd, -weight_kg. |
format | string | no | json | Response format: json, compact, yaml |
filters | object | no | {} | Filters on collection_data fields. Supports multi-value: "manufacturer": "SKF,ABB" |
Filter operators
| Suffix | Operator | Example |
|---|---|---|
| (none) | = | "country": "DE" |
val1,val2 | IN (multi-value) | "manufacturer": "SKF,ABB,FAG" |
_min | >= | "price_eur_min": 0.05 |
_max | <= | "price_eur_max": 0.20 |
_gt | > | "stock_gt": 0 |
_lt | < | "lead_time_days_lt": 10 |
_in | IN (explicit) | "material_in": "stainless,titanium" |
Maximum 20 filters per query. Multiple filters use AND logic.
Response (200) — JSON format
{
"results": [
{
"record_id": "550e8400-...",
"name": "Stainless Steel Hex Head Bolt M8x40 ISO 4017",
"score": 0.87,
"collection": "manufacturing",
"record_type": "fastener",
"collection_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": "fulltext",
"query_type": "keyword",
"processing_time_ms": 42,
"total_estimate": 1,
"cache_hit": false,
"timings": {
"search_ms": 12.4,
"hydrate_ms": 8.1
}
}
}Response fields
| Field | Description |
|---|---|
results[].record_id | Record UUID |
results[].score | Relevance score (0-1). Identifier matches = 1.0 |
results[].collection_data | Your structured data |
results[].description | User-provided record description |
results[].description_llm | Auto-generated LLM-optimized description from record fields |
results[].source_type | How data was uploaded: api, file_upload, webhook, connector |
metadata.search_mode | fulltext, identifier, or filtered |
metadata.query_type | identifier, keyword, or natural_language |
metadata.processing_time_ms | Total server-side latency |
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/{collection}
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 and format are not supported via GET — use POST.