The GET /v1/aftermarket/crosses endpoint returns a list of analog parts for a given article number — other brands that produce the same part. Sounds simple enough, until you hit one edge case that breaks half of all requests.
IAM ≠ OEM: The Most Common Mistake
The article parameter accepts an IAM number (Aftermarket / Independent Aftermarket) — the part number assigned by the aftermarket manufacturer itself: Bosch, MANN, Febi, NGK, etc.
An OEM number is something completely different. It is the original part number from the vehicle manufacturer: 03L115562 from Volkswagen, 1J0698151B from VW. If you pass an OEM number to /crosses, you will get an empty or incorrect response.
The rule is simple:
- You have an IAM number (F026407123 from Bosch) → use
/v1/aftermarket/crosses
- You have an OEM number (03L115562 from VW) → use
/v1/aftermarket/search?type=OENumber
Request Parameters
GET /v1/aftermarket/crosses
?article=F026407123
&brand=BOSCH
&lang=en
Authorization: Bearer {your_api_key}
article — IAM article number. Case-insensitive, but spaces and separators should match how the manufacturer stores it. For example, Bosch may store it as F 026 407 123, so it is a good idea to first look up the article via /v1/aftermarket/search?type=ArticleNumber and take the article_nr from the response.
brand — the brand that issued this article number. This matters: article W712/95 from MANN and the same string from another manufacturer are different entities in the database. The brand must match the one that authored the number.
Response Structure
{
"success": true,
"data": {
"found": true,
"article": {
"art_id": 6926927,
"article_nr": "F 026 407 123",
"brand": "BOSCH",
"name": null
},
"crosses": [
{
"art_id": 2001,
"brand": "MANN",
"article_nr": "W 712/95",
"matched_oem": "03L 115 562",
"cross_type": null,
"article_url": "/api/v1/aftermarket/search?q=W+712%2F95&type=ArticleNumber"
},
{
"art_id": 2002,
"brand": "MAHLE",
"article_nr": "OC 229",
"matched_oem": "03L 115 562",
"cross_type": null,
"article_url": "/api/v1/aftermarket/search?q=OC+229&type=ArticleNumber"
},
{
"art_id": 2003,
"brand": "VOLKSWAGEN",
"article_nr": "03L115562",
"matched_oem": "03L 115 562",
"cross_type": null,
"article_url": "/api/v1/aftermarket/search?q=03L115562&type=ArticleNumber"
}
]
}
}
Things to note:
name: null — expected behavior. Not all articles in the database have a text name. Do not build logic around the presence of name; use art_id as a stable identifier.
matched_oem — the OEM number through which the cross-reference relationship was established. All analogs in the crosses array share the same original OEM part at their core. This field explains why these specific articles appear in the list.
article_url — a ready-made proxied URL for an immediate follow-up request. Found a MANN analog W 712/95? Just call article_url to get the full article card with specs, fitment, and images.
Typical Usage Pattern
Say a client has Bosch F026407123 (oil filter) in stock and you want to suggest alternatives. The call chain:
- Look up the article →
/v1/aftermarket/search?q=F026407123&type=ArticleNumber — confirm the article exists, get the normalized article_nr and art_id
- Get analogs →
/v1/aftermarket/crosses?article=F026407123&brand=BOSCH — list of analogs with article_url for each
- Fetch analog details → follow the
article_url of the desired analog — get the full article card
Cost: 2 tokens for /crosses + 2 tokens per follow-up via article_url.
Playground
You can try the endpoint in the Playground — the Article field is labeled as "IAM article number" with examples: F026407123 (BOSCH) and W712/95 (MANN). The response is rendered in real time directly in the browser.