Ship My Car Logo (White)
Home
Contact
Client Portal
Ship My Car Logo (White)

UK's leading vehicle import and export specialists since 2006. Shipping, customs, testing, and DVLA registration — all under one roof.

01908 887917info@shipmycar.co.uk
Milton Keynes, UK
FacebookInstagramXYouTube

Services

  • Car Shipping
  • HMRC Customs
  • IVA / MOT Testing
  • DVLA Registration
  • Instant Quote

Company

  • About Us
  • Our History
  • Workshops
  • Gallery
  • Contact

Resources

  • FAQ & Guides
  • Import Guides
  • IVA Testing Guides
  • API Documentation
  • Car Transport Providers

Legal

  • Privacy Policy
  • Cookie Policy
  • Terms & Conditions
© 2026 ShipMyCar Ltd•BIFA Audited Member•Est. 2006
Platform by IT Boffins
Vehicle logistics API

SMC API v1.0

SMC API v1.0 is a server-to-server quote API for international car dealers, listing sites, marketplaces, and relocation companies. It returns transport quotes for UK, EU, and selected international vehicle movements, with optional destination import-tax and registration estimates for UK and EU arrivals. View the API brochure.

UK road transport

Instant UK collection and delivery estimates for dealer stock, private sales and relocations.

UK and EU movements

Quote UK-to-EU and EU-to-UK vehicle transport with destination tax and registration context.

International sea freight

Support overseas enquiry flows with international shipping, customs and arrival-cost estimates.

Taxes and registration

Return display-ready estimates for customs taxes, testing and registration into the UK and all EU countries.

Endpoint

POST /api/v1/quotes

Authentication

x-api-key

Format

application/json

01

Overview

The API is intended for trusted server-to-server integrations. Do not place API keys in browser JavaScript, mobile apps, or public repositories.

Responses separate payable ShipMyCar transport charges from destination-cost estimates, so partners can show freight totals and arrival-cost guidance without mixing currencies or estimate types.

This endpoint replaces the old public /api/getallcosts integration.

Supported route types

uk-to-ukuk-to-eueu-to-ukuk-to-internationalinternational-to-ukinternational-to-eu

02

Authentication

Send the API key in the x-api-key request header. SMC API v1.0 only accepts active, non-expired API keys from the API users database.

curl -X POST https://www.shipmycar.co.uk/api/v1/quotes \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{"partnerReference":"UK-EU-PERFORMANCE-001","collection":{"country":"United Kingdom","address":"London, UK"},"delivery":{"country":"France","address":"Paris, France"},"vehicle":{"vin":"SMCDEMBMW2023M4XX","value":65000,"currency":"GBP"},"transport":{"shippingMethod":"open","nonRunner":false},"options":{"targetCurrency":"GBP","includeDestinationImportTaxes":true,"includeDestinationRegistrationEstimate":true},"destinationCostDetails":{"registrationCountry":"United Kingdom"}}'
The API does not return whether a failed key was inactive, expired, or unknown. All failed key checks return unauthorized to avoid leaking account state.

03

Request Body

Submit nested JSON. Vehicle details may be provided manually, or supplied through one of the configured demo VINs.

FieldTypeRequiredDescription
partnerReferencestringNoYour own quote or listing reference. Returned unchanged in the response.
collection.countrystringYesCollection country name or 2-letter country code.
collection.addressstringYesCollection address or city. It must be specific enough to geocode.
delivery.countrystringYesDelivery country name or 2-letter country code.
delivery.addressstringYesDelivery address or city. It must be specific enough to geocode.
vehicle.vinstringNoOptional demo VIN. In the current rollout, only configured demo VINs are decoded locally.
vehicle.yearnumberIf no VINVehicle year. Required when not supplied by a valid demo VIN.
vehicle.makestringIf no VINVehicle make. Required when not supplied by a valid demo VIN.
vehicle.modelstringIf no VINVehicle model. Required when not supplied by a valid demo VIN.
vehicle.valuenumberYesVehicle value used for freight, import tax, and destination-cost estimates.
vehicle.currencyGBP | EUR | USD | JPY | CAD | AUD | CHF | ZAR | NZDNoCurrency for vehicle.value. Defaults to GBP when omitted.
vehicle.typestringNoOptional vehicle category. vehicleType is also accepted. Defaults to car.
vehicle.fuelTypestringNoOptional fuel type used by some destination registration calculations.
transport.shippingMethodopen | enclosedNoPreferred transport method. Defaults to open. transport.method is accepted as a backwards-compatible alias.
transport.nonRunnerbooleanNoSet true when the vehicle cannot be driven. Defaults to false.
transport.skipUKTransportbooleanNoSet true to omit the UK inland transport leg where supported.
options.targetCurrencycurrency codeNoDisplay currency for transport quote totals. Defaults to GBP.
options.includeDestinationImportTaxesbooleanNoSet true to estimate destination import duty/VAT where available.
options.includeDestinationRegistrationEstimatebooleanNoSet true to estimate destination registration or arrival costs where available.
destinationCostDetailsobjectNoOptional country-specific details for import and registration estimates.

