{"openapi":"3.1.0","info":{"title":"Moveroo public quote API","version":"2026-06-30","description":"Official host-aware public API for customer-authorised household removals and vehicle transport quote submissions."},"servers":[{"url":"https:\/\/quoting.backloading-au.com.au"}],"externalDocs":{"description":"Official public agent quote API guide","url":"https:\/\/quoting.backloading-au.com.au\/agents"},"paths":{"\/api\/v1\/estimate-volume":{"post":{"summary":"Estimate household move volume","description":"Returns a deterministic cubic metre estimate from customer-authorised inventory text, structured items, and optional dwelling profile. This is an estimate for quote preparation, not a guaranteed final cubing result.","operationId":"estimateHouseholdMoveVolume","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EstimateVolumeRequest"}}}},"responses":{"200":{"description":"Volume estimate with confidence, assumptions, and household quote submit next step.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EstimateVolumeResponse"}}}},"404":{"description":"This host does not expose the public quote capability manifest."},"422":{"description":"Validation failed. Check consent, origin_domain, and inventory or dwelling input."},"429":{"description":"Rate limited. Retry later."}}}},"\/api\/v1\/household-quotes\/assistant\/submit":{"post":{"summary":"Submit a household removals quote request","description":"Creates a host-aware household quote entry for staff review. Requires customer consent fields and does not require a customer login.","operationId":"submitHouseholdQuote","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/HouseholdQuoteSubmission"}}}},"responses":{"200":{"description":"Duplicate or idempotent submission accepted."},"201":{"description":"Quote submission accepted."},"422":{"description":"Validation failed. Check required fields, consent, conditional requirements, and any locality suggestions returned for ambiguous vehicle pickup or delivery locations. Household submissions also reject measurement text in route_text, pickup, delivery, or extra-stop locality fields before creating a draft or quote; put volume in the dedicated inventory fields and resubmit the corrected payload."},"429":{"description":"Rate limited. Retry later with the same idempotency key where possible."}}}},"\/api\/v1\/vehicle-quotes\/assistant\/submit":{"post":{"summary":"Submit a vehicle transport quote request","description":"Creates a host-aware vehicle quote request using the current vehicle workflow. Public submissions require a customer phone value, which may still be recorded as non-callable when the supplied value is invalid. An approved internal operator may omit the phone only with actor_context and an explicit missing-phone fallback decision. Requires customer consent fields and does not require a customer login.","operationId":"submitVehicleQuote","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VehicleQuoteSubmission"}}}},"responses":{"200":{"description":"Duplicate or idempotent submission accepted."},"201":{"description":"Quote submission accepted."},"422":{"description":"Validation failed. Check required fields, consent, conditional requirements, and any locality suggestions returned for ambiguous vehicle pickup or delivery locations. Household submissions also reject measurement text in route_text, pickup, delivery, or extra-stop locality fields before creating a draft or quote; put volume in the dedicated inventory fields and resubmit the corrected payload."},"429":{"description":"Rate limited. Retry later with the same idempotency key where possible."}},"x-moveroo-webmcp":null}},"\/api\/v1\/vehicle-quotes\/assistant\/intake\/session":{"get":{"summary":"Discover the vehicle quote intake workflow for this host","description":"Returns host-aware vehicle quote workflow capabilities and endpoint paths. Use the intake workflow when a complete one-shot vehicle quote payload is not yet available.","operationId":"vehicleQuoteIntakeSession","responses":{"200":{"description":"Vehicle quote intake workflow is available for this host."},"404":{"description":"This host does not expose the public quote capability manifest."},"422":{"description":"This host could not be resolved to one active vehicle quote tenant."}}}},"\/api\/v1\/vehicle-quotes\/assistant\/intake\/{action}":{"post":{"summary":"Continue a vehicle quote intake workflow","description":"Server-held multi-step vehicle quote intake for public agents, chat, and voice adapters. Supported actions are message, contact, category, pickup, delivery, vehicle, vehicle-detail, drivable, dimension-check, confirm, summary, and submit. Customer consent is required only on submit.","operationId":"vehicleQuoteIntakeAction","parameters":[{"name":"action","in":"path","required":true,"schema":{"type":"string","enum":["message","contact","category","pickup","delivery","vehicle","vehicle-detail","drivable","dimension-check","confirm","summary","submit"]}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VehicleQuoteIntakeAction"}}}},"responses":{"200":{"description":"Workflow state, next step, messages, and any suggestions or submission result."},"403":{"description":"Draft session token is missing or invalid."},"422":{"description":"Validation failed or a clarification is required."},"429":{"description":"Rate limited. Retry later with the same draft\/session details where possible."}}}},"\/api\/v1\/vehicle-quotes\/results\/actions":{"post":{"summary":"Find public vehicle quote result actions","description":"Looks up customer-safe vehicle quote result actions. Email-only lookup returns quote choices; full result actions require quote_reference plus the matching customer email.","operationId":"vehicleQuoteResultActions","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VehicleQuoteResultsActionsRequest"}}}},"responses":{"200":{"description":"Customer-safe quote choices or result actions."},"404":{"description":"This host does not expose the public vehicle quote result capability."},"422":{"description":"Validation failed. Check consent, origin_domain, email verification, and quote reference."},"429":{"description":"Rate limited. Retry later."}}}},"\/api\/v1\/vehicle-quotes\/results\/book-option":{"post":{"summary":"Submit a selected vehicle quote booking request","description":"Submits a customer-authorised booking continuation for a selected vehicle quote option. Requires a current confirmation fingerprint and idempotency key. No payment details are accepted by this API.","operationId":"bookVehicleQuoteOption","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VehicleQuoteBookingRequest"}}}},"responses":{"200":{"description":"Booking request accepted or idempotent retry returned."},"404":{"description":"Quote not found for the supplied email\/reference."},"409":{"description":"The selected option or confirmation fingerprint must be refreshed."},"422":{"description":"Validation failed or the quote is not currently bookable."},"429":{"description":"Rate limited. Retry later with the same idempotency key where possible."}}}},"\/api\/v1\/household-quotes\/booking\/actions":{"post":{"summary":"Find household booking actions for a priced quote","description":"Looks up customer-safe household quote booking actions. Agents may supply quote_reference plus customer email or phone, or an email-only lookup that returns safe quote choices before any booking details are disclosed.","operationId":"householdBookingActions","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/HouseholdBookingActionsRequest"}}}},"responses":{"200":{"description":"Booking action, confirmation, duplicate, or booking request response."},"404":{"description":"Quote or email-only match not found for this host and verification context."},"409":{"description":"The quote details changed and the selected option must be reconfirmed."},"422":{"description":"Validation failed, the option is unavailable, or the quote is not currently bookable."},"429":{"description":"Rate limited. Retry later with the same idempotency key where possible."}}}},"\/api\/v1\/household-quotes\/booking\/confirm-option":{"post":{"summary":"Confirm a household quote option before booking","description":"Returns the customer-safe confirmation snapshot and fingerprint that must be supplied to book the selected household quote option.","operationId":"confirmHouseholdBookingOption","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/HouseholdBookingConfirmRequest"}}}},"responses":{"200":{"description":"Booking action, confirmation, duplicate, or booking request response."},"404":{"description":"Quote or email-only match not found for this host and verification context."},"409":{"description":"The quote details changed and the selected option must be reconfirmed."},"422":{"description":"Validation failed, the option is unavailable, or the quote is not currently bookable."},"429":{"description":"Rate limited. Retry later with the same idempotency key where possible."}}}},"\/api\/v1\/household-quotes\/booking\/book-option":{"post":{"summary":"Submit a household booking request","description":"Submits a customer-authorised household booking request for a selected priced option. No payment is collected through this API.","operationId":"bookHouseholdQuoteOption","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/HouseholdBookingRequest"}}}},"responses":{"200":{"description":"Booking action, confirmation, duplicate, or booking request response."},"404":{"description":"Quote or email-only match not found for this host and verification context."},"409":{"description":"The quote details changed and the selected option must be reconfirmed."},"422":{"description":"Validation failed, the option is unavailable, or the quote is not currently bookable."},"429":{"description":"Rate limited. Retry later with the same idempotency key where possible."}}}},"\/api\/v1\/callbacks\/assistant\/request":{"post":{"summary":"Request a callback time","description":"Books a host-aware callback appointment using the same callback availability as the public contact page. Requires customer consent fields and does not require a customer login.","operationId":"requestCallbackTime","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CallbackRequest"}}}},"responses":{"200":{"description":"Duplicate or idempotent callback request accepted."},"201":{"description":"Callback appointment booked."},"404":{"description":"This host does not expose the public callback capability."},"422":{"description":"Validation failed. Check consent, customer details, origin domain, and whether the selected callback slot is still available."},"429":{"description":"Rate limited. Retry later with the same idempotency key where possible."}}}},"\/api\/v1\/callbacks\/assistant\/slots":{"get":{"summary":"List available callback times","description":"Returns the currently selectable callback appointment slots for this approved host.","operationId":"listCallbackTimes","responses":{"200":{"description":"Available callback slot groups.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CallbackSlotsResponse"}}}},"404":{"description":"This host does not expose the public callback capability."},"429":{"description":"Rate limited. Retry later."}}}},"\/api\/v1\/customer-assistant\/support\/answer":{"post":{"summary":"Answer a generic Customer Assistant support question","description":"Returns a customer-safe support answer from active approved FAQ entries, or a household quote handoff when the customer is asking for a move quote. Close FAQ matches can return status=suggested and should be shown as tentative with feedback options. Draft, proposed, and archived FAQ entries are never customer-visible.","operationId":"answerCustomerAssistantSupportQuestion","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CustomerAssistantSupportAnswerRequest"}}}},"responses":{"200":{"description":"Approved FAQ answer or bounded fallback.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CustomerAssistantSupportAnswerResponse"}}}},"422":{"description":"Validation failed. Supply a bounded question string."},"429":{"description":"Rate limited. Retry later."}}}},"\/api\/v1\/customer-assistant\/support\/feedback":{"post":{"summary":"Record Customer Assistant support suggestion feedback","description":"Records whether a suggested approved FAQ answer helped. did_not_help creates unanswered-question review evidence with optional conversation context for staff or approved-agent FAQ improvement.","operationId":"recordCustomerAssistantSupportFeedback","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CustomerAssistantSupportFeedbackRequest"}}}},"responses":{"200":{"description":"Feedback accepted and, when relevant, unanswered-question evidence captured.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CustomerAssistantSupportFeedbackResponse"}}}},"422":{"description":"Validation failed. Supply question, outcome, and only active FAQ ids when provided."},"429":{"description":"Rate limited. Retry later."}}}}},"components":{"schemas":{"CustomerConsent":{"type":"object","required":["confirmed","basis"],"properties":{"confirmed":{"type":"boolean","const":true,"description":"Must be true when the customer has asked the agent to request a quote."},"basis":{"type":"string","enum":["customer_requested_quote"]}}},"CallbackConsent":{"type":"object","required":["confirmed","basis"],"properties":{"confirmed":{"type":"boolean","const":true,"description":"Must be true when the customer has asked the agent to request a callback."},"basis":{"type":"string","enum":["customer_requested_callback"]}}},"LeadAttribution":{"type":"object","additionalProperties":false,"description":"Optional cross-domain marketing lead attribution supplied by controlled marketing sites or approved agents. Values are untrusted, bounded, and never treated as customer identity.","properties":{"lead_intent_id":{"type":"string","maxLength":120,"pattern":"^[A-Za-z0-9._:-]+$"},"source_site":{"type":"string","maxLength":253,"pattern":"^(?=.*[A-Za-z])(?=.{1,253}(?![\\s\\S]))[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*(?![\\s\\S])","description":"Marketing hostname that generated the lead intent. Leading\/trailing whitespace, email addresses, paths, malformed host labels, and controls are rejected."},"source_path":{"type":"string","maxLength":512,"description":"Marketing path only; query strings and PII are stripped before storage."},"intent_type":{"type":"string","enum":["quote_household","quote_vehicle","booking_household","contact"]}}},"CallbackAttributionTouch":{"type":"object","additionalProperties":false,"properties":{"utm":{"type":"object","maxProperties":10,"additionalProperties":false,"properties":{"utm_source":{"type":"string","minLength":1,"maxLength":255,"description":"Whitespace is trimmed; control characters and malformed values are rejected before persistence.","not":{"pattern":"^(?:\\s*|[\\s\\S]*[\\x00-\\x1F\\x7F][\\s\\S]*)$"}},"utm_medium":{"type":"string","minLength":1,"maxLength":255,"description":"Whitespace is trimmed; control characters and malformed values are rejected before persistence.","not":{"pattern":"^(?:\\s*|[\\s\\S]*[\\x00-\\x1F\\x7F][\\s\\S]*)$"}},"utm_campaign":{"type":"string","minLength":1,"maxLength":255,"description":"Whitespace is trimmed; control characters and malformed values are rejected before persistence.","not":{"pattern":"^(?:\\s*|[\\s\\S]*[\\x00-\\x1F\\x7F][\\s\\S]*)$"}},"utm_term":{"type":"string","minLength":1,"maxLength":255,"description":"Whitespace is trimmed; control characters and malformed values are rejected before persistence.","not":{"pattern":"^(?:\\s*|[\\s\\S]*[\\x00-\\x1F\\x7F][\\s\\S]*)$"}},"utm_content":{"type":"string","minLength":1,"maxLength":255,"description":"Whitespace is trimmed; control characters and malformed values are rejected before persistence.","not":{"pattern":"^(?:\\s*|[\\s\\S]*[\\x00-\\x1F\\x7F][\\s\\S]*)$"}},"utm_id":{"type":"string","minLength":1,"maxLength":255,"description":"Whitespace is trimmed; control characters and malformed values are rejected before persistence.","not":{"pattern":"^(?:\\s*|[\\s\\S]*[\\x00-\\x1F\\x7F][\\s\\S]*)$"}},"utm_source_platform":{"type":"string","minLength":1,"maxLength":255,"description":"Whitespace is trimmed; control characters and malformed values are rejected before persistence.","not":{"pattern":"^(?:\\s*|[\\s\\S]*[\\x00-\\x1F\\x7F][\\s\\S]*)$"}}}},"click_ids":{"type":"object","maxProperties":8,"additionalProperties":false,"properties":{"gclid":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[A-Za-z0-9._:-]+$","description":"Identifier characters only; reserved synthetic values are rejected before persistence.","not":{"pattern":"^(?:[sS][hH][oO][uU][lL][dD]-[nN][oO][tT]-.*|[cC][oO][nN][tT][rR][oO][lL](?:[-_].*)?|[tT][eE][sS][tT]|[fF][aA][kK][eE]|[dD][uU][mM][mM][yY]|[eE][xX][aA][mM][pP][lL][eE]|[nN][uU][lL][lL]|[uU][nN][dD][eE][fF][iI][nN][eE][dD])$"}},"gbraid":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[A-Za-z0-9._:-]+$","description":"Identifier characters only; reserved synthetic values are rejected before persistence.","not":{"pattern":"^(?:[sS][hH][oO][uU][lL][dD]-[nN][oO][tT]-.*|[cC][oO][nN][tT][rR][oO][lL](?:[-_].*)?|[tT][eE][sS][tT]|[fF][aA][kK][eE]|[dD][uU][mM][mM][yY]|[eE][xX][aA][mM][pP][lL][eE]|[nN][uU][lL][lL]|[uU][nN][dD][eE][fF][iI][nN][eE][dD])$"}},"wbraid":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[A-Za-z0-9._:-]+$","description":"Identifier characters only; reserved synthetic values are rejected before persistence.","not":{"pattern":"^(?:[sS][hH][oO][uU][lL][dD]-[nN][oO][tT]-.*|[cC][oO][nN][tT][rR][oO][lL](?:[-_].*)?|[tT][eE][sS][tT]|[fF][aA][kK][eE]|[dD][uU][mM][mM][yY]|[eE][xX][aA][mM][pP][lL][eE]|[nN][uU][lL][lL]|[uU][nN][dD][eE][fF][iI][nN][eE][dD])$"}},"msclkid":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[A-Za-z0-9._:-]+$","description":"Identifier characters only; reserved synthetic values are rejected before persistence.","not":{"pattern":"^(?:[sS][hH][oO][uU][lL][dD]-[nN][oO][tT]-.*|[cC][oO][nN][tT][rR][oO][lL](?:[-_].*)?|[tT][eE][sS][tT]|[fF][aA][kK][eE]|[dD][uU][mM][mM][yY]|[eE][xX][aA][mM][pP][lL][eE]|[nN][uU][lL][lL]|[uU][nN][dD][eE][fF][iI][nN][eE][dD])$"}},"fbclid":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[A-Za-z0-9._:-]+$","description":"Identifier characters only; reserved synthetic values are rejected before persistence.","not":{"pattern":"^(?:[sS][hH][oO][uU][lL][dD]-[nN][oO][tT]-.*|[cC][oO][nN][tT][rR][oO][lL](?:[-_].*)?|[tT][eE][sS][tT]|[fF][aA][kK][eE]|[dD][uU][mM][mM][yY]|[eE][xX][aA][mM][pP][lL][eE]|[nN][uU][lL][lL]|[uU][nN][dD][eE][fF][iI][nN][eE][dD])$"}}}},"lead_intent":{"type":"object","maxProperties":4,"additionalProperties":false,"properties":{"lead_intent_id":{"type":"string","maxLength":120,"pattern":"^[A-Za-z0-9._:-]+$"},"source_site":{"type":"string","maxLength":253,"pattern":"^(?=.*[A-Za-z])(?=.{1,253}(?![\\s\\S]))[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*(?![\\s\\S])"},"source_path":{"type":"string","maxLength":512,"pattern":"^\/(?!\/)[A-Za-z0-9._~\/-]*$","not":{"pattern":"\\b(?:61|0)[2-478](?:[.-]?\\d){8}\\b"},"description":"Marketing path only. It must start with \/ and use safe path characters; email addresses, Australian phone-like values, and percent-encoded input are rejected."},"intent_type":{"type":"string","enum":["quote_household","quote_vehicle","booking_household","contact"]}}},"landing_url":{"type":"string","maxLength":2000,"format":"uri","pattern":"^(?!.*[\\x00-\\x1F\\x7F])(?!.*%(?![0-9A-Fa-f]{2}))https?:\/\/(?=[A-Za-z0-9.-]{1,253}(?:[\/?#]|$))(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)*[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:[\/?][A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*(?:#[A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*)?|#[A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*)?$","x-moveroo-query-contract":{"validation":"server-side-semantic","query_decoding":"percent-decoded-before-validation","allowed_keys":{"utm":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_source_platform"],"click_ids":["gclid","gbraid","wbraid","msclkid","fbclid"],"internal":["utm_internal"],"lead_intent":["lead_intent_id","source_site","source_path","intent_type"],"all":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_source_platform","gclid","gbraid","wbraid","msclkid","fbclid","utm_internal","lead_intent_id","source_site","source_path","intent_type"]},"family_value_handling":{"utm":"AttributionUtmParameters","click_ids":"AttributionClickIds","internal":"url-whitelist-retained","lead_intent":"LeadIntentAttribution"},"key_matching":"exact","aliases":"rejected","duplicates":"rejected","canonical_url_max_bytes":2000,"canonical_url_max_bytes_measurement":"after-normalization-and-percent-encoding","canonical_url_overflow_status":422,"utm_value_constraints":{"trim_whitespace":true,"non_empty":true,"valid_utf8":true,"control_characters":"rejected","max_characters":255},"click_id_value_constraints":{"pattern":"^[A-Za-z0-9._:-]+$","reserved_values":"rejected","max_characters":256},"invalid_request_status":422,"unrelated_query_keys":"removed-before-persistence"},"description":"HTTP(S) URL without userinfo or an explicit port. The server validates configured attribution keys after percent-decoding. UTM and click-ID values use their family-specific constraints; internal flags are retained by the URL whitelist, and lead-intent values use their family-specific normalizer. Aliases, duplicates, malformed values, and values rejected by a family validator return HTTP 422. Unrelated query strings may be removed before persistence."},"canonical_landing_url":{"type":"string","maxLength":2000,"format":"uri","pattern":"^(?!.*[\\x00-\\x1F\\x7F])(?!.*%(?![0-9A-Fa-f]{2}))https?:\/\/(?=[A-Za-z0-9.-]{1,253}(?:[\/?#]|$))(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)*[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:[\/?][A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*(?:#[A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*)?|#[A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*)?$","x-moveroo-query-contract":{"validation":"server-side-semantic","query_decoding":"percent-decoded-before-validation","allowed_keys":{"utm":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_source_platform"],"click_ids":["gclid","gbraid","wbraid","msclkid","fbclid"],"internal":["utm_internal"],"lead_intent":["lead_intent_id","source_site","source_path","intent_type"],"all":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_source_platform","gclid","gbraid","wbraid","msclkid","fbclid","utm_internal","lead_intent_id","source_site","source_path","intent_type"]},"family_value_handling":{"utm":"AttributionUtmParameters","click_ids":"AttributionClickIds","internal":"url-whitelist-retained","lead_intent":"LeadIntentAttribution"},"key_matching":"exact","aliases":"rejected","duplicates":"rejected","canonical_url_max_bytes":2000,"canonical_url_max_bytes_measurement":"after-normalization-and-percent-encoding","canonical_url_overflow_status":422,"utm_value_constraints":{"trim_whitespace":true,"non_empty":true,"valid_utf8":true,"control_characters":"rejected","max_characters":255},"click_id_value_constraints":{"pattern":"^[A-Za-z0-9._:-]+$","reserved_values":"rejected","max_characters":256},"invalid_request_status":422,"unrelated_query_keys":"removed-before-persistence"},"description":"HTTP(S) URL without userinfo or an explicit port. The server validates configured attribution keys after percent-decoding. UTM and click-ID values use their family-specific constraints; internal flags are retained by the URL whitelist, and lead-intent values use their family-specific normalizer. Aliases, duplicates, malformed values, and values rejected by a family validator return HTTP 422. Unrelated query strings may be removed before persistence."},"raw_landing_url":{"type":"string","maxLength":2000,"format":"uri","pattern":"^(?!.*[\\x00-\\x1F\\x7F])(?!.*%(?![0-9A-Fa-f]{2}))https?:\/\/(?=[A-Za-z0-9.-]{1,253}(?:[\/?#]|$))(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)*[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:[\/?][A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*(?:#[A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*)?|#[A-Za-z0-9._~!$&'()*+,;=:@\/?%-]*)?$","x-moveroo-query-contract":{"validation":"server-side-semantic","query_decoding":"percent-decoded-before-validation","allowed_keys":{"utm":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_source_platform"],"click_ids":["gclid","gbraid","wbraid","msclkid","fbclid"],"internal":["utm_internal"],"lead_intent":["lead_intent_id","source_site","source_path","intent_type"],"all":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_source_platform","gclid","gbraid","wbraid","msclkid","fbclid","utm_internal","lead_intent_id","source_site","source_path","intent_type"]},"family_value_handling":{"utm":"AttributionUtmParameters","click_ids":"AttributionClickIds","internal":"url-whitelist-retained","lead_intent":"LeadIntentAttribution"},"key_matching":"exact","aliases":"rejected","duplicates":"rejected","canonical_url_max_bytes":2000,"canonical_url_max_bytes_measurement":"after-normalization-and-percent-encoding","canonical_url_overflow_status":422,"utm_value_constraints":{"trim_whitespace":true,"non_empty":true,"valid_utf8":true,"control_characters":"rejected","max_characters":255},"click_id_value_constraints":{"pattern":"^[A-Za-z0-9._:-]+$","reserved_values":"rejected","max_characters":256},"invalid_request_status":422,"unrelated_query_keys":"removed-before-persistence"},"description":"HTTP(S) URL without userinfo or an explicit port. The server validates configured attribution keys after percent-decoding. UTM and click-ID values use their family-specific constraints; internal flags are retained by the URL whitelist, and lead-intent values use their family-specific normalizer. Aliases, duplicates, malformed values, and values rejected by a family validator return HTTP 422. Unrelated query strings may be removed before persistence."},"referrer_host":{"type":"string","maxLength":253,"pattern":"^(?=.*[A-Za-z])(?=.{1,253}(?![\\s\\S]))[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*(?![\\s\\S])","description":"Hostname only; email addresses, paths, and other arbitrary text are rejected."},"channel":{"type":"string","maxLength":80,"not":{"pattern":"[\\x00-\\x1F\\x7F]"}},"captured_at":{"type":"string","maxLength":80,"format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,6})?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$","description":"RFC3339 timestamp with an optional fractional second (up to microsecond precision)."},"visitor_id":{"type":"string","maxLength":255,"not":{"pattern":"[\\x00-\\x1F\\x7F]"}},"visitor_scope":{"type":"string","maxLength":80,"not":{"pattern":"[\\x00-\\x1F\\x7F]"}},"path_class":{"type":"string","enum":["public_acquisition_entry","quote_flow_submission","private_operational","unavailable"]},"acquisition_eligible":{"type":"boolean"}}},"CallbackAcquisitionEntryTouch":{"allOf":[{"$ref":"#\/components\/schemas\/CallbackAttributionTouch"},{"type":"object","required":["path_class","acquisition_eligible"],"properties":{"path_class":{"type":"string","enum":["public_acquisition_entry","quote_flow_submission"]},"acquisition_eligible":{"const":true}}}],"description":"An explicit acquisition touch must be eligible and use a public acquisition or quote-flow path."},"CallbackQuoteFlowTouch":{"allOf":[{"$ref":"#\/components\/schemas\/CallbackAttributionTouch"},{"type":"object","required":["path_class"],"properties":{"path_class":{"const":"quote_flow_submission"}}}],"description":"An explicit quote-flow touch must use the quote_flow_submission path class."},"CallbackAttributionSnapshot":{"type":"object","additionalProperties":false,"description":"Optional bounded attribution supplied by a controlled browser or approved public agent. It is normalized before persistence and is never treated as customer identity.","properties":{"first":{"$ref":"#\/components\/schemas\/CallbackAttributionTouch"},"last":{"$ref":"#\/components\/schemas\/CallbackAttributionTouch"},"history":{"type":"array","maxItems":20,"items":{"$ref":"#\/components\/schemas\/CallbackAttributionTouch"}},"acquisition_entry":{"$ref":"#\/components\/schemas\/CallbackAcquisitionEntryTouch","description":"Optional explicit acquisition touch; it must have acquisition_eligible=true and an acquisition path class."},"quote_flow":{"$ref":"#\/components\/schemas\/CallbackQuoteFlowTouch","description":"Optional explicit quote-flow touch; it must have path_class=quote_flow_submission."}}},"BookingConsent":{"type":"object","required":["confirmed","basis"],"properties":{"confirmed":{"type":"boolean","const":true,"description":"Must be true when the customer has asked the agent to book a priced household quote option."},"basis":{"type":"string","enum":["customer_requested_booking"]}}},"VehicleResultsConsent":{"type":"object","required":["confirmed","basis"],"properties":{"confirmed":{"type":"boolean","const":true,"description":"Must be true when the customer has asked the agent to look up vehicle quote result actions."},"basis":{"type":"string","enum":["customer_requested_vehicle_results"]}}},"VehicleBookingConsent":{"type":"object","required":["confirmed","basis"],"properties":{"confirmed":{"type":"boolean","const":true,"description":"Must be true when the customer has asked the agent to continue booking a selected vehicle quote option."},"basis":{"type":"string","enum":["customer_requested_vehicle_booking"]}}},"Customer":{"type":"object","required":["name","email","phone"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"}}},"HouseholdQuoteSubmissionCustomer":{"type":"object","required":["name","email"],"description":"Household quote customer details. Public submissions must include a phone value. An approved internal staff-assisted submission may omit it only when actor_context records the missing_phone fallback; Moveroo stores null and does not use phone matching or phone communication.","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"}}},"VehicleQuoteSubmissionCustomer":{"type":"object","required":["name","email"],"description":"Vehicle quote customer details. Public submissions must include a phone value; approved internal staff-assisted submissions may omit it only when actor_context records the missing-phone fallback.","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":["string","null"],"description":"Required for public submissions. Omit or set null only for the approved internal missing-phone fallback. Invalid supplied values are retained as non-callable provenance."}}},"Location":{"type":"object","properties":{"city":{"type":"string"},"state":{"type":"string"},"postcode":{"type":"string"},"locality_id":{"type":"integer"}},"description":"Supply either city\/state\/postcode style fields or a known locality_id. Do not put measurements such as m3, cubic metres, cbm, or dimensions in city, state, postcode, or other locality fields. Vehicle quote submissions can auto-confirm strong locality matches and may return suggestions when a pickup or delivery locality is ambiguous."},"EstimateVolumeRequest":{"type":"object","required":["origin_domain","customer_consent"],"properties":{"origin_domain":{"type":"string","description":"The approved quote host handling this request. Must match the request host."},"customer_consent":{"$ref":"#\/components\/schemas\/CustomerConsent"},"inventory_text":{"type":"string","description":"Natural-language inventory or move scope supplied by the customer."},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"quantity":{"type":"integer","minimum":1},"volume_m3":{"type":"number","minimum":0}}}},"dwelling":{"type":"object","properties":{"bedrooms":{"type":"integer","minimum":0,"maximum":8},"property_type":{"type":"string","enum":["house","apartment","unit","townhouse","storage","garage","office","other"]}}}},"anyOf":[{"required":["inventory_text"]},{"required":["items"]},{"required":["dwelling"]}]},"EstimateVolumeResponse":{"type":"object","required":["estimated_m3","confidence","method","assumptions","quote_next_step"],"properties":{"estimated_m3":{"type":"number","description":"Estimated cubic metres rounded to one decimal place."},"confidence":{"type":"number","minimum":0,"maximum":1},"method":{"type":"string"},"assumptions":{"type":"array","items":{"type":"string"}},"matched_items":{"type":"array","items":{"type":"object"}},"unmatched_lines":{"type":"array","items":{"type":"string"}},"ambiguous_lines":{"type":"array","items":{"type":"string"}},"quote_next_step":{"type":"object","properties":{"endpoint":{"type":"string","const":"\/api\/v1\/household-quotes\/assistant\/submit"},"use_estimate_as":{"type":"string"},"payload_hint":{"type":"object"},"required_fields":{"type":"array","items":{"type":"string"}}}}}},"CustomerAssistantSupportAnswerRequest":{"type":"object","required":["question"],"properties":{"question":{"type":"string","maxLength":500},"origin_domain":{"type":"string"},"channel":{"type":"string"},"surface":{"type":"string"},"conversation":{"type":"array","maxItems":40,"items":{"type":"object","required":["role","text"],"properties":{"role":{"type":"string","maxLength":40},"text":{"type":"string","maxLength":2000},"kind":{"type":"string","maxLength":80}}}}}},"CustomerAssistantSupportAnswerResponse":{"type":"object","required":["ok","status","matched","answer","source","source_label","actions","guidance","learning"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["answered","suggested","quote_intent","fallback"]},"matched":{"type":"boolean"},"answer":{"type":"string"},"source":{"type":"string","enum":["approved_faq","approved_faq_suggestion","household_quote_intent","approved_faq_fallback","customer_assistant_intent"]},"source_label":{"type":"string"},"topic":{"type":["object","null"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"category":{"type":"string"},"reviewed_at":{"type":["string","null"],"format":"date-time"}}},"suggestion":{"type":["object","null"],"properties":{"suggested_faq_id":{"type":["integer","null"]},"score":{"type":["number","null"]},"reason":{"type":["string","null"]},"feedback_endpoint":{"type":"string"},"feedback_options":{"type":"array","items":{"type":"string","enum":["helped","did_not_help"]}}}},"quote_intent":{"type":["object","null"],"properties":{"type":{"type":"string","enum":["household"]},"matched_intent":{"type":"string"},"handoff_action":{"type":"string","enum":["start-household-quote"]},"handoff_value":{"type":"string"},"preserves_customer_message":{"type":"boolean"},"needs_inventory_clarification":{"type":"boolean"},"suggested_action":{"type":"string","enum":["household_quote"]}}},"refund_form_available":{"type":["boolean","null"],"description":"Whether the reviewed HTTPS\/host-allowlisted cancellation and refund details form is available. A refund action is never returned when this is false."},"actions":{"type":"array","items":{"type":"object","description":"Customer-safe helper action. The open-refund-form action, when present, contains only the configured permanent refund-form URL and does not approve or process a refund.","properties":{"label":{"type":"string"},"action":{"type":"string"},"value":{"type":"string"},"url":{"type":"string","format":"uri"},"variant":{"type":"string"}}}},"guidance":{"type":"object"},"learning":{"type":"object","required":["captured_unanswered_question","feedback_endpoint"],"properties":{"captured_unanswered_question":{"type":"boolean"},"feedback_endpoint":{"type":"string"}}}}},"CustomerAssistantSupportFeedbackRequest":{"type":"object","required":["question","outcome"],"properties":{"question":{"type":"string","maxLength":500},"outcome":{"type":"string","enum":["helped","did_not_help"]},"suggested_faq_id":{"type":"integer","description":"Active approved FAQ id returned by support\/answer suggestion.suggested_faq_id."},"suggested_score":{"type":"number","minimum":0,"maximum":1},"suggested_reason":{"type":"string","maxLength":120},"origin_domain":{"type":"string"},"channel":{"type":"string"},"surface":{"type":"string"},"conversation":{"type":"array","maxItems":40,"items":{"type":"object","required":["role","text"],"properties":{"role":{"type":"string","maxLength":40},"text":{"type":"string","maxLength":2000},"kind":{"type":"string","maxLength":80}}}}}},"CustomerAssistantSupportFeedbackResponse":{"type":"object","required":["ok","recorded_feedback","captured_unanswered_question","message"],"properties":{"ok":{"type":"boolean"},"recorded_feedback":{"type":"boolean"},"captured_unanswered_question":{"type":"boolean"},"unanswered_question_id":{"type":["integer","null"]},"message":{"type":"string"}}},"HouseholdQuoteSubmission":{"type":"object","required":["origin_domain","customer","move_date","inventory","customer_consent"],"allOf":[{"if":{"required":["customer"],"properties":{"customer":{"required":["phone"],"properties":{"phone":{"type":"string","minLength":1}}}}},"then":{"type":"object","properties":{"actor_context":{"properties":{"fallback_decisions":{"not":{"required":["missing_phone"],"properties":{"missing_phone":{"const":true}}}}}}}},"else":{"required":["actor_context"],"properties":{"actor_context":{"required":["approval_reference","fallback_decisions"],"properties":{"fallback_decisions":{"required":["missing_phone"]}}}}}}],"properties":{"origin_domain":{"type":"string","description":"The quote host where the customer journey originated."},"tenant":{"type":"string","description":"Optional. Omit tenant for public host-aware submissions unless Moveroo has supplied a tenant slug."},"idempotency_key":{"type":"string","description":"Optional stable key supplied by the agent. If omitted, Moveroo computes a quote-type-specific fingerprint."},"customer_consent":{"$ref":"#\/components\/schemas\/CustomerConsent"},"lead_attribution":{"$ref":"#\/components\/schemas\/LeadAttribution"},"customer":{"$ref":"#\/components\/schemas\/HouseholdQuoteSubmissionCustomer"},"actor_context":{"type":"object","additionalProperties":false,"description":"Internal-only approved operator context. Requires an authenticated managed operator with quotes.submit and Company scope. A missing phone requires explicit approval, stores null, and does not enable phone matching, customer communication, SMS, or calling.","properties":{"approval_reference":{"type":"string","minLength":1,"maxLength":128,"pattern":".*\\S.*"},"source_email_message_id":{"type":"integer","minimum":1},"source_case_revision":{"type":"string","pattern":"^[a-fA-F0-9]{64}$"},"fallback_decisions":{"type":"object","additionalProperties":false,"properties":{"missing_phone":{"type":"boolean","const":true}}}}},"route_text":{"type":"string","description":"Optional route phrase such as \"Sydney to Brisbane\" or \"pickup Brisbane QLD 4000, delivery Sydney NSW 2000\". Supply either route_text or both structured pickup and delivery."},"pickup":{"allOf":[{"$ref":"#\/components\/schemas\/Location"}],"description":"Structured pickup locality. Required when route_text is omitted."},"delivery":{"allOf":[{"$ref":"#\/components\/schemas\/Location"}],"description":"Structured delivery locality. Required when route_text is omitted."},"move_date":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["exact","asap","unknown","vague"]},"date":{"type":"string","format":"date"}}},"inventory":{"type":"object","description":"Household inventory input. For pasted_list, text can include item labels, quantities, and customer-supplied dimensions so Moveroo can create quote-scoped custom inventory items while preserving customer measured volume separately from quoted volume.","required":["method"],"properties":{"method":{"type":"string","enum":["m3","pasted_list","unknown"]},"cubic_meters":{"type":"number"},"text":{"type":"string","description":"Required when method is pasted_list. May include measured custom items such as \"2x dance stair props length 2.45m width 70cm height 1.3m\"."}}},"channel":{"type":"string"},"surface":{"type":"string"},"notes":{"type":"string"}}},"HouseholdBookingActionsRequest":{"type":"object","required":["origin_domain","verification","customer_consent"],"properties":{"origin_domain":{"type":"string","description":"The approved quote request host. It must match the request host; stored quote origins may match another approved host alias on the same resolved tenant."},"quote_reference":{"type":"string","description":"Optional for email-only lookup; required to return full booking actions for one quote."},"verification":{"type":"string","description":"Customer email or phone for the quote being booked. Email-only lookup returns safe quote choices first."},"tenant":{"type":"string","description":"Optional. Omit tenant for public host-aware booking lookups unless Moveroo has supplied a tenant slug."},"customer_consent":{"$ref":"#\/components\/schemas\/BookingConsent"}}},"HouseholdBookingConfirmRequest":{"type":"object","required":["origin_domain","quote_reference","verification","option_id","customer_consent"],"properties":{"origin_domain":{"type":"string","description":"The approved quote request host. It must match the request host; stored quote origins may match another approved host alias on the same resolved tenant."},"quote_reference":{"type":"string"},"verification":{"type":"string","description":"Customer email or phone for the quote being booked."},"option_id":{"type":"string"},"booking_contact_phone":{"type":"string","description":"Required when the stored quote phone is missing, invalid, or placeholder-like. This is contact data for the booking; email remains the quote verification proof."},"customer_consent":{"$ref":"#\/components\/schemas\/BookingConsent"}}},"HouseholdBookingRequest":{"type":"object","required":["origin_domain","quote_reference","verification","option_id","expected_fingerprint","idempotency_key","customer_consent"],"properties":{"origin_domain":{"type":"string","description":"The approved quote request host. It must match the request host; stored quote origins may match another approved host alias on the same resolved tenant."},"quote_reference":{"type":"string"},"verification":{"type":"string","description":"Customer email or phone for the quote being booked."},"option_id":{"type":"string"},"expected_fingerprint":{"type":"string","minLength":64,"maxLength":64},"idempotency_key":{"type":"string","description":"Required stable key so retrying the same booking request cannot create duplicate bookings."},"booking_contact_phone":{"type":"string","description":"Required when the stored quote phone is missing, invalid, or placeholder-like. This is saved as the booking contact phone after quote verification succeeds."},"customer_consent":{"$ref":"#\/components\/schemas\/BookingConsent"},"terms_accepted":{"type":"boolean","description":"Optional compatibility field. customer_consent.confirmed=true authorises the public booking request."}}},"VehicleQuoteResultsActionsRequest":{"type":"object","required":["origin_domain","verification","customer_consent"],"properties":{"origin_domain":{"type":"string","description":"The quote host where the customer journey originated. Must match the request host."},"verification":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}},"quote_reference":{"type":"string","description":"Required for full result actions. Email-only lookup returns customer-safe quote choices."},"full_details":{"type":"boolean"},"customer_consent":{"$ref":"#\/components\/schemas\/VehicleResultsConsent"},"agent":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"platform":{"type":"string"}}}}},"VehicleQuoteBookingRequest":{"type":"object","required":["origin_domain","verification","quote_reference","expected_fingerprint","idempotency_key","booking","customer_consent"],"properties":{"origin_domain":{"type":"string","description":"The approved quote host handling this request. Must match the request host."},"verification":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}},"quote_reference":{"type":"string"},"expected_fingerprint":{"type":"string","description":"Current fingerprint from results_status.booking_confirmation.fingerprint."},"idempotency_key":{"type":"string","description":"Required stable key so retrying the same booking request cannot create duplicate bookings."},"option_reference":{"type":"string"},"confirmation_text":{"type":"string"},"booking":{"type":"object","description":"Vehicle booking details. Payment\/card details are rejected by this API.","additionalProperties":false,"properties":{"vehicle":{"type":"object"},"pickup":{"type":"object"},"delivery":{"type":"object"},"tax_invoice_required":{"type":"boolean"},"invoice_name":{"type":"string","nullable":true},"invoice_address":{"type":"string","nullable":true},"customer_questions":{"type":"string","nullable":true},"goods_in_car":{"type":"boolean"}}},"customer_consent":{"$ref":"#\/components\/schemas\/VehicleBookingConsent"},"agent":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"platform":{"type":"string"}}},"source":{"type":"object","additionalProperties":false,"properties":{"channel":{"type":"string"},"surface":{"type":"string"}}}}},"VehicleQuoteSubmission":{"type":"object","required":["origin_domain","customer","pickup","delivery","vehicle","customer_consent"],"allOf":[{"if":{"required":["customer"],"properties":{"customer":{"required":["phone"],"properties":{"phone":{"type":"string","minLength":1,"pattern":"^(?!\\s*0\\s*$).*\\S.*$"}}}}},"then":{"type":"object","properties":{"actor_context":{"properties":{"fallback_decisions":{"not":{"required":["missing_phone_sentinel"],"properties":{"missing_phone_sentinel":{"const":true}}}}}}}},"else":{"required":["actor_context"],"properties":{"actor_context":{"required":["approval_reference","fallback_decisions"],"properties":{"fallback_decisions":{"required":["missing_phone_sentinel"]}}}}}},{"if":{"required":["actor_context"],"properties":{"actor_context":{"required":["fallback_decisions"]}}},"then":{"properties":{"actor_context":{"required":["approval_reference"]}}}}],"properties":{"origin_domain":{"type":"string","description":"The quote host where the customer journey originated."},"tenant":{"type":"string","description":"Optional. Omit tenant for public host-aware submissions unless Moveroo has supplied a tenant slug."},"idempotency_key":{"type":"string","description":"Optional stable key supplied by the agent. If omitted, Moveroo computes a quote-type-specific fingerprint."},"customer_consent":{"$ref":"#\/components\/schemas\/CustomerConsent"},"lead_attribution":{"$ref":"#\/components\/schemas\/LeadAttribution"},"customer":{"$ref":"#\/components\/schemas\/VehicleQuoteSubmissionCustomer"},"actor_context":{"type":"object","additionalProperties":false,"description":"Internal-only approved operator context. Requires an authenticated managed operator with quotes.submit and Company scope. Fallback decisions require approval_reference and are recorded as provenance; the fallback decision itself does not contact a customer or provider.","properties":{"approval_reference":{"type":"string","minLength":1,"maxLength":128,"pattern":".*\\S.*"},"source_email_message_id":{"type":"integer","minimum":1},"source_case_revision":{"type":"string","pattern":"^[a-fA-F0-9]{64}$"},"fallback_decisions":{"type":"object","additionalProperties":false,"properties":{"pickup_representative_locality_id":{"type":"integer","minimum":1},"delivery_representative_locality_id":{"type":"integer","minimum":1},"missing_phone_sentinel":{"type":"boolean","const":true}}}}},"pickup":{"$ref":"#\/components\/schemas\/Location"},"delivery":{"$ref":"#\/components\/schemas\/Location"},"vehicle":{"type":"object","required":["make","model","year","is_drivable"],"properties":{"category":{"type":"string"},"make":{"type":"string"},"model":{"type":"string"},"year":{"type":"integer"},"is_drivable":{"type":"boolean"},"condition":{"type":"string"},"has_working_brakes":{"type":"boolean"},"can_roll":{"type":"boolean"},"has_keys":{"type":"boolean"},"is_damaged":{"type":"boolean"},"damage_details":{"type":"string"}}},"timing":{"type":"object","properties":{"preferred_date":{"type":"string","format":"date"},"is_flexible":{"type":"boolean"}}},"channel":{"type":"string"},"surface":{"type":"string"},"notes":{"type":"string"}}},"VehicleQuoteIntakeAction":{"type":"object","properties":{"origin_domain":{"type":"string","description":"Optional for workflow actions. Defaults to the request host and must match when supplied."},"tenant":{"type":"string","description":"Optional. Omit tenant unless Moveroo has supplied a tenant slug."},"draft_id":{"type":"integer","description":"Required after a draft is created."},"session_token":{"type":"string","description":"Required after a draft is created."},"message":{"type":"string","description":"Natural-language message for the message, vehicle-detail, or dimension-check actions."},"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"query":{"type":"string","description":"Locality or vehicle search phrase."},"locality_id":{"type":"integer"},"category":{"type":"string"},"vehicle_category":{"type":"string"},"make":{"type":"string"},"model":{"type":"string"},"year":{"type":"integer"},"reference_make_id":{"type":"integer"},"reference_model_id":{"type":"integer"},"is_drivable":{"type":"boolean"},"condition":{"type":"string"},"kind":{"type":"string","enum":["pickup","delivery","vehicle"]},"value_fingerprint":{"type":"string"},"confirmed":{"type":"boolean"},"confirmation_text":{"type":"string"},"customer_consent":{"$ref":"#\/components\/schemas\/CustomerConsent"},"idempotency_key":{"type":"string"},"channel":{"type":"string"},"surface":{"type":"string"}}},"CallbackRequest":{"type":"object","required":["origin_domain","customer","slot","customer_consent"],"properties":{"origin_domain":{"type":"string","description":"The quote\/contact host where the customer journey originated. Must match the request host."},"idempotency_key":{"type":"string","description":"Optional stable key supplied by the agent. If omitted, Moveroo computes a callback request fingerprint."},"customer_consent":{"$ref":"#\/components\/schemas\/CallbackConsent"},"attribution":{"$ref":"#\/components\/schemas\/CallbackAttributionSnapshot"},"customer":{"$ref":"#\/components\/schemas\/Customer"},"slot":{"type":"string","description":"ISO-8601 callback slot token from the public contact page availability list."},"channel":{"type":"string"},"surface":{"type":"string"},"agent":{"type":"object","properties":{"name":{"type":"string"},"platform":{"type":"string"}}},"notes":{"type":"string"}}},"CallbackSlotsResponse":{"type":"object","properties":{"success":{"type":"boolean"},"source_hostname":{"type":"string"},"timezone":{"type":"string"},"slot_groups":{"type":"array","items":{"type":"object","properties":{"date_key":{"type":"string"},"date_label":{"type":"string"},"slots":{"type":"array","items":{"type":"object","properties":{"token":{"type":"string"},"time_label":{"type":"string"}}}}}}}}}}}}