We use cookies to improve your experience. By continuing, you agree to our Cookie Policy.

plan.parts
About Databases Data Tasks How it works Pricing Docs Blog Support Contacts

Oct 14, 2026 · plan.parts Team

Part Analogs via API: IAM Number ≠ OEM Number

The /v1/aftermarket/crosses endpoint returns analogs for an IAM article number. The most common mistake is passing an OEM number instead of an IAM one. We break down the difference, the response structure (name: null, matched_oem, article_url), and the typical call pattern.

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:

  1. Look up the article → /v1/aftermarket/search?q=F026407123&type=ArticleNumber — confirm the article exists, get the normalized article_nr and art_id
  2. Get analogs → /v1/aftermarket/crosses?article=F026407123&brand=BOSCH — list of analogs with article_url for each
  3. 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.

More Articles