Demo VINs

VINDescription
SMCDEMVW2020GLF1X2020 Volkswagen Golf demo profile
SMCDEMBMW2023M4XX2023 BMW M4 Competition demo profile

Demo VIN request

{ "partnerReference": "UK-EU-PERFORMANCE-001", "collection": { "country": "United Kingdom", "address": "London, UK" }, "delivery": { "country": "France", "address": "Paris, France" }, "vehicle": { "vin": "SMCDEMBMW2023M4XX", "value": 65000, "currency": "GBP" }, "transport": { "shippingMethod": "open", "nonRunner": false }, "options": { "targetCurrency": "GBP", "includeDestinationImportTaxes": true, "includeDestinationRegistrationEstimate": true }, "destinationCostDetails": { "registrationCountry": "United Kingdom" } }

Classic Car Request

{ "partnerReference": "UK-EU-CLASSIC-001", "collection": { "country": "United Kingdom", "address": "London, UK" }, "delivery": { "country": "France", "address": "Paris, France" }, "vehicle": { "year": 1967, "make": "Ford", "model": "Mustang Fastback", "value": 42000, "currency": "GBP", "vehicleType": "car", "fuelType": "petrol", "engineSize": 4727, "firstRegistrationDate": "1967-05-01", "odometerKm": 128000, "departmentCode": "75" }, "transport": { "shippingMethod": "open", "nonRunner": false }, "options": { "targetCurrency": "GBP", "includeDestinationImportTaxes": true, "includeDestinationRegistrationEstimate": true }, "destinationCostDetails": { "registrationCountry": "United Kingdom", "arrivalDate": "2026-06-01", "vehicleExchangeRate": 1, "vehicleDetails": { "departmentCode": "75", "netPowerKw": 200, "vehicleTypeApproval": "national_or_isolated" } } }
Classic vehicle examples do not need emissions values. Send only the core vehicle details and any destination-specific registration fields that are actually required for the estimate.

Destination cost detail inputs

These fields are optional and only needed when requesting destination import-tax or registration estimates. The API accepts the nested object names below; aliases are shown where supported.

FieldTypeDescription
destinationCostDetails.registrationCountrystringCurrent registration or origin country. Defaults to the collection country when omitted.
destinationCostDetails.vehicleDetailsobjectOptional country-specific vehicle facts for EU registration estimates, such as CO2, weight, first registration date, power, seats, or department code. euVehicleDetails is accepted as an alias.
destinationCostDetails.exportDetailsobjectOptional EU import/export facts such as import date, origin country, free-circulation status, or exchange-rate inputs. euExportDetails is accepted as an alias.
destinationCostDetails.hmrcDetailsobjectOptional UK import-tax details. ukImportDetails is accepted as an alias.
destinationCostDetails.dvlaDetailsobjectOptional UK registration details. ukRegistrationDetails is accepted as an alias.
destinationCostDetails.arrivalDateISO dateOptional arrival/import date for EU destination-cost calculations. importDate and expectedArrivalDate are also accepted.
destinationCostDetails.vehicleExchangeRatenumberOptional exchange rate used when EU destination-cost inputs require conversion from the vehicle currency.

destinationCostDetails.vehicleDetails

EU destination registration calculators use these vehicle facts when they are not already known from a demo VIN. Send only the values that apply to the destination country and vehicle.

