Inventory Webhook
This Inventory Webhook is generic webhook used by most of our clients to integrate the stock from our system to external services.
This document describes how to configure an external system to receive inventory data from Dealer Studio. Data is sent as a single JSON vehicle record per request via HTTP POST to the provided endpoint URL. The service supports optional authentication (Basic, API key via X-API-KEY, or bearer token via Authorization: Bearer …).
Please note that we do not permit third parties to retrieve inventory via GET requests. Inventory access is provided exclusively via webhooks for performance and reliability reasons.
Setup & Configuration
Section titled “Setup & Configuration”For setting up this integration, we need few details from the integrating system.
- External service Endpoint URL
- Authorization is OPTIONAL but supported
- Basic Auth — configure username/password
- API Key — using header X-API-KEY: value
- Authorization — using header Authorization: Bearer value
Request Details
Section titled “Request Details”HTTP Method & URL: POST external_service_url
external_service_url is the url of the system to which inventory data need to be exported to.
Request Headers:
| Header Name | Value/Format | Notes |
|---|---|---|
| Content-Type | application/json | Payload is sent as JSON. |
| Accept | application/json | Response expected in JSON format. |
| Authorization (OPTIONAL) | Basic Auth, API Key, Bearer Token | Supported methods: Basic Auth — username and password; API key — header X-API-KEY: <token>; Bearer token — header Authorization: Bearer <token> |
Request Body: Request Body is sent as json data to the above endpoint. We send only ONE Car data at a time with this inventory endpoint. Hence max size of the payload will be < 256KB
Payload Variations and Event Types
Section titled “Payload Variations and Event Types”Integrators (e.g. advertising or listing systems) should handle the following variations so that listings stay in sync with Dealer Studio.
SaleStatus
Section titled “SaleStatus”| Value | Meaning |
|---|---|
For Sale | Vehicle is available and included in the feed (e.g. in stock, listed). |
WITHDRAWN | Vehicle should be removed or marked unavailable on your side. |
When we send WITHDRAWN:
- Car no longer in feed — The vehicle was previously sent to your endpoint but no longer matches the feed (e.g. filters, stock rules, or eligibility). On full/daily feed runs we re-send such vehicles once with
SaleStatus: "WITHDRAWN"so you can withdraw them. - Car status changed — The vehicle is no longer “in stock” in Dealer Studio (e.g. sold, withdrawn, deal pending). Real-time webhooks send an update with
SaleStatus: "WITHDRAWN"for that vehicle.
Your endpoint should treat SaleStatus: "WITHDRAWN" as a signal to remove or hide the listing (e.g. stop advertising, mark as withdrawn), using the same Identifier or Identification values you use for “For Sale” payloads to match the record.
ListingType
Section titled “ListingType”ListingType reflects the vehicle type in Dealer Studio. Possible values:
| Value | Description |
|---|---|
new | New vehicle |
used | Used vehicle |
demo | Demo vehicle |
Other variations
Section titled “Other variations”- Optional or conditional fields — e.g.
VendorData(e.g. Autograb),SubscriptionPricing,Features, and someSpecification/Attributesmay be absent or empty depending on configuration and data. See Field Attributes for details. - Schema variants — Some webhook recipients use a different schema (e.g. Autograb). The behaviour above applies to the standard inventory webhook payload described in this guide.
JSON Example
Section titled “JSON Example”{ "Type": "CAR", "Identifier": 94083, "ListingType": "new", "SaleStatus": "For Sale", "SaleType": "Retail", "Description": "MY23 Series 4 Alfa Romeo Stelvio Veloce in Alfa White with Dual-Pane Panoramic Sunroof.", "Slug": "new-alfa-white-2023-alfa-romeo-stelvio-225180279", "Registration": { "Number": "YRA89W", "ExpiresUtc": "2025-08-29T00:00:00.000Z" }, "Identification": [ { "Type": "StockNumber", "Value": "225180277" }, { "Type": "VIN", "Value": "ZARPAHJN2P7D66539" } ], "Colours": [ { "Location": "Exterior", "Name": "White" }, { "Location": "Interior", "Name": "Black" } ], "OdometerReadings": [{ "Type": "", "Value": 17.0, "UnitOfMeasure": "KM" }], "Seller": { "Identifier": 285, "Type": "Dealer", "Name": "Gulsons", "ExternalIdentifiers": [{ "IdentifierName": "Stellantis", "PrimaryCode": "AJ123234" }], "LocationCode": "12103", "LocationName": "Gulson Alfa Romeo", "LocationId": 1011, "Logo": null, "DealerLicenceNumber": "MD1111", "DealershipGroupNames": ["DealerGroup A"], "Addresses": [ { "Line1": "279 Canberra Ave", "Suburb": "Fyshwick", "State": "ACT", "Postcode": "0820", "Latitude": -33.30249, "Longitude": 149.1226898 } ], "Contact": { "Phone": "02 6280 4440", "OperatingHours": [ { "Weekday": "Sunday", "Status": "Closed", "Open": "8:30am", "Close": "5:30pm" }, { "Weekday": "Monday", "Status": "Open", "Open": "8:30am", "Close": "5:30pm" }, { "Weekday": "Tuesday", "Status": "Open", "Open": "8:30am", "Close": "5:30pm" }, { "Weekday": "Wednesday", "Status": "Open", "Open": "8:30am", "Close": "5:30pm" }, { "Weekday": "Thursday", "Status": "Open", "Open": "8:30am", "Close": "5:30pm" }, { "Weekday": "Friday", "Status": "Open", "Open": "8:30am", "Close": "5:30pm" }, { "Weekday": "Saturday", "Status": "Closed", "Open": "8:30am", "Close": "5:30pm" } ] } }, "Specification": { "Identifier": 94083, "SpecificationSource": "REDBOOK", "SpecificationCode": "AUVHOLD2017AEEE", "description": "description_details", "CountryCode": "AU", "Make": "Alfa Romeo", "Model": "Stelvio", "Series": "Series 3 MY22", "ReleaseDate": { "Year": 2023 }, "Title": "2023 Alfa Romeo Stelvio Veloce Series 3 MY22", "Attributes": [ { "Name": "Badge", "Value": "Veloce" }, { "Name": "EngineType", "Value": "Piston" }, { "Name": "EngineSize", "Value": 2 }, { "Name": "EngineSizeLitres", "Value": 2.0 }, { "Name": "FuelConsumptionLitres", "Value": 6 }, { "Name": "Co2Emission", "Value": 168 }, { "Name": "Cylinders", "Value": 4 }, { "Name": "FuelType", "Value": "Petrol" }, { "Name": "Transmission", "Value": "Automatic" }, { "Name": "Gears", "Value": 8 }, { "Name": "Drive", "Value": "All Wheel Drive" }, { "Name": "BodyStyle", "Value": "SUV" }, { "Name": "Doors", "Value": 4 }, { "Name": "Seats", "Value": 5 }, { "Name": "Torque", "Value": 410 }, { "Name": "Views", "Value": 5 } ] }, "Features": { "Audio, Visual & Communication": [ "6 Speaker Stereo", "Bluetooth System", "Radio - Digital (DAB+)", "Smart Device Integration - Android Auto", "Smart Device Integration - Apple CarPlay" ], "Comfort & Convenience": [ "Air Conditioning - Pollen Filter", "Cup Holders - 1st Row", "Cup Holders - 2nd Row", "Sunglass Holder" ], "Exterior": [ "Daytime Running Lamps - LED", "Headlamps - LED", "Power Door Mirrors - Folding", "Sunroof - Electric", "Tail Lamps - LED" ], "Safety & Security": [ "ABS (Antilock Brakes)", "Airbag - Driver", "Airbag - Passenger", "Blind Spot Sensor", "Camera - Rear Vision", "Cruise Control - Distance Control", "Lane Departure Warning" ], "Seating": ["Heated Seats - 1st Row", "Leather Look - Seats", "Seats - 2nd Row Split Fold"], "Wheels & Tyres": ["18 Inch Alloy Wheels", "Tyre Pressure Monitoring - with logging/display"] }, "Media": { "Photos": [ { "Url": "https://d2s8i866417m9.cloudfront.net/photo/10997914/photo/medium-c4b8a0bea115b86326ea0dbb990e86e9.jpg", "Large": { "Url": "https://d1soaem4p9lhy8.cloudfront.net/derivations/image/large/1500/1000/example.jpg" }, "Thumb": { "Url": "https://d2s8i866417m9.cloudfront.net/photo/10997914/photo/thumb-88b8dfd4511bd103c8b7a1450d1ce7d9.jpg" } } ] }, "ComplianceDate": { "Month": "06", "Year": "2023" }, "BuildDate": { "Month": "07", "Year": "2017" }, "Warranty": {}, "PriceList": [ { "Type": "DAP", "Currency": "AUD", "Amount": 83888.0 }, { "Type": "EGC", "Amount": 82888.0, "Currency": "AUD" }, { "Type": "BeforePrice", "Amount": 80909, "Currency": "AUD" } ], "Certification": { "Certified": true, "CertificationType": "COI" }, "LastModifiedUtc": "2024-08-30T01:09:22.626Z", "CreatedUtc": "2023-07-27T01:24:15.226Z", "VendorData": [ { "Identifier": "autograb", "Data": { "description": "test description", "fill": 0.5, "id": "9be09ff2-af83-4734-8a15-d6b10d471e63", "vehicle_title": "2023 Holden Cruze CD JH Series II Auto MY11", "listing_price": 5990, "market_range_min": 6117, "market_range_max": 7550, "confidence": 0.7008, "sample_size": 55 } } ], "Destinations": [ { "type": "Dealer Website", "url": "https://www.example.com/cars/used-red-2019-ford-impreza", "name": "Ford website" } ], "SubscriptionPricing": [ { "Name": "Starter", "WeeklyPrice": 100.0, "MonthlyPrice": 433.3, "FortnightlyPrice": 200.0, "DailyPrice": 14.2 }, { "Name": "Value", "WeeklyPrice": 150.0, "MonthlyPrice": 650.0, "FortnightlyPrice": 300.0, "DailyPrice": 21.4 } ]}Withdrawn event example
Section titled “Withdrawn event example”When we send a Withdrawn event, the payload has the same structure as above, with these differences:
SaleStatusis"WITHDRAWN"instead of"For Sale".- All other fields (e.g.
Identifier,Identification,Slug,ListingType) are unchanged so you can match the record and withdraw or hide it.
Example fragment for a withdrawn listing:
{ "Type": "CAR", "Identifier": 94083, "ListingType": "new", "SaleStatus": "WITHDRAWN", "SaleType": "Retail", "Description": "MY23 Series 4 Alfa Romeo Stelvio Veloce.", "Slug": "new-alfa-white-2023-alfa-romeo-stelvio-225180279", "Identification": [ { "Type": "StockNumber", "Value": "225180277" }, { "Type": "VIN", "Value": "ZARPAHJN2P7D66539" } ]}Handle every payload with SaleStatus: "WITHDRAWN" as a withdrawal instruction for that vehicle (e.g. in your Advertising API), using Identifier or Identification[].Value (e.g. StockNumber, VIN) to identify the listing.
Can we use a custom API key header (e.g. Ocp-Apim-Subscription-Key)?
Section titled “Can we use a custom API key header (e.g. Ocp-Apim-Subscription-Key)?”No. For API key authentication, Dealer Studio sends the configured secret in the X-API-KEY header. The header name is not configurable.
If your API gateway (for example Azure API Management) expects a different header such as Subscription-Key, you will need to handle that on your side—for example by adding a policy that maps X-API-KEY to the key your backend expects, or by using Basic authentication or a Bearer token instead if your endpoint supports those and that fits your setup.
The standard payload uses X-API-KEY. Some agreed schema variants (for example Autograb) use a different fixed header name; that is not configurable per customer endpoint.
When a vehicle moves from “For Sale” to Sold or another status, does the feed still include it so we can tell what happened?
Section titled “When a vehicle moves from “For Sale” to Sold or another status, does the feed still include it so we can tell what happened?”Standard inventory webhook: Yes, you still receive a webhook when a vehicle is no longer for sale in Dealer Studio—typically with SaleStatus: "WITHDRAWN"—so you can match the vehicle (via Identifier or Identification, e.g. stock number or VIN) and remove or hide the listing.
What you cannot infer from SaleStatus: In the standard JSON payload, SaleStatus is only For Sale or WITHDRAWN. We do not send distinct values such as Sold, Deal Pending, or other internal statuses. Anything that is not active “in stock” for the feed is represented as WITHDRAWN, so you cannot tell from SaleStatus alone whether a vehicle was sold, withdrawn, deal pending, or another non–for-sale state. Use WITHDRAWN as “no longer listed via this webhook”; track your own business logic if you need to label outcomes beyond that.
How long after a vehicle is sold is it still sent? For sold vehicles, the export logic keeps sold_date within the last seven days in the same eligible set as in-stock vehicles (subject to feed filters and rules). During that period you may still receive webhooks for that vehicle with SaleStatus: "WITHDRAWN". After more than seven days since sold_date, the vehicle is not included in routine full-feed webhook runs. Separately, if we had already sent For Sale to your endpoint for that vehicle but the latest successful payload was not WITHDRAWN, we may still send a withdrawal so you can remove the listing, even once the vehicle is outside that seven-day window.
Retry Mechanism for Timeout Errors
Section titled “Retry Mechanism for Timeout Errors”In case of a ReadTimeout or OpenTimeout error, the system will automatically attempt to resend the request up to a MAXIMUM of 3 retries. This ensures that the data is successfully posted to the client endpoint, even in the event of transient network issues or server delays.
If the request still fails after the maximum retry count, an error will be logged, and the request will be considered UNSUCCESSFUL.
Additional Features
Section titled “Additional Features”-
Granular Stock Filtering We support fine-grained filtering to exclude specific vehicles or criteria before sending data to external systems—if required.
-
Autogauge & RedBook Integration: Data from Autogauge and RedBook can be included with stock information, provided this is agreed upon in the contractual terms.
Refer to the Field Attributes page for detailed information on the field attributes.