Listings sync
Structured inventory (cars, flats, products) the worker can search by attribute.
Knowledge sources are free text. Listings are rows: a price, a category, attributes. Use listings when the worker needs to answer "anything under 20k with automatic gearbox?" rather than "what's your return policy?".
Sync
POST
/api/v1/listings/syncUpsert by externalId. 1 to 1000 listings per request, request allowed 5 minutes.
listingsobject[]requireddeleteStalebooleanDelete listings not in this payload. Compared within the first item's
category only, so send one category per request when using this.default falseEach listing:
externalIdstringrequiredtitlestringrequireddescriptionstringcategorystringpricenumber≥ 0. Comes back as a string with two decimals.
currencystringdefault EUR
attributesobjectSearchable key/values.
{ "gearbox": "automatic", "year": 2021 }.sourceUrlurl{
"deleteStale": true,
"listings": [
{
"externalId": "VIN-123",
"title": "2021 Volvo XC60 B5",
"category": "cars",
"price": 34900,
"attributes": { "gearbox": "automatic", "km": 61000, "fuel": "hybrid" },
"sourceUrl": "https://example.com/cars/VIN-123"
}
]
}{
"data": {
"imported": 1, "updated": 0, "failed": 0, "deleted": 3,
"results": {
"imported": [{ "id": "…", "externalId": "VIN-123", "title": "2021 Volvo XC60 B5" }],
"updated": [],
"failed": []
}
},
"meta": { "timestamp": "…", "message": "Synced: 1 created, 0 updated, 0 failed, 3 stale deleted" }
}Embeddings are regenerated for every created or updated listing, synchronously. Validation errors come back as 400 with a details[] array of { path, message }.
Current state
GET
/api/v1/listings/syncEvery active listing, up to 10 000, for diffing before a sync. Optional ?category= filter.
{
"data": {
"listings": [
{ "id": "…", "externalId": "VIN-123", "title": "…", "price": "34900.00", "status": "active", "sourceUrl": "…", "updatedAt": "…" }
],
"total": 42
},
"meta": { "timestamp": "…" }
}