Search

  • Purpose: The Search interface enables AeroHub to retrieve available flight, fare, tax, and pricing information from suppliers based on criteria such as date, departure location, and destination. The interface supports various types of flight information, including direct flights, round trips, layovers, and stopovers.
  • Request: POST
  • Encryption: No

Request Parameters

Parameter Name Type Required Description
requestId string Unique request ID for the entire booking process. This field links all interfaces within the booking flow. Length: 32 chars.
tripType int Type of trip: 1 for one-way, 2 for round-trip. If set to 1 or 2, only flights matching that trip type will be searched.
flightType int Type of flight: 0 for all (default), 1 for direct flights, 2 for connecting flights.
adultNumber int Number of adult passengers for this search.
childNumber int Number of child passengers for this search.
infantNumber int Number of infant passengers for this search.
fromDate string Departure date for this search, formatted as YYYYMMDD.
retDate string Return date for this search. Required if tripType is 2 (round-trip). Format: YYYYMMDD.
fromCity string Departure city in ISO 3166 three-letter code format.
toCity string Destination city in ISO 3166 three-letter code format.
carrierCode array Array of airline codes in IATA two-letter code format. If provided, only fares from these airlines will be included.
product array Package type, supports two package types: AirlineBundle and AerohubBundle. If empty, it defaults to AerohubBundle.
priceMode int Pricing mode: 0 represents the lowest price mode, returning only the lowest price across all packages; 1 represents all, returning prices for all package types. Default is 0.
serviceTag object Object specifying service requirements, including ticket issuance speed, order splitting, ticket number changes, and email use.
currency string Currency for quotes. Defaults to USD if not specified. Use ISO currency codes, e.g., USD, EUR, JPY.
siteChannel int Source of the request, indicating the site’s service requirements. For example, 1 represents site1.
timeout float Includes one decimal place, representing the required response time (in seconds). If the response time exceeds this value, it will not be displayed. Note: This duration includes network transmission time.
isCompressEncode bool Indicates if the supplier should compress the query response. true for compression, false for no compression. Responses compressed via gzip should include a Content-Encoding: gzip header.

ServiceTag Object

Parameter Name Type Required Description
ticketSpeed int Ticket issuance speed: 0 for 30 minutes, 1 for 1 hour, 2 for 12 hours.
nonSplitOrder int Specifies if split-ticketing is allowed: 0 for no restrictions, 1 to prohibit splitting orders.
nonReplaceTicketNo int Specifies if ticket numbers can be replaced post-issuance: 0 for no restrictions, 1 to prohibit.
issueMailbox int Specifies email usage during ticket issuance: 0 for no restrictions, 1 to use provided email and phone.

Sample Request:

{
    "requestId": "a8fd68b2d2b7b3568c03abd9c05ec6cf",
    "timeOut":5.0,
    "tripType": 1,
    "flightType": 0,
    "adultNumber": 2,
    "childNumber": 0,
    "infantNumber": 0,
    "fromDate": "20230701",
    "retDate": "",
    "fromCity": "HKT",
    "toCity": "BKK",
    "carrierCode": [],
    "product": ["AirlineBundle""AerohubBundle"],
    "includeSSR": [],
    "serviceTag": {
      "ticketSpeed": 1,
      "nonSplitOrder": 0,
      "nonReplaceTicketNo": 1,
      "issueMailbox": 0
    },
   "isCompressEncode": false
}

Response

Parameter Name Type Required Description
marketErrorCode int Supplier system error code, used to assist AeroHub and suppliers in troubleshooting. Please return the actual error.
marketErrorMsg string Supplier system error description. Please return the actual reason for the error. Length < 300.
flightList array/flightList Element Flight information reflecting the supported flight numbers for this search.
shoppingResultList array/shoppingResultList Element Quotation information, one-to-many relationship with flightList (one flight may have multiple quotes, e.g., different passenger types or classes).

array/flightList Element

Parameter Name Type Required Description
flightRefNum int Flight index number, associated with flightRefList in shoppingResultList. Starts from 1, must be unique.
marketingCarrier string Airline code (IATA two-letter code) corresponding to the first two characters of flightNumber.
flightNumber string Flight number, e.g., CA123.
codeShare bool Indicates whether this flight is a codeshare flight. true = codeshare; false = not codeshare. If true, operatingCarrier and operatingFlightNo must be provided.
operatingCarrier string Operating airline code (IATA two-letter code) corresponding to the first two characters of operatingFlightNo.
operatingFlightNo string Operating flight number.
depAirport string Departure airport code (IATA three-letter code).
arrAirport string Arrival airport code (IATA three-letter code).
depTerminal string Departure terminal code (e.g., T1 for Terminal 1).
arrTerminal string Arrival terminal code (e.g., T1 for Terminal 1).
depTime string Departure date and time (local time) in the format YYYYMMDDHHMM. E.g., 202303100300 = March 10, 2023, at 03:00.
arrTime string Arrival date and time (local time) in the format YYYYMMDDHHMM. E.g., 202303101305 = March 10, 2023, at 13:05.
aircraftCode string Aircraft type (IATA three-character code).
stops array/stops Stopover details (if none, this node may be omitted).

array/stops Element

Parameter Name Type Required Description
stopAirport string Stopover airport (IATA three-letter code).
stopDuration int Stopover duration in minutes. If exact duration is unavailable, set to 0.
stopCity string Stopover city (ISO 3166 three-letter code).
stopoverArrivalTime string Stopover arrival time in YYYYMMDDHHMM format.
stopoverDepartureTime string Stopover departure time in YYYYMMDDHHMM format.

array/shoppingResultList Element

Parameter Name Type Required Description
data string Supplier-specific data. Used to store essential information. During verification, the original data will be returned.
flightRefList array/flightRefList Element Segment information.
tuList array/tuList Element Pricing information.

array/flightRefList Element

Parameter Name Type Required Description
flightRefNum int Flight index number, associated with flightRefNum in flightList.
segmentNo int Segment order: 1 for outbound, 2 for return.
flightSeq int Flight segment order (starts from 1). For round trips, both outbound and return start from 1.
tuSequence int The value is fixed at 1.
seatGrade string Cabin class: F = First, C = Business, S = Premium Economy, Y = Economy.
seatClass string Seat code.
seatCount int Maximum purchasable seats (1–9). Default is 9; cannot be 0.
originSeatClass string AeroHub field for refund/rebooking. Suppliers may ignore.

array/tuList Element

Parameter Name Type Required Description
tuSequence int Represents the ticket sequence number. Currently always returns 1, not yet in use.
priceList array/priceList Ticket prices for different passenger types.
eligibility string Passenger type code: NOR (Regular Adult), LAB (Labor), SEA (Seaman), SNR (Senior), STU (Student), YOU (Youth).
validatingCarrier string The validating airline code, using the IATA two-letter standard.
productType string Product type. Blank indicates a standard product (refund and change policies follow airline rules). Currently, AeroHub only supports standard products.
fareBasis string Corresponds to fare classes in GDS. For multiple segments, separate values with a semicolon ";".
bookingOfficeNo string Booking office number. Reserved for future use by AeroHub; can currently be left blank.
ticketingOfficeNo string Ticketing office number. Reserved for future use by AeroHub; can currently be left blank.
reservationType string Policy source. Reserved for future use by AeroHub; can currently be left blank.
posCode string Point of sale country code, using ISO 3166 two-letter standard. Use “
complexTerm int Reserved field for special products. Currently, AeroHub has no special products; this field can be set to 0.
minAge int Minimum passenger age restriction for this flight. Set to 0 for no restriction.
maxAge int Maximum passenger age restriction for this flight. Set to 0 for no restriction.
invoiceType string The type of document the supplier can provide: T (Itinerary), F (Invoice), E (E-invoice).
minPassengerCount int Minimum number of passengers allowed for this flight, starting from 1.
maxPassengerCount int Maximum number of passengers allowed for this flight.
note string Notes or remarks, up to 300 characters.
airlineAncillaries object/airlineAncillaries Element Baggage information reflecting whether baggage is available for sale or included.
packageInfo object/packageInfo Element Package information. If blank or absent, it indicates the lowest-priced product.
formatBaggageDetailList array/formatBaggageDetailList Element Free baggage details. Absence of this element indicates no free baggage allowance.
refundInfoList array/refundInfoList Element Refund rules.
changesInfoList array/changesInfoList Element Change rules.
currency string Quoted currency, typically matching the settlement currency agreed with the supplier.
ticketTimeUnit int Ticketing time limit in seconds, used to match AeroHub’s ticketing requirements for different products.
endorsement int Endorsement status: 0 (Not supported), 1 (Supported).

array/priceList Element

Parameter Name Type Required Description
passengerType int Passenger type: 0 (Adult), 1 (Child), 2 (Infant).
publishPrice float Published fare, excluding taxes.
price float Ticket price excluding taxes. For multiple segments (round-trip/connecting), only returned for the first segment.
taxFeeAmount float Tax amount. For multiple segments (round-trip/connecting), only returned for the first segment.
taxFeeDisclosureList array/TaxFeeDisclosureList Element Tax breakdown. Reserved field for AeroHub; can currently be returned empty.

array/TaxFeeDisclosureList Element

Parameter Name Type Required Description
type int Tax type: 1 (Airport Construction Fee), 2 (Fuel Surcharge). This field is currently valid only for Chinese domestic airlines.
amount float Tax amount. If set to 0, it indicates free of charge.

object/airlineAncillaries Element

Parameter Name Type Required Description
baggageService bool Indicates whether chargeable baggage is available for purchase: true (available), false (not available). If true, the baggage price can be retrieved using the SSR API.
unFreeBaggage bool Indicates whether free baggage is available: true (no free baggage allowance), false (all flights include some free baggage allowance or partial free allowance).

object/packageInfo Element

Parameter Name Type Required Description
packageType string Package type. If empty, the default is AerohubBundle. Possible values: AirlineBundle (airline package), AerohubBundle (agent bundle package).
packageName string Package name: when the value is AHBasic, it indicates the lowest price in AerohubBundle. If packageType is AirlineBundle, the name must match the airline’s package name. If packageType is AerohubBundle, the package name must follow the custom naming rules specified in BundleNameRules.

array/formatBaggageDetailList Element

Parameter Name Type Required Description
segmentNo int Segment order: 1 for outbound, 2 for return (associated with segmentNo in flightRefList)
flightSeq int Flight segment order, starting from 1. Note: For round trips, both outbound and return start from 1 (associated with flightSeq in flightRefList)
passengerType int Passenger type: 0 for adult, 1 for child, 2 for infant
baggagePiece int Number of checked baggage pieces. If -1, it means unlimited pieces.
baggageWeightType int Measurement method: 1 for per-piece weight, 2 for total weight. Default is 1, used together with baggageWeight.
baggageWeight int Checked baggage weight in KG, used together with baggagePiece.
carryonBaggagePiece int Number of carry-on baggage pieces. If -1, it means unlimited pieces.
carryonBaggageWeightType int Carry-on baggage measurement method: 1 for per-piece weight, 2 for total weight. Default is 1, used together with carryonBaggageWeight.
carryonBaggageWeight int Carry-on baggage weight in KG, used together with carryonBaggagePiece.

array/refundInfoList Element

Parameter Name Type Required Description
passengerType int Passenger type: 0 (Adult), 1 (Child), 2 (Infant).
refundType int Refund type: 0 (All segments unused), 1 (Outbound segment used).
refundStatus string Refund indicator: T (Non-refundable), H (Refundable with conditions), F (Free refund), E (As per airline policy). For standard products, use E.
refundFee float Refund fee, in the same currency as the ticket price.
refNoshow string No-show refund rule: T (Non-refundable), H (Refundable with conditions), F (Free refund), E (As per airline policy).
refNoShowCondition int Time limit (in hours) for applying for a refund in case of no-show. For example, if the request must be made at least 4 hours before departure, set to 4.
refNoshowFee float Refund fee for no-show cases.
conditionList array/conditionList Element Refund rules for different departure times when there are multiple fee conditions.

array/changesInfoList Element

Parameter Name Type Required Description
passengerType int Passenger type: 0 (Adult), 1 (Child), 2 (Infant).
changesType int Change type: 0 (All segments unused), 1 (Outbound segment used).
changesStatus string Change indicator: T (Non-changeable), H (Changeable with conditions), F (Free change), E (As per airline policy). For standard products, use E.
changesFee float Change fee, in the same currency as the ticket price.
revNoshow string No-show change rule: T (Non-changeable), H (Changeable with conditions), F (Free change), E (As per airline policy).
revNoShowCondition int Time limit (in hours) for applying for a change in case of no-show. For example, if the request must be made at least 4 hours before departure, set to 4.
revNoShowFee float Change fee for no-show cases.
conditionList array/conditionList Element Change rules for different departure times when there are multiple fee conditions.

array/conditionList Element

Parameter Name Type Required Description
status string Refund/Change indicator: T (Non-refundable/non-changeable), H (Refundable/changeable with conditions), F (Free refund/change), E (As per airline policy).
endMinute int Time limit (in minutes) for applying for a refund/change before departure. For example, if the request must be made at least 240 minutes (4 hours) before departure, set to 240.
amount float Refund/Change fee. If status is H, this value is required; if status is T/F, it may be omitted.

Success Response:

{
    "marketErrorCode": 200,
    "marketErrorMsg": "Successful",
    "serviceTag": {
      "ticketSpeed": 1,
      "nonSplitOrder": 0,
      "nonReplaceTicketNo": 1,
      "issueMailbox": 0
    },
    "flightList": [{
        "flightRefNum": 1,
        "marketingCarrier": "DY",
        "flightNumber": "DY1495",
        "codeShare": false,
        "operatingCarrier": "",
        "operatingFlightNo": "",
        "depAirport": "CDG",
        "arrAirport": "OSL",
        "depTerminal": "",
        "arrTerminal": "",
        "depTime": "202407021020",
        "arrTime": "202407021240",
        "aircraftCode": "73H",
        "stops": []
    },
    {
        "flightRefNum": 2,
        "marketingCarrier": "D8",
        "flightNumber": "D82047",
        "codeShare": false,
        "operatingCarrier": "",
        "operatingFlightNo": "",
        "depAirport": "CDG",
        "arrAirport": "ARN",
        "depTerminal": "",
        "arrTerminal": "",
        "depTime": "202407021215",
        "arrTime": "202407021455",
        "aircraftCode": "7M8",
        "stops": []
    },
    {
        "flightRefNum": 3,
        "marketingCarrier": "DY",
        "flightNumber": "DY817",
        "codeShare": false,
        "operatingCarrier": "",
        "operatingFlightNo": "",
        "depAirport": "ARN",
        "arrAirport": "OSL",
        "depTerminal": "",
        "arrTerminal": "",
        "depTime": "202407021630",
        "arrTime": "202407021730",
        "aircraftCode": "73H",
        "stops": []
    },
    {
        "flightRefNum": 4,
        "marketingCarrier": "DY",
        "flightNumber": "DY823",
        "codeShare": false,
        "operatingCarrier": "",
        "operatingFlightNo": "",
        "depAirport": "ARN",
        "arrAirport": "OSL",
        "depTerminal": "",
        "arrTerminal": "",
        "depTime": "202407021930",
        "arrTime": "202407022030",
        "aircraftCode": "73H",
        "stops": []
    }],
    "shoppingResultList": [{
        "flightRefList": [{
            "flightRefNum": 1,
            "segmentNo": 1,
            "flightSeq": 1,
            "tuSequence": 1,
            "seatGrade": "Y",
            "seatClass": "V",
            "seatCount": 9,
            "originSeatClass": ""
        }],
        "data": "eyJzI1FiAiIiwgImZzIjogIiJ9",
        "tuList": [{
            "tuSequence": 1,
            "priceList": [{
                "passengerType": 0,
                "publishPrice": 70.73,
                "price": 70.73,
                "taxFeeAmount": 36.03,
                "taxFeeDisclosureList": []
            },
            {
                "passengerType": 1,
                "publishPrice": 70.73,
                "price": 70.73,
                "taxFeeAmount": 36.03,
                "taxFeeDisclosureList": []
            }],
            "eligibility": "",
            "validatingCarrier": "DY",
            "productType": "",
            "fareBasis": "",
            "bookingOfficeNo": "",
            "ticketingOfficeNo": "",
            "reservationType": "",
            "posCode": "CN",
            "complexTerm": 0,
            "minAge": 0,
            "maxAge": 0,
            "invoiceType": "E",
            "minPassengerCount": 1,
            "maxPassengerCount": 9,
            "note": "",
            "airlineAncillaries": {
                "baggageService": true,
                "unFreeBaggage": true
            },
            "packageInfo": null,
            "formatBaggageDetailList": [{
                "segmentNo": 1,
                "flightSeq": 1,
                "passengerType": 0,
                "baggagePiece": 0,
                "baggageWeight": 0
            },
            {
                "segmentNo": 1,
                "flightSeq": 1,
                "passengerType": 1,
                "baggagePiece": 0,
                "baggageWeight": 0
            }],
            "refundInfoList": [{
                "passengerType": 0,
                "refundType": 0,
                "refundStatus": "T",
                "refundFee": 0,
                "refNoshow": "T",
                "refNoShowCondition": 0,
                "refNoshowFee": 0,
                "conditionList": []
            },
            {
                "passengerType": 1,
                "refundType": 0,
                "refundStatus": "T",
                "refundFee": 0,
                "refNoshow": "T",
                "refNoShowCondition": 0,
                "refNoshowFee": 0,
                "conditionList": []
            }],
            "changesInfoList": [{
                "passengerType": 0,
                "changesType": 0,
                "changesStatus": "T",
                "changesFee": 0,
                "revNoshow": "T",
                "revNoShowCondition": 0,
                "revNoshowFee": 0,
                "conditionList": ""
            },
            {
                "passengerType": 1,
                "changesType": 0,
                "changesStatus": "T",
                "changesFee": 0,
                "revNoshow": "T",
                "revNoShowCondition": 0,
                "revNoshowFee": 0,
                "conditionList": ""
            }],
            "currency": "USD",
            "ticketTimeUnit": 0,
            "endorsement": 0
        }]
    },
    {
        "flightRefList": [{
            "flightRefNum": 2,
            "segmentNo": 1,
            "flightSeq": 1,
            "tuSequence": 1,
            "seatGrade": "Y",
            "seatClass": "T",
            "seatCount": 7,
            "originSeatClass": ""
        },
        {
            "flightRefNum": 3,
            "segmentNo": 1,
            "flightSeq": 2,
            "tuSequence": 1,
            "seatGrade": "Y",
            "seatClass": "X",
            "seatCount": 7,
            "originSeatClass": ""
        }],
        "data": "eyJzIXiwgImZzIjogIiJ9",
        "tuList": [{
            "tuSequence": 1,
            "priceList": [{
                "passengerType": 0,
                "publishPrice": 108.62,
                "price": 108.62,
                "taxFeeAmount": 43.98,
                "taxFeeDisclosureList": []
            },
            {
                "passengerType": 1,
                "publishPrice": 108.62,
                "price": 108.62,
                "taxFeeAmount": 43.98,
                "taxFeeDisclosureList": []
            }],
            "eligibility": "",
            "validatingCarrier": "D8",
            "productType": "",
            "fareBasis": "",
            "bookingOfficeNo": "",
            "ticketingOfficeNo": "",
            "reservationType": "",
            "posCode": "CN",
            "complexTerm": 0,
            "minAge": 0,
            "maxAge": 0,
            "invoiceType": "E",
            "minPassengerCount": 1,
            "maxPassengerCount": 7,
            "note": "",
            "airlineAncillaries": {
                "baggageService": true,
                "unFreeBaggage": true
            },
            "packageInfo": null,
            "formatBaggageDetailList": [{
                "segmentNo": 1,
                "flightSeq": 1,
                "passengerType": 0,
                "baggagePiece": 0,
                "baggageWeight": 0
            },
            {
                "segmentNo": 1,
                "flightSeq": 1,
                "passengerType": 1,
                "baggagePiece": 0,
                "baggageWeight": 0
            },
            {
                "segmentNo": 1,
                "flightSeq": 2,
                "passengerType": 0,
                "baggagePiece": 0,
                "baggageWeight": 0
            },
            {
                "segmentNo": 1,
                "flightSeq": 2,
                "passengerType": 1,
                "baggagePiece": 0,
                "baggageWeight": 0
            }],
            "refundInfoList": [{
                "passengerType": 0,
                "refundType": 0,
                "refundStatus": "T",
                "refundFee": 0,
                "refNoshow": "T",
                "refNoShowCondition": 0,
                "refNoshowFee": 0,
                "conditionList": []
            },
            {
                "passengerType": 1,
                "refundType": 0,
                "refundStatus": "T",
                "refundFee": 0,
                "refNoshow": "T",
                "refNoShowCondition": 0,
                "refNoshowFee": 0,
                "conditionList": []
            }],
            "changesInfoList": [{
                "passengerType": 0,
                "changesType": 0,
                "changesStatus": "T",
                "changesFee": 0,
                "revNoshow": "T",
                "revNoShowCondition": 0,
                "revNoshowFee": 0,
                "conditionList": ""
            },
            {
                "passengerType": 1,
                "changesType": 0,
                "changesStatus": "T",
                "changesFee": 0,
                "revNoshow": "T",
                "revNoShowCondition": 0,
                "revNoshowFee": 0,
                "conditionList": ""
            }],
            "currency": "USD",
            "ticketTimeUnit": 0,
            "endorsement": 0
        }]
    },
    {
        "flightRefList": [{
            "flightRefNum": 2,
            "segmentNo": 1,
            "flightSeq": 1,
            "tuSequence": 1,
            "seatGrade": "Y",
            "seatClass": "T",
            "seatCount": 7,
            "originSeatClass": ""
        },
        {
            "flightRefNum": 4,
            "segmentNo": 1,
            "flightSeq": 2,
            "tuSequence": 1,
            "seatGrade": "Y",
            "seatClass": "X",
            "seatCount": 7,
            "originSeatClass": ""
        }],
        "data": "eyJzIjMTEIiwgImZzIjogIiJ9",
        "tuList": [{
            "tuSequence": 1,
            "priceList": [{
                "passengerType": 0,
                "publishPrice": 108.62,
                "price": 108.62,
                "taxFeeAmount": 43.98,
                "taxFeeDisclosureList": []
            },
            {
                "passengerType": 1,
                "publishPrice": 108.62,
                "price": 108.62,
                "taxFeeAmount": 43.98,
                "taxFeeDisclosureList": []
            }],
            "eligibility": "",
            "validatingCarrier": "D8",
            "productType": "",
            "fareBasis": "",
            "bookingOfficeNo": "",
            "ticketingOfficeNo": "",
            "reservationType": "",
            "posCode": "CN",
            "complexTerm": 0,
            "minAge": 0,
            "maxAge": 0,
            "invoiceType": "E",
            "minPassengerCount": 1,
            "maxPassengerCount": 7,
            "note": "",
            "airlineAncillaries": {
                "baggageService": true,
                "unFreeBaggage": true
            },
            "packageInfo":null,
            "formatBaggageDetailList": [{
                "segmentNo": 1,
                "flightSeq": 1,
                "passengerType": 0,
                "baggagePiece": 0,
                "baggageWeight": 0
            },
            {
                "segmentNo": 1,
                "flightSeq": 1,
                "passengerType": 1,
                "baggagePiece": 0,
                "baggageWeight": 0
            },
            {
                "segmentNo": 1,
                "flightSeq": 2,
                "passengerType": 0,
                "baggagePiece": 0,
                "baggageWeight": 0
            },
            {
                "segmentNo": 1,
                "flightSeq": 2,
                "passengerType": 1,
                "baggagePiece": 0,
                "baggageWeight": 0
            }],
            "refundInfoList": [{
                "passengerType": 0,
                "refundType": 0,
                "refundStatus": "T",
                "refundFee": 0,
                "refNoshow": "T",
                "refNoShowCondition": 0,
                "refNoshowFee": 0,
                "conditionList": []
            },
            {
                "passengerType": 1,
                "refundType": 0,
                "refundStatus": "T",
                "refundFee": 0,
                "refNoshow": "T",
                "refNoShowCondition": 0,
                "refNoshowFee": 0,
                "conditionList": []
            }],
            "changesInfoList": [{
                "passengerType": 0,
                "changesType": 0,
                "changesStatus": "T",
                "changesFee": 0,
                "revNoshow": "T",
                "revNoShowCondition": 0,
                "revNoshowFee": 0,
                "conditionList": ""
            },
            {
                "passengerType": 1,
                "changesType": 0,
                "changesStatus": "T",
                "changesFee": 0,
                "revNoshow": "T",
                "revNoShowCondition": 0,
                "revNoshowFee": 0,
                "conditionList": ""
            }],
            "currency": "USD",
            "ticketTimeUnit": 0,
            "endorsement": 0
        }]
    }]
}

Error Response

{
    "marketErrorCode": 1006,
    "marketErrorMsg": "An unknown error occurred"
}
Author:AeroHub  Create time:2023-07-10 16:10
Last editor:AeroHub  Update time:2025-07-29 17:21