FieldTypeDescription
fuelTypepetrol | diesel | hybrid | electric | ...Fuel type. Usually supplied by the demo VIN, but may be supplied manually.
engineSizenumberEngine capacity in cc.
firstRegistrationDateYYYY-MM-DDFirst registration date. Used for vehicle age, classic, and registration-tax rules.
co2EmissionsnumberCO2 emissions in g/km. Not normally required for 30+ year classics.
co2Standardwltp | nedcCO2 measurement standard when CO2 is supplied.
euroStandardstringEmissions standard, for example euro6d or euro0.
powerKw / netPowerKwnumberPower in kW. Some destination registration formulas use one or both values.
vehicleWeightKg / maximumAuthorizedMassKgnumberWeight values used by some EU registration formulas.
localMarketValuenumberEstimated local market value where a destination tax calculation requires it.
departmentCodestringFrench department code, for example 75.
belgiumRegionflanders | wallonia | brusselsBelgian registration region when Belgium is the destination.
vehicleTypeApprovaleu | national_or_isolatedFrench type-approval status where relevant.

destinationCostDetails.exportDetails

FieldTypeDescription
originCountrycountry codeOrigin/current registration country, for example GB, US, DE.
importDateYYYY-MM-DDExpected EU import/arrival date. arrivalDate is also accepted at destinationCostDetails level.
vehicleCurrencycurrency codeCurrency used for the vehicle value when different from the main vehicle currency.
vehicleExchangeRatenumberExchange rate for EU tax conversion when the vehicle value is not in EUR.
inFreeCirculationbooleanFor EU-origin arrivals, whether the vehicle is already in EU free circulation.
exportPurposepermanent | temporaryImport/export purpose where the destination calculator needs it.
transferOfResidencebooleanSet true where transfer-of-residence relief may apply.

destinationCostDetails.ukImportDetails

Used for UK arrivals when options.includeDestinationImportTaxes is true. hmrcDetails is accepted as an alias.

FieldTypeDescription
importDurationpermanent | temporaryWhether the UK import is permanent or temporary.
vehicleExchangeRatenumberExchange rate to GBP when vehicle.currency is not GBP.
isCommercialImportbooleanSet true for commercial imports.
importReasonstringOptional reason such as returning, gift, inheritance, or moving.
transferOfResidencebooleanSet true if transfer-of-residence relief may apply.
ownershipDurationstringOwnership duration for relief checks, where relevant.
previouslyRegisteredInUkbooleanSet true for returning UK vehicles.
hasEuStatementOnOrigin / hasEuExporterNumberbooleanOptional EU origin-proof flags for preferential-duty checks.
hasJapanStatementOnOrigin / hasJapanCorporateNumberbooleanOptional Japan origin-proof flags for preferential-duty checks.

destinationCostDetails.ukRegistrationDetails

Used for UK arrivals when options.includeDestinationRegistrationEstimate is true. dvlaDetails is accepted as an alias.

FieldTypeDescription
registrationCountrystringCountry where the vehicle is currently registered.
hasRearFogyes | no | unsureWhether the vehicle already has a compliant rear fog light.
fogLightPositionleft | right | centreFog-light position when hasRearFog is yes.
hasMphyes | no | unsureWhether the speedometer displays mph.
dashboardTypeanalogue | digitalUsed when mph conversion may be required.
hasCoCyes | no | unsureCertificate of Conformity status for relevant EU vehicles.
isHalogenyes | no | unsureUsed for some headlight-conversion estimates.

Nested object shape

{ "registrationCountry": "United Kingdom", "arrivalDate": "2026-06-01", "vehicleExchangeRate": 1, "vehicleDetails": { "departmentCode": "75", "netPowerKw": 200, "vehicleTypeApproval": "national_or_isolated" }, "exportDetails": { "originCountry": "GB", "inFreeCirculation": true }, "ukImportDetails": { "importDuration": "permanent", "isCommercialImport": false, "vehicleExchangeRate": 1.27 }, "ukRegistrationDetails": { "registrationCountry": "United States", "hasRearFog": "yes", "fogLightPosition": "right", "hasMph": "yes" } }

04

Success Response

A successful request returns HTTP 200 with success: true. A quote is usable when quotable is also true.

