Search
Pixee PIM search is backed by Meilisearch, with an automatic fallback to PostgreSQL when Meilisearch is unavailable. Facet filters keep working under the fallback — only ranking quality and autocomplete degrade.
This page covers the Search and Product Search tags. "Search" queries your own indexed catalog (products, brands, categories, suppliers). "Product Search" (bottom of this page) is a different feature: it queries external data providers to find or enrich product data (e.g. resolve a missing EAN) — see Product Search (external providers).
Global search
Multi-index search across products, brands, categories, and suppliers in one call, grouped by index.
Query parameters
- Name
q- Type
- string
- Description
Search query.
- Name
limit- Type
- integer
- Description
Max results per index, 1–50 (default: 5).
- Name
indexes- Type
- string
- Description
Comma-separated list of indexes to search:
products,brands,categories,suppliers(default:products,brands,categories).
- Name
exact_match- Type
- boolean
- Description
Require all words to match (default:
false, approximate matching).
- Name
active- Type
- boolean
- Description
Filter by
is_active. Applied to every requested index.
- Name
level- Type
- integer
- Description
Category depth (0–20). Only applied to the
categoriesindex.
- Name
country- Type
- string
- Description
ISO 3166-1 alpha-2 country code. Only applied to the
suppliersindex.
- Name
lang- Type
- string
- Description
ISO 639-1 language code for tokenization and localized titles. Defaults to the locale from
Accept-Language. Returns422 LANGUAGE_NOT_ENABLEDif the language isn't enabled on your tenant.
Each filter is routed only to the indexes that declare it filterable — level never reaches brands, for instance. Sending an unsupported combination has no effect on unrelated indexes.
Request
curl "https://api.pixeepim.com/api/v1/search?q=casque+bluetooth&indexes=products,brands&limit=10&active=true" \
-H "Authorization: Bearer {api_key}"
Response
{
"query": "casque bluetooth",
"processing_time_ms": 4.2,
"provider": "meilisearch",
"results": {
"products": {
"hits": [
{ "id": "550e8400-e29b-41d4-a716-446655440000", "title": "Casque Bluetooth XR200", "ean": "3760000000001" }
],
"count": 1,
"facets": null
},
"brands": { "hits": [], "count": 0, "facets": null }
}
}
Search products
Faceted product search with native identifier filters. A query needs either text (q) or at least one filter — an empty request is rejected rather than silently returning the entire catalog.
Query parameters
- Name
q- Type
- string
- Description
Search query. May be omitted if at least one filter below is set.
- Name
limit- Type
- integer
- Description
Max results, 1–100 (default: 20).
- Name
offset- Type
- integer
- Description
Pagination offset (default: 0).
- Name
brand- Type
- array
- Description
Filter by brand name. Repeatable (
brand=Acme&brand=Globex) — values withinbrandcombine with OR, different facets combine with AND. Max 20 values.
- Name
is_active- Type
- boolean
- Description
Filter by active status.
- Name
has_asin- Type
- boolean
- Description
Filter by presence of an ASIN.
- Name
has_image- Type
- boolean
- Description
Filter by presence of a gallery image.
- Name
ean- Type
- string
- Description
Exact-match filter on EAN/GTIN. Native filter as of 17/09/2026 — it no longer matches partial/substring text elsewhere in the title.
- Name
sku- Type
- string
- Description
Exact-match filter on SKU / reference.
- Name
asin- Type
- string
- Description
Exact-match filter on ASIN.
- Name
sort- Type
- string
- Description
relevance(default, engine ranking),title:asc, ortitle:desc.
- Name
exact_match- Type
- boolean
- Description
Require all words to match (default:
false).
- Name
lang- Type
- string
- Description
ISO 639-1 language code. Defaults to the locale from
Accept-Language.
ean, sku, and asin are strict-equality filters on their own field — unlike brand, only one value each, since a product has a single EAN/SKU/ASIN. They deliberately have no facet distribution (it would produce roughly one million single-item buckets).
Request
curl "https://api.pixeepim.com/api/v1/search/products?ean=3760000000001" \
-H "Authorization: Bearer {api_key}"
Request — text + facets
curl "https://api.pixeepim.com/api/v1/search/products?q=casque&brand=Acme&is_active=true&sort=title:asc&limit=20" \
-H "Authorization: Bearer {api_key}"
Response
{
"hits": [
{ "id": "550e8400-e29b-41d4-a716-446655440000", "title": "Casque Bluetooth XR200", "ean": "3760000000001", "brand_name": "Acme" }
],
"count": 1,
"facets": { "brand_name": { "Acme": 1 }, "has_asin": { "true": 1 } }
}
Get similar products
Vector-similarity recommendations for a product, computed from the Qdrant embedding index. Unlike Relations, these are computed, not curated, and change as the index is refreshed.
Path parameters
- Name
product_id- Type
- string
- Description
The reference product's UUID.
Query parameters
- Name
limit- Type
- integer
- Description
Max results to return.
- Name
score_threshold- Type
- number
- Description
Minimum similarity score (0–1) required to include a match.
Request
curl "https://api.pixeepim.com/api/v1/search/products/550e8400-e29b-41d4-a716-446655440000/similar?limit=5&score_threshold=0.75" \
-H "Authorization: Bearer {api_key}"
Suggestions
Autocomplete suggestions as the user types.
Query parameters
- Name
q- Type
- string
- Description
Partial search query.
- Name
limit- Type
- integer
- Description
Max suggestions to return.
Request
curl "https://api.pixeepim.com/api/v1/search/suggestions?q=cas&limit=8" \
-H "Authorization: Bearer {api_key}"
Health check
Public endpoint (no auth required) reporting which search provider is currently serving traffic.
- Name
provider- Type
- string
- Description
meilisearch,postgresql(fallback engaged),none, orerror.
- Name
healthy- Type
- boolean
- Description
Whether the active provider responded successfully.
- Name
meilisearch_available- Type
- boolean
- Description
trueonly whenproviderismeilisearchand it's healthy.falsewhenever the PostgreSQL fallback is serving requests — this is the field to alert on, nothealthyalone.
Under the PostgreSQL fallback, queries still work and facet filters are still honoured — only relevance ranking, typo-tolerance, and autocomplete quality degrade to plain SQL matching.
Request
curl https://api.pixeepim.com/api/v1/search/health
Response — degraded
{
"provider": "postgresql",
"healthy": true,
"meilisearch_available": false
}
Saved searches
Per-user saved search criteria for the /search screen. The server never interprets query_string — it stores and returns it opaquely; only the client reads it. A saved search belongs to its creator: accessing someone else's returns 404, never 403, so a UUID can't be used to probe existence.
- Name
GET /search/saved- Description
Lists the current user's saved searches.
- Name
POST /search/saved- Description
Creates a saved search.
- Name
PUT /search/saved/{recherche_id}- Description
Updates a saved search you own.
- Name
DELETE /search/saved/{recherche_id}- Description
Deletes a saved search you own.
Body parameters — POST / PUT
- Name
name- Type
- string
- Description
Display name for the saved search.
- Name
query_string- Type
- string
- Description
Opaque, client-defined criteria string (max 4,000 characters).
- Name
scope- Type
- string
- Description
Search scope, e.g.
products(default:products, max 32 characters).
A maximum of 100 saved searches per user is enforced server-side.
Request
curl -X POST https://api.pixeepim.com/api/v1/search/saved \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"name": "Casques sans stock",
"query_string": "q=casque&is_active=true&has_image=false",
"scope": "products"
}'
Response
{
"id": "9f8e7d6c-5b4a-3210-9876-543210fedcba",
"name": "Casques sans stock",
"query_string": "q=casque&is_active=true&has_image=false",
"scope": "products",
"created_at": "2026-09-17T09:00:00Z"
}
Indexing & reindex
Administrative endpoints for the Meilisearch and Qdrant indexes.
| Method & path | Purpose |
|---|---|
GET /search/stats | Document count per index, provider, and last reindex time. |
GET /search/indexing-status | Combined Meilisearch stats and indexing configuration. |
PATCH /search/indexing-config | Updates reindex_interval_hours, auto_reindex_enabled, reindex_after_import. |
POST /search/reindex | Triggers a full Meilisearch reindex. Body: { "index": "products" | "brands" | "categories" | "suppliers" | null } (null = all). |
POST /search/reindex-differential | Triggers a Meilisearch differential (incremental) reindex. |
GET /search/qdrant/status | Qdrant collection status for vector search. |
POST /search/qdrant/reindex | Triggers a full Qdrant reindex. Query: recreate_collection, resume. |
POST /search/qdrant/reindex-differential | Triggers an incremental Qdrant reindex. |
GET /search/semantic | Semantic (vector) search over products (q, limit, score_threshold). |
Product Search (external providers)
A separate feature from catalog search above: it queries external product-data providers (EAN/GTIN databases, marketplaces) to find or resolve product information, typically to fill in a missing EAN or enrich a record.
- Name
POST /product-search/- Description
Unified search across enabled providers for one query (free text or explicit EAN).
- Name
POST /product-search/bulk- Description
Runs multiple queries against the providers in one call.
- Name
POST /product-search/from-catalog- Description
Searches providers for catalog products matching a filter, e.g.
no_ean(products missing an EAN).
- Name
GET /product-search/providers- Description
Lists available search providers.
- Name
POST /product-search/resolve-pending- Description
Synchronously resolves pending EAN lookups for a supplier.
- Name
POST /product-search/resolve-pending/jobs- Description
Creates an asynchronous EAN-resolution job for larger batches.
- Name
GET /product-search/resolve-pending/jobs/{job_id}- Description
Polls job progress.
- Name
DELETE /product-search/resolve-pending/jobs/{job_id}- Description
Cancels a running job.
Body parameters — POST /product-search/
- Name
query- Type
- string
- Description
Free-text search query (type auto-detected).
- Name
ean- Type
- string
- Description
Explicit EAN/GTIN for a direct barcode lookup.
- Name
brand- Type
- string
- Description
Brand filter.
- Name
providers- Type
- array
- Description
Limit the search to specific provider IDs.
- Name
max_results- Type
- integer
- Description
Max results to return.
Request
curl -X POST https://api.pixeepim.com/api/v1/product-search/ \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"ean": "3760000000001",
"max_results": 5
}'
Request
curl -X POST https://api.pixeepim.com/api/v1/product-search/resolve-pending/jobs \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"supplier_codes": ["ACME"],
"limit": 500,
"auto_apply": false
}'