import {z} from 'zod' export type GetApiRentalsIdArgs = {id: number}; export type GetApiRentalsIdOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const activeOptions = z.object({cancel_policy: z.string().optional(), cancel_policy_combo_bookings: z.string().optional(), instant_book: z.boolean().optional(), instant_book_disabled_reason: z.string().optional(), insurance_coverage: z.string().optional(), minimum_nights: z.number().int().optional(), use_day_pricing: z.boolean().optional(), use_tax_inclusive_pricing: z.boolean().optional()}); export const activePrice = z.object({base_day: z.number().int().optional(), day: z.number().int().optional(), month: z.number().int().optional(), tax: z.number().int().optional(), week: z.number().int().optional()}); export const averageRatings = z.object({cleanliness_score: z.number().optional(), cleanliness_score_percentage: z.number().optional(), communication_score: z.number().optional(), communication_score_percentage: z.number().optional(), listing_score: z.number().optional(), listing_score_percentage: z.number().optional(), mechanical_score: z.number().optional(), mechanical_score_percentage: z.number().optional(), score: z.number().optional(), score_percentage: z.number().optional(), value_score: z.number().optional(), value_score_percentage: z.number().optional()}); export const averageReviewsScores = z.object({key: z.string().optional(), name: z.string().optional(), percentage: z.number().optional(), score: z.number().optional()}); export const averageReviews = z.object({owner: z.array(averageReviewsScores).optional(), rental: z.array(averageReviewsScores).optional(), score: z.number().optional()}); export const campsiteCategoryQuestion = z.object({included: z.boolean().optional(), label: z.string().optional(), value: z.string().optional()}); export const mSI = z.record(z.string(), z.unknown()); export const petFee = z.object({amount: z.number().int().optional(), created: z.string().optional(), daily: z.boolean().optional(), id: z.number().int().optional(), max_count: z.number().int().optional(), rental_id: z.number().int().optional(), updated: z.string().optional()}); export const campsiteCategory = z.object({active_rate_plan: z.string().optional(), bathrooms: z.number().int().optional(), bedrooms: z.number().int().optional(), beds: z.number().int().optional(), campground_id: z.number().int().optional(), campground_name: z.string().optional(), campground_site_map_url: z.string().optional(), category_type: z.string().optional(), checkout_questions: z.array(campsiteCategoryQuestion).optional(), created: z.string().optional(), deleted: z.boolean().optional(), description: z.string().optional(), display_category_type: z.string().optional(), display_max_vehicle_length: z.string().optional(), display_site_type: z.string().optional(), enabled_for_rental_categories: mSI.optional(), external_id: z.string().optional(), features: mSI.optional(), has_pricing: z.boolean().optional(), id: z.number().int().optional(), is_odn: z.boolean().optional(), max_occupancy: z.number().int().optional(), max_occupancy_adult: z.number().int().optional(), max_occupancy_kids: z.number().int().optional(), max_parking_spaces: z.number().int().optional(), max_vehicle_length: z.number().optional(), name: z.string().optional(), owner_id_int: z.number().int().optional(), parking_onsite: z.boolean().optional(), pet_fee: petFee.optional(), quantity: z.number().int().optional(), rental_id_int: z.number().int().optional(), rv_rental_id_int: z.number().int().optional(), site_type: z.string().optional(), slug: z.string().optional(), supplier_category_id: z.number().int().optional(), updated: z.string().optional()}); export const dBMSISlice = z.array(z.record(z.string(), z.unknown())); export const nullFloat64 = z.object({Float64: z.number().optional(), Valid: z.boolean().optional()}); export const rentalConsignment = z.object({consignment_completed: z.boolean().optional(), interested_in_consignment: z.boolean().optional(), keep_pct_cc_fee: nullFloat64.optional(), keep_pct_insurance_fee: nullFloat64.optional(), owner_id: z.number().int().optional(), pay_pct: nullFloat64.optional(), pay_pct_generator: nullFloat64.optional(), pay_pct_mileage: nullFloat64.optional()}); export const distributedRatings = z.object({score: z.object({r1: z.number().optional(), r2: z.number().optional(), r3: z.number().optional(), r4: z.number().optional(), r5: z.number().optional()}).optional()}); export const dBInterfaceMap = z.unknown(); export const home = z.object({city: z.string().optional(), country: z.string().optional(), county: z.string().optional(), lat: z.number().optional(), lng: z.number().optional(), state: z.string().optional(), street: z.string().optional(), street_etc: z.string().optional(), zip: z.string().optional()}); export const rentalImageAmenity = z.object({description: z.string().optional(), name: z.string().optional(), slug: z.string().optional()}); export const mediaCategory = z.object({name: z.string().optional(), slug: z.string().optional()}); export const bookingSummary = z.object({from: z.string().optional(), id: z.number().int().optional(), to: z.string().optional()}); export const dBStringSlice = z.array(z.string()); export const reviewOwner = z.object({avatar_url: z.string().optional(), first_name: z.string().optional(), id: z.number().int().optional(), last_name: z.string().optional()}); export const ownerResponseReview = z.object({text: z.string().optional(), timestamp: z.string().optional()}); export const campsiteSummary = z.object({beds: z.number().int().optional(), campground_id: z.number().int().optional(), campground_name: z.string().optional(), campground_sitemap_url: z.string().optional(), display_campsite_type: z.string().optional(), display_max_vehicle_length: z.string().optional(), display_site_type: z.string().optional(), is_odn: z.boolean().optional(), rental_id: z.number().int().optional(), site_type: z.string().optional(), sleeps: z.number().int().optional(), type: z.string().optional()}); export const staySummary = z.object({baths: z.number().int().optional(), bedrooms: z.number().int().optional(), beds: z.number().int().optional(), check_in_type: z.string().optional(), display_stay_type: z.string().optional(), location_description: z.string().optional(), max_parking_spaces: z.number().int().optional(), parking_onsite: z.boolean().optional(), rental_id: z.number().int().optional(), sleeps: z.number().int().optional(), type: z.string().optional()}); export const rentalSummary = z.object({campsite_summary: campsiteSummary.optional(), disallow_movement: z.boolean().optional(), display_type: z.string().optional(), formatted_length: z.string().optional(), id: z.number().int().optional(), interior_primary_image_url: z.string().optional(), internal_id: z.string().optional(), location: z.string().optional(), name: z.string().optional(), primary_image_url: z.string().optional(), rental_category: z.string().optional(), sleeps: z.number().int().optional(), slug: z.string().optional(), stay_summary: staySummary.optional(), style: z.string().optional(), type: z.string().optional()}); export const tagRental = z.object({Created: z.string().optional(), ID: z.number().int().optional(), Name: z.string().optional(), Slug: z.string().optional(), Updated: z.string().optional(), position: z.number().int().optional(), usage_by_rental_count: z.number().int().optional()}); export const iD = z.string(); export const reviewImage = z.object({created: z.string().optional(), id: iD.optional(), lat: z.number().optional(), lng: z.number().optional(), rental_id: z.string().optional(), review_id: z.string().optional(), reviewed: z.boolean().optional(), reviewed_by: z.string().optional(), status: z.string().optional(), updated: z.string().optional(), url: z.string().optional()}); export const reviewer = z.object({avatar_url: z.string().optional(), first_name: z.string().optional(), id: z.number().int().optional(), last_name: z.string().optional()}); export const tag = z.object({allow_for_review: z.boolean().optional(), created: z.string().optional(), description: z.string().optional(), id: z.number().int().optional(), name: z.string().optional(), owner_user_id: z.number().int().nullable().optional(), position: z.number().int().optional(), slug: z.string().optional(), updated: z.string().optional()}); export const rentalImageReview = z.object({apply_credit: z.boolean().optional(), booking_id: z.number().int().optional(), booking_summary: bookingSummary.optional(), can_edit: z.boolean().optional(), can_edit_until: z.string().optional(), cleanliness_score: z.number().optional(), communication_score: z.number().optional(), deleted: z.string().optional(), exclude_from_rating: z.boolean().optional(), id: z.number().int().optional(), images: dBStringSlice.optional(), imported: z.boolean().optional(), listing_score: z.number().optional(), mechanical_score: z.number().optional(), name: z.string().optional(), outdoorsy_only: z.boolean().optional(), owner: reviewOwner.optional(), owner_can_respond: z.boolean().optional(), owner_response: ownerResponseReview.optional(), published: z.boolean().optional(), rental_id: z.number().int().optional(), rental_summary: rentalSummary.optional(), rental_tags: z.array(tagRental).optional(), review_image_id: z.string().optional(), review_images: z.array(reviewImage).optional(), reviewer: reviewer.optional(), reviewer_id: z.number().int().optional(), score: z.number().optional(), source_page: z.string().optional(), tags: z.array(tag).optional(), text: z.string().optional(), timestamp: z.string().optional(), user_id: z.number().int().optional(), user_recommend: z.boolean().optional(), value_score: z.number().optional()}); export const rentalImage = z.object({ai_aesthetic_score: z.number().optional(), ai_description: z.string().optional(), ai_position: z.number().int().optional(), ai_summary: z.string().optional(), amenity: rentalImageAmenity.optional(), best: z.boolean().optional(), category: mediaCategory.optional(), description: z.string().optional(), height: z.number().int().optional(), id: z.number().int().optional(), ignore_rejected: z.boolean().optional(), interior_primary: z.boolean().optional(), position: z.number().int().optional(), primary: z.boolean().optional(), rental_id: z.number().int().optional(), review: rentalImageReview.optional(), skip_enhance: z.boolean().optional(), status: z.string().optional(), tags: z.string().optional(), title: z.string().optional(), url: z.string().optional(), video: z.boolean().optional(), width: z.number().int().optional()}); export const rentalImages = z.array(rentalImage); export const planOverride = z.object({created: z.string().optional(), dealer_owned_owner_fee_percentage: z.number().optional(), dealer_owned_renter_fee_percentage: z.number().optional(), id: z.number().int().optional(), insurance_plan_id: z.lazy(() => plan.optional()), owner_fee_percentage: z.number().optional(), owner_id: z.number().int().optional(), renter_fee_percentage: z.number().optional(), updated: z.string().optional()}); export const plan: z.ZodType = z.object({allow_unregistered: z.boolean().optional(), approved_vehicle_types: dBStringSlice.optional(), bundle_required: z.boolean().optional(), claims_number: z.string().optional(), comp_policy_url: z.string().optional(), comprehensive_coverage: z.boolean().optional(), comprehensive_maximum: z.string().optional(), country: z.string().optional(), created: z.string().optional(), created_by_id: z.number().int().nullable().optional(), dealer_only: z.boolean().optional(), hidden: z.boolean().optional(), id: z.number().int().optional(), insurance_address_1: z.string().optional(), insurance_city: z.string().optional(), insurance_end_date: z.string().optional(), insurance_name: z.string().optional(), insurance_plan_override: planOverride.optional(), insurance_policy_number: z.string().optional(), insurance_start_date: z.string().optional(), insurance_state: z.string().optional(), insurance_zip: z.string().optional(), insured_address_1: z.string().optional(), insured_city: z.string().optional(), insured_name: z.string().optional(), insured_state: z.string().optional(), insured_zip: z.string().optional(), label: z.string().optional(), last_updated_by_id: z.number().int().nullable().optional(), liability_coverage: z.boolean().optional(), liability_maximum: z.string().optional(), liability_policy_url: z.string().optional(), locality: z.string().optional(), minimum_daily_fee: z.number().int().optional(), minimum_year: z.number().int().optional(), owner_comprehensive_deductible: z.string().optional(), owner_fee_percentage: z.number().optional(), owner_liability_deductible: z.string().optional(), owner_liability_maximum: z.string().optional(), rental_category: z.string().optional(), renter_comprehensive_deductible: z.string().optional(), renter_fee_percentage: z.number().optional(), renter_liability_deductible: z.string().optional(), renter_liability_maximum: z.string().optional(), requires_driver_verification: z.boolean().optional(), tiered: z.boolean().optional(), updated: z.string().optional()}); export const nullTime = z.object({Time: z.string().optional(), Valid: z.boolean().optional()}); export const iMap = z.unknown(); export const taxRate = z.object({archived: z.boolean().optional(), created: z.string().optional(), description: z.string().optional(), id: z.number().int().optional(), marketplace: z.boolean().optional(), name: z.string().optional(), owner_id: z.number().int().optional(), rate: z.number().optional(), state: z.string().optional(), updated: z.string().optional(), zip_code: z.string().optional()}); export const rentalItem = z.object({applies_to_type: dBStringSlice.optional(), available: z.number().int().optional(), category: z.string().optional(), category_id: z.number().int().optional(), consigned_pay_pct: z.number().optional(), created: nullTime.optional(), daily: z.boolean().optional(), deferred: z.boolean().optional(), description: z.string().optional(), hidden: z.boolean().optional(), id: z.number().int().optional(), image_url: z.string().optional(), ledger_account_number: z.number().int().optional(), location_id: z.number().int().optional(), location_ids: z.array(z.number().int()).optional(), maximum_price: z.number().int().nullable().optional(), metadata: iMap.optional(), minimum_price: z.number().int().nullable().optional(), name: z.string().optional(), percent: z.number().optional(), percent_type: z.string().optional(), position: z.number().int().optional(), presentment_currency: z.string().optional(), price: z.number().int().optional(), rental_items_category_id: z.number().int().nullable().optional(), rental_items_category_name: z.string().optional(), rental_items_category_owner_name: z.string().optional(), rental_items_category_reason: z.string().optional(), rental_items_category_requested_name: z.string().optional(), rental_items_category_status: z.string().optional(), required: z.boolean().optional(), settlement_currency: z.string().optional(), tax: z.number().int().optional(), tax_rate_id: taxRate.optional(), tax_rate_ids: z.array(z.number().int()).optional(), travelers: z.number().int().optional(), updated: nullTime.optional()}); export const rentalFullReview = z.object({avatar_url: z.string().optional(), first_name: z.string().optional(), last_name: z.string().optional(), score: z.number().optional(), text: z.string().optional()}); export const unitLocale = z.object({base_currency: z.string().optional(), distance_unit: z.string().optional(), length_unit: z.string().optional(), liquid_unit: z.string().optional(), weight_unit: z.string().optional()}); export const prepFee = z.object({amount: z.number().int().optional(), description: z.string().optional(), id: z.number().int().optional(), tax_rate_ids: z.array(z.number().int()).optional()}); export const priceEstimatePrediction = z.object({meta: z.record(z.string(), z.unknown()).optional(), name: z.string().optional(), prediction: z.number().optional()}); export const priceEstimate = z.object({predictions: z.array(priceEstimatePrediction).optional(), price_est_mean: z.number().optional()}); export const price = z.object({can_charge_security_deposit: z.boolean().optional(), day: z.number().int().optional(), estimate: z.number().int().optional(), minimum_security_deposit: z.number().int().optional(), month: z.number().int().optional(), price_estimate: priceEstimate.optional(), security_deposit: z.number().int().optional(), week: z.number().int().optional()}); export const reviewScores = z.object({bayesian_rating: z.number().optional()}); export const stayDetails = z.object({baths: z.number().int().nullable().optional(), bedrooms: z.number().int().nullable().optional(), beds: z.number().int().nullable().optional(), check_in_type: z.string().optional(), display_stay_type: z.string().optional(), features: dBInterfaceMap.optional(), features_other_items: z.string().optional(), location_description: z.string().nullable().optional(), location_highlights_other_items: z.string().optional(), max_parking_spaces: z.number().int().nullable().optional(), parking_onsite: z.boolean().nullable().optional(), rental_id: z.number().int().optional(), sleeps: z.number().int().nullable().optional(), type: z.string().nullable().optional()}); export const vehicle = z.object({amps: z.number().int().optional(), box_length: z.number().optional(), class: z.string().optional(), current_generator: z.number().optional(), current_lat: z.number().optional(), current_lng: z.number().optional(), current_mileage: z.number().optional(), dry_weight: z.number().int().optional(), gvwr: z.number().int().optional(), height: z.number().optional(), insurance_renewal_month: z.string().optional(), length: z.number().optional(), length_with_hitch: z.number().optional(), license_plate: z.string().optional(), license_plate_country: z.string().optional(), license_plate_state: z.string().optional(), make: z.string().optional(), model: z.string().optional(), replacement_value: z.string().optional(), trim: z.string().optional(), unit_of_measure: z.string().optional(), vin: z.string().optional(), width: z.number().optional(), year: z.number().int().optional()}); export const vinCheck = z.object({clean: z.boolean().optional(), created: z.string().optional(), error: z.string().optional(), failed: z.boolean().optional(), forced_approval_by: z.string().optional(), forced_approval_reason: z.string().optional(), id: z.number().int().optional(), last_title_date: z.string().optional(), last_title_state: z.string().optional(), raw_response: z.string().optional(), salvage: z.boolean().optional(), status: z.string().optional(), validation_id: z.string().optional(), vin: z.string().optional()}); export const rental = z.object({active_options: activeOptions.optional(), active_price: activePrice.optional(), auto_insurance_type: z.string().optional(), average_ratings: averageRatings.optional(), average_reviews: averageReviews.optional(), booking_leeway_days: z.number().int().nullable().optional(), bypass_new_york_regulations: z.boolean().optional(), campsite_category: campsiteCategory.optional(), can_manage_tax_rates: z.boolean().optional(), cancel_policy: z.string().nullable().optional(), cancel_policy_combo_bookings: z.string().nullable().optional(), check_in: z.number().int().optional(), check_out: z.number().int().optional(), checkout_questions: dBMSISlice.optional(), consignment: rentalConsignment.optional(), created: z.string().optional(), current_location_id: z.number().int().optional(), custom_insurance_text: z.string().nullable().optional(), delivery_usage_item_id: z.number().int().optional(), deposit_percentage: nullFloat64.optional(), description: z.string().optional(), description_included: z.string().optional(), description_other: z.string().optional(), description_recommendations: z.string().optional(), distributed_ratings: distributedRatings.optional(), eligible_for_custom_tax_rates: z.boolean().optional(), eligible_for_system_tax_rates: z.boolean().optional(), exempt_rental_sales_tax: z.boolean().optional(), external: z.boolean().nullable().optional(), external_site_url: z.string().optional(), features: dBInterfaceMap.optional(), first_published: z.string().optional(), free_form_typed: z.boolean().optional(), generator_usage_item_id: z.number().int().optional(), group_on_map: z.boolean().optional(), has_checkout_questions: z.boolean().optional(), has_completed_lyrv: z.boolean().optional(), hidden: z.boolean().optional(), hidden_reason: z.string().nullable().optional(), home: home.optional(), id: z.number().int().optional(), images: rentalImages.optional(), images_verified: z.boolean().nullable().optional(), images_verified_by: z.number().int().nullable().optional(), import_id: z.string().optional(), inactive: z.boolean().optional(), instant_book: z.boolean().nullable().optional(), instant_book_ban_date: z.string().optional(), instant_book_banned: z.boolean().optional(), instant_book_leeway: z.number().int().nullable().optional(), instant_book_type: z.string().optional(), insurance_coverage: z.string().optional(), insurance_plan_id: plan.optional(), insurance_renter_adjustable: z.boolean().nullable().optional(), interior_primary_image_id: z.number().int().optional(), interior_primary_image_url: z.string().optional(), internal_id: z.string().optional(), internal_notes: z.string().optional(), items: z.array(rentalItem).optional(), last_published: z.string().optional(), last_unpublish_date: z.string().optional(), latest_review: rentalFullReview.optional(), listing_steps: dBInterfaceMap.optional(), locale: unitLocale.optional(), metadata: iMap.optional(), mileage_usage_item_id: z.number().int().optional(), minimum_days: z.number().int().nullable().optional(), minimum_deposit: z.number().int().nullable().optional(), minimum_renter_age: z.number().int().optional(), name: z.string().optional(), ny_insurance_warning: z.boolean().optional(), od_stays_opt_in: z.boolean().optional(), od_stays_opt_in_eligible: z.boolean().optional(), od_stays_opt_in_missing_requirements: z.array(z.string()).optional(), one_way_rental_maximum_radius: z.number().int().nullable().optional(), one_way_rental_requests: z.boolean().nullable().optional(), original_url: z.string().optional(), parent_id: z.number().int().optional(), pet_fee: petFee.optional(), photo_score: z.number().int().nullable().optional(), position: z.number().int().optional(), prep_fee: prepFee.optional(), price: price.optional(), primary_image_id: z.number().int().optional(), primary_image_url: z.string().optional(), publish_field_errors: z.array(z.string()).optional(), published: z.boolean().optional(), rejected_images_count: z.number().int().optional(), rental_category: z.string().optional(), request_less_than_minimum_days: z.number().int().optional(), require_insurance: z.boolean().nullable().optional(), require_roadside: z.boolean().nullable().optional(), review_notes: z.string().nullable().optional(), review_scores: reviewScores.optional(), review_status: z.string().nullable().optional(), roamly_policy_number: z.string().optional(), sd_waiver_enabled: z.boolean().nullable().optional(), seatbelts: z.number().int().optional(), settings: dBInterfaceMap.optional(), sleeps: z.number().int().optional(), sleeps_adults: z.number().int().optional(), sleeps_kids: z.number().int().optional(), smart_pricing_enabled: z.boolean().optional(), smart_pricing_max: z.number().int().optional(), smart_pricing_min: z.number().int().optional(), smart_pricing_mode: z.string().optional(), snooze_expiration_date: z.string().optional(), sort: z.number().optional(), sort_metrics: dBInterfaceMap.optional(), stay: stayDetails.optional(), summary: z.string().optional(), tags: z.array(tagRental).optional(), tax_rate_id: taxRate.optional(), tax_rate_ids: z.array(z.number().int()).optional(), tollspot_id: z.number().int().optional(), turnaround_days_after: z.number().int().nullable().optional(), turo_vehicle_id: z.string().optional(), type: z.string().optional(), unpublish_reason: z.string().optional(), updated: z.string().optional(), use_system_tax_rates: z.boolean().optional(), vehicle: vehicle.optional(), vehicle_title: z.string().optional(), vin_check: vinCheck.optional(), waived_insurance_text: z.string().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Read one rental * * GET /rentals/{id} * * Also accepts auth: API-Key */ export const getApiRentalsId = async (args: GetApiRentalsIdArgs, options: GetApiRentalsIdOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/rentals/${encodeURIComponent(String(args.id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(rental, await res.json()) };