FieldTypeDescription
successbooleanTrue when the API request was processed successfully.
quotablebooleanTrue when a transport quote could be calculated.
partnerReferencestring | nullThe partner reference supplied in the request.
routeobjectRoute type, support flag, and collection/delivery regions.
vehicleobjectNormalized vehicle year, make, model, value, and currency used for the quote.
vinobjectSafe VIN status only: supplied, decoded, demo, and partial flags.
transportobjectTransport line items and subtotal in the response currency.
destinationCostsobjectOptional import tax and destination registration estimates. Deep calculation traces are intentionally not returned.
totalsobjectTransport total, destination estimate total, currencies, and combined total when currencies match.
currencystringCurrency for transport amounts.
metadataobjectPublic metadata only: source, item count, destination-cost status, and canContinue when available.
apiLogIduuidReturned for quotable responses when the continue quote link is available.
expiresAtISO dateExpiration for the continue quote link. Links currently expire after 30 days.
continueQuoteUrlstringA URL that lets the customer continue the quote on ShipMyCar with the quote data pre-filled.

Example response

{ "success": true, "quotable": true, "partnerReference": "UK-EU-PERFORMANCE-001", "route": { "type": "uk-to-eu", "supported": true, "collectionRegion": "uk", "deliveryRegion": "eu" }, "vehicle": { "year": 2023, "make": "BMW", "model": "M4 Competition", "value": 65000, "currency": "GBP" }, "vin": { "supplied": true, "decoded": true, "demo": true, "partial": false }, "transport": { "items": [ { "description": "Fully Insured Road Transport by open transport from London to Paris.", "amount": 2520, "vat": 0, "optional": false }, { "description": "Customs Clearance Charges (UK to EU) Includes all required UK export clearance customs and EU import clearance charges Excludes any applicable import tax/duty", "amount": 408, "vat": 0, "optional": false } ], "subtotal": 2928 }, "destinationCosts": { "requested": true, "status": "full", "currency": "EUR", "country": "France", "countryCode": "FR", "importTaxes": { "requested": true, "available": true, "status": "full", "subtotal": 11050, "duty": 0, "vat": 11050, "items": [ { "key": "import-vat", "type": "import_tax", "label": "VAT (%)", "amount": 11050, "formattedValue": "€11,050.00", "unavailable": false } ] }, "registration": { "requested": true, "available": true, "status": "full", "subtotal": 36340.71, "taxName": "Malus", "notice": null, "items": [ { "key": "fr-y1", "type": "registration", "label": "Y1 Regional Tax", "amount": 2826.95, "formattedValue": "€2,826.95", "unavailable": false }, { "key": "fr-y3", "type": "registration", "label": "Y3 CO2 + TMOM (Weight)", "amount": 50000, "formattedValue": "€50,000.00", "unavailable": false }, { "key": "fr-discount", "type": "registration", "label": "Discount", "amount": -16500, "formattedValue": "-€16,500.00", "unavailable": false } ] }, "environmental": { "items": [] }, "subtotal": 47390.71, "total": { "label": "Estimated Arrival Costs", "amount": 47390.71, "formattedValue": "€47,390.71", "unavailable": false }, "missingFields": [], "messages": { "warnings": [ "This estimate does not include country-specific costs or practical hurdles for importing a right-hand-drive vehicle into a left-hand-drive EU market, such as lighting changes, rear-fog compliance, inspection issues, or buyer-value impacts." ], "explanations": [ "Import duty: €0.00 (0% - UK-EU Trade Agreement)", "Import VAT: €11050.00 (20% of value + duty)", "Registration tax (Malus): €36326.95", "FR Y3 used 229g/km WLTP emissions and 1775kg vehicle weight.", "Administrative fees: €13.76" ], "details": [], "validationErrors": [], "footnotes": [ "Further costs may apply, including FFVE or attestation fees, technical inspection (where required), ANTS or professional processing fees, number plates, and local administrative charges." ] } }, "totals": { "currency": "GBP", "payableTransportTotal": 2928, "destinationEstimateTotal": 47390.71, "destinationEstimateCurrency": "EUR", "combinedEstimateTotal": null }, "currency": "GBP", "metadata": { "source": "partner-api-v1", "itemCount": 2, "destinationCostStatus": "full", "canContinue": true }, "apiLogId": "d904a372-3293-4181-b8ec-66437790b58f", "expiresAt": "2026-05-23T19:59:16.156Z", "continueQuoteUrl": "https://www.shipmycar.co.uk/continue-api-quote?apiId=d904a372-3293-4181-b8ec-66437790b58f&token=..." }

05

Line Items

Transport and destination costs use different row contracts. Transport rows are quote charges payable to ShipMyCar. Destination rows are estimates for import tax, registration, or environmental charges in the arrival country.

