Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.2.0"
".": "0.3.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 12
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/azure/partnermax-52b9912a508298f3c622752ebf2b3a23da0c923955e1c5effe76912f7ed00b44.yml
openapi_spec_hash: 549792bed17760a971f104f9268072b2
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/azure/partnermax-6b46d3e49935c9b6d7df9150b7dad7fc184b4f1edaf47d3c1626785ea8eea04b.yml
openapi_spec_hash: 32e26e0ae2574e8356931eef53062c7e
config_hash: bf921bb2f4db038ffed15141c74cd018
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.3.0 (2026-05-17)

Full Changelog: [v0.2.0...v0.3.0](https://github.com/DealerMax-app/partnermax-python/compare/v0.2.0...v0.3.0)

### Features

* **api:** api update ([a6d5f2a](https://github.com/DealerMax-app/partnermax-python/commit/a6d5f2ab1cddcb9bf57396109402fd280676013f))

## 0.2.0 (2026-05-17)

Full Changelog: [v0.1.0...v0.2.0](https://github.com/DealerMax-app/partnermax-python/compare/v0.1.0...v0.2.0)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "partnermax"
version = "0.2.0"
version = "0.3.0"
description = "The official Python library for the partnermax API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/partnermax/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "partnermax"
__version__ = "0.2.0" # x-release-please-version
__version__ = "0.3.0" # x-release-please-version
200 changes: 161 additions & 39 deletions src/partnermax/types/dealers/nlt/offer_retrieve_response.py
Original file line number Diff line number Diff line change
@@ -1,82 +1,204 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

from typing import List, Optional
from datetime import datetime
from typing_extensions import Literal

from ...._models import BaseModel
from .nlt_offer_summary import NltOfferSummary

__all__ = [
"OfferRetrieveResponse",
"OfferRetrieveResponseQuotation",
"OfferRetrieveResponseSpecs",
"OfferRetrieveResponseDealerCard",
"OfferRetrieveResponseOptionalAccessory",
"AccessoriInclusi",
"AddonsDisponibili",
"AddonsDisponibiliAutoSostitutiva",
"AddonsDisponibiliPneumatici",
"AnticipoScenariEur",
"AnticipoScenariLabels",
"Gallery",
"NetworkOffer",
"Quotazioni",
"Tag",
]


class OfferRetrieveResponseQuotation(BaseModel):
down_payment_eur: int
"""Down-payment amount in EUR for this tier (from the dealer's NLT settings)."""
class AccessoriInclusi(BaseModel):
codice: str

down_payment_tier: Literal["low", "medium", "high"]
descrizione: str

duration_months: Literal[24, 36, 48]
prezzo_extra_eur: float

km_per_year: Literal[10000, 15000, 20000, 25000, 30000, 40000]

monthly_canon_eur: float
"""Displayed monthly canon (includes dealer markup + VAT treatment)."""
class AddonsDisponibiliAutoSostitutiva(BaseModel):
categoria_default: str
"""Replacement vehicle category (B fixed)."""

categoria_descrizione: str

class OfferRetrieveResponseSpecs(BaseModel):
co2_g_per_km: Optional[int] = None
costo_mensile_eur: float

engine_displacement_cc: Optional[int] = None

height_mm: Optional[int] = None
class AddonsDisponibiliPneumatici(BaseModel):
costo_treno_eur: float
"""Cost of one set of 4 tyres, EUR."""

length_mm: Optional[int] = None
diametro_in: int
"""Tyre diameter in inches."""

power_kw: Optional[float] = None
regola_cambio: str
"""Replacement rule (e.g. one set every 30 000 km, rounded up)."""

transmission: Optional[str] = None

trunk_litres: Optional[int] = None
class AddonsDisponibili(BaseModel):
auto_sostitutiva: Optional[AddonsDisponibiliAutoSostitutiva] = None

pneumatici: Optional[AddonsDisponibiliPneumatici] = None


class AnticipoScenariEur(BaseModel):
anticipo_medio: int
"""12.5% down-payment scenario, whole EUR."""

anticipo_standard: int
"""25% down-payment scenario, whole EUR (matches vetrina canon)."""

anticipo_zero: int
"""Zero down-payment scenario, whole EUR."""


class AnticipoScenariLabels(BaseModel):
anticipo_medio: str

anticipo_standard: str

anticipo_zero: str


class Gallery(BaseModel):
is_cover: bool

url: str

width_mm: Optional[int] = None

class NetworkOffer(BaseModel):
canone_mensile_min_eur: float

class OfferRetrieveResponseDealerCard(BaseModel):
business_name: Optional[str] = None
dealer_id: int

dealer_name: str

city: Optional[str] = None

contact_url: Optional[str] = None

google_maps_url: Optional[str] = None

phone: Optional[str] = None

primary_domain: Optional[str] = None
province: Optional[str] = None

rating_value: Optional[float] = None

review_count: Optional[int] = None


class Quotazioni(BaseModel):
canone_mensile_eur: float
"""Displayed monthly canon for this (durata, km) cell.

Computed by `calcola_canone_vetrina` for the primary dealer of the partner
network; VAT-inclusive when `solo_privati=true`.
"""

durata_mesi: Literal[36, 48, 60]

km_inclusi_anno: Literal[10000, 15000, 20000, 25000, 30000, 40000]


class Tag(BaseModel):
name: str

province_code: Optional[str] = None
color: Optional[str] = None
"""Hex color for tag chip."""

icon: Optional[str] = None
"""FontAwesome icon class."""

class OfferRetrieveResponseOptionalAccessory(BaseModel):
label: str

monthly_canon_delta_eur: float
class OfferRetrieveResponse(BaseModel):
"""Full offer detail.

Shape mirrors apimax MCP `get_nlt_offer_details` (`apimax/app/api/mcp_server.py::_tool_get_nlt_offer_details`) bit-for-bit so partnermax SDK consumers stay aligned with the Custom GPT / MCP clients on the DealerMAX network.
"""

class OfferRetrieveResponse(NltOfferSummary):
included_services: List[
Literal["full_insurance", "maintenance", "road_tax", "tires", "replacement_vehicle", "roadside_assistance"]
]
found: bool

quotations: List[OfferRetrieveResponseQuotation]
"""All 54 displayed price points (18 base quotations × 3 down-payment tiers)."""
iva_inclusa: bool
"""True when canon is VAT-inclusive (i.e. `solo_privati=true`)."""

specs: OfferRetrieveResponseSpecs
network_dealer_count: int

dealer_card: Optional[OfferRetrieveResponseDealerCard] = None
slug: str
"""Offer slug (stable identifier shared with apimax surfaces)."""

image_gallery: Optional[List[str]] = None
title: str

accessori_inclusi: Optional[List[AccessoriInclusi]] = None

addons_disponibili: Optional[AddonsDisponibili] = None

anticipo_scenari_eur: Optional[AnticipoScenariEur] = None

anticipo_scenari_labels: Optional[AnticipoScenariLabels] = None

canone_mensile_min_eur: Optional[float] = None
"""
Lowest canon across the partner network for this offer (primary dealer's price).
"""

description_full: Optional[str] = None
"""AI-generated long-form description."""

description_short: Optional[str] = None

fuel_type: Optional[str] = None
"""Raw Italian label from `nlt_offerte.alimentazione` (e.g. "Benzina", "Ibrida")."""

gallery: Optional[List[Gallery]] = None

image_url: Optional[str] = None

last_modified: Optional[datetime] = None

marca: Optional[str] = None

modello: Optional[str] = None

network_offers: Optional[List[NetworkOffer]] = None
"""All the partner's dealers that can fulfil this offer, sorted by canon ASC."""

prezzo_totale_eur: Optional[float] = None
"""List price IVA-inclusive (vehicle + accessories + MSS)."""

primary_dealer_city: Optional[str] = None

primary_dealer_name: Optional[str] = None

primary_dealer_province: Optional[str] = None

quotazioni: Optional[List[Quotazioni]] = None

segmento: Optional[str] = None

solo_privati: Optional[bool] = None
"""Per-offer VAT scope: true → consumer-facing (B2C, VAT-inclusive).

false → business (B2B, VAT-exclusive).
"""

tags: Optional[List[Tag]] = None

transmission: Optional[str] = None
"""Raw Italian label from `nlt_offerte.cambio`."""

optional_accessories: Optional[List[OfferRetrieveResponseOptionalAccessory]] = None
versione: Optional[str] = None
Loading