listing-health
Skill1 starsChanged 12 days agoMITView on GitHub
Use when the user asks whether products are live or sellable on OTTO Market, Kaufland or a Mirakl-based marketplace (e.g. Home24) through Backlane: new products not showing up, listings rejected, restricted, blocked or offline, missing mandatory fields or GPSR data per item and channel, "why is this SKU/EAN not online", or a listing status overview across channels. Requires the Backlane MCP server (tools `list_integrations`, `search`, `execute`).
In this repository9 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .claude/CLAUDE.mdCLAUDE.md
- backlaneSkill
- customer-serviceSkill
- daily-checkSkill
- get-startedSkill
- mirakl-product-dataSkill
- otto-adsSkill
- sales-analysisSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 1 is distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 35
Scope: Use the channels and products the user named.
- Very specific: line 41
Empty shops: Read the total first (limit: 1, then pagination.total / total_count).
- Very specific: line 120
Not the seller's catalog: GET /v2/assortment-coverage/insights lists products Kaufland wants sellers to add (hundreds of thousands).
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Listing health across marketplaces
Answers "is it live, and if not, why?" per product and channel. Every call
here is a read. Load the backlane skill first if you have not checked the
connections yet. Use search for the exact schema before the first call to
an operation.
Live means two things
A product sells only when both the product and the offer are fine. Check both, or you will report products as live that nobody can buy.
| Channel | Product side | Offer side |
| OTTO | marketplace-status is ONLINE | active-status true, quantity > 0, price set |
| Kaufland | product by EAN is_valid, not is_blocked | units/status is_live |
| Mirakl | CM11 status is LIVE | an offer exists in OF21 with stock |
Before the first call
- Scope. Use the channels and products the user named. If they named none, ask (SKUs, EANs, "everything new this week").
- Connections.
list_integrationsshows each connection'senvironment. Preferproduction; if you check asandboxor playground, say so in the answer, because "live" there is not the real shop. With several connections per platform, name the one you used. - Empty shops. Read the total first (
limit: 1, thenpagination.total/total_count). If a shop has 0 offers, report "nothing is listed on this channel" once instead of a failure per product. 404s are answers.
codemode.requestreturns the parsed body and throws on any non-2xx, with the status in the message (OTTO 404 on GET ...). Several 404s below mean "never sent" or "none", so wrap each call:const call = async (req) => { try { return { ok: true, data: await codemode.request(req) }; } catch (e) { const m = String(e); return { ok: false, status: Number(m.match(/ (\d{3}) on /)?.[1]), error: m.slice(0, 300) }; } };
Match products across channels by EAN. Aggregate in code and return summaries: responses are capped at ~6,000 tokens.
OTTO
Paths /otto/<connection>/..., paginated with page and limit; follow
the next link until it is missing.
- Find the SKU. Calls take OTTO's
sku./v5/productshas no EAN filter: if you only have EANs, scanGET /v5/products(limit100) and mapean→sku. An unknownskuthere returns 200 with an empty list. - Status, many products:
GET /v5/products/marketplace-status(limitup to 1000). Filter withmarketPlaceStatus: ["REJECTED", "RESTRICTED"](array) orsku. Each item hasstatus(PENDING,ONLINE,RESTRICTED,REJECTED,INACTIVE),errorsandinformation(eachcode+title), and ashoplink. Group by error code. - Status, one product:
GET /v5/products/{sku}/marketplace-status. - Offer side:
GET /v5/products/{sku}/active-status,GET /v1/availability/quantities/{sku},GET /v5/products/{sku}/prices(lists:/v5/products/active-statuswithlimitup to 100,/v1/availability/quantities,/v5/products/prices). Prices are plain euros (750= 750.00 EUR), unlike the ads API. - 404 means "never sent", not "rejected" on all of the single-SKU calls
above and on
/v5/products/prices?sku=./v5/products/content-changesanswers 404 "page not found" when there are simply no changes. - Recent changes:
fromDateonmarketplace-statusfilters by when the status last changed, not by creation date. - A delivery the user just sent:
GET /v5/products/update-tasks/{processUuid}, then/failedfor the rejected products. An unknown UUID returnsstate: "pending"forever, not 404. Only poll a UUID you got from an actual POST, and respectpingAfter.
Kaufland
Paths /kaufland/<connection>/v2/....
- Storefronts:
GET /v2/info/storefrontlists the seller's storefronts. Any otherstorefrontanswers 400storefront-not-configured. - Offers:
GET /v2/unitswithstorefront, filtered byeanorid_product. Addembedded: "products"(plural) for product data including EANs. Retry a 500 once. - Why not live:
POST /v2/units/status,query: { storefront }, body{ unit_ids: [...] }, at most 20 per call: loop in batches. Each entry hasis_liveandreasons[](reason,reason_description, optionaldetails_url), e.g.product_data_incomplete,gpsr_info_needed,stock_update_needed,offer_paused,price_check_needed. New reasons appear without notice: showreason_descriptionfor unknown ones. Unknown IDs come back as entries withstatus_code: 404; the call itself succeeds. 500/503 are safe to retry. - Product side:
GET /v2/products/ean/{ean}withstorefrontgivesis_valid,is_blocked,blocked_reasons. This is Kaufland's shared catalog entry, possibly built from other sellers' data: it proves the product exists, not that the user's data is fine. 404 means Kaufland does not know the EAN. - The seller's own data:
GET /v2/product-data/status/{ean}withlocale(e.g.de-DE). 404 means the seller never sent data for that EAN. - Whole catalog:
POST /v2/reports/invalid-itemswithstorefrontlists offers that cannot go live for missing product data. Reports are queued: pollGET /v2/reports/{id_report}untilurlis set. It can stayNEWfor a long time; tell the user and check back later instead of looping.product-data-import-file-errorsneedsid_file_importin the body.
Not the seller's catalog: GET /v2/assortment-coverage/insights lists
products Kaufland wants sellers to add (hundreds of thousands). Never count
them as the user's listings.
Mirakl
Paths /mirakl/<connection>/api/....
- Status: CM11
GET /api/mcm/products/sources/status/export.- One product by shop SKU:
provider_unique_identifier: "<sku>". - By EAN:
unique_identifier: "EAN-13|<ean>". A bare EAN fails with 400MCM-06001. { status: 204 }means no product source: never sent.- Many products: filter
status(LIVE,NOT_LIVE). - A full export (no filter, no dates) is allowed once every 4 hours:
add
asFile: true, aggregate in the same script and keep the result for the session.updated_sincegives a delta (max every 5 minutes). Filtered single-product calls were not throttled in testing.
- One product by shop SKU:
- Read both
errorsandwarnings. Missing required attributes (MCM-05000) and value-list errors (MCM-05010) arrive inwarnings;errorsoften holds onlyMCM-0L000(not published yet). Group bycode+attribute_codeand count. - Who fixes it:
MCM-05000/05010/05012are seller data.MCM-0L000andMCM-04014clear only after the marketplace reviews the product. - Offer side: OF21
GET /api/offers(maxup to 100,offset; filterskuorproduct_id). No offer means not sellable, even for aLIVEproduct. - Recent imports: P51
GET /api/products/imports(max 1 per minute).has_transformation_error_report: true→ P47.../{import}/transformation_error_report(CSV with anerrorscolumn per line). P44.../error_reportanswers 404 whenhas_error_reportis false.
To fix Mirakl product data, use the mirakl-product-data skill.
Report
- Which connection per channel, and whether it is a sandbox.
- One line per channel: products checked, live, not live.
- Not-live reasons grouped by cause with counts, largest first, e.g. "749 missing GPSR manufacturer data (nameOfManufacturer, postalAddressOfManufacturer, eMailAddressOrURLOfManufacturer)".
- For each cause: who fixes it (seller data, offer/stock, marketplace review) and the next step.
- A product × channel table only when the user asked about specific products.
- Give
file.downloadUrlfor any export the user may want (valid 24 hours).
Common mistakes
| Mistake | Result | |
| Checking only the product status | "Live" products without offer, stock or price | |
Reading only CM11 errors | Missing attributes are reported as "just not published" | |
| Letting a thrown 404 abort the script | No answer; wrap calls and treat 404 as "never sent" or "none" | |
Bare EAN in CM11 unique_identifier | 400 MCM-06001; use `EAN-13 | <ean>` |
Kaufland products/ean valid → "our data is fine" | Shared catalog entry; check product-data/status | |
Counting assortment-coverage rows | Hundreds of thousands of products that are not the user's | |
More than 20 IDs in units/status | Request rejected | |
| A second full CM11 export within 4 hours | Rate limit hit | |
Polling a guessed OTTO processUuid | Stays pending forever | |
| Sandbox results reported as the live shop | Wrong conclusions |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

