QANATIX
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

ParameterDescription
collectionThe collection to search within

Request body

FieldTypeRequiredDefaultDescription
querystringnoSearch query (1-500 chars). Optional when filters are provided.
limitintegerno20Max results (1-100)
offsetintegerno0Pagination offset
sortstringnoSort field. Prefix with - for descending. E.g. price_usd, -weight_kg.
formatstringnojsonResponse format: json, compact, yaml
filtersobjectno{}Filters on collection_data fields. Supports multi-value: "manufacturer": "SKF,ABB"

Filter operators

SuffixOperatorExample
(none)="country": "DE"
val1,val2IN (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
_inIN (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

FieldDescription
results[].record_idRecord UUID
results[].scoreRelevance score (0-1). Identifier matches = 1.0
results[].collection_dataYour structured data
results[].descriptionUser-provided record description
results[].description_llmAuto-generated LLM-optimized description from record fields
results[].source_typeHow data was uploaded: api, file_upload, webhook, connector
metadata.search_modefulltext, identifier, or filtered
metadata.query_typeidentifier, keyword, or natural_language
metadata.processing_time_msTotal server-side latency
metadata.cache_hitWhether response was served from 30-second cache
metadata.timingsPer-phase latency breakdown
pagination.has_moreWhether 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..."
ParameterMaps toDefault
qquery— (required)
limitlimit20
offsetoffset0

Filters and format are not supported via GET — use POST.

On this page