Agentic Dealer Network
Server Details
Live franchised-dealer inventory, quotes, and consented salesperson handoffs.
- Status
- Healthy
- Uptime
- 99.9% over 76 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 12 tools
The toolset is largely well-separated with explicit cross-references (e.g., network_search points to inventory_stats/network_snapshot). Slight overlap remains between deal_quote and quote_preview (both out-the-door pricing) and between network_directory and stores (rooftop metadata), but descriptions clarify their distinct purposes.
All names use lower snake_case, but the pattern is inconsistent: some are entity_action (inventory_get, lead_submit) while others are entity_noun (inventory_stats, network_directory), and 'stores' lacks a prefix. This mixed convention is still readable but not fully predictable.
12 tools is well-scoped for a dealer network API covering inventory browsing, pricing, leads, and directory. Each tool has a clear role and none appear redundant or excessive.
The surface covers inventory discovery (search, get, stats, comparables, snapshot, changes), pricing (preview, deal), leads (prepare, submit), and directory/stores. A minor gap is the lack of a tool to retrieve or manage a persisted deal thread after deal_quote, but core workflows are complete.
Available Tools
12 toolsdeal_quoteRequest a quoteADestructiveIdempotentInspect
Out-the-door quote for one available unit at a named rooftop. Anonymous calls are stateless; authenticated calls persist a deal thread. Anonymous calls persist nothing; quote_preview is the read-only equivalent for browsing. Fee schedules may be incomplete — an unlisted fee is not a guarantee that no such fee applies; confirm final charges with the dealer. Totals are estimates at best; when pricing_coverage is "partial_estimate", present the total as a subtotal excluding the charges in excluded. Always relay pricing_disclosure.
| Name | Required | Description | Default |
|---|---|---|---|
| identity | Yes | ||
| rooftop_slug | Yes | ||
| idempotency_key | No | Required when authenticated (durable quote); ignored meaningfully only with an agent key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructive/idempotent/openWorld; the description adds substantive behavior the agent needs: stateless anonymous calls vs persisted deal threads, incomplete fee schedules with a warning not to treat omission as absence, the pricing_coverage='partial_estimate' presentation rule, and the mandatory pricing_disclosure relay. This is well beyond the annotation surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the fee/pricing caveats are valuable, but the description wastes a sentence on redundancy: 'Anonymous calls are stateless... Anonymous calls persist nothing' repeats the same idea twice. Overall dense but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is correctly omitted, and the caveats around fees, totals, and disclosure are thorough. The main gap is that the required parameters remain unexplained, which is a meaningful omission for a tool with low schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, yet the description never explains the required 'identity' or 'rooftop_slug' parameters — what an identity token is or what rooftop_slug should reference. Only the authenticated-vs-anonymous framing loosely touches identity, leaving the two required params largely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('out-the-door quote for one available unit at a named rooftop') and explicitly distinguishes itself from the sibling quote_preview ('the read-only equivalent for browsing'). An agent can tell it apart from other quote/inventory tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains the anonymous vs authenticated usage split and names quote_preview as the alternative for read-only browsing. It does not give an explicit 'use this when...' exclusion list, but the context needed to choose is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inventory_changesSync catalog changesARead-onlyIdempotentInspect
State synchronization for a mirror built from network_snapshot: pass the sync_cursor and receive upserts (current rows in the same view) and tombstones since that position, with has_more and next_cursor. Bounded eventual consistency: take a fresh snapshot at least every 24 hours and whenever resync_required is true. Example: {"cursor": "<sync_cursor from network_snapshot>"}. Pass country=CA for Canadian dealers.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | ||
| cursor | Yes | ||
| country | No | Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles. | US |
| rooftop_slug | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds substantial context beyond them: the bounded eventual-consistency contract, the 24-hour resync obligation, and the fact that the stream mixes upserts with tombstones. This is exactly the operational context an agent needs to avoid stale reads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core contract, then consistency rules, then a concrete call example. Dense but every sentence carries information; the example is justified by the opaque cursor value, though the 24-hour rule and example could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully names the return shape (upserts, tombstones, has_more, next_cursor) plus the sync discipline, so an agent can drive the loop correctly. The main gap is the unexplained view parameter, which affects how much data each call returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25%, so the description must compensate; it explains cursor (its origin in network_snapshot) and country (CA for Canadian dealers, with the schema carrying the fuller enum semantics). It says nothing about the view enum (manifest/summary/full) or rooftop_slug, leaving two parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — state synchronization for a mirror built from network_snapshot — and explicitly frames itself as the incremental counterpart to a full snapshot. An agent can distinguish it from network_snapshot without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent to pass the sync_cursor obtained from network_snapshot, and prescribes taking a fresh snapshot at least every 24 hours and whenever resync_required is true. That gives clear when-to-use context and effectively routes full refreshes to the sibling, though it never names the fallback tool explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inventory_comparablesCompare a vehicle's price to like unitsARead-onlyIdempotentInspect
Price context for one vehicle against like units across the network (same make, model, exact model year, condition; optional trim and geo). Example: {"identity": "", "rooftop_slug": "mms"} or {"make": "Subaru", "model": "Outback", "model_year": 2024, "condition": "used"}. Returns count, price quartiles, the subject's rank and up to 5 cheapest peers. Advertised prices only; call quote_preview for a total. Pass country=CA for Canadian dealers.
| Name | Required | Description | Default |
|---|---|---|---|
| make | No | ||
| trim | No | ||
| model | No | ||
| country | No | Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles. | US |
| currency | No | ||
| identity | No | ||
| latitude | No | ||
| condition | No | ||
| longitude | No | ||
| model_year | No | ||
| radius_miles | No | ||
| rooftop_slug | No | ||
| model_year_expand | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the readOnly/idempotent annotations: it enumerates the return shape (count, price quartiles, subject rank, up to 5 cheapest peers), discloses that prices are advertised-only, and notes the country=CA flag for Canadian dealers. Nothing contradicts the annotations, though peer-selection mechanics (e.g. radius defaulting) are left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose and matching scope first, concrete examples second, return shape and caveats last. No filler, and the most decision-relevant information (matching criteria, quote_preview routing) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with an output schema and a parent schema that already encodes the one-of identity vs make/model/model_year rule and lat/long/radius dependencies, the description supplies enough context to invoke it correctly. The remaining gap is the handful of untagged tuning parameters (radius_miles, currency, model_year_expand).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 8%, so the description carries the burden, and it does explain identity, rooftop_slug, make, model, model_year, condition, trim, geo and country via prose and examples. However, currency, latitude/longitude, radius_miles, and model_year_expand are never mentioned, leaving several parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Price context for one vehicle against like units across the network') and pins the matching criteria (make, model, exact model year, condition; optional trim and geo). An agent can distinguish this from siblings like inventory_stats or network_search without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to a sibling ('call quote_preview for a total') and clarifies the scope limit ('Advertised prices only'). It gives concrete invocation examples covering both the identity and make/model/year modes, but does not state when to prefer this over inventory_stats or network_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inventory_getGet vehicle detailsARead-onlyIdempotentInspect
Fetch one available unit by identity (VIN) from a named rooftop (rooftop_slug from network_search results). Returns the full detail shape — ordered photo gallery, options, plain-text description; embed the first few photo_urls as markdown images when presenting the vehicle. Unknown or ineligible identity/rooftop returns unit_not_found. Listed prices may exclude doc/government fees and tax — call quote_preview for the estimated total. Totals are estimates at best; when pricing_coverage is "partial_estimate", present the total as a subtotal excluding the charges in excluded. Always relay pricing_disclosure.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Optional consistency assertion: must equal the rooftop's country; omit it unless you are checking. | |
| identity | Yes | ||
| rooftop_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare safe, idempotent, open-world read behavior, yet the description adds substantial context beyond them: the returned detail shape, presentation instructions for photo_urls, the unit_not_found error path, and the pricing caveats around excluded fees and pricing_coverage="partial_estimate". This is a rare case where the description meaningfully exceeds the annotation signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then layers output shape, error behavior, and pricing caveats in dense but functional sentences. The pricing-disclosure instructions are necessary but make the block longer than ideal; every sentence does carry operational weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description still adds presentation and interpretation guidance (photo embedding, pricing disclosure, partial_estimate handling) that the schema cannot express. Combined with the error case and sibling routing, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, so the description must compensate, and it does: it identifies 'identity' as the VIN and names the exact upstream source of 'rooftop_slug'. The optional country assertion is documented in the schema itself, but no format or validation nuance is added beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: fetch one unit by VIN from a named rooftop. It clearly distinguishes itself from network_search (source of rooftop_slug) and quote_preview (totals), so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: rooftop_slug comes from network_search results, and quote_preview should be called for the estimated total. It also defines the failure condition (unknown/ineligible identity or rooftop returns unit_not_found), giving concrete when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inventory_statsCount and summarize network inventoryARead-onlyIdempotentInspect
Aggregate available inventory across the network in ONE call: counts, effective-price min/median/max and the top values per facet. Example: {"dimensions": ["make_model", "body_style"], "condition": "used", "rooftop_slugs": ["mms"]}. Geo (latitude and longitude, optional radius_miles) and oem_program_slug scope exactly as network_search. Pivot mode (group_by, up to 2 of the facets plus state, dealer_group, price_band, age_band) returns one row per group with count and medians; dimensions and group_by are mutually exclusive; format csv returns the rows as CSV. Pass country=CA for Canadian dealers.
| Name | Required | Description | Default |
|---|---|---|---|
| make | No | ||
| trim | No | ||
| model | No | ||
| format | No | ||
| country | No | Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles. | US |
| group_by | No | ||
| latitude | No | ||
| condition | No | ||
| fuel_type | No | ||
| longitude | No | ||
| price_max | No | Maximum expiry-gated effective price. | |
| price_min | No | Minimum expiry-gated effective price. | |
| body_style | No | ||
| dimensions | No | One to four unique facets. make_model values join nonblank make and model with one space; rooftop values are rooftop slugs. | |
| drivetrain | No | ||
| listed_only | No | When true, only units with at least one stored photo and a vehicle detail page (vdp_url). Absent or false returns every available unit, including stock the dealer has not merchandised yet. | |
| is_certified | No | ||
| odometer_max | No | ||
| radius_miles | No | ||
| transmission | No | ||
| rooftop_slugs | No | Restrict the single-snapshot aggregation to these network rooftops. | |
| exterior_color | No | ||
| interior_color | No | ||
| model_year_max | No | ||
| model_year_min | No | ||
| oem_program_slug | No | ||
| passenger_capacity_min | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile is covered. The description adds real behavioral detail beyond that: dimensions and group_by are mutually exclusive, pivot mode is limited to two facets plus a fixed set of groupers, csv changes the output shape, and country=CA switches markets. It doesn't discuss result limits or snapshot freshness beyond the schema's note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It leads with the core capability and the output shape, then layers the example, the geo/scope rule, pivot mode, and the CA note. The paragraph is dense but every clause carries information; only the example value is arguably dispensable filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no prose, and the description still covers the mode-selection rules, format switch, and market switch that an agent must know before calling. For a 27-parameter read-only aggregation tool, nothing essential to a correct first call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 22% across 27 parameters, so the description is expected to compensate, and it targets the genuinely confusing ones: dimensions/group_by semantics, their mutual exclusivity, the pivot grouper set, format=csv, and the country/currency behavior. The remaining filters (make, model, colors, years, price) are self-evident from their names but receive no elaboration here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ('Aggregate available inventory across the network') and enumerates exactly what comes back: counts, effective-price min/median/max, and top values per facet. The 'ONE call' framing implicitly separates it from the sibling listing tools such as network_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete example invocation and explains that geo and oem_program_slug 'scope exactly as network_search,' which anchors the mental model for an agent already familiar with that sibling. It stops short of an explicit when-not-to-use statement versus network_search or inventory_comparables, leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_prepareAsk the dealership to reach out — prepareCRead-onlyIdempotentInspect
Prepare a named dealership's exact contact disclosure and a short-lived signed binding.
| Name | Required | Description | Default |
|---|---|---|---|
| channels | Yes | ||
| comments | No | ||
| customer | Yes | ||
| rooftop_slug | Yes | ||
| include_quote | No | Set false when the shopper was not shown a quote: the disclosure then makes no price claim and quote_included is false. | |
| unit_identity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description usefully adds that the binding is short-lived and signed, plus the concept of an 'exact contact disclosure', but it omits what happens to the binding, whether it is returned to the caller, and how expiry interacts with the idempotent hint. With annotations carrying the safety burden, this partial added context lands at a 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler, and the key noun phrase (the disclosure and signed binding) is front-loaded. Its brevity is efficient, though here it shades into under-specification rather than pure conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters, nested customer objects, conditional cross-field requirements, and a two-step submit workflow, the description is far too thin. The output schema justifies omitting return-value detail, but the agent still lacks the workflow position, timing/expiry expectations, and any parameter guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17% (essentially just include_quote), and the description adds nothing about rooftop_slug, unit_identity, comments, or the channels/customer cross-field constraint, which only appears in the schema-level description. 'Exact contact disclosure' hints at the customer/channels pair but gives no rules or formats, so the description fails to compensate for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb ('Prepare') and specific artifacts ('contact disclosure' and 'short-lived signed binding'), so the agent knows this is a preparation step rather than a generic lookup. It does not, however, distinguish itself from the obvious sibling lead_submit or explain that it is the first half of a two-step flow, so sibling routing relies on the title alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus lead_submit or quote_preview, no prerequisite conditions, and no note that the resulting binding must be submitted shortly after creation. The only implicit hint is the '— prepare' suffix in the title, which the description itself never develops.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_submitAsk the dealership to reach out — confirmCDestructiveIdempotentInspect
Submit the shopper's bound contact request to the named dealership.
| Name | Required | Description | Default |
|---|---|---|---|
| binding | Yes | ||
| comments | No | ||
| customer | Yes | ||
| rooftop_slug | Yes | ||
| disclosure_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered structurally. The description adds essentially nothing beyond the title — it does not explain that this sends a real lead to a third party, that the action is irreversible/outbound, or what the 'binding' represents, which would be valuable context for a destructive open-world call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clean, front-loaded sentence with no filler, but its brevity here reflects under-specification rather than disciplined conciseness given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Placeholder.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across five parameters, including an opaque required 'binding' string, a 'disclosure_text' field, a 'rooftop_slug' identifier, and a nested customer object. The description only obliquely gestures at 'bound contact request' and 'named dealership'; it explains none of the parameter formats, constraints, or the email/phone either-or requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Submit the shopper's bound contact request to the named dealership' tells an agent exactly what action is taken and on whose behalf. It does not, however, distinguish itself from the sibling 'lead_prepare' or explain the relationship between the two, so an agent must infer the prepare→submit flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as lead_prepare. An agent gets no signal about when this should be called versus the other lead-related sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
network_directoryList dealershipsBRead-onlyIdempotentInspect
Directory of active ADN rooftops: slug, name, dealer group, OEM programs, location metadata, and per-rooftop manifest URL. Pass country=CA for Canadian dealers.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| country | No | Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles. | US |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered elsewhere. The description's added value is the 'active' qualifier — only active rooftops appear — and the fact that a per-rooftop manifest URL is included. It says nothing about pagination behavior or freshness of the directory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core identity of the tool is front-loaded and the single actionable parameter note comes last. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only directory tool with a full output schema and complete safety annotations, the description covers what the resource is and what it contains. The residual gap is paging behavior for limit/offset, which neither the schema nor the description explains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: 'country' carries a rich schema description, but 'limit' and 'offset' have none. The description repeats the country hint ('Pass country=CA') which is already fully covered by the schema enum text, and says nothing about limit/offset defaults or paging semantics, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope — 'Directory of active ADN rooftops' — and enumerates the fields returned (slug, name, dealer group, OEM programs, location, manifest URL). That is far more informative than the bare title 'List dealerships'. It does not, however, contrast itself with siblings like network_search or network_snapshot, so the agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is 'Pass country=CA for Canadian dealers', which is a parameter hint rather than a when-to-use rule. There is no statement of when to reach for this tool versus network_search or network_snapshot, and no exclusion conditions. Usage is only implied by the word 'Directory'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
network_searchSearch network inventoryARead-onlyIdempotentInspect
Browse available inventory across the network, one page at a time. For counts or distributions call inventory_stats; to copy the catalog call network_snapshot (one download replaces hundreds of pages). Results are slim summary rows; embed hero_photo_url as a markdown image when presenting a vehicle, and call inventory_get with rooftop_slug for its full photo gallery. Optional OEM program scope; optional geographic radius — latitude and longitude together; radius_miles defaults to 50 (max 500) and needs both. Rooftops without coordinates are excluded from geo-scoped results. Pass country=CA for Canadian dealers. Listed prices may exclude doc/government fees and tax — call quote_preview for the estimated total. Totals are estimates at best; when pricing_coverage is "partial_estimate", present the total as a subtotal excluding the charges in excluded. Always relay pricing_disclosure.
| Name | Required | Description | Default |
|---|---|---|---|
| make | No | ||
| sort | No | Optional ordering; defaults to price_asc. The sort key uses NULLS LAST and is deterministically terminated by rooftop and unit ids. distance requires latitude and longitude (radius_miles defaults to 50). | |
| trim | No | ||
| view | No | summary | |
| limit | No | 1–500 with view manifest; 1–50 for summary and full (server-enforced) | |
| model | No | ||
| format | No | json | |
| offset | No | Zero-based row offset. Results are totally ordered and stable for an unchanged catalog, but pagination is NOT snapshot-isolated: ingestion between two page requests shifts offsets, so a traversal may duplicate or omit rows. To copy the catalog consistently: record catalog_watermark AND total from the first page, compare both on every subsequent page, and restart the traversal if either changes. Narrowing by rooftop_slug shortens each traversal and so reduces the chance of a restart. Offsets beyond 10000 are rejected; narrow the query instead. | |
| country | No | Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles. | US |
| latitude | No | ||
| condition | No | ||
| fuel_type | No | ||
| longitude | No | ||
| price_max | No | Maximum expiry-gated effective price: an unexpired special price when present, otherwise asking price. | |
| price_min | No | Minimum expiry-gated effective price: an unexpired special price when present, otherwise asking price. | |
| body_style | No | ||
| drivetrain | No | ||
| listed_only | No | When true, only units with at least one stored photo and a vehicle detail page (vdp_url). Absent or false returns every available unit, including stock the dealer has not merchandised yet. | |
| is_certified | No | ||
| odometer_max | No | ||
| radius_miles | No | ||
| rooftop_slug | No | Restrict results to one rooftop, as listed by network_directory. A slug that matches no rooftop returns no results rather than an error. | |
| transmission | No | ||
| rooftop_slugs | No | Restrict results to these network rooftops. | |
| exterior_color | No | ||
| interior_color | No | ||
| model_year_max | No | ||
| model_year_min | No | ||
| oem_program_slug | No | ||
| passenger_capacity_min | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond that: rooftops without coordinates are silently excluded from geo-scoped results, listed prices may omit doc/government fees and tax, and totals must be qualified when pricing_coverage is partial_estimate. It does not itself disclose the pagination non-isolation risk (that lives in the offset schema), which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by sibling routing and then caveats. Dense but every sentence carries payload; the only mild cost is that multiple concerns (routing, presentation, pricing, geo) are packed into one block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be explained. Given the complexity (30 params, geo scoping, pagination), the description covers the operationally risky areas (geo exclusions, price disclosure, coverage flags) well, though it omits the pagination stability caveat and some filter semantics that live only in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 30 parameters and only 30% schema description coverage, the schema does most of the work but many fields (make/model/trim/color enums, price gates) are undocumented anywhere. The description compensates for the trickiest ones — geo scope (lat+lon together, radius_miles default 50/max 500), oem_program_slug, and country=CA — but leaves the bulk of the filter surface unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Browse available inventory across the network') and immediately distinguishes itself from siblings by naming inventory_stats, network_snapshot, and inventory_get with the conditions that select each. An agent can pick this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: counts/distributions → inventory_stats; catalog copy → network_snapshot; photo gallery → inventory_get with rooftop_slug; estimated total → quote_preview. Both when-to-use and when-not-to-use are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
network_snapshotExport the catalogARead-onlyIdempotentInspect
Export the whole network catalog (or one rooftop with rooftop_slug) as one gzip artifact instead of paging: returns a descriptor with a generation URL, strong ETag, row and byte counts, expiry and (when available) sync_cursor; small results are inlined as rows_inline. Views: manifest (identity, pricing, key attributes; default), summary (the network_search row), full (the inventory_get row). Formats: csv (default), json. Example: {"view": "manifest", "format": "csv"}. Re-download only when the ETag changes; poll inventory_changes with sync_cursor to stay current. Pass country=CA for Canadian dealers.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | manifest | |
| format | No | csv | |
| country | No | Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles. | US |
| rooftop_slug | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description goes further with behavior the annotations cannot express: the response is a descriptor (generation URL, strong ETag, row/byte counts, expiry, optional sync_cursor), with small results inlined as rows_inline — i.e. it may not return the data inline at all. Auth requirements and rate limits are not mentioned, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then structured as labeled lists (Views, Formats, Example) separated by semicolons, with a concrete JSON example. Dense but every clause is load-bearing; it is long only because the tool genuinely has three views, two formats and a caching protocol to describe.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (bulk export, ETag caching, sync_cursor), and the description covers scope, views, formats, an example, the caching protocol and the country switch. An output schema exists, yet the descriptor shape is still summarized, which is helpful rather than redundant. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (country alone), so the description must carry the load and largely does: it defines what each view actually contains (manifest = identity/pricing/key attributes, summary = the network_search row, full = the inventory_get row), the two formats, the default values, and the single-rooftop mode. Only rooftop_slug's format is left to the schema pattern, so it falls just short of complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export the whole network catalog ... as one gzip artifact instead of paging') and immediately contrasts the scope with per-row access. The view mapping to sibling rows (summary = the network_search row, full = the inventory_get row) lets an agent distinguish this from network_search and inventory_get without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('instead of paging'), explicit re-download policy ('Re-download only when the ETag changes'), and an explicit follow-up path ('poll inventory_changes with sync_cursor to stay current'), naming the sibling responsible for that. It also carves out the single-rooftop case via rooftop_slug and the Canadian market via country=CA.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_previewPreview an out-the-door priceARead-onlyIdempotentInspect
Read-only out-the-door price preview for one available unit at a named rooftop (pass rooftop_slug): base price plus itemized fees and taxes — fees already included in the listed price are flagged included_in_price and add nothing on top. Persists nothing; free to call while browsing. Fee schedules may be incomplete — an unlisted fee is not a guarantee that no such fee applies; confirm final charges with the dealer. Totals are estimates at best; when pricing_coverage is "partial_estimate", present the total as a subtotal excluding the charges in excluded. Always relay pricing_disclosure.
| Name | Required | Description | Default |
|---|---|---|---|
| identity | Yes | ||
| rooftop_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/non-destructive annotations: it discloses that nothing is persisted, that fees may be flagged included_in_price, that fee schedules can be incomplete, how to present totals when pricing_coverage is 'partial_estimate', and the directive to always relay pricing_disclosure. This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded — the core purpose leads and the caveats follow. Every sentence carries information, though the fee/disclaimer content is packed tightly enough that it borders on run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be enumerated, and the description still frames key response fields (pricing_coverage, excluded, pricing_disclosure). The unexplained 'identity' parameter is the one real completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document both parameters. It explains rooftop_slug only by role ('named rooftop'), and the required 'identity' parameter (5-30 chars) is never mentioned at all, leaving an agent to guess its format and purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'read-only out-the-door price preview for one available unit at a named rooftop'. The 'persists nothing' clause implicitly separates it from deal_quote's committed quote, but no sibling is named explicitly, so the differentiation must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('free to call while browsing', 'persists nothing') and a boundary ('confirm final charges with the dealer'). It never names an alternative tool or an explicit when-not-to-use condition, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storesGet dealership detailsARead-onlyIdempotentInspect
One named rooftop's store record: name, dealer group, OEM programs, location/contact metadata, and fee schedule. Pass rooftop_slug. Whether a specific unit's listed price already includes a fee varies per unit — quote_preview returns the estimated total. Fee schedules may be incomplete — an unlisted fee is not a guarantee that no such fee applies; confirm final charges with the dealer.
| Name | Required | Description | Default |
|---|---|---|---|
| rooftop_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| error | No | Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration). |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds real behavioral caveats beyond that: fee schedules may be incomplete, an unlisted fee is not a guarantee of absence, and whether a listed unit price already includes a fee varies per unit — all material to interpreting the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the record contains, then the parameter, then the fee caveats. Nothing is wasted, though 'Pass rooftop_slug' partially restates an already-required schema field, keeping it just short of maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. The description still supplies the interpretive caveats an agent needs about fee data reliability, leaving only minor gaps (no auth/permission notes, no clarification of when the slug is not in hand).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter, so the description carries the burden. It names the parameter ('Pass rooftop_slug') and implies its meaning via 'One named rooftop', but adds no format, slug conventions, or constraint guidance beyond the schema's min/maxLength. Minimal but non-zero compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource precisely — a single named rooftop's store record — and enumerates what it contains (name, dealer group, OEM programs, location/contact, fee schedule), which differentiates it from list-oriented siblings like network_directory and network_search. However, no explicit verb is stated (the 'Get' only lives in the title), and it never directly contrasts itself with the directory/search siblings, so the differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the caller to pass rooftop_slug and routes the pricing use case to quote_preview ('quote_preview returns the estimated total'), which is a genuine alternative selection hint. It stops short of explicit when-not-to-use guidance against network_search/network_directory for discovering rooftops when no slug is known, so it is clear context without full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
- Changed
deal_quote1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "assumptions": { + "items": { + "maxLength": 500, + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "durable": { + "type": "boolean" + }, + "expires_at": { + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "freshness_disclosure": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + }, + "generated_at": { + "format": "date-time", + "type": "string" + }, + "inventory_last_seen_at": { + "format": "date-time", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "generated_at", + "inventory_last_seen_at", + "by_rooftop" + ], + "type": "object" + }, + "pricing": { + "additionalProperties": false, + "dependentRequired": { + "excluded": [ + "pricing_coverage", + "pricing_disclosure" + ], + "pricing_coverage": [ + "excluded", + "pricing_disclosure" + ], + "pricing_disclosure": [ + "pricing_coverage", + "excluded" + ] + }, + "properties": { + "base_price": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "currency": { + "const": "USD" + }, + "excluded": { + "items": { + "additionalProperties": false, + "properties": { + "code": { + "enum": [ + "sales_tax", + "title", + "registration" + ] + }, + "label": { + "maxLength": 40, + "type": "string" + }, + "reason": { + "const": "varies_by_location" + } + }, + "required": [ + "code", + "label", + "reason" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "fees_total": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "line_items": { + "items": { + "additionalProperties": false, + "properties": { + "amount": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "basis": { + "enum": [ + "firm", + "estimated" + ] + }, + "category": { + "maxLength": 40, + "type": "string" + }, + "code": { + "maxLength": 80, + "type": "string" + }, + "fee_type": { + "enum": [ + "flat", + "percent" + ] + }, + "included_in_price": { + "type": "boolean" + }, + "label": { + "maxLength": 200, + "type": "string" + }, + "taxable": { + "type": "boolean" + } + }, + "required": [ + "code", + "label", + "category", + "fee_type", + "amount", + "taxable" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" + }, + "otd_total": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "pricing_coverage": { + "enum": [ + "otd_estimate", + "partial_estimate" + ] + }, + "pricing_disclosure": { + "maxLength": 500, + "type": "string" + }, + "tax_total": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + } + }, + "required": [ + "base_price", + "fees_total", + "tax_total", + "otd_total", + "currency", + "line_items" + ], + "type": "object" + }, + "quote_id": { + "oneOf": [ + { + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "thread_id": { + "oneOf": [ + { + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "unit": { + "additionalProperties": false, + "properties": { + "condition": { + "enum": [ + "new", + "used" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model" + ], + "type": "object" + } + }, + "required": [ + "durable", + "thread_id", + "quote_id", + "expires_at", + "unit", + "pricing", + "assumptions", + "freshness_disclosure" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
inventory_changes1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "catalog_version": { + "type": "string" + }, + "has_more": { + "type": "boolean" + }, + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "next_cursor": { + "maxLength": 2048, + "minLength": 8, + "type": "string" + }, + "resync_required": { + "type": "boolean" + }, + "round_upper": { + "format": "date-time", + "type": "string" + }, + "rows_emitted": { + "maximum": 500, + "minimum": 0, + "type": "integer" + }, + "rows_scanned": { + "maximum": 5000, + "minimum": 0, + "type": "integer" + }, + "scope": { + "anyOf": [ + { + "pattern": "^network:(?:US|CA)$", + "type": "string" + }, + { + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$", + "type": "string" + } + ] + }, + "tombstones": { + "items": { + "additionalProperties": false, + "properties": { + "changed_at": { + "format": "date-time", + "type": "string" + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "rooftop_slug", + "identity", + "changed_at" + ], + "type": "object" + }, + "maxItems": 500, + "type": "array" + }, + "upserts": { + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "condition": { + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "date_in_stock": { + "format": "date", + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "rooftop_slug", + "identity", + "stock_number", + "condition", + "is_certified", + "model_year", + "make", + "model", + "trim", + "currency", + "asking_price", + "special_price", + "special_expiry", + "effective_price", + "effective_price_source", + "msrp", + "odometer", + "odometer_unit", + "body_style", + "date_in_stock", + "vdp_url", + "price_basis" + ], + "type": "object" + }, + { + "allOf": [ + { + "description": "The slim public projection of one inventory search result. Heavy merchandising fields are available through inventory_get.", + "not": { + "anyOf": [ + { + "required": [ + "photo_urls" + ] + }, + { + "required": [ + "options" + ] + }, + { + "required": [ + "description" + ] + }, + { + "required": [ + "date_in_stock" + ] + } + ] + }, + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "carfax_one_owner": { + "type": [ + "boolean", + "null" + ] + }, + "carfax_report_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "city_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "condition": { + "description": "Normalized vehicle condition. CLOSED vocabulary: ADN normalizes every dealer feed into exactly these values at ingestion, and the database enforces them, so consumers may switch on this field exhaustively. Certification is separate — see is_certified.", + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "description_snippet": { + "maxLength": 200, + "type": [ + "string", + "null" + ] + }, + "doors": { + "maximum": 10, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "drivetrain": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "description": "An unexpired special price when present, otherwise asking price; null when neither is available.", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "description": "The field selected for effective_price, or null when effective_price is null.", + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "engine": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "engine_cylinders": { + "maximum": 16, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "engine_displacement": { + "maxLength": 80, + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "exterior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "fuel_type": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "hero_photo_url": { + "maxLength": 300, + "type": [ + "string", + "null" + ] + }, + "highway_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "interior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "options_count": { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "passenger_capacity": { + "maximum": 20, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "photo_count": { + "maximum": 60, + "minimum": 0, + "type": "integer" + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "enriched_fields": { + "items": { + "enum": [ + "photo_urls", + "options", + "description", + "vdp_url", + "video_url", + "city_mpg", + "highway_mpg", + "doors", + "passenger_capacity", + "engine_cylinders", + "engine_displacement", + "carfax_one_owner", + "carfax_report_url", + "is_certified", + "trim", + "body_style", + "transmission", + "drivetrain", + "asking_price" + ] + }, + "maxItems": 19, + "type": "array", + "uniqueItems": true + }, + "merch_updated_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "merch_updated_at", + "enriched_fields" + ], + "type": "object" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "transmission": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "video_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model", + "hero_photo_url", + "photo_count", + "options_count", + "description_snippet", + "odometer_unit", + "price_basis" + ], + "type": "object" + }, + { + "properties": { + "distance_km": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "distance_miles": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "rooftop_name": { + "maxLength": 200, + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "rooftop_slug", + "rooftop_name" + ], + "type": "object" + } + ] + }, + { + "allOf": [ + { + "description": "The public projection of one inventory unit. No source attributes, internal ids, or ingest metadata ever appear here.", + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "carfax_one_owner": { + "type": [ + "boolean", + "null" + ] + }, + "carfax_report_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "city_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "condition": { + "description": "Normalized vehicle condition. CLOSED vocabulary: ADN normalizes every dealer feed into exactly these values at ingestion, and the database enforces them, so consumers may switch on this field exhaustively. Certification is separate — see is_certified.", + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "description": { + "maxLength": 10000, + "type": [ + "string", + "null" + ] + }, + "doors": { + "maximum": 10, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "drivetrain": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "description": "An unexpired special price when present, otherwise asking price; null when neither is available.", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "description": "The field selected for effective_price, or null when effective_price is null.", + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "engine": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "engine_cylinders": { + "maximum": 16, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "engine_displacement": { + "maxLength": 80, + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "exterior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "fuel_type": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "highway_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "interior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "options": { + "items": { + "maxLength": 100, + "type": "string" + }, + "maxItems": 100, + "type": [ + "array", + "null" + ] + }, + "passenger_capacity": { + "maximum": 20, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "photo_urls": { + "items": { + "maxLength": 300, + "type": "string" + }, + "maxItems": 60, + "type": [ + "array", + "null" + ] + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "enriched_fields": { + "items": { + "enum": [ + "photo_urls", + "options", + "description", + "vdp_url", + "video_url", + "city_mpg", + "highway_mpg", + "doors", + "passenger_capacity", + "engine_cylinders", + "engine_displacement", + "carfax_one_owner", + "carfax_report_url", + "is_certified", + "trim", + "body_style", + "transmission", + "drivetrain", + "asking_price" + ] + }, + "maxItems": 19, + "type": "array", + "uniqueItems": true + }, + "merch_updated_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "merch_updated_at", + "enriched_fields" + ], + "type": "object" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "transmission": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "video_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model", + "odometer_unit", + "price_basis" + ], + "type": "object" + }, + { + "properties": { + "distance_km": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "distance_miles": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "rooftop_name": { + "maxLength": 200, + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "rooftop_slug", + "rooftop_name" + ], + "type": "object" + } + ] + } + ] + }, + "maxItems": 500, + "type": "array" + }, + "view": { + "enum": [ + "manifest", + "summary", + "full" + ] + } + }, + "required": [ + "scope", + "view", + "upserts", + "tombstones", + "has_more", + "next_cursor", + "catalog_version", + "resync_required", + "round_upper", + "rows_scanned", + "rows_emitted" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
inventory_comparables1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "catalog_version": { + "type": "string" + }, + "cheapest": { + "items": { + "allOf": [ + { + "description": "The slim public projection of one inventory search result. Heavy merchandising fields are available through inventory_get.", + "not": { + "anyOf": [ + { + "required": [ + "photo_urls" + ] + }, + { + "required": [ + "options" + ] + }, + { + "required": [ + "description" + ] + }, + { + "required": [ + "date_in_stock" + ] + } + ] + }, + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "carfax_one_owner": { + "type": [ + "boolean", + "null" + ] + }, + "carfax_report_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "city_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "condition": { + "description": "Normalized vehicle condition. CLOSED vocabulary: ADN normalizes every dealer feed into exactly these values at ingestion, and the database enforces them, so consumers may switch on this field exhaustively. Certification is separate — see is_certified.", + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "description_snippet": { + "maxLength": 200, + "type": [ + "string", + "null" + ] + }, + "doors": { + "maximum": 10, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "drivetrain": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "description": "An unexpired special price when present, otherwise asking price; null when neither is available.", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "description": "The field selected for effective_price, or null when effective_price is null.", + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "engine": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "engine_cylinders": { + "maximum": 16, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "engine_displacement": { + "maxLength": 80, + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "exterior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "fuel_type": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "hero_photo_url": { + "maxLength": 300, + "type": [ + "string", + "null" + ] + }, + "highway_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "interior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "options_count": { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "passenger_capacity": { + "maximum": 20, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "photo_count": { + "maximum": 60, + "minimum": 0, + "type": "integer" + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "enriched_fields": { + "items": { + "enum": [ + "photo_urls", + "options", + "description", + "vdp_url", + "video_url", + "city_mpg", + "highway_mpg", + "doors", + "passenger_capacity", + "engine_cylinders", + "engine_displacement", + "carfax_one_owner", + "carfax_report_url", + "is_certified", + "trim", + "body_style", + "transmission", + "drivetrain", + "asking_price" + ] + }, + "maxItems": 19, + "type": "array", + "uniqueItems": true + }, + "merch_updated_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "merch_updated_at", + "enriched_fields" + ], + "type": "object" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "transmission": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "video_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model", + "hero_photo_url", + "photo_count", + "options_count", + "description_snippet", + "odometer_unit", + "price_basis" + ], + "type": "object" + }, + { + "properties": { + "distance_km": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "distance_miles": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "rooftop_name": { + "maxLength": 200, + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "rooftop_slug", + "rooftop_name" + ], + "type": "object" + } + ] + }, + "maxItems": 5, + "type": "array" + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "disclosure": { + "enum": [ + "Advertised prices only; call quote_preview for an estimated total.", + "Advertised prices only, as published by the dealer." + ] + }, + "filters_applied": { + "additionalProperties": false, + "properties": { + "condition": { + "enum": [ + "new", + "used" + ] + }, + "currency": { + "pattern": "^[A-Z]{3}$", + "type": "string" + }, + "make": { + "type": "string" + }, + "model": { + "type": "string" + }, + "model_year": { + "type": "integer" + }, + "model_year_expand": { + "enum": [ + 0, + 1 + ], + "type": "integer" + }, + "radius_miles": { + "exclusiveMinimum": 0, + "maximum": 500, + "type": "number" + }, + "trim": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "make", + "model", + "model_year", + "model_year_expand", + "currency" + ], + "type": "object" + }, + "low_sample": { + "type": "boolean" + }, + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "price": { + "additionalProperties": false, + "properties": { + "max": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "min": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "p25": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "p75": { + "minimum": 0, + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "min", + "p25", + "median", + "p75", + "max" + ], + "type": "object" + }, + "priced_count": { + "minimum": 0, + "type": "integer" + }, + "subject": { + "oneOf": [ + { + "type": "null" + }, + { + "additionalProperties": false, + "properties": { + "identity": { + "type": "string" + }, + "price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "rank": { + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "rooftop_slug": { + "type": "string" + }, + "ties": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "identity", + "rooftop_slug", + "price", + "rank", + "ties" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filters_applied", + "count", + "priced_count", + "price", + "subject", + "cheapest", + "low_sample", + "disclosure", + "catalog_version" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
inventory_get2 fields changed- added
Input schema / properties / countryAdded value: +{ + "description": "Optional consistency assertion: must equal the rooftop's country; omit it unless you are checking.", + "enum": [ + "US", + "CA" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "unit": { + "allOf": [ + { + "description": "The public projection of one inventory unit. No source attributes, internal ids, or ingest metadata ever appear here.", + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "carfax_one_owner": { + "type": [ + "boolean", + "null" + ] + }, + "carfax_report_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "city_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "condition": { + "description": "Normalized vehicle condition. CLOSED vocabulary: ADN normalizes every dealer feed into exactly these values at ingestion, and the database enforces them, so consumers may switch on this field exhaustively. Certification is separate — see is_certified.", + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "description": { + "maxLength": 10000, + "type": [ + "string", + "null" + ] + }, + "doors": { + "maximum": 10, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "drivetrain": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "description": "An unexpired special price when present, otherwise asking price; null when neither is available.", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "description": "The field selected for effective_price, or null when effective_price is null.", + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "engine": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "engine_cylinders": { + "maximum": 16, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "engine_displacement": { + "maxLength": 80, + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "exterior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "fuel_type": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "highway_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "interior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "options": { + "items": { + "maxLength": 100, + "type": "string" + }, + "maxItems": 100, + "type": [ + "array", + "null" + ] + }, + "passenger_capacity": { + "maximum": 20, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "photo_urls": { + "items": { + "maxLength": 300, + "type": "string" + }, + "maxItems": 60, + "type": [ + "array", + "null" + ] + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "enriched_fields": { + "items": { + "enum": [ + "photo_urls", + "options", + "description", + "vdp_url", + "video_url", + "city_mpg", + "highway_mpg", + "doors", + "passenger_capacity", + "engine_cylinders", + "engine_displacement", + "carfax_one_owner", + "carfax_report_url", + "is_certified", + "trim", + "body_style", + "transmission", + "drivetrain", + "asking_price" + ] + }, + "maxItems": 19, + "type": "array", + "uniqueItems": true + }, + "merch_updated_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "merch_updated_at", + "enriched_fields" + ], + "type": "object" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "transmission": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "video_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model", + "odometer_unit", + "price_basis" + ], + "type": "object" + }, + { + "not": { + "required": [ + "date_in_stock" + ] + } + } + ] + } + }, + "required": [ + "unit" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
inventory_stats1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "catalog_watermark": { + "type": [ + "string", + "null" + ] + }, + "dimensions": { + "additionalProperties": false, + "description": "Contains one property for each requested dimension.", + "properties": { + "body_style": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "condition": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "drivetrain": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "exterior_color": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "fuel_type": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "make": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "make_model": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "model": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "model_year": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + }, + "rooftop": { + "additionalProperties": false, + "description": "values contains at most 20 nonmissing values ordered by count descending then value ascending. other_count covers nonmissing values outside the top 20; missing_count includes both null and blank strings.", + "properties": { + "missing_count": { + "minimum": 0, + "type": "integer" + }, + "other_count": { + "minimum": 0, + "type": "integer" + }, + "values": { + "items": { + "additionalProperties": false, + "properties": { + "count": { + "minimum": 1, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value", + "count" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "values", + "other_count", + "missing_count" + ], + "type": "object" + } + }, + "type": "object" + }, + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "price": { + "additionalProperties": false, + "properties": { + "currency": { + "type": "string" + }, + "max": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "min": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "priced_count": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "currency", + "priced_count", + "min", + "max", + "median" + ], + "type": "object" + }, + "rooftop_slugs_covered": { + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array", + "uniqueItems": true + }, + "total": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "total", + "dimensions", + "price", + "catalog_watermark" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "catalog_version": { + "type": "string" + }, + "catalog_watermark": { + "type": [ + "string", + "null" + ] + }, + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "pivot": { + "additionalProperties": false, + "properties": { + "group_by": { + "items": { + "type": "string" + }, + "maxItems": 2, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "missing": { + "additionalProperties": false, + "properties": { + "age_band": { + "type": "integer" + }, + "body_style": { + "type": "integer" + }, + "condition": { + "type": "integer" + }, + "dealer_group": { + "type": "integer" + }, + "drivetrain": { + "type": "integer" + }, + "exterior_color": { + "type": "integer" + }, + "fuel_type": { + "type": "integer" + }, + "make": { + "type": "integer" + }, + "make_model": { + "type": "integer" + }, + "model": { + "type": "integer" + }, + "model_year": { + "type": "integer" + }, + "price_band": { + "type": "integer" + }, + "rooftop": { + "type": "integer" + }, + "state": { + "type": "integer" + } + }, + "type": "object" + }, + "other": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "age_band": { + "type": "string" + }, + "body_style": { + "type": "string" + }, + "condition": { + "type": "string" + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "days_in_stock_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "dealer_group": { + "type": "string" + }, + "dealer_group_name": { + "type": [ + "string", + "null" + ] + }, + "drivetrain": { + "type": "string" + }, + "exterior_color": { + "type": "string" + }, + "fuel_type": { + "type": "string" + }, + "make": { + "type": "string" + }, + "make_model": { + "type": "string" + }, + "model": { + "type": "string" + }, + "model_year": { + "type": "string" + }, + "odometer_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_band": { + "type": "string" + }, + "price_max": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_min": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "priced_count": { + "minimum": 0, + "type": "integer" + }, + "rooftop": { + "type": "string" + }, + "state": { + "type": "string" + } + }, + "required": [ + "count", + "priced_count", + "price_min", + "price_median", + "price_max", + "odometer_median", + "days_in_stock_median" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "rows": { + "items": { + "additionalProperties": false, + "properties": { + "age_band": { + "type": "string" + }, + "body_style": { + "type": "string" + }, + "condition": { + "type": "string" + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "days_in_stock_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "dealer_group": { + "type": "string" + }, + "dealer_group_name": { + "type": [ + "string", + "null" + ] + }, + "drivetrain": { + "type": "string" + }, + "exterior_color": { + "type": "string" + }, + "fuel_type": { + "type": "string" + }, + "make": { + "type": "string" + }, + "make_model": { + "type": "string" + }, + "model": { + "type": "string" + }, + "model_year": { + "type": "string" + }, + "odometer_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_band": { + "type": "string" + }, + "price_max": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_min": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "priced_count": { + "minimum": 0, + "type": "integer" + }, + "rooftop": { + "type": "string" + }, + "state": { + "type": "string" + } + }, + "required": [ + "count", + "priced_count", + "price_min", + "price_median", + "price_max", + "odometer_median", + "days_in_stock_median" + ], + "type": "object" + }, + "maxItems": 200, + "type": "array" + } + }, + "required": [ + "group_by", + "rows", + "other", + "missing" + ], + "type": "object" + }, + "price": { + "additionalProperties": false, + "properties": { + "currency": { + "type": "string" + }, + "max": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "min": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "priced_count": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "currency", + "priced_count", + "min", + "max", + "median" + ], + "type": "object" + }, + "rooftop_slugs_covered": { + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array", + "uniqueItems": true + }, + "total": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "total", + "pivot", + "price", + "catalog_watermark", + "catalog_version" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "catalog_version": { + "type": "string" + }, + "catalog_watermark": { + "type": [ + "string", + "null" + ] + }, + "csv": { + "type": "string" + }, + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "price": { + "additionalProperties": false, + "properties": { + "currency": { + "type": "string" + }, + "max": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "min": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "priced_count": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "currency", + "priced_count", + "min", + "max", + "median" + ], + "type": "object" + }, + "rows": { + "items": { + "additionalProperties": false, + "properties": { + "age_band": { + "type": "string" + }, + "body_style": { + "type": "string" + }, + "condition": { + "type": "string" + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "days_in_stock_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "dealer_group": { + "type": "string" + }, + "dealer_group_name": { + "type": [ + "string", + "null" + ] + }, + "drivetrain": { + "type": "string" + }, + "exterior_color": { + "type": "string" + }, + "fuel_type": { + "type": "string" + }, + "make": { + "type": "string" + }, + "make_model": { + "type": "string" + }, + "model": { + "type": "string" + }, + "model_year": { + "type": "string" + }, + "odometer_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_band": { + "type": "string" + }, + "price_max": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_median": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "price_min": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "priced_count": { + "minimum": 0, + "type": "integer" + }, + "rooftop": { + "type": "string" + }, + "state": { + "type": "string" + } + }, + "required": [ + "count", + "priced_count", + "price_min", + "price_median", + "price_max", + "odometer_median", + "days_in_stock_median" + ], + "type": "object" + }, + "maxItems": 201, + "type": "array" + }, + "total": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "csv", + "rows", + "total", + "price", + "catalog_watermark", + "catalog_version" + ], + "type": "object" + } + ] + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
lead_prepare1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "binding": { + "maxLength": 16384, + "minLength": 1, + "type": "string" + }, + "disclosure_text": { + "maxLength": 5000, + "minLength": 10, + "type": "string" + }, + "expires_at": { + "format": "date-time", + "maxLength": 40, + "type": "string" + }, + "quote_included": { + "type": "boolean" + } + }, + "required": [ + "disclosure_text", + "binding", + "expires_at", + "quote_included" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
lead_submit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "lead_id": { + "maxLength": 36, + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + "type": "string" + }, + "status": { + "const": "accepted" + } + }, + "required": [ + "lead_id", + "status" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
network_directory1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "rooftops": { + "items": { + "additionalProperties": false, + "properties": { + "address": { + "maxLength": 200, + "type": "string" + }, + "available_units": { + "description": "null when the rooftop is not part of network aggregation (network opt-out)", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "city": { + "maxLength": 100, + "type": "string" + }, + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "dealer_group": { + "additionalProperties": false, + "properties": { + "name": { + "maxLength": 200, + "type": "string" + }, + "slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "name", + "slug" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "hours": { + "type": "object" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "limitations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "manifest_url": { + "maxLength": 300, + "type": "string" + }, + "name": { + "maxLength": 200, + "type": "string" + }, + "new_units": { + "description": "null when the rooftop is not part of network aggregation (network opt-out)", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "oem_programs": { + "items": { + "maxLength": 80, + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "phone": { + "maxLength": 30, + "type": "string" + }, + "price_median": { + "description": "null when the rooftop is not part of network aggregation (network opt-out)", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "priced_count": { + "description": "null when the rooftop is not part of network aggregation (network opt-out)", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "slug": { + "maxLength": 80, + "type": "string" + }, + "state": { + "maxLength": 50, + "type": "string" + }, + "top_makes": { + "items": { + "maxLength": 80, + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "used_units": { + "description": "null when the rooftop is not part of network aggregation (network opt-out)", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "website_url": { + "maxLength": 300, + "type": "string" + }, + "zip": { + "maxLength": 20, + "type": "string" + } + }, + "required": [ + "name", + "slug", + "country", + "dealer_group", + "oem_programs", + "available_units", + "new_units", + "used_units", + "top_makes", + "priced_count", + "price_median", + "freshness" + ], + "type": "object" + }, + "maxItems": 500, + "type": "array" + }, + "total": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "rooftops", + "total" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
network_search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "catalog_version": { + "type": "string" + }, + "catalog_watermark": { + "description": "Opaque revision token for the network catalog. Changes whenever an inventory ingestion is applied anywhere in the network; monotonic per catalog but carries NO timestamp semantics — compare for equality only. Null before the first ingest. Covers ingestion only: administrative reconfiguration (rooftop activation, exclusion rules, coordinates) can shift result rows without changing this token — most such events also change total, which the traversal recipe compares as well.", + "type": [ + "string", + "null" + ] + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "csv": { + "type": "string" + }, + "format": { + "enum": [ + "json", + "csv" + ] + }, + "has_more": { + "type": "boolean" + }, + "hint": { + "additionalProperties": false, + "properties": { + "arguments": { + "type": "object" + }, + "reason": { + "enum": [ + "page_cap", + "deep_offset" + ] + }, + "tool": { + "enum": [ + "inventory_stats", + "network_snapshot" + ] + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "next_offset": { + "minimum": 0, + "type": "integer" + }, + "total": { + "minimum": 0, + "type": "integer" + }, + "units": { + "items": { + "anyOf": [ + { + "allOf": [ + { + "description": "The slim public projection of one inventory search result. Heavy merchandising fields are available through inventory_get.", + "not": { + "anyOf": [ + { + "required": [ + "photo_urls" + ] + }, + { + "required": [ + "options" + ] + }, + { + "required": [ + "description" + ] + }, + { + "required": [ + "date_in_stock" + ] + } + ] + }, + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "carfax_one_owner": { + "type": [ + "boolean", + "null" + ] + }, + "carfax_report_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "city_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "condition": { + "description": "Normalized vehicle condition. CLOSED vocabulary: ADN normalizes every dealer feed into exactly these values at ingestion, and the database enforces them, so consumers may switch on this field exhaustively. Certification is separate — see is_certified.", + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "description_snippet": { + "maxLength": 200, + "type": [ + "string", + "null" + ] + }, + "doors": { + "maximum": 10, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "drivetrain": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "description": "An unexpired special price when present, otherwise asking price; null when neither is available.", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "description": "The field selected for effective_price, or null when effective_price is null.", + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "engine": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "engine_cylinders": { + "maximum": 16, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "engine_displacement": { + "maxLength": 80, + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "exterior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "fuel_type": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "hero_photo_url": { + "maxLength": 300, + "type": [ + "string", + "null" + ] + }, + "highway_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "interior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "options_count": { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "passenger_capacity": { + "maximum": 20, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "photo_count": { + "maximum": 60, + "minimum": 0, + "type": "integer" + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "enriched_fields": { + "items": { + "enum": [ + "photo_urls", + "options", + "description", + "vdp_url", + "video_url", + "city_mpg", + "highway_mpg", + "doors", + "passenger_capacity", + "engine_cylinders", + "engine_displacement", + "carfax_one_owner", + "carfax_report_url", + "is_certified", + "trim", + "body_style", + "transmission", + "drivetrain", + "asking_price" + ] + }, + "maxItems": 19, + "type": "array", + "uniqueItems": true + }, + "merch_updated_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "merch_updated_at", + "enriched_fields" + ], + "type": "object" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "transmission": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "video_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model", + "hero_photo_url", + "photo_count", + "options_count", + "description_snippet", + "odometer_unit", + "price_basis" + ], + "type": "object" + }, + { + "properties": { + "distance_km": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "distance_miles": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "rooftop_name": { + "maxLength": 200, + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "rooftop_slug", + "rooftop_name" + ], + "type": "object" + } + ] + }, + { + "additionalProperties": false, + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "condition": { + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "date_in_stock": { + "format": "date", + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "rooftop_slug", + "identity", + "stock_number", + "condition", + "is_certified", + "model_year", + "make", + "model", + "trim", + "currency", + "asking_price", + "special_price", + "special_expiry", + "effective_price", + "effective_price_source", + "msrp", + "odometer", + "odometer_unit", + "body_style", + "date_in_stock", + "vdp_url", + "price_basis" + ], + "type": "object" + }, + { + "allOf": [ + { + "description": "The public projection of one inventory unit. No source attributes, internal ids, or ingest metadata ever appear here.", + "properties": { + "asking_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "body_style": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "carfax_one_owner": { + "type": [ + "boolean", + "null" + ] + }, + "carfax_report_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "city_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "condition": { + "description": "Normalized vehicle condition. CLOSED vocabulary: ADN normalizes every dealer feed into exactly these values at ingestion, and the database enforces them, so consumers may switch on this field exhaustively. Certification is separate — see is_certified.", + "enum": [ + "new", + "used" + ] + }, + "currency": { + "maxLength": 3, + "type": [ + "string", + "null" + ] + }, + "description": { + "maxLength": 10000, + "type": [ + "string", + "null" + ] + }, + "doors": { + "maximum": 10, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "drivetrain": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "effective_price": { + "description": "An unexpired special price when present, otherwise asking price; null when neither is available.", + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "effective_price_source": { + "description": "The field selected for effective_price, or null when effective_price is null.", + "enum": [ + "special_price", + "asking_price", + null + ] + }, + "engine": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "engine_cylinders": { + "maximum": 16, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "engine_displacement": { + "maxLength": 80, + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "exterior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "fuel_type": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "highway_mpg": { + "maximum": 999, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "interior_color": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "is_certified": { + "type": [ + "boolean", + "null" + ] + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + }, + "msrp": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "odometer": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + }, + "options": { + "items": { + "maxLength": 100, + "type": "string" + }, + "maxItems": 100, + "type": [ + "array", + "null" + ] + }, + "passenger_capacity": { + "maximum": 20, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "photo_urls": { + "items": { + "maxLength": 300, + "type": "string" + }, + "maxItems": 60, + "type": [ + "array", + "null" + ] + }, + "price_basis": { + "const": "dealer_published", + "type": "string" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "enriched_fields": { + "items": { + "enum": [ + "photo_urls", + "options", + "description", + "vdp_url", + "video_url", + "city_mpg", + "highway_mpg", + "doors", + "passenger_capacity", + "engine_cylinders", + "engine_displacement", + "carfax_one_owner", + "carfax_report_url", + "is_certified", + "trim", + "body_style", + "transmission", + "drivetrain", + "asking_price" + ] + }, + "maxItems": 19, + "type": "array", + "uniqueItems": true + }, + "merch_updated_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "merch_updated_at", + "enriched_fields" + ], + "type": "object" + }, + "special_expiry": { + "format": "date", + "maxLength": 10, + "type": [ + "string", + "null" + ] + }, + "special_price": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "stock_number": { + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "transmission": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "trim": { + "maxLength": 120, + "type": [ + "string", + "null" + ] + }, + "vdp_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + }, + "video_url": { + "maxLength": 500, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model", + "odometer_unit", + "price_basis" + ], + "type": "object" + }, + { + "properties": { + "distance_km": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "distance_miles": { + "minimum": 0, + "type": [ + "number", + "null" + ] + }, + "rooftop_name": { + "maxLength": 200, + "type": "string" + }, + "rooftop_slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "rooftop_slug", + "rooftop_name" + ], + "type": "object" + } + ] + } + ] + }, + "maxItems": 500, + "type": "array" + }, + "view": { + "enum": [ + "summary", + "manifest", + "full" + ] + } + }, + "required": [ + "total", + "count", + "units", + "catalog_watermark", + "has_more", + "catalog_version" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
network_snapshot1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "as_of_business_date": { + "format": "date", + "type": "string" + }, + "bytes": { + "minimum": 0, + "type": "integer" + }, + "bytes_compressed": { + "minimum": 0, + "type": "integer" + }, + "catalog_version": { + "type": "string" + }, + "etag": { + "type": "string" + }, + "expires_at": { + "format": "date-time", + "type": "string" + }, + "format": { + "enum": [ + "csv", + "json" + ] + }, + "generated_at": { + "format": "date-time", + "type": "string" + }, + "market": { + "additionalProperties": false, + "properties": { + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "currency": { + "type": "string" + }, + "odometer_unit": { + "enum": [ + "mi", + "km" + ], + "type": "string" + } + }, + "required": [ + "country", + "currency", + "odometer_unit" + ], + "type": "object" + }, + "rows": { + "minimum": 0, + "type": "integer" + }, + "rows_inline": { + "items": { + "type": "object" + }, + "type": "array" + }, + "schema_version": { + "const": 1 + }, + "scope": { + "anyOf": [ + { + "pattern": "^network:(?:US|CA)$", + "type": "string" + }, + { + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$", + "type": "string" + } + ] + }, + "snapshot_id": { + "pattern": "^[0-9a-f]{24}$", + "type": "string" + }, + "sync_cursor": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + }, + "view": { + "enum": [ + "manifest", + "summary", + "full" + ] + } + }, + "required": [ + "snapshot_id", + "schema_version", + "scope", + "view", + "format", + "generated_at", + "as_of_business_date", + "rows", + "bytes", + "bytes_compressed", + "etag", + "url", + "expires_at", + "catalog_version" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
quote_preview1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "assumptions": { + "items": { + "maxLength": 500, + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "freshness_disclosure": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + }, + "generated_at": { + "format": "date-time", + "type": "string" + }, + "inventory_last_seen_at": { + "format": "date-time", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "generated_at", + "inventory_last_seen_at", + "by_rooftop" + ], + "type": "object" + }, + "pricing": { + "additionalProperties": false, + "dependentRequired": { + "excluded": [ + "pricing_coverage", + "pricing_disclosure" + ], + "pricing_coverage": [ + "excluded", + "pricing_disclosure" + ], + "pricing_disclosure": [ + "pricing_coverage", + "excluded" + ] + }, + "properties": { + "base_price": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "currency": { + "const": "USD" + }, + "excluded": { + "items": { + "additionalProperties": false, + "properties": { + "code": { + "enum": [ + "sales_tax", + "title", + "registration" + ] + }, + "label": { + "maxLength": 40, + "type": "string" + }, + "reason": { + "const": "varies_by_location" + } + }, + "required": [ + "code", + "label", + "reason" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "fees_total": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "line_items": { + "items": { + "additionalProperties": false, + "properties": { + "amount": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "basis": { + "enum": [ + "firm", + "estimated" + ] + }, + "category": { + "maxLength": 40, + "type": "string" + }, + "code": { + "maxLength": 80, + "type": "string" + }, + "fee_type": { + "enum": [ + "flat", + "percent" + ] + }, + "included_in_price": { + "type": "boolean" + }, + "label": { + "maxLength": 200, + "type": "string" + }, + "taxable": { + "type": "boolean" + } + }, + "required": [ + "code", + "label", + "category", + "fee_type", + "amount", + "taxable" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" + }, + "otd_total": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + }, + "pricing_coverage": { + "enum": [ + "otd_estimate", + "partial_estimate" + ] + }, + "pricing_disclosure": { + "maxLength": 500, + "type": "string" + }, + "tax_total": { + "description": "Exact decimal amount with two places (never a JSON float).", + "pattern": "^-?[0-9]+\\.[0-9]{2}$", + "type": "string" + } + }, + "required": [ + "base_price", + "fees_total", + "tax_total", + "otd_total", + "currency", + "line_items" + ], + "type": "object" + }, + "unit": { + "additionalProperties": false, + "properties": { + "condition": { + "enum": [ + "new", + "used" + ] + }, + "identity": { + "maxLength": 30, + "minLength": 5, + "type": "string" + }, + "make": { + "maxLength": 80, + "type": "string" + }, + "model": { + "maxLength": 80, + "type": "string" + }, + "model_year": { + "maximum": 2100, + "minimum": 1950, + "type": "integer" + } + }, + "required": [ + "identity", + "condition", + "model_year", + "make", + "model" + ], + "type": "object" + } + }, + "required": [ + "unit", + "pricing", + "assumptions", + "freshness_disclosure" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
stores1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "store": { + "allOf": [ + { + "description": "The public projection of one rooftop's store metadata. NULL holders are omitted, never fabricated.", + "properties": { + "address": { + "maxLength": 200, + "type": "string" + }, + "city": { + "maxLength": 100, + "type": "string" + }, + "country": { + "enum": [ + "US", + "CA" + ], + "type": "string" + }, + "dealer_group": { + "additionalProperties": false, + "properties": { + "name": { + "maxLength": 200, + "type": "string" + }, + "slug": { + "maxLength": 80, + "type": "string" + } + }, + "required": [ + "name", + "slug" + ], + "type": "object" + }, + "hours": { + "type": "object" + }, + "latitude": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "limitations": { + "items": { + "maxLength": 500, + "type": "string" + }, + "maxItems": 1, + "type": "array" + }, + "longitude": { + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "manifest_url": { + "maxLength": 300, + "type": "string" + }, + "name": { + "maxLength": 200, + "type": "string" + }, + "oem_programs": { + "items": { + "maxLength": 80, + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "phone": { + "maxLength": 30, + "type": "string" + }, + "slug": { + "maxLength": 80, + "type": "string" + }, + "state": { + "maxLength": 50, + "type": "string" + }, + "website_url": { + "maxLength": 300, + "type": "string" + }, + "zip": { + "maxLength": 20, + "type": "string" + } + }, + "required": [ + "name", + "slug", + "country", + "dealer_group", + "oem_programs" + ], + "type": "object" + }, + { + "properties": { + "fee_schedule": { + "items": { + "additionalProperties": false, + "properties": { + "amount": { + "minimum": 0, + "type": "number" + }, + "applies_to": { + "enum": [ + "new", + "used", + "all" + ] + }, + "category": { + "enum": [ + "fee", + "tax", + "title_reg" + ] + }, + "code": { + "maxLength": 60, + "type": "string" + }, + "effective_from": { + "format": "date", + "type": "string" + }, + "fee_type": { + "enum": [ + "flat", + "percent" + ] + }, + "jurisdiction": { + "maxLength": 60, + "type": [ + "string", + "null" + ] + }, + "label": { + "maxLength": 200, + "type": "string" + }, + "taxable": { + "type": "boolean" + } + }, + "required": [ + "code", + "label", + "category", + "fee_type", + "amount" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "store" + ], + "type": "object" + }, + "error": { + "additionalProperties": false, + "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).", + "properties": { + "auth_help_url": { + "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.", + "format": "uri", + "maxLength": 500, + "type": "string" + }, + "code": { + "enum": [ + "rooftop_not_found", + "rooftop_inactive", + "unit_not_found", + "invalid_params", + "rate_limited", + "upstream_unavailable", + "capability_unavailable", + "identity_required", + "quota_exceeded", + "unit_held", + "quote_expired", + "rooftop_paused", + "handoff_duplicate", + "idempotency_conflict", + "price_unavailable", + "snapshot_expired", + "artifact_too_large", + "cursor_invalid", + "cursor_expired", + "ambiguous_identity", + "unsupported_in_country" + ] + }, + "message": { + "maxLength": 500, + "type": "string" + }, + "retry_after_seconds": { + "minimum": 0, + "type": "integer" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "retryable" + ], + "type": "object" + }, + "freshness": { + "additionalProperties": false, + "properties": { + "by_rooftop": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "last_ingest_at": { + "format": "date-time", + "maxLength": 40, + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "fresh", + "stale", + "no_data" + ] + } + }, + "required": [ + "status", + "last_ingest_at" + ], + "type": "object" + }, + "maxProperties": 500, + "type": "object" + } + }, + "required": [ + "by_rooftop" + ], + "type": "object" + } + }, + "type": "object" +}
2 tool updates
- Changed
inventory_stats1 field changed- added
Input schema / properties / listed_onlyAdded value: +{ + "description": "When true, only units with at least one stored photo and a vehicle detail page (vdp_url). Absent or false returns every available unit, including stock the dealer has not merchandised yet.", + "type": "boolean" +}
- Changed
network_search1 field changed- added
Input schema / properties / listed_onlyAdded value: +{ + "description": "When true, only units with at least one stored photo and a vehicle detail page (vdp_url). Absent or false returns every available unit, including stock the dealer has not merchandised yet.", + "type": "boolean" +}
1 tool update
- Changed
lead_prepare1 field changed- added
Input schema / properties / include_quoteAdded value: +{ + "default": true, + "description": "Set false when the shopper was not shown a quote: the disclosure then makes no price claim and quote_included is false.", + "type": "boolean" +}
1 tool update
- Changed
network_search1 field changed- added
Input schema / properties / rooftop_slugsAdded value: +{ + "description": "Restrict results to these network rooftops.", + "items": { + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array", + "uniqueItems": true +}
1 tool update
- Changed
inventory_comparables1 field changed- added
Input schema / properties / currencyAdded value: +{ + "pattern": "^[A-Z]{3}$", + "type": "string" +}
6 tool updates
- Changed
inventory_changes2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "US", + "description": "Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.", + "enum": [ + "US", + "CA" + ], + "type": "string" +} - added
Input schema / properties / rooftop_slugAdded value: +{ + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$", + "type": "string" +}
- Changed
inventory_comparables2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "US", + "description": "Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.", + "enum": [ + "US", + "CA" + ], + "type": "string" +} - removed
Input schema / properties / currencyRemoved value: -{ - "pattern": "^[A-Z]{3}$", - "type": "string" -}
- Changed
inventory_stats1 field changed- added
Input schema / properties / countryAdded value: +{ + "default": "US", + "description": "Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.", + "enum": [ + "US", + "CA" + ], + "type": "string" +}
- Changed
network_directory1 field changed- added
Input schema / properties / countryAdded value: +{ + "default": "US", + "description": "Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.", + "enum": [ + "US", + "CA" + ], + "type": "string" +}
- Changed
network_search1 field changed- added
Input schema / properties / countryAdded value: +{ + "default": "US", + "description": "Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.", + "enum": [ + "US", + "CA" + ], + "type": "string" +}
- Changed
network_snapshot1 field changed- added
Input schema / properties / countryAdded value: +{ + "default": "US", + "description": "Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.", + "enum": [ + "US", + "CA" + ], + "type": "string" +}
6 tool updates
- Added
inventory_changes - Added
inventory_comparables - Changed
inventory_stats8 fields changed- changed
Input schema / descriptionPrevious value: -"Categorical arrays are ORed within their field; separate filter fields are ANDed together. Aggregation has no pagination or sorting input."New value: +"Categorical arrays are ORed within their field; separate filter fields are ANDed together. Aggregation has no pagination or sorting input. Server-enforced: latitude requires longitude; longitude requires latitude; radius_miles requires latitude and longitude. Exactly one of dimensions | group_by is required. Additional argument rules are enforced server-side." - added
Input schema / properties / formatAdded value: +{ + "enum": [ + "json", + "csv" + ] +} - added
Input schema / properties / group_byAdded value: +{ + "items": { + "enum": [ + "make", + "model", + "make_model", + "condition", + "body_style", + "fuel_type", + "drivetrain", + "exterior_color", + "model_year", + "rooftop", + "state", + "dealer_group", + "price_band", + "age_band" + ] + }, + "maxItems": 2, + "minItems": 1, + "type": "array", + "uniqueItems": true +} - added
Input schema / properties / latitudeAdded value: +{ + "maximum": 90, + "minimum": -90, + "type": "number" +} - added
Input schema / properties / longitudeAdded value: +{ + "maximum": 180, + "minimum": -180, + "type": "number" +} - added
Input schema / properties / oem_program_slugAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / radius_milesAdded value: +{ + "exclusiveMinimum": 0, + "maximum": 500, + "type": "number" +} - removed
Input schema / requiredRemoved value: -[ - "dimensions" -]
- Changed
lead_prepare2 fields changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "customer": { - "required": [ - "email" - ] - } - } - }, - "then": { - "properties": { - "channels": { - "contains": { - "const": "email" - } - } - } - } - }, - { - "if": { - "properties": { - "customer": { - "required": [ - "phone" - ] - } - } - }, - "then": { - "properties": { - "channels": { - "contains": { - "const": "phone" - } - } - } - } - } -] - added
Input schema / descriptionAdded value: +"customer.email requires channels to include email. customer.phone requires channels to include phone."
- Changed
network_search7 fields changed- removed
Input schema / allOfRemoved value: -[ - { - "if": { - "properties": { - "sort": { - "const": "distance" - } - }, - "required": [ - "sort" - ] - }, - "then": { - "required": [ - "latitude", - "longitude" - ] - } - } -] - removed
Input schema / dependentRequiredRemoved value: -{ - "latitude": [ - "longitude" - ], - "longitude": [ - "latitude" - ], - "radius_miles": [ - "latitude", - "longitude" - ] -} - changed
Input schema / descriptionPrevious value: -"Categorical arrays are ORed within their field; separate filter fields are ANDed together. The default ordering is price_asc."New value: +"Categorical arrays are ORed within their field; separate filter fields are ANDed together. The default ordering is price_asc. Server-enforced: latitude requires longitude; longitude requires latitude; radius_miles requires latitude and longitude. sort = distance requires latitude and longitude. Additional argument rules are enforced server-side." - added
Input schema / properties / formatAdded value: +{ + "default": "json", + "enum": [ + "json", + "csv" + ] +} - added
Input schema / properties / limit / descriptionAdded value: +"1–500 with view manifest; 1–50 for summary and full (server-enforced)" - changed
Input schema / properties / limit / maximumPrevious value: -50New value: +500 - added
Input schema / properties / viewAdded value: +{ + "default": "summary", + "enum": [ + "summary", + "manifest", + "full" + ] +}
- Added
network_snapshot
1 tool update
- Changed
network_search4 fields changed- changed
Input schema / allOfPrevious value: -[ - { - "if": { - "properties": { - "sort": { - "const": "distance" - } - }, - "required": [ - "sort" - ] - }, - "then": { - "required": [ - "latitude", - "longitude", - "radius_miles" - ] - } - } -]New value: +[ + { + "if": { + "properties": { + "sort": { + "const": "distance" + } + }, + "required": [ + "sort" + ] + }, + "then": { + "required": [ + "latitude", + "longitude" + ] + } + } +] - changed
Input schema / dependentRequired / latitudePrevious value: -[ - "longitude", - "radius_miles" -]New value: +[ + "longitude" +] - changed
Input schema / dependentRequired / longitudePrevious value: -[ - "latitude", - "radius_miles" -]New value: +[ + "latitude" +] - changed
Input schema / properties / sort / descriptionPrevious value: -"Optional ordering; defaults to price_asc. The sort key uses NULLS LAST and is deterministically terminated by rooftop and unit ids. distance requires latitude, longitude, and radius_miles."New value: +"Optional ordering; defaults to price_asc. The sort key uses NULLS LAST and is deterministically terminated by rooftop and unit ids. distance requires latitude and longitude (radius_miles defaults to 50)."
2 tool updates
- Added
inventory_stats - Changed
network_search22 fields changed- added
Input schema / allOfAdded value: +[ + { + "if": { + "properties": { + "sort": { + "const": "distance" + } + }, + "required": [ + "sort" + ] + }, + "then": { + "required": [ + "latitude", + "longitude", + "radius_miles" + ] + } + } +] - added
Input schema / descriptionAdded value: +"Categorical arrays are ORed within their field; separate filter fields are ANDed together. The default ordering is price_asc." - added
Input schema / properties / body_styleAdded value: +{ + "oneOf": [ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } + ] +} - added
Input schema / properties / drivetrainAdded value: +{ + "oneOf": [ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } + ] +} - added
Input schema / properties / exterior_colorAdded value: +{ + "oneOf": [ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } + ] +} - added
Input schema / properties / fuel_typeAdded value: +{ + "oneOf": [ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } + ] +} - added
Input schema / properties / interior_colorAdded value: +{ + "oneOf": [ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } + ] +} - removed
Input schema / properties / make / maxLengthRemoved value: -80 - removed
Input schema / properties / make / minLengthRemoved value: -1 - added
Input schema / properties / make / oneOfAdded value: +[ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } +] - removed
Input schema / properties / make / typeRemoved value: -"string" - removed
Input schema / properties / model / maxLengthRemoved value: -80 - removed
Input schema / properties / model / minLengthRemoved value: -1 - added
Input schema / properties / model / oneOfAdded value: +[ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } +] - removed
Input schema / properties / model / typeRemoved value: -"string" - added
Input schema / properties / odometer_maxAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / passenger_capacity_minAdded value: +{ + "maximum": 20, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / price_max / descriptionAdded value: +"Maximum expiry-gated effective price: an unexpired special price when present, otherwise asking price." - added
Input schema / properties / price_min / descriptionAdded value: +"Minimum expiry-gated effective price: an unexpired special price when present, otherwise asking price." - added
Input schema / properties / sortAdded value: +{ + "description": "Optional ordering; defaults to price_asc. The sort key uses NULLS LAST and is deterministically terminated by rooftop and unit ids. distance requires latitude, longitude, and radius_miles.", + "enum": [ + "price_asc", + "price_desc", + "year_desc", + "mileage_asc", + "distance" + ] +} - added
Input schema / properties / transmissionAdded value: +{ + "oneOf": [ + { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + } + ] +} - added
Input schema / properties / trimAdded value: +{ + "maxLength": 120, + "minLength": 1, + "type": "string" +}
2 tool updates
- Added
quote_preview - Added
stores
6 tool updates
- First observed
deal_quote - First observed
inventory_get - First observed
lead_prepare - First observed
lead_submit - First observed
network_directory - First observed
network_search
Related MCP Connectors
Search live US dealership inventory, get market prices, and send buyer inquiries. Free, no API key.
Automotive inventory search for AI assistants: vehicles, dealers, deals, and market data.
Agent car inventory index. Synthetic demo data, not real inventory, not an offer.
Live vehicle warranty (service contract) quotes by VIN, plate, or make/model/year.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables decoding VINs into complete vehicle specifications, searching active used car listings from US dealers, and retrieving vehicle valuations with total cost of ownership estimates.421 npmMIT- FlicenseNot gradedqualityBmaintenanceProvides dealership intelligence by integrating CRM, DMS, CDP, and analytics data, enabling tools for lead management, inventory, customer 360, and OEM KPI queries through a FastMCP server.-
- AlicenseNot gradedqualityBmaintenanceEnables calculation of vehicle registration, title, and out-the-door fees, state-specific fee lookups, and VIN validation.MIT
- AlicenseAqualityCmaintenanceEnables users to search CarMax and Carvana inventory, retrieve vehicle details and sell/trade-in offers, and schedule CarMax test drives through automated browser workflows.8MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.