{"openapi":"3.0.1","info":{"title":"AutoNation Mobile Service Developer API","description":"API for requesting quotes and booking appointments with AMS","version":"v0.1.0"},"externalDocs":{"description":"Getting Started Guide","url":"/docs/getting-started"},"servers":[{"url":"https://developer.repairsmith.com","description":"Generated server url"}],"security":[{"ApiKey":[]}],"paths":{"/api/users/{userId}/repair-orders/{referenceNum}/contact-info":{"put":{"tags":["repair-order-controller"],"summary":"Update the contact info associated with a repair-order","operationId":"updateRepairOrderContactInfo","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactInfo"}}},"required":true},"responses":{"401":{"description":"Unauthorized."},"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RepairOrderResponse"}}}},"404":{"description":"Resource not found."},"400":{"description":"Bad Request."},"403":{"description":"Forbidden."}}}},"/api/users/{userId}/repair-orders/{referenceNum}/pre-auth":{"post":{"tags":["repair-order-controller"],"summary":"Fetch repair orders by user ID","description":"Pre Authorize a repair order. Will throw an error if the repair order can't be pre authorized. Won't execute any logic if a previous pre authorization made with the default payment method is found","operationId":"preAuthorizeRepairOrder","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"401":{"description":"Unauthorized."},"200":{"description":"OK"},"404":{"description":"Resource not found."},"400":{"description":"Bad Request."},"403":{"description":"Forbidden."}}}},"/api/users/{userId}/repair-orders/{referenceNum}/notes":{"get":{"tags":["user-notes-controller"],"summary":"Get all notes","operationId":"getAllNotes","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"All Repair Order notes","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Note"}}}}}}},"post":{"tags":["user-notes-controller"],"summary":"Create a new Note","operationId":"createNote","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"required":true},"responses":{"200":{"description":"The note was successfully created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Note"}}}}}}},"/api/users/{userId}/repair-orders/{referenceNum}/cancel-appointment":{"post":{"tags":["repair-order-controller"],"summary":"Cancel appointment","description":"Cancel an active appointment. Will throw an error if no appointment is scheduled or the appointment is already in progress or completed","operationId":"cancelAppointment","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelAppointmentRequest"}}},"required":true},"responses":{"200":{"description":"Appointment got cancelled successfully"}}}},"/api/users/{userId}/payment-methods":{"post":{"tags":["user-payment-methods-controller"],"summary":"Create a new Payment Method","description":"Add a card to the user file, the card will be used for pre-auth and payment","operationId":"createPartnerPaymentMethod","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodRequest"}}},"required":true},"responses":{"200":{"description":"The payment method was successfully created.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PaymentMethodResponse"}}}}}}},"/api/quotes":{"post":{"tags":["quotes-controller"],"summary":"Submit a request for a quote","description":"Creates a quote and an RO. Returns an ID for tracking the status of the Quote","operationId":"requestQuote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"200":{"description":"Request for Quote has successfully been submitted. Returns an ID for tracking the status of the Quote.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}}}}},"/api/quotes/{trackingId}/book-appointment":{"post":{"tags":["quotes-controller"],"summary":"Book an appointment for a quote","description":"Creates an appointment within the Repair Order, this means the user now has an scheduled confirmed time","operationId":"bookAppointment","parameters":[{"name":"trackingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookAppointmentRequest"}}},"required":true},"responses":{"200":{"description":"The appointment was successfully booked.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}}}}},"/api/quotes/{trackingId}/address":{"post":{"tags":["quotes-controller"],"summary":"Add Address to a quote","description":"If an address is not provided with the quote request it can be added here. The Address is necessary for availability checks and for appointment booking.\nAddress can only be added if the Repair Order doesn't have an active appointment","operationId":"addAddress","parameters":[{"name":"trackingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Address"}}},"required":true},"responses":{"200":{"description":"The Address was successfully added."}}}},"/api/estimates":{"post":{"tags":["estimates-controller"],"summary":"Get a pricing estimate","description":"Returns a pricing estimate for services by vehicle and zip","operationId":"getEstimates","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRequest"}}},"required":true},"responses":{"200":{"description":"Returns an Estimate with all available pricing info.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Estimate"}}}}}}},"/api/users/{userId}/repair-orders/{referenceNum}/notes/{noteId}":{"get":{"tags":["user-notes-controller"],"summary":"Get a note by id","operationId":"getNoteById","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}},{"name":"noteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Note is successfully retrieved","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Note"}}}}}},"patch":{"tags":["user-notes-controller"],"summary":"Update a note","operationId":"updateNote","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}},{"name":"noteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"required":true},"responses":{"200":{"description":"The note was successfully updated","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Note"}}}}}}},"/api/service-areas/{zipcode}":{"head":{"tags":["service-areas-controller"],"summary":"Determine whether AMS offers services in a given zip code","operationId":"serviceArea","parameters":[{"name":"zipcode","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"AMS offers services in this zip code.","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"AMS does not currently offer services in this zip code.","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/vehicles/years":{"get":{"tags":["vehicles-controller"],"summary":"Fetch supported years","operationId":"getSupportedYears","responses":{"200":{"description":"Returns a list of years.","content":{"*/*":{"schema":{"type":"array","items":{"type":"integer","format":"int32"}}}}}}}},"/api/vehicles/years/{year}/makes":{"get":{"tags":["vehicles-controller"],"summary":"Fetch supported makes for a specific year (e.g. Acura, BMW, etc)","operationId":"getSupportedMakes","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Returns a list of makes.","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}}}}}},"/api/vehicles/years/{year}/makes/{make}/models":{"get":{"tags":["vehicles-controller"],"summary":"Fetch supported models/engines/trims for a specific year and make (e.g. 2010 Acura)","operationId":"getSupportedModels","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"make","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Returns a list of models/engines/trims.","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Model"}}}}}}}},"/api/users/{userId}/repair-orders":{"get":{"tags":["repair-order-controller"],"summary":"Fetch repair orders by user ID","description":"Contains a list of details about the user/car/address/quote/appointment","operationId":"getRepairOrdersByUserId","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"401":{"description":"Unauthorized."},"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RepairOrderResponse"}}}}},"404":{"description":"Resource not found."},"400":{"description":"Bad Request."},"403":{"description":"Forbidden."}}}},"/api/users/{userId}/repair-orders/{referenceNum}":{"get":{"tags":["repair-order-controller"],"summary":"Fetch repair order by user ID and referenceNum","description":"Contains details about the user/car/address/quote/appointment","operationId":"getRepairOrderByReferenceNum","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"401":{"description":"Unauthorized."},"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RepairOrderResponse"}}}},"404":{"description":"Resource not found."},"400":{"description":"Bad Request."},"403":{"description":"Forbidden."}}}},"/api/users/{userId}/repair-orders/{referenceNum}/mpi/pdf":{"get":{"tags":["repair-order-controller"],"summary":"Fetch a link to download a PDF of the multi-point inspection (MPI) of a repair order by user ID and referenceNum","operationId":"getRepairOrderMpiPdfByReferenceNum","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"401":{"description":"Unauthorized."},"404":{"description":"Resource not found."},"400":{"description":"Bad Request."},"403":{"description":"Forbidden."},"200":{"description":"The mpi was successfully retrieved.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AssetUrlResponse"}}}}}}},"/api/users/{userId}/repair-orders/{referenceNum}/invoice":{"get":{"tags":["repair-order-controller"],"summary":"Fetch repair order invoice by user ID and referenceNum","operationId":"getRepairOrderInvoiceByReferenceNum","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"401":{"description":"Unauthorized."},"404":{"description":"Resource not found."},"200":{"description":"The invoice was successfully retrieved.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"400":{"description":"Bad Request."},"403":{"description":"Forbidden."}}}},"/api/users/{userId}/repair-orders/{referenceNum}/invoice/pdf":{"get":{"tags":["repair-order-controller"],"summary":"Fetch a link to download a PDF of the invoice of a repair order by user ID and referenceNum","operationId":"getRepairOrderInvoicePdfByReferenceNum","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"referenceNum","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"401":{"description":"Unauthorized."},"404":{"description":"Resource not found."},"200":{"description":"The invoice was successfully retrieved.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AssetUrlResponse"}}}},"400":{"description":"Bad Request."},"403":{"description":"Forbidden."}}}},"/api/services/search":{"get":{"tags":["services-controller"],"summary":"Search for available services","description":"Returns a list of services based on the search params, sorted by relevance.","operationId":"searchServices","parameters":[{"name":"request","in":"query","required":true,"schema":{"$ref":"#/components/schemas/SearchRequest"}}],"responses":{"200":{"description":"Returns a list of services based on the search params, sorted by relevance.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageDtoServiceSearch"}}}}}}},"/api/security/secure-tokenization":{"get":{"tags":["spreedly-security-controller"],"summary":"Get Spreedly Secure Tokenization Info","operationId":"getSecureTokenizationInfo","responses":{"200":{"description":"Returns a list of security fields to use in an instance of the Spreedly iFrame","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SpreedlySecureTokenizationInfo"}}}}}}},"/api/quotes/{trackingId}":{"get":{"tags":["quotes-controller"],"summary":"Fetch quote details","description":"Returns the full details of the Quote. Results may be incomplete while Quote is still in progress.","operationId":"fetchQuoteById","parameters":[{"name":"trackingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Returns the full details of the Quote. Results may be incomplete while Quote is still in progress.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}}}}},"/api/quotes/{trackingId}/status":{"get":{"tags":["quotes-controller"],"summary":"Fetch quote status","description":"Quote status can be [PENDING, PROCESSING, COMPLETED, FAILED]","operationId":"fetchQuoteStatus","parameters":[{"name":"trackingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Returns the status of the Quote.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}}}}},"/api/quotes/{trackingId}/check-availability":{"get":{"tags":["quotes-controller"],"summary":"Check available time slots for a quote","description":"Returns a list of time slots grouped by date. Each time slot represents an arrival window.","operationId":"checkAvailability","parameters":[{"name":"trackingId","in":"path","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Returns a list of time slots grouped by date. Each time slot represents an arrival window.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AvailabilityResponse"}}}}}}}},"components":{"schemas":{"Address":{"required":["city","state","street","zip"],"type":"object","properties":{"street":{"type":"string","example":"2333 Utah Ave"},"street2":{"type":"string"},"city":{"type":"string","example":"El Segundo"},"state":{"type":"string","example":"CA"},"zip":{"maxLength":5,"minLength":5,"type":"string","example":"90245"}}},"Aggregates":{"type":"object","properties":{"laborTotalPrice":{"type":"number"},"partsTotalPrice":{"type":"number"},"totalSublet":{"type":"number"},"subtotal":{"type":"number"},"discounts":{"type":"number"},"adjustments":{"type":"number"},"totalPrice":{"type":"number"},"balanceOwed":{"type":"number"},"paymentsReceivedTotal":{"type":"number"},"totalTaxes":{"type":"number"},"totalFees":{"type":"number"}}},"Appointment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"start":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"status":{"type":"string","enum":["PENDING","CONFIRMED","CANCELED","CLOSED"]},"arrivalWindow":{"type":"string","description":"The arrival window of the appointment in local time.","example":"2:00 PM - 4:00 PM"},"arrivalWindowStartUtc":{"pattern":"yyyy-MM-dd'T'HH:mm:ss'Z'","type":"string","description":"ISO timestamp of the arrival window start in UTC","example":"2026-07-06T10:00:00Z"},"arrivalWindowEndUtc":{"pattern":"yyyy-MM-dd'T'HH:mm:ss'Z'","type":"string","description":"ISO timestamp of the arrival window end in UTC","example":"2026-07-06T10:00:00Z"}}},"AssetUrlResponse":{"type":"object","properties":{"url":{"type":"string","description":"Link to download a requested resource.","example":"https://test-servus-documents.s3.amazonaws.com/mpi-documents/health-reports/3139492b-73a2-4497-8ccc-d1c1ee0b0e73.pdf"}}},"AvailabilityResponse":{"type":"object","properties":{"address":{"type":"string","description":"The full service address, normalized","example":"2333 Utah Ave, El Segundo CA 90245"},"slots":{"type":"object","additionalProperties":{"type":"array","description":"Calculated slots representing the availability for the given parameters","example":"{'2022-02-22': [<TimeSlot>, <TimeSlot>], '2022-02-23': [<TimeSlot>]}","items":{"$ref":"#/components/schemas/TimeSlot"}},"description":"Calculated slots representing the availability for the given parameters","example":"{'2022-02-22': [<TimeSlot>, <TimeSlot>], '2022-02-23': [<TimeSlot>]}"}}},"BookAppointmentRequest":{"required":["slot"],"type":"object","properties":{"trackingId":{"type":"string","description":"The tracking ID for a quote request","format":"uuid","example":"5fcd82bf-15e4-42ab-b5bf-e52470f18f88"},"referenceNum":{"type":"string","description":"The user-friendly reference number for a quote","example":"AA0013835"},"slot":{"$ref":"#/components/schemas/TimeSlot"}}},"CancelAppointmentRequest":{"type":"object","properties":{"userAcceptsCancellationFee":{"type":"boolean","description":"User has accepted the cancellation fee"}}},"Car":{"type":"object","properties":{"year":{"type":"integer","format":"int32","example":2010},"make":{"type":"string","example":"Acura"},"model":{"type":"string","example":"TSX"},"subModel":{"type":"string","example":"V6"},"engine":{"type":"string","example":"3.5L V6"},"engineId":{"type":"integer","format":"int32","example":9084},"baseVehicleId":{"type":"integer","format":"int32","example":30489},"vin":{"type":"string","example":"JH4CU2F61CL005749"},"mileage":{"type":"integer","format":"int32","example":10000}},"description":"Either VIN or Car Details(EngineId/BaseVehicleId) are required. If Vin is provided then length must be 17 characters"},"Component":{"type":"object","properties":{"type":{"type":"string","description":"The component type","example":"LABOR, PART, OR FLUID"},"name":{"type":"string","description":"The name of the component","example":"Spark Plugs"},"quantity":{"type":"number","description":"The required number of units of this component","example":2},"unit":{"type":"string","description":"The unit type for this component","example":"ITEM, HOUR, QUART, LITER, OUNCE, GRAM, MILLILITER/ML, GALLON, DOLLAR or PERCENT"},"unitPrice":{"type":"number","description":"The price of a single unit","example":12.99},"price":{"type":"number","description":"The total price of the component (quantity * unit price)","example":12.99}},"description":"The list of components required for this service","example":"LABOR, PARTS, FLUIDS"},"ComponentEstimate":{"type":"object","properties":{"type":{"type":"string","description":"The component type","example":"LABOR, PART, OR FLUID"},"name":{"type":"string","description":"The name of the component","example":"Spark Plugs"},"quantity":{"type":"number","description":"The required number of units of this component","example":2},"minQuantity":{"type":"number","description":"The minimum estimated number of units of this component","example":2},"maxQuantity":{"type":"number","description":"The maximum estimated number of units of this component","example":2},"unit":{"type":"string","description":"The unit type for this component","example":"ITEM, HOUR, QUART, LITER, OUNCE, GRAM, MILLILITER/ML, GALLON, DOLLAR or PERCENT"},"unitPrice":{"type":"number","description":"The price of a single unit","example":12.99},"minUnitPrice":{"type":"number","description":"The minimum estimated price of a single unit","example":12.99},"maxUnitPrice":{"type":"number","description":"The maximum estimated price of a single unit","example":12.99},"price":{"type":"number","description":"The total price of the component (quantity * unit price)","example":12.99},"minPrice":{"type":"number","description":"The minimum total price of the component (minQuantity * minUnitPrice)","example":12.99},"maxPrice":{"type":"number","description":"The maximum total price of the component (maxQuantity * maxUnitPrice)","example":12.99}},"description":"The list of components required for this service","example":"LABOR, PARTS, FLUIDS"},"ContactInfo":{"required":["email","firstName","lastName","phone"],"type":"object","properties":{"firstName":{"type":"string","example":"John"},"lastName":{"type":"string","example":"Doe"},"email":{"type":"string","example":"example_email@address.com"},"phone":{"pattern":"^$|[2-9]{1}\\d{2}[2-9]{1}\\d{6}","type":"string","example":"2345551234"}}},"Discount":{"type":"object","properties":{"promoCode":{"type":"string"},"description":{"type":"string"},"amount":{"type":"number"}}},"Engine":{"type":"object","properties":{"id":{"type":"integer","format":"int32","example":9084},"description":{"type":"string","example":"3.5L V6"},"baseVehicleId":{"type":"integer","format":"int64","example":30489},"vehicleId":{"type":"integer","format":"int64"}}},"Estimate":{"type":"object","properties":{"totalPrice":{"type":"number","description":"The estimated total price before taxes","example":99.99},"minTotalPrice":{"type":"number","description":"The sum of all minimum service estimates","example":99.99},"maxTotalPrice":{"type":"number","description":"The sum of all maximum service estimates","example":99.99},"services":{"type":"array","description":"The list of services for this estimate","items":{"$ref":"#/components/schemas/ServiceEstimate"}},"fees":{"$ref":"#/components/schemas/Fees"},"discounts":{"type":"array","items":{"$ref":"#/components/schemas/Discount"}}}},"EstimateRequest":{"required":["car","services","zipCode"],"type":"object","properties":{"car":{"$ref":"#/components/schemas/Car"},"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceRequest"}},"zipCode":{"maxLength":5,"minLength":5,"type":"string","example":"90245"}}},"FeeItems":{"type":"object","properties":{"name":{"type":"string"},"amount":{"type":"number"}},"description":"The list of Fees for this quote"},"Fees":{"type":"object","properties":{"totalFees":{"type":"number"}}},"Invoice":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"referenceNum":{"type":"string"},"fees":{"$ref":"#/components/schemas/Fees"},"taxes":{"$ref":"#/components/schemas/Taxes"},"aggregates":{"$ref":"#/components/schemas/Aggregates"},"payments":{"type":"array","items":{"$ref":"#/components/schemas/Payment"}},"discounts":{"type":"array","items":{"$ref":"#/components/schemas/Discount"}},"car":{"$ref":"#/components/schemas/Car"},"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}},"userProfile":{"$ref":"#/components/schemas/UserProfile"},"contactInfo":{"$ref":"#/components/schemas/ContactInfo"},"feeItems":{"type":"array","items":{"$ref":"#/components/schemas/FeeItems"}}}},"Model":{"type":"object","properties":{"model":{"type":"string","example":"TSX"},"subModels":{"type":"array","example":"[Base, V6]","items":{"type":"string","example":"[Base, V6]"}},"engines":{"type":"array","items":{"$ref":"#/components/schemas/Engine"}}}},"Note":{"required":["content","type"],"type":"object","properties":{"content":{"type":"string","example":"Arrival instructions..."},"type":{"type":"string","example":"ARRIVAL_INSTRUCTIONS","enum":["ARRIVAL_INSTRUCTIONS"]}}},"PageDtoServiceSearch":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/ServiceSearch"}},"number":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"numberOfElements":{"type":"integer","format":"int32"},"empty":{"type":"boolean"},"sort":{"type":"object","additionalProperties":{"type":"object"}},"pageable":{"$ref":"#/components/schemas/PageableDto"}}},"PageableDto":{"type":"object","properties":{"pageNumber":{"type":"integer","format":"int32"},"pageSize":{"type":"integer","format":"int32"},"sort":{"type":"object","additionalProperties":{"type":"object"}},"offset":{"type":"integer","format":"int64"},"unpaged":{"type":"boolean"},"paged":{"type":"boolean"}}},"Payment":{"type":"object","properties":{"description":{"type":"string"},"amount":{"type":"number"},"refundReason":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"}}},"PaymentMethodRequest":{"required":["methodType","token"],"type":"object","properties":{"token":{"type":"string"},"methodType":{"type":"string","enum":["CREDIT_CARD","AFFIRM"]}}},"PaymentMethodResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"integer","format":"int64"},"token":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"lastFourDigits":{"type":"string"},"firstSixDigits":{"type":"string"},"monthExpiration":{"type":"integer","format":"int32"},"yearExpiration":{"type":"integer","format":"int32"},"cardType":{"type":"string","enum":["VISA","MASTERCARD","AMEX","DISCOVER","DANKORT","JCB","DINERS_CLUB"]},"methodType":{"type":"string","enum":["CREDIT_CARD","AFFIRM"]}}},"Quote":{"type":"object","properties":{"totalPrice":{"type":"number","description":"The estimated total price before taxes","example":99.99},"services":{"type":"array","description":"The list of services for this quote","items":{"$ref":"#/components/schemas/Service"}},"fees":{"$ref":"#/components/schemas/Fees"},"discounts":{"type":"array","items":{"$ref":"#/components/schemas/Discount"}},"feeItems":{"type":"array","description":"The list of Fees for this quote","items":{"$ref":"#/components/schemas/FeeItems"}}}},"QuoteRequest":{"required":["car","services","userProfile"],"type":"object","properties":{"car":{"$ref":"#/components/schemas/Car"},"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceRequest"}},"address":{"$ref":"#/components/schemas/Address"},"userProfile":{"$ref":"#/components/schemas/UserProfile"},"zipCode":{"maxLength":5,"minLength":5,"type":"string","example":"90245"}},"description":"ZipCode is required if Address is not included. If Zip Code is provided it must be 5 characters long"},"QuoteResponse":{"type":"object","properties":{"trackingId":{"type":"string"},"status":{"type":"string"},"metadata":{"type":"object","additionalProperties":{"type":"object"}}}},"RepairOrderResponse":{"type":"object","properties":{"referenceNum":{"type":"string"},"car":{"$ref":"#/components/schemas/Car"},"userProfile":{"$ref":"#/components/schemas/UserProfile"},"address":{"$ref":"#/components/schemas/Address"},"quote":{"$ref":"#/components/schemas/Quote"},"appointment":{"$ref":"#/components/schemas/Appointment"},"payments":{"type":"array","items":{"$ref":"#/components/schemas/Payment"}},"contactInfo":{"$ref":"#/components/schemas/ContactInfo"}}},"SearchRequest":{"type":"object","properties":{"query":{"type":"string","description":"Keyword search. Leave blank to fetch all services","example":"oil"},"pageSize":{"type":"integer","description":"The items per page","format":"int32","example":20,"default":20},"fromIndex":{"type":"integer","description":"The index from which to start the search","format":"int32","default":0}}},"Service":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the service","format":"int32","example":12},"name":{"type":"string","description":"The name of the service","example":"Synthetic Oil Change"},"price":{"type":"number","description":"The total price of this service","example":99.99},"components":{"type":"array","description":"The list of components required for this service","example":"LABOR, PARTS, FLUIDS","items":{"$ref":"#/components/schemas/Component"}},"feeItems":{"type":"array","description":"The list of Fees for this Repair","items":{"$ref":"#/components/schemas/FeeItems"}}},"description":"The list of services for this quote"},"ServiceEstimate":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the service","format":"int32","example":12},"name":{"type":"string","description":"The name of the service","example":"Synthetic Oil Change"},"price":{"type":"number","description":"The total price of this service","example":99.99},"minPrice":{"type":"number","description":"The minimum total price of this service","example":99.99},"maxPrice":{"type":"number","description":"The maximum total price of this service","example":99.99},"components":{"type":"array","description":"The list of components required for this service","example":"LABOR, PARTS, FLUIDS","items":{"$ref":"#/components/schemas/ComponentEstimate"}}},"description":"The list of services for this estimate"},"ServiceRequest":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"The ID of the service","format":"int32","example":12},"name":{"type":"string","description":"The name of the service","example":"Synthetic Oil Change"}}},"ServiceSearch":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the service","format":"int32","example":12},"name":{"type":"string","description":"The name of the service","example":"Synthetic Oil Change"}}},"SpreedlySecureTokenizationInfo":{"type":"object","properties":{"nonce":{"type":"string","format":"uuid"},"timestamp":{"type":"string"},"certificateToken":{"type":"string"},"signature":{"type":"string"}}},"Taxes":{"type":"object","properties":{"totalTaxes":{"type":"number"}}},"TimeSlot":{"required":["date","start","vanId"],"type":"object","properties":{"date":{"type":"string","description":"The date of appointment","format":"date","example":"2022-04-01"},"start":{"type":"string","description":"The start time of arrival window","example":"2:00 PM"},"offset":{"type":"integer","description":"For internal use. This must be included when booking an appointment","format":"int32","example":0},"vanId":{"type":"string","description":"For internal use. This must be included when booking an appointment","format":"uuid","example":"5f6e9217-d729-4d1b-9ea8-7975828de25b"},"arrivalWindow":{"type":"string","description":"The arrival window of the appointment. This is what the consumer is choosing when booking the appointment","example":"2:00 PM - 4:00 PM"},"timezone":{"type":"string","description":"The timezone in which the appointment will be scheduled","example":"America/Los_Angeles"},"arrivalWindowStartUtc":{"pattern":"yyyy-MM-dd'T'HH:mm:ss'Z'","type":"string","description":"ISO timestamp of the arrival window start in UTC","example":"2026-07-06T10:00:00Z"},"arrivalWindowEndUtc":{"pattern":"yyyy-MM-dd'T'HH:mm:ss'Z'","type":"string","description":"ISO timestamp of the arrival window end in UTC","example":"2026-07-06T10:00:00Z"}},"description":"The requested time slot"},"UserProfile":{"required":["email","firstName","lastName","phone"],"type":"object","properties":{"firstName":{"pattern":"[a-zA-Z0-9\\'\\-\\’ ]*[a-zA-Z][a-zA-Z0-9 ]*","type":"string","example":"John"},"lastName":{"pattern":"[a-zA-Z0-9\\'\\-\\’ ]*[a-zA-Z][a-zA-Z0-9 ]*","type":"string","example":"Doe"},"email":{"type":"string","example":"johndoe@repairsmith.com"},"phone":{"pattern":"^$|[2-9]{1}\\d{2}[2-9]{1}\\d{6}","type":"string","example":"3332224444"}}}},"securitySchemes":{"ApiKey":{"type":"apiKey","description":"The API Key issued to you by AMS","name":"rs-x-api-key","in":"header"}}}}