Destination rows do not include summary rows such as total payable. Use section subtotals and destinationCosts.total for totals.

transport.items[]

FieldTypeDescription
descriptionstringPlain-text transport or service description. HTML is stripped from the public response.
amountnumberLine item amount excluding VAT.
vatnumberVAT amount for the item.
optionalbooleanWhether the item is optional.

destinationCosts.*.items[]

FieldTypeDescription
keystringStable display key for the row, such as import-vat or fr-y3.
typeimport_tax | registration | environmentalDestination-cost section this row belongs to.
labelstringDisplay label for the cost row.
amountnumberNumeric amount. Discounts are negative values.
formattedValuestringHuman-readable value, formatted by the API for display.
unavailablebooleanTrue when a row is shown but not calculable.
Discounts are returned with negative numeric amounts. The formatted value is included for display, but use the numeric amount for calculations.

06

Destination Costs

Destination costs are optional. Set options.includeDestinationImportTaxes and/or options.includeDestinationRegistrationEstimate to request them. If a section cannot be calculated, the response returns status and messages explaining what is missing.

Import taxes

Returned under destinationCosts.importTaxes. Includes duty, VAT, subtotal, and display rows.

Registration estimate

Returned under destinationCosts.registration. Includes subtotal, tax name, optional notice, and display rows.

Messages

User-facing destination-cost messages are grouped by purpose:

warningsexplanationsdetailsvalidationErrorsfootnotes

07

Continue Quote URL

Quotable responses include a continueQuoteUrl. Send the customer to this URL to load the vehicle, route, transport, and cost data into the ShipMyCar quote flow.

Continue links currently expire after 30 days. Treat the URL as a bearer token: anyone with the URL can open the saved quote data until it expires.

const response = await fetch('https://www.shipmycar.co.uk/api/v1/quotes', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.SMC_PARTNER_API_KEY }, body: JSON.stringify({ partnerReference: 'UK-EU-PERFORMANCE-001', collection: { country: 'United Kingdom', address: 'London, UK' }, delivery: { country: 'France', address: 'Paris, France' }, vehicle: { vin: 'SMCDEMBMW2023M4XX', value: 65000, currency: 'GBP' }, transport: { shippingMethod: 'open', nonRunner: false }, options: { targetCurrency: 'GBP', includeDestinationImportTaxes: true, includeDestinationRegistrationEstimate: true } }) }) const quote = await response.json() if (quote.success && quote.quotable && quote.continueQuoteUrl) { // Send the customer to ShipMyCar to review and complete the quote. return quote.continueQuoteUrl }

08

Error Responses

Error responses are sanitised. Known validation errors include field-level details; internal calculation and infrastructure failures do not expose raw exception data.

StatusCodeMeaning
400invalid_jsonRequest body was not valid JSON.
400invalid_requestRequest JSON was valid, but failed schema validation.
400missing_vehicle_dataVehicle year, make, model, value, or currency was missing.
401missing_api_keyThe x-api-key header was not supplied.
401unauthorizedThe API key is invalid, inactive, or expired.
403demo_vin_requiredA VIN was supplied that is not enabled for this API environment.
422unsupported_routeThe route is unknown or not supported by SMC API v1.0.
422quote_not_calculableThe route was supported, but a quote could not be calculated from the supplied data.
400partner_quote_errorKnown quote calculation failure that does not expose internal details.
500partner_quote_failedUnexpected server-side failure. The response is sanitised.

Validation error example

{ "success": false, "error": "Invalid partner quote request", "code": "invalid_request", "details": [ { "field": "vehicle.currency", "message": "Invalid option: expected one of \"GBP\"|\"EUR\"|\"USD\"|\"JPY\"|\"CAD\"|\"AUD\"|\"CHF\"|\"ZAR\"|\"NZD\"", "code": "invalid_value" } ] }

09

Migration Notes

The old public documentation described /api/getallcosts. SMC API v1.0 uses /api/v1/quotes and a nested request model.

The response intentionally omits internal fields that were present in older responses, including quoteCostId, route database IDs, calculation traces, selected haulier IDs, legacy metadata, and raw decoded VIN data.

For display, use transport.items, destinationCosts.importTaxes.items,destinationCosts.registration.items, section subtotals, and destinationCosts.total.