The Recall Campaign API takes a vehicle make and a manufacturer's campaign code, such as Volkswagen `37M2`, and returns the campaign behind it: the NHTSA campaign number, whether it is a safety recall or a service bulletin, the defect and remedy description, the component, and the affected models and model years. No VIN required.

---

<Row>
  <Col>
    Manufacturer campaign codes are what appear on repair orders, owner letters, and auction condition reports. This endpoint resolves one of them with an exact match against the CarsXE campaign dictionary, which covers safety recalls and manufacturer service bulletins.

    ## Required attributes

    <Properties>
      <Property name="key" type="string">
        Your CarsXE API key.
      </Property>
      <Property name="make" type="string">
        The vehicle manufacturer name (e.g. `volkswagen`, `land rover`). Case and extra whitespace are ignored. Up to 120 characters.
      </Property>
      <Property name="code" type="string">
        The manufacturer's campaign code (e.g. `37M2`). Case-insensitive, and the letter `O` is read as the digit `0`. Volkswagen warranty codes match in any spelling: `VWP1403`, `VWP 14 03`, and `VWP-14-03` are the same code. Up to 64 characters.
      </Property>
    </Properties>

    ---

    ## Response attributes

    <Properties>
      <Property name="success" type="boolean">
        `true` when a campaign was found.
      </Property>
      <Property name="input" type="object">
        The normalized `make` and the `code` you sent, trimmed.
      </Property>
      <Property name="data" type="object">
        The matched campaign.
      </Property>
      <Property name="campaign_code" type="string">
        The manufacturer's campaign code as stored in the dictionary (e.g. `37M2`, `VWP-14-03`).
      </Property>
      <Property name="recall_class" type="string">
        `Safety / Compliance Recall` for a safety recall, otherwise the service bulletin type.
      </Property>
      <Property name="description" type="string">
        The defect and remedy text for a recall, or the bulletin summary for a service bulletin.
      </Property>
      <Property name="nhtsa_campaign_number" type="string">
        One or more NHTSA campaign numbers separated by `;` (e.g. `19V615000`). Empty for a code known only from a service bulletin.
      </Property>
      <Property name="component" type="string">
        The affected vehicle system. Empty for a code known only from a service bulletin.
      </Property>
      <Property name="models" type="string">
        Affected models separated by `;`.
      </Property>
      <Property name="model_years" type="string">
        Affected model years separated by `;`.
      </Property>
      <Property name="confidence" type="string">
        `high` when the code came from an identifier field, `medium (prose reference)` when it was found only in bulletin text.
      </Property>
      <Property name="matched" type="boolean">
        Always `true` on a successful response.
      </Property>
      <Property name="dictionary_version" type="number">
        The dictionary build that answered. It increases each time a new build is published.
      </Property>
      <Property name="timestamp" type="string">
        When the response was generated, in ISO 8601 format.
      </Property>
    </Properties>

    <FAQ faqs={[
      {
        question: "What is a manufacturer campaign code?",
        answer: "The manufacturer's own ID for a recall or service campaign, such as Volkswagen 37M2. It is printed on repair orders and owner letters, while the same recall also carries an NHTSA campaign number."
      },
      {
        question: "What happens when a code is not found?",
        answer: "The API returns a 404 with the message \"No campaign found for this make and campaign code\", and the call is not billed. The endpoint never guesses a nearby code."
      },
      {
        question: "Do I need a VIN?",
        answer: "No. The API takes only a make and a code. To check every recall on one vehicle use the VIN-based Vehicle Recalls API, and for a whole model line use Recalls by YMM."
      },
      {
        question: "How often is the data updated?",
        answer: "The campaign data is refreshed regularly, and each refresh is published as a new dictionary build. dictionary_version identifies the build that answered."
      },
      {
        question: "How is it billed?",
        answer: "A call that returns a campaign is billed as one Vehicle Recalls call and shares that quota and rate. A miss returns 404 and costs nothing."
      },
      {
        question: "Is the Recall Campaign API included in the free Sandbox?",
        answer: <>Yes. It counts as a Vehicle Recalls call, so it draws on the Sandbox's shared quota (up to 100 API calls). For more information visit our <a href='/pricing'>pricing</a> page.</>
      }
    ]} hidePadding />
  </Col>
  <Col sticky>
    <CodeGroup title="Request" tag="GET" label="/v1/recalls-campaigns">
      ```bash
      curl -G https://api.carsxe.com/v1/recalls-campaigns \
        -d key=CARSXE_API_KEY \
        -d make=volkswagen \
        -d code=37M2
      ```

      ```js
      const query = new URLSearchParams({ key: "CARSXE_API_KEY", make: "volkswagen", code: "37M2" });
      const response = await fetch(`https://api.carsxe.com/v1/recalls-campaigns?${query}`);

      if (response.status === 404) {
        console.log("Code not found (not billed)");
      } else {
        console.log(await response.json());
      }
      ```

      ```python
      import httpx

      response = httpx.get(
          "https://api.carsxe.com/v1/recalls-campaigns",
          params={"key": "CARSXE_API_KEY", "make": "volkswagen", "code": "37M2"},
          timeout=30.0,
      )

      if response.status_code == 404:
          print("Code not found (not billed)")
      else:
          print(response.json())
      ```
    </CodeGroup>

    <CodeGroup title="Response">
      ```json showLineNumbers
      {
        "success": true,
        "input": {
          "make": "volkswagen",
          "code": "37M2"
        },
        "data": {
          "campaign_code": "37M2",
          "recall_class": "Safety / Compliance Recall",
          "description": "Volkswagen Group of America, Inc. (Volkswagen) is recalling certain 2015-2019 GTI, 2015-2016 and 2018-2019 Golf, 2012-2019 Beetle and Beetle Convertible, 2017-2019 Golf SportWagen and 2011-2018 Jetta vehicles equipped with an automatic transmission, manual handbrake and keyless entry. A build-up of silicate on the shift lever micro switch contacts may enable the key to be removed from the ignition when the transmission shift lever is not in \"Park.\" Volkswagen will notify owners, and dealers will install an additional switch and circuit board, free of charge.",
          "nhtsa_campaign_number": "19V615000",
          "component": "ELECTRICAL SYSTEM:IGNITION:ANTI-THEFT:CONTROL MODULE",
          "models": "BEETLE;BEETLE CONVERTIBLE;GOLF;GOLF SPORTWAGEN;GTI;JETTA",
          "model_years": "2011;2012;2013;2014;2015;2016;2017;2018;2019",
          "confidence": "high",
          "matched": true,
          "dictionary_version": 1
        },
        "timestamp": "2026-09-25T12:29:09.352Z"
      }
      ```
    </CodeGroup>

  </Col>
</Row>
