A live, Akeneo-sourced replica of the legacy search2.luna.se search API.
Status & the decisions that need you.
tech[], images, documents, taxonomy, benefits).documentList.documents[] envelope as legacy./media proxy (cached).q=* offset/hits paging; browser pretty-print; brand & status now show labels.tech[] ≈95.5% name-parity with legacy; ordered by Akeneo sort_order; metric/text name-collisions de-duped (prefer the human value). Residual gaps are Akeneo label/data quality.docs/FIELD_COMPLETENESS.md.You were right twice. The rule is the catalog gate and your market rule together:
enabled · item_status∈{20,30,50,80,90} · brand_movex≠∅ (Movex supplier) · (control_assortment≠1 → all markets ; =1 → market∈approved_for_market).
Live result: SE 82,217 vs legacy 78,407 (+4.9%), PL 73,874 vs 70,722 (+4.5%) — and PL < SE, so the markets split correctly. The two missing pieces were (a) the Movex-supplier gate (cut 142k→82k) and (b) keeping your control_assortment market logic (an earlier pass wrongly dropped it). Discontinued/status 80/90 are kept (legacy keeps them).
Source confirmed (legacy C4 sqlite): the market list is SalesCatalogEntry.Marknad (country codes SE/PL/…) set in the legacy C4 PIM on the parent "product" — = legacy markets_ss = Akeneo approved_for_market (same signal, 3 encodings). The supplier+status half comes from Movex/M3. Residual ~5%: Akeneo's approved_for_market is the parent-level list (broader than legacy's item-level Marknad) → SE +4.9%. PL is the opposite: the iCore Marknad PL set (53,520) is smaller than live legacy PL (70,722), so our +4.5% PL is already closer to legacy than the source export (PL data is stale/partial). Searchers are separate endpoints with the right languages (sestd1=sv+en, plstd1=pl+en); no-lang totalHits 156,852/141,470 = products×langs.
Marknad into a per-variant Akeneo attribute and gate on that instead of the parent-level approved_for_market; refresh the PL market feed (it's stale). No structural issue.Per-article lookups are instant. q=* paging works, but deep live paging (offset ≫ 0) is slow (each doc is transformed live). The real harvest path is build-then-serve: run python -m build.build_docs --market to pre-build the index into the store, then q=* offset paging is instant.
market_price, pl_stock-level, pl_stocked, pl_packaging, pl_nextDeliv have no Akeneo source (legacy joins them from Movex CSVs at query time). We currently emit the placeholder "NEEDS_ERP_FEED".
market_price as a number will break on the string.ERP_PLACEHOLDER="").The mirror currently ignores the token (open access). Locale-name fallback: a product with no name in the requested language falls back to another language (names only) rather than showing empty like legacy.
MIRROR_TOKEN to require a token like legacy's ?token=.item_status options have no labels (just codes) — we hardcode legacy's map (20→Godkänd, 80→Utgången, 90→Borttagen). Fix: add option labels in Akeneo.Flammtemperatur), auto-label cruft (_AUTO, (metric>text)), Excel-corrupted values (Anslutningsgänga 1/4 → 45661).spare_part_name/number empty in Akeneo (legacy has them) — can't emit what isn't there.pl_PL/sv_SE name → null or cross-locale fallback.link_info (EcoOnline SDS/protection-sheet links) — legacy emits a structured list; source exists in Akeneo (the links-group URL attrs: safety_data_sheet_url, protection_sheet_url, …) but legacy's per-link id/category/type aren't cleanly reproducible. Currently these URLs surface inside tech[] instead. Decide the shape before wiring.brand_info (brand metadata: image/website/info) — legacy emits it but it's an empty subquery for most products; source exists in the Akeneo brands entity. Wireable but usually empty — low priority, shape TBD.?lastmod= (incremental "modified since" harvest), ?brand=, ?taxonomy=, ?status=. We do artno + q=*. Wire these only if receivers use them.pl_packaging_split — now emitted as the ERP placeholder (it's a Movex field, no Akeneo source).Arbetstemperatur into , min/, max entries; legacy shows one ranged entry. We keep them granular (more data). Decide: keep granular vs fold into a single min–max range to match legacy's shape.luna.okface.se/media/… (you wanted Akeneo links), not legacy's C4 host.brands entity label (Mareld); legacy emits the Movex supplier code (MARELD/ADPROLIN). Deliberate — the label is the cleaner brand name. (Flag if you want exact-legacy codes instead.)name).