Configurator Source
The Stellantis brand "Build & Price" sites (jeep.com, dodge.com, ramtrucks.com,
chrysler.com, fiatusa.com, alfaromeousa.com) expose four public configurator APIs, fetched
per trim (ccode + llp). They are implemented in
projects/ai_stellantis/src/ai_stellantis/sources/configurator.py.
| Endpoint | Purpose |
|---|---|
| CVD | All trims/configurations + base pricing for a model-year code (archival). |
| Equipment Categories | Full ~350-option catalog with descriptions, standard flag, category hierarchy. |
| Catalog Option Details | Per-option pricing, extended descriptions, associations, media. |
| Configure | The standard configuration state of each selectable option — the authority for is_configurable. |
No credentials required; requests use browser-impersonating headers (random_headers()).
The state field — deciding is_configurable
The configure endpoint
(/hostd/api/configure/EN/states/US/models/{ccode}/lowerLevelPackages/{llp}/configurations/standard)
returns options grouped as options[categoryId][subCategoryId][optionKey]. Each option carries a
state. Established by scanning ~33k options across all 6 brands (MY2023–2027):
state | meaning | selectable? |
|---|---|---|
U | unselected, freely-available add-on | yes |
C | unselected mutually-exclusive alternative (a priced swap for the standard sibling) | yes |
R | unselected alternative gated by a combinations rule (jeep/dodge/ram only) | yes |
S | standard equipment, selected — the fixed/standard config | no |
G | package-forced selection: on the build only because another selected option pulls it in (always prices.included=true, stateSetBy populated) | no |
Other useful signals: prices.included=true is the exclusive signature of S/G;
locked is unused (always false in current data — do not key on it); content items
(option.content[]) carry no state of their own.
The rule
A single option's flags cannot decide configurability. The standard default of a real choice and
always-on standard equipment are byte-identical (state="S", standard=true, selected=true, onlyOne=true) — they differ only by whether the group offers an alternative. For example, on
the Wrangler the engine group holds ERC (3.6L, state="S") and EC1 (state="C"), so the
standard ERC is configurable; on the Grand Cherokee L the engine group holds only EC7
(state="S"), so it is not.
A top-level option is
is_configurableiff its(categoryId, subCategoryId)group contains a member withstate ∈ {U, C, R}. A group whose members are allS/Gis fixed equipment. Every member of a configurable group — including its standardS/Gdefault — is configurable.
There is intentionally no special-case for powertrain: a trim with a single engine
(state="S", no alternative) is not configurable.
Content items (constituents listed under a package, e.g. the standard Quick Order Package)
have no own state, so they inherit from the parent option: content of a selectable parent
(state ∈ {U, C, R}) is configurable; content that exists only under fixed-standard parents (the
standard QOP) is standard equipment. A content code that is also a configurable top-level option
stays configurable.
This is why the Stellantis configure feed and the code_guides feed historically disagreed on
many standard-equipment codes (Apple CarPlay, heated seats, etc.): the old extractor marked every
top-level option and most package content configurable, while code_guides correctly treats
standard equipment as non-configurable. The group-state rule aligns them.
The variation_id field — compound pair codes and tiebreaking
Each option in the configure response is identified by a variation_id. For most options this is
a plain three-character code (e.g. PW7 for White Exterior Paint). For options that are defined
as built-in pairings — combinations that the ordering system treats as a single unit — the API
returns a hyphenated compound form: PW7-QW7 (White Paint + Glass Roof), PW7-QX8 (White Paint
- Black Roof), etc.
The three-character form is the operationally significant one for the ordering system. The compound
form is a configure-API artifact: the same PW7 option appears as a standalone code on trims
where the roof is not paired, and as half of a compound code on trims where it is. The choice
between PW7-QW7 and PW7-QX8 is arbitrary from a pipeline perspective — both encode the same
PW7 base option, and the pairing half (roof finish) varies by trim configuration.
Because multiple configure API calls for the same option key may return different compound forms
depending on query order or trim variant, the same logical option can show up as conflicting
variation_id values across raw rows. The pipeline resolves this by tiebreaking on variation_id
with strategy: min (lexicographic ascending), which produces a stable, deterministic choice
without privileging any particular pairing.
invoice and msrp values on configure rows are considered unreliable and are overridden at the
consolidation tier from more authoritative sources.
Future: resolving content items and missing data via href
Both top-level options and content items carry an href pointing to the catalog-option details
endpoint:
# top-level option
"href": "https://www.jeep.com/hostd/api/catalog-option/EN/details/models/{ccode}/lowerLevelPackages/{llp}/options/{variation}"
# content item
"href": "https://www.jeep.com/hostd/api/catalog-option/EN/details/models/{ccode}/lowerLevelPackages/{llp}/options/{content_variation}"
Querying these hrefs would yield:
- Full descriptions for content items not already captured by the equipment-categories source.
- Prefixed codes — the catalog-option response includes a
media.mackevision.image.codefield that carries the prefixed form (e.g.*NL), making the prefix recoverable for content items without a parent lookup. - Prices for content items whose parent option does not propagate pricing.
- Potentially other fields (associations, extended descriptions) not returned in the configure response itself.
This has not been implemented. The catalog-option source already fetches details for top-level
options via a separate raw asset; extending it to cover content-item hrefs is the natural path
and should be investigated before building any bespoke content-item resolution logic.