import {z} from 'zod' export type GetApiV4AdvertisersAdvertisersIdLineItemsArgs = {advertisersId: string, filter?: string | undefined, orderBy?: string | undefined, pageSize?: number | undefined, pageToken?: string | undefined}; export type GetApiV4AdvertisersAdvertisersIdLineItemsOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, Oauth2c?: string | undefined, fetch?: typeof fetch | undefined}; export const demandGenBiddingStrategy = z.object({effectiveBiddingValue: z.string().optional(), effectiveBiddingValueSource: z.enum(["BIDDING_SOURCE_UNSPECIFIED", "BIDDING_SOURCE_LINE_ITEM", "BIDDING_SOURCE_AD_GROUP"]).optional(), type: z.enum(["DEMAND_GEN_BIDDING_STRATEGY_TYPE_UNSPECIFIED", "DEMAND_GEN_BIDDING_STRATEGY_TYPE_TARGET_CPA", "DEMAND_GEN_BIDDING_STRATEGY_TYPE_TARGET_ROAS", "DEMAND_GEN_BIDDING_STRATEGY_TYPE_MAXIMIZE_CONVERSIONS", "DEMAND_GEN_BIDDING_STRATEGY_TYPE_MAXIMIZE_CONVERSION_VALUE", "DEMAND_GEN_BIDDING_STRATEGY_TYPE_MAXIMIZE_CLICKS", "DEMAND_GEN_BIDDING_STRATEGY_TYPE_TARGET_CPC"]).optional(), value: z.string().optional()}); export const fixedBidStrategy = z.object({bidAmountMicros: z.string().optional()}); export const maximizeSpendBidStrategy = z.object({customBiddingAlgorithmId: z.string().optional(), maxAverageCpmBidAmountMicros: z.string().optional(), performanceGoalType: z.enum(["BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_UNSPECIFIED", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CPA", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CPC", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_VIEWABLE_CPM", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CUSTOM_ALGO", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CIVA", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_IVO_TEN", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_AV_VIEWED", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_REACH"]).optional(), raiseBidForDeals: z.boolean().optional()}); export const performanceGoalBidStrategy = z.object({customBiddingAlgorithmId: z.string().optional(), maxAverageCpmBidAmountMicros: z.string().optional(), performanceGoalAmountMicros: z.string().optional(), performanceGoalType: z.enum(["BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_UNSPECIFIED", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CPA", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CPC", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_VIEWABLE_CPM", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CUSTOM_ALGO", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_CIVA", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_IVO_TEN", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_AV_VIEWED", "BIDDING_STRATEGY_PERFORMANCE_GOAL_TYPE_REACH"]).optional()}); export const youtubeAndPartnersBiddingStrategy = z.object({adGroupEffectiveTargetCpaSource: z.enum(["BIDDING_SOURCE_UNSPECIFIED", "BIDDING_SOURCE_LINE_ITEM", "BIDDING_SOURCE_AD_GROUP"]).optional(), adGroupEffectiveTargetCpaValue: z.string().optional(), type: z.enum(["YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_UNSPECIFIED", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_MANUAL_CPV", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_MANUAL_CPM", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_TARGET_CPA", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_TARGET_CPM", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_RESERVE_CPM", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_MAXIMIZE_LIFT", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_MAXIMIZE_CONVERSIONS", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_TARGET_CPV", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_TARGET_ROAS", "YOUTUBE_AND_PARTNERS_BIDDING_STRATEGY_TYPE_MAXIMIZE_CONVERSION_VALUE"]).optional(), value: z.string().optional()}); export const biddingStrategy = z.object({demandGenBid: demandGenBiddingStrategy.optional(), fixedBid: fixedBidStrategy.optional(), maximizeSpendAutoBid: maximizeSpendBidStrategy.optional(), performanceGoalAutoBid: performanceGoalBidStrategy.optional(), youtubeAndPartnersBid: youtubeAndPartnersBiddingStrategy.optional()}); export const lineItemBudget = z.object({budgetAllocationType: z.enum(["LINE_ITEM_BUDGET_ALLOCATION_TYPE_UNSPECIFIED", "LINE_ITEM_BUDGET_ALLOCATION_TYPE_AUTOMATIC", "LINE_ITEM_BUDGET_ALLOCATION_TYPE_FIXED", "LINE_ITEM_BUDGET_ALLOCATION_TYPE_UNLIMITED"]).optional(), budgetUnit: z.enum(["BUDGET_UNIT_UNSPECIFIED", "BUDGET_UNIT_CURRENCY", "BUDGET_UNIT_IMPRESSIONS"]).optional(), maxAmount: z.string().optional()}); export const trackingFloodlightActivityConfig = z.object({floodlightActivityId: z.string().optional(), postClickLookbackWindowDays: z.number().int().optional(), postViewLookbackWindowDays: z.number().int().optional()}); export const conversionCountingConfig = z.object({floodlightActivityConfigs: z.array(trackingFloodlightActivityConfig).optional(), postViewCountPercentageMillis: z.string().optional(), primaryAttributionModelId: z.string().optional()}); export const thirdPartyVendorConfig = z.object({placementId: z.string().optional(), vendor: z.enum(["THIRD_PARTY_VENDOR_UNSPECIFIED", "THIRD_PARTY_VENDOR_MOAT", "THIRD_PARTY_VENDOR_DOUBLE_VERIFY", "THIRD_PARTY_VENDOR_INTEGRAL_AD_SCIENCE", "THIRD_PARTY_VENDOR_COMSCORE", "THIRD_PARTY_VENDOR_TELEMETRY", "THIRD_PARTY_VENDOR_MEETRICS", "THIRD_PARTY_VENDOR_ZEFR", "THIRD_PARTY_VENDOR_NIELSEN", "THIRD_PARTY_VENDOR_KANTAR", "THIRD_PARTY_VENDOR_DYNATA", "THIRD_PARTY_VENDOR_TRANSUNION", "THIRD_PARTY_VENDOR_ORIGIN", "THIRD_PARTY_VENDOR_GEMIUS", "THIRD_PARTY_VENDOR_MEDIA_SCOPE", "THIRD_PARTY_VENDOR_AUDIENCE_PROJECT", "THIRD_PARTY_VENDOR_VIDEO_AMP", "THIRD_PARTY_VENDOR_ISPOT_TV", "THIRD_PARTY_VENDOR_INTAGE", "THIRD_PARTY_VENDOR_MACROMILL", "THIRD_PARTY_VENDOR_VIDEO_RESEARCH", "THIRD_PARTY_VENDOR_AQUILA"]).optional()}); export const thirdPartyMeasurementConfigs = z.object({brandLiftVendorConfigs: z.array(thirdPartyVendorConfig).optional(), brandSafetyVendorConfigs: z.array(thirdPartyVendorConfig).optional(), reachVendorConfigs: z.array(thirdPartyVendorConfig).optional(), viewabilityVendorConfigs: z.array(thirdPartyVendorConfig).optional()}); export const demandGenSettings = z.object({geoLanguageTargetingEnabled: z.boolean().optional(), linkedMerchantId: z.string().optional(), thirdPartyMeasurementConfigs: thirdPartyMeasurementConfigs.optional()}); export const date = z.object({day: z.number().int().optional(), month: z.number().int().optional(), year: z.number().int().optional()}); export const dateRange = z.object({endDate: date.optional(), startDate: date.optional()}); export const lineItemFlight = z.object({dateRange: dateRange.optional(), flightDateType: z.enum(["LINE_ITEM_FLIGHT_DATE_TYPE_UNSPECIFIED", "LINE_ITEM_FLIGHT_DATE_TYPE_INHERITED", "LINE_ITEM_FLIGHT_DATE_TYPE_CUSTOM"]).optional()}); export const frequencyCap = z.object({maxImpressions: z.number().int().optional(), maxViews: z.number().int().optional(), timeUnit: z.enum(["TIME_UNIT_UNSPECIFIED", "TIME_UNIT_LIFETIME", "TIME_UNIT_MONTHS", "TIME_UNIT_WEEKS", "TIME_UNIT_DAYS", "TIME_UNIT_HOURS", "TIME_UNIT_MINUTES"]).optional(), timeUnitCount: z.number().int().optional(), unlimited: z.boolean().optional()}); export const integrationDetails = z.object({details: z.string().optional(), integrationCode: z.string().optional()}); export const mobileApp = z.object({appId: z.string().optional(), displayName: z.string().optional(), platform: z.enum(["PLATFORM_UNSPECIFIED", "IOS", "ANDROID"]).optional(), publisher: z.string().optional()}); export const pacing = z.object({dailyMaxImpressions: z.string().optional(), dailyMaxMicros: z.string().optional(), pacingPeriod: z.enum(["PACING_PERIOD_UNSPECIFIED", "PACING_PERIOD_DAILY", "PACING_PERIOD_FLIGHT"]).optional(), pacingType: z.enum(["PACING_TYPE_UNSPECIFIED", "PACING_TYPE_AHEAD", "PACING_TYPE_ASAP", "PACING_TYPE_EVEN"]).optional()}); export const partnerCost = z.object({costType: z.enum(["PARTNER_COST_TYPE_UNSPECIFIED", "PARTNER_COST_TYPE_ADLOOX", "PARTNER_COST_TYPE_ADLOOX_PREBID", "PARTNER_COST_TYPE_ADSAFE", "PARTNER_COST_TYPE_ADXPOSE", "PARTNER_COST_TYPE_AGGREGATE_KNOWLEDGE", "PARTNER_COST_TYPE_AGENCY_TRADING_DESK", "PARTNER_COST_TYPE_DV360_FEE", "PARTNER_COST_TYPE_COMSCORE_VCE", "PARTNER_COST_TYPE_DATA_MANAGEMENT_PLATFORM", "PARTNER_COST_TYPE_DEFAULT", "PARTNER_COST_TYPE_DOUBLE_VERIFY", "PARTNER_COST_TYPE_DOUBLE_VERIFY_PREBID", "PARTNER_COST_TYPE_EVIDON", "PARTNER_COST_TYPE_INTEGRAL_AD_SCIENCE_VIDEO", "PARTNER_COST_TYPE_INTEGRAL_AD_SCIENCE_PREBID", "PARTNER_COST_TYPE_MEDIA_COST_DATA", "PARTNER_COST_TYPE_MOAT_VIDEO", "PARTNER_COST_TYPE_NIELSEN_DAR", "PARTNER_COST_TYPE_SHOP_LOCAL", "PARTNER_COST_TYPE_TERACENT", "PARTNER_COST_TYPE_THIRD_PARTY_AD_SERVER", "PARTNER_COST_TYPE_TRUST_METRICS", "PARTNER_COST_TYPE_VIZU", "PARTNER_COST_TYPE_CUSTOM_FEE_1", "PARTNER_COST_TYPE_CUSTOM_FEE_2", "PARTNER_COST_TYPE_CUSTOM_FEE_3", "PARTNER_COST_TYPE_CUSTOM_FEE_4", "PARTNER_COST_TYPE_CUSTOM_FEE_5", "PARTNER_COST_TYPE_SCIBIDS_FEE"]).optional(), feeAmount: z.string().optional(), feePercentageMillis: z.string().optional(), feeType: z.enum(["PARTNER_COST_FEE_TYPE_UNSPECIFIED", "PARTNER_COST_FEE_TYPE_CPM_FEE", "PARTNER_COST_FEE_TYPE_MEDIA_FEE"]).optional(), invoiceType: z.enum(["PARTNER_COST_INVOICE_TYPE_UNSPECIFIED", "PARTNER_COST_INVOICE_TYPE_DV360", "PARTNER_COST_INVOICE_TYPE_PARTNER"]).optional()}); export const partnerRevenueModel = z.object({markupAmount: z.string().optional(), markupType: z.enum(["PARTNER_REVENUE_MODEL_MARKUP_TYPE_UNSPECIFIED", "PARTNER_REVENUE_MODEL_MARKUP_TYPE_CPM", "PARTNER_REVENUE_MODEL_MARKUP_TYPE_MEDIA_COST_MARKUP", "PARTNER_REVENUE_MODEL_MARKUP_TYPE_TOTAL_MEDIA_COST_MARKUP"]).optional()}); export const targetingExpansionConfig = z.object({audienceExpansionLevel: z.enum(["UNKNOWN", "NO_REACH", "LEAST_REACH", "MID_REACH", "MOST_REACH"]).optional(), audienceExpansionSeedListExcluded: z.boolean().optional(), enableOptimizedTargeting: z.boolean().optional(), excludeDemographicExpansion: z.boolean().optional()}); export const youtubeAndPartnersInventorySourceConfig = z.object({includeGoogleTv: z.boolean().optional(), includeYoutube: z.boolean().optional(), includeYoutubeVideoPartners: z.boolean().optional()}); export const targetFrequency = z.object({targetCount: z.string().optional(), timeUnit: z.enum(["TIME_UNIT_UNSPECIFIED", "TIME_UNIT_LIFETIME", "TIME_UNIT_MONTHS", "TIME_UNIT_WEEKS", "TIME_UNIT_DAYS", "TIME_UNIT_HOURS", "TIME_UNIT_MINUTES"]).optional(), timeUnitCount: z.number().int().optional()}); export const videoAdInventoryControl = z.object({allowInFeed: z.boolean().optional(), allowInStream: z.boolean().optional(), allowNonSkippableInStream: z.boolean().optional(), allowShorts: z.boolean().optional()}); export const videoAdSequenceStep = z.object({adGroupId: z.string().optional(), interactionType: z.enum(["INTERACTION_TYPE_UNSPECIFIED", "INTERACTION_TYPE_PAID_VIEW", "INTERACTION_TYPE_SKIP", "INTERACTION_TYPE_IMPRESSION", "INTERACTION_TYPE_ENGAGED_IMPRESSION"]).optional(), previousStepId: z.string().optional(), stepId: z.string().optional()}); export const videoAdSequenceSettings = z.object({minimumDuration: z.enum(["VIDEO_AD_SEQUENCE_MINIMUM_DURATION_UNSPECIFIED", "VIDEO_AD_SEQUENCE_MINIMUM_DURATION_WEEK", "VIDEO_AD_SEQUENCE_MINIMUM_DURATION_MONTH"]).optional(), steps: z.array(videoAdSequenceStep).optional()}); export const youtubeAndPartnersSettings = z.object({contentCategory: z.enum(["YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_UNSPECIFIED", "YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_STANDARD", "YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_EXPANDED", "YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_LIMITED"]).optional(), effectiveContentCategory: z.enum(["YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_UNSPECIFIED", "YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_STANDARD", "YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_EXPANDED", "YOUTUBE_AND_PARTNERS_CONTENT_CATEGORY_LIMITED"]).optional(), inventorySourceSettings: youtubeAndPartnersInventorySourceConfig.optional(), leadFormId: z.string().optional(), linkedMerchantId: z.string().optional(), relatedVideoIds: z.array(z.string()).optional(), targetFrequency: targetFrequency.optional(), thirdPartyMeasurementConfigs: thirdPartyMeasurementConfigs.optional(), videoAdInventoryControl: videoAdInventoryControl.optional(), videoAdSequenceSettings: videoAdSequenceSettings.optional(), viewFrequencyCap: frequencyCap.optional()}); export const lineItem = z.object({advertiserId: z.string().optional(), bidStrategy: biddingStrategy.optional(), budget: lineItemBudget.optional(), campaignId: z.string().optional(), containsEuPoliticalAds: z.enum(["EU_POLITICAL_ADVERTISING_STATUS_UNKNOWN", "CONTAINS_EU_POLITICAL_ADVERTISING", "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING"]).optional(), conversionCounting: conversionCountingConfig.optional(), creativeIds: z.array(z.string()).optional(), demandGenSettings: demandGenSettings.optional(), displayName: z.string().optional(), entityStatus: z.enum(["ENTITY_STATUS_UNSPECIFIED", "ENTITY_STATUS_ACTIVE", "ENTITY_STATUS_ARCHIVED", "ENTITY_STATUS_DRAFT", "ENTITY_STATUS_PAUSED", "ENTITY_STATUS_SCHEDULED_FOR_DELETION"]).optional(), excludeNewExchanges: z.boolean().optional(), flight: lineItemFlight.optional(), frequencyCap: frequencyCap.optional(), insertionOrderId: z.string().optional(), integrationDetails: integrationDetails.optional(), lineItemId: z.string().optional(), lineItemType: z.enum(["LINE_ITEM_TYPE_UNSPECIFIED", "LINE_ITEM_TYPE_DISPLAY_DEFAULT", "LINE_ITEM_TYPE_DISPLAY_MOBILE_APP_INSTALL", "LINE_ITEM_TYPE_VIDEO_DEFAULT", "LINE_ITEM_TYPE_VIDEO_MOBILE_APP_INSTALL", "LINE_ITEM_TYPE_DISPLAY_MOBILE_APP_INVENTORY", "LINE_ITEM_TYPE_VIDEO_MOBILE_APP_INVENTORY", "LINE_ITEM_TYPE_AUDIO_DEFAULT", "LINE_ITEM_TYPE_VIDEO_OVER_THE_TOP", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_ACTION", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_NON_SKIPPABLE", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_VIDEO_SEQUENCE", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_AUDIO", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_REACH", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_SIMPLE", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_NON_SKIPPABLE_OVER_THE_TOP", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_REACH_OVER_THE_TOP", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_SIMPLE_OVER_THE_TOP", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_TARGET_FREQUENCY", "LINE_ITEM_TYPE_YOUTUBE_AND_PARTNERS_VIEW", "LINE_ITEM_TYPE_DISPLAY_OUT_OF_HOME", "LINE_ITEM_TYPE_VIDEO_OUT_OF_HOME", "LINE_ITEM_TYPE_DEMAND_GEN"]).optional(), mobileApp: mobileApp.optional(), name: z.string().optional(), optimizeFixedBidding: z.boolean().optional(), pacing: pacing.optional(), partnerCosts: z.array(partnerCost).optional(), partnerRevenueModel: partnerRevenueModel.optional(), reservationType: z.enum(["RESERVATION_TYPE_UNSPECIFIED", "RESERVATION_TYPE_NOT_GUARANTEED", "RESERVATION_TYPE_PROGRAMMATIC_GUARANTEED", "RESERVATION_TYPE_TAG_GUARANTEED", "RESERVATION_TYPE_PETRA_VIRAL", "RESERVATION_TYPE_INSTANT_RESERVE"]).optional(), targetingExpansion: targetingExpansionConfig.optional(), updateTime: z.string().optional(), warningMessages: z.array(z.enum(["LINE_ITEM_WARNING_MESSAGE_UNSPECIFIED", "INVALID_FLIGHT_DATES", "EXPIRED", "PENDING_FLIGHT", "ALL_PARTNER_ENABLED_EXCHANGES_NEGATIVELY_TARGETED", "INVALID_INVENTORY_SOURCE", "APP_INVENTORY_INVALID_SITE_TARGETING", "APP_INVENTORY_INVALID_AUDIENCE_LISTS", "NO_VALID_CREATIVE", "PARENT_INSERTION_ORDER_PAUSED", "PARENT_INSERTION_ORDER_EXPIRED"])).optional(), youtubeAndPartnersSettings: youtubeAndPartnersSettings.optional()}); export const listLineItemsResponse = z.object({lineItems: z.array(lineItem).optional(), nextPageToken: z.string().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 }; /** * Lists line items in an advertiser. The order is defined by the order_by parameter. If a filter by entity_status is not specified, line items with `ENTITY_STATUS_ARCHIVED` will not be included in the results. * * GET /v4/advertisers/{advertisersId}/lineItems */ export const getApiV4AdvertisersAdvertisersIdLineItems = async (args: GetApiV4AdvertisersAdvertisersIdLineItemsArgs, options?: GetApiV4AdvertisersAdvertisersIdLineItemsOptions) => { const {baseUrl = "https://displayvideo.googleapis.com", fetch: fetchFn = fetch, Oauth2, Oauth2c} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.filter != null) query.append("filter", String(args.filter)) if (args.orderBy != null) query.append("orderBy", String(args.orderBy)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (args.pageToken != null) query.append("pageToken", String(args.pageToken)) if (Oauth2 !== undefined) headers.set('authorization', `Bearer ${Oauth2}`) if (Oauth2c !== undefined) headers.set('authorization', `Bearer ${Oauth2c}`) const url = `${baseUrl.replace(/\/+$/, '')}/v4/advertisers/${encodeURIComponent(String(args.advertisersId))}/lineItems${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(listLineItemsResponse, await res.json()) };