feat(transformers): provide a region's product inventory level
Feature request
1. Summary of expected behavior (User story)
As a construction-consumer,
I want to know how many products are in-stock at a store/business
in order to save time and operational (pickup) costs.
2. Acceptance criteria
We'll be done when:
-
The current approximate inventory level of a Product
is available by place (e.g., local or online business). -
The product.
review property is removed. Theproduct.offers.
availabilityEnds property exists.Theproduct.offers.
availabilityStarts property exists.-
The product.offers.
availableAtOrFrom property as an array ofHomeAndConstructionBusiness
exists. -
The product.offers.
availableDeliveryMethod property as an array ofDeliveryMethod
enumerations exists. -
The The product.offers.
ineligibleRegion property exists. -
The product.offers.
inventoryLevel property asQuantitativeValue
exists. -
The product.offers.
priceSpecification property asDeliveryChargeSpecification
exists.
-
ⓘ See the wiki page
ProductFulfillmentAdaptor
for details. - See MR !10 (merged) for commits & work.
3. Notes
3.1. How Home Depot determines inventory levels
An HD product page POSTs
a GraphQL query with XHR requests to a federated datastore based on the location of the Product webpage's viewer. The response returns additional product data.
3.1.1. Request
General info | Value |
---|---|
Request URL | https://www.homedepot.com/federation-gateway/graphql?opname=productClientOnlyProduct |
Request Method | POST |
Status Code | 200 OK |
Remote Address | 173.222.253.243:443 |
Referrer Policy | strict-origin-when-cross-origin |
3.1.1.1. Request headers:
Request header | Value |
---|---|
:authority: | www.homedepot.com |
:method: | POST |
:path: | /federation-gateway/graphql?opname=productClientOnlyProduct |
:scheme: | https |
Accept: | */* |
Accept-Encoding: | gzip, deflate, br, zstd |
Accept-Language: | en-US,en;q=0.6 |
Cache-Control: | no-cache |
Content-Length: | 10156 |
Content-Type: | application/json |
Cookies: | |
Dnt: | 1 |
Origin: | https://www.homedepot.com |
Pragma: | no-cache |
Referer: | https://www.homedepot.com/p/Huber-6-in-x-20-ft-ZIP-System-Linered-Stretch-Tape-EHD5017118/310526318 |
Sec-Ch-Ua: | "Brave";v="123", "Not:A-Brand";v="8", "Chromium";v="123" |
Sec-Ch-Ua-Mobile: | ?0 |
Sec-Ch-Ua-Platform: | "macOS" |
Sec-Fetch-Dest: | empty |
Sec-Fetch-Mode: | cors |
Sec-Fetch-Site: | same-origin |
Sec-Gpc: | 1 |
User-Agent: | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 |
X-Api-Cookies: | {"tt_search":"msr_l1l2_with_semantic","x-user-id":"41f4445f-1344-d463-4840-73d1e2a2fa93"} |
X-Cloud-Trace-Context: | 696bc358c0e94ba59e7c7c783c9deaa0/1;o=1 |
X-Current-Url: | /p/Huber-6-in-x-20-ft-ZIP-System-Linered-Stretch-Tape-EHD5017118/310526318 |
X-Debug: | false |
X-Experience-Name: | general-merchandise |
X-Hd-Dc: | origin |
X-Parent-Trace-Id: | 93a58e4e925b0c91e2ddd1b4dcc9bdee/1906128057135935132 |
X-Thd-Customer-Token: |
3.1.1.2. Request payload/body:
Toggle request payload (parsed and formatted for legibility)
{
"operationName": "productClientOnlyProduct",
"variables": {
"skipSubscribeAndSave": false,
"skipFavoriteCount": false,
"skipPaintDetails": true,
"skipSpecificationGroup": false,
"skipInstallServices": true,
"skipKPF": false,
"itemId": "310526318",
"storeId": "2781",
"zipCode": "48235"
},
"query":"query productClientOnlyProduct(
$storeId: String,
$zipCode: String,
$quantity: Int,
$itemId: String!,
$dataSource: String,
$loyaltyMembershipInput: LoyaltyMembershipInput,
$skipSubscribeAndSave: Boolean = false,
$skipFavoriteCount: Boolean = false,
$configId: String,
$skipPaintDetails: Boolean = true,
$skipSpecificationGroup: Boolean = false,
$skipInstallServices: Boolean = true,
$skipKPF: Boolean = false) {
product(
itemId: $itemId
dataSource: $dataSource
loyaltyMembershipInput: $loyaltyMembershipInput
) {
fulfillment(storeId: $storeId, zipCode: $zipCode, quantity: $quantity) {
backordered
fulfillmentOptions {
type
services {
type
deliveryTimeline
deliveryDates {
startDate
endDate
__typename
}
deliveryCharge
dynamicEta {
hours
minutes
__typename
}
hasFreeShipping
freeDeliveryThreshold
locations {
curbsidePickupFlag
isBuyInStoreCheckNearBy
distance
inventory {
isOutOfStock
isInStock
isLimitedQuantity
isUnavailable
quantity
maxAllowedBopisQty
minAllowedBopisQty
__typename
}
isAnchor
locationId
state
storeName
storePhone
type
storeTimeZone
__typename
}
totalCharge
optimalFulfillment
hasSameDayCarDelivery
__typename
}
fulfillable
__typename
}
anchorStoreStatus
anchorStoreStatusType
backorderedShipDate
bossExcludedShipStates
excludedShipStates
seasonStatusEligible
onlineStoreStatus
onlineStoreStatusType
fallbackMode
sthExcludedShipState
bossExcludedShipState
inStoreAssemblyEligible
bodfsAssemblyEligible
__typename
}
info {
dotComColorEligible
globalCustomConfigurator {
customPosition
customButtonText
customDescription
customExperience
customExperienceUrl
customTitle
__typename
}
bathRenovation
productSubType {
name
link
__typename
}
movingCalculatorEligible
forProfessionalUseOnly
replacementOMSID
label
hidePrice
ecoRebate
quantityLimit
categoryHierarchy
sskMin
sskMax
unitOfMeasureCoverage
wasMaxPriceRange
wasMinPriceRange
hasSubscription
isBuryProduct
isSponsored
isGenericProduct
isLiveGoodsProduct
sponsoredBeacon {
onClickBeacon
onViewBeacon
onClickBeacons
onViewBeacons
__typename
}
sponsoredMetadata {
campaignId
placementId
slotId
sponsoredId
trackSource
__typename
}
returnable
samplesAvailable
customerSignal {
previouslyPurchased
__typename
}
productDepartmentId
productDepartment
augmentedReality
swatches {
isSelected
itemId
label
swatchImgUrl
url
value
__typename
}
totalNumberOfOptions
paintBrand
fiscalYear
classNumber
paintFamily
gccExperienceOmsId
recommendationFlags {
visualNavigation
pipCollections
packages
ACC
collections
frequentlyBoughtTogether
bundles
batItems
__typename
}
minimumOrderQuantity
projectCalculatorEligible
subClassNumber
isInStoreReturnMessageEligible
protectionPlanSku
eligibleProtectionPlanSkus
hasServiceAddOns
consultationType
pipCalculator {
coverageUnits
display
publisher
toggle
__typename
}
__typename
}
identifiers {
skuClassification
productType
storeSkuNumber
brandName
productLabel
isSuperSku
parentId
canonicalUrl
itemId
sampleId
modelNumber
specialOrderSku
toolRentalSkuNumber
rentalCategory
rentalSubCategory
upc
upcGtin13
roomVOEnabled
__typename
}
dataSources
availabilityType {
type
discontinued
status
buyable
__typename
}
media {
augmentedRealityLink {
usdz
image
__typename
}
images {
url
type
subType
sizes
altText
__typename
}
video {
link {
text
url
__typename
}
shortDescription
title
type
videoId
videoStill
url
thumbnail
longDescription
uploadDate
dateModified
__typename
}
threeSixty {
id
url
__typename
}
__typename
}
itemId
taxonomy {
breadCrumbs {
browseUrl
creativeIconUrl
deselectUrl
dimensionName
label
refinementKey
url
__typename
}
brandLinkUrl
__typename
}
pricing(storeId: $storeId) {
value
unitOfMeasure
alternatePriceDisplay
message
original
mapAboveOriginalPrice
promotion {
dollarOff
type
description {
shortDesc
longDesc
__typename
}
percentageOff
promotionTag
savingsCenter
savingsCenterPromos
specialBuySavings
specialBuyDollarOff
specialBuyPercentageOff
dates {
end
start
__typename
}
experienceTag
subExperienceTag
__typename
}
alternate {
bulk {
pricePerUnit
thresholdQuantity
value
__typename
}
unit {
caseUnitOfMeasure
unitsOriginalPrice
unitsPerCase
value
__typename
}
__typename
}
preferredPriceFlag
specialBuy
conditionalPromotions {
dates {
start
end
__typename
}
description {
shortDesc
longDesc
__typename
}
experienceTag
subExperienceTag
eligibilityCriteria {
itemGroup
minPurchaseAmount
minPurchaseQuantity
relatedSkusCount
omsSkus
__typename
}
reward {
tiers {
minPurchaseAmount
minPurchaseQuantity
rewardPercent
rewardAmountPerOrder
rewardAmountPerItem
rewardFixedPrice
maxAllowedRewardAmount
maxPurchaseQuantity
__typename
}
__typename
}
nvalues
brandRefinementId
__typename
}
__typename
}
subscription @skip(if: $skipSubscribeAndSave) {
defaultfrequency
discountPercentage
subscriptionEnabled
__typename
}
favoriteDetail @skip(if: $skipFavoriteCount) {
count
__typename
}
details {
description
highlights
collection {
url
collectionId
name
__typename
}
installation {
leadGenUrl
__typename
}
__typename
}
badges(storeId: $storeId) {
label
name
color
creativeImageUrl
endDate
message
timerDuration
timer {
timeBombThreshold
daysLeftThreshold
dateDisplayThreshold
message
__typename
}
__typename
}
reviews {
ratingsReviews {
totalReviews
averageRating
__typename
}
__typename
}
paintDetails(configId: $configId, storeId: $storeId) @skip(if: $skipPaintDetails) {
brandLogo
colorType
rgb {
red
green
blue
__typename
}
colorDisplayName
__typename
}
dataSource
specificationGroup @skip(if: $skipSpecificationGroup) {
specifications {
specName
specValue
__typename
}
specTitle
__typename
}
seo {
seoKeywords
seoDescription
__typename
}
installServices(storeId: $storeId, zipCode: $zipCode) @skip(if: $skipInstallServices) {
scheduleAMeasure
gccCarpetDesignAndOrderEligible
__typename
}
keyProductFeatures @skip(if: $skipKPF) {
keyProductFeaturesItems {
features {
name
refinementId
refinementUrl
value
__typename
}
__typename
}
__typename
}
sizeAndFitDetail {
attributeGroups {
attributes {
attributeName
dimensions
__typename
}
dimensionLabel
productType
__typename
}
__typename
}
seoDescription
__typename
}
}"}
View cURL request for additional product information…
curl 'https://www.homedepot.com/federation-gateway/graphql?opname=productClientOnlyProduct' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.6' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'cookie: <cookie-value>' \
-H 'dnt: 1' \
-H 'origin: https://www.homedepot.com' \
-H 'pragma: no-cache' \
-H 'referer: https://www.homedepot.com/p/Huber-6-in-x-20-ft-ZIP-System-Linered-Stretch-Tape-EHD5017118/310526318' \
-H 'sec-ch-ua: "Brave";v="123", "Not:A-Brand";v="8", "Chromium";v="123"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'sec-gpc: 1' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36' \
-H 'x-api-cookies: {"tt_search":"msr_l1l2_with_semantic","x-user-id":"41f4445f-1344-d463-4840-73d1e2a2fa93"}' \
-H 'x-cloud-trace-context: 696bc358c0e94ba59e7c7c783c9deaa0/1;o=1' \
-H 'x-current-url: /p/Huber-6-in-x-20-ft-ZIP-System-Linered-Stretch-Tape-EHD5017118/310526318' \
-H 'x-debug: false' \
-H 'x-experience-name: general-merchandise' \
-H 'x-hd-dc: origin' \
-H 'x-parent-trace-id: 93a58e4e925b0c91e2ddd1b4dcc9bdee/1906128057135935132' \
-H 'x-thd-customer-token;' \
--data-raw $'{"operationName":"productClientOnlyProduct","variables":{"skipSubscribeAndSave":false,"skipFavoriteCount":false,"skipPaintDetails":true,"skipSpecificationGroup":false,"skipInstallServices":true,"skipKPF":false,"itemId":"310526318","storeId":"2781","zipCode":"48235"},"query":"query productClientOnlyProduct($storeId: String, $zipCode: String, $quantity: Int, $itemId: String\u0021, $dataSource: String, $loyaltyMembershipInput: LoyaltyMembershipInput, $skipSubscribeAndSave: Boolean = false, $skipFavoriteCount: Boolean = false, $configId: String, $skipPaintDetails: Boolean = true, $skipSpecificationGroup: Boolean = false, $skipInstallServices: Boolean = true, $skipKPF: Boolean = false) {\\n product(\\n itemId: $itemId\\n dataSource: $dataSource\\n loyaltyMembershipInput: $loyaltyMembershipInput\\n ) {\\n fulfillment(storeId: $storeId, zipCode: $zipCode, quantity: $quantity) {\\n backordered\\n fulfillmentOptions {\\n type\\n services {\\n type\\n deliveryTimeline\\n deliveryDates {\\n startDate\\n endDate\\n __typename\\n }\\n deliveryCharge\\n dynamicEta {\\n hours\\n minutes\\n __typename\\n }\\n hasFreeShipping\\n freeDeliveryThreshold\\n locations {\\n curbsidePickupFlag\\n isBuyInStoreCheckNearBy\\n distance\\n inventory {\\n isOutOfStock\\n isInStock\\n isLimitedQuantity\\n isUnavailable\\n quantity\\n maxAllowedBopisQty\\n minAllowedBopisQty\\n __typename\\n }\\n isAnchor\\n locationId\\n state\\n storeName\\n storePhone\\n type\\n storeTimeZone\\n __typename\\n }\\n totalCharge\\n optimalFulfillment\\n hasSameDayCarDelivery\\n __typename\\n }\\n fulfillable\\n __typename\\n }\\n anchorStoreStatus\\n anchorStoreStatusType\\n backorderedShipDate\\n bossExcludedShipStates\\n excludedShipStates\\n seasonStatusEligible\\n onlineStoreStatus\\n onlineStoreStatusType\\n fallbackMode\\n sthExcludedShipState\\n bossExcludedShipState\\n inStoreAssemblyEligible\\n bodfsAssemblyEligible\\n __typename\\n }\\n info {\\n dotComColorEligible\\n globalCustomConfigurator {\\n customPosition\\n customButtonText\\n customDescription\\n customExperience\\n customExperienceUrl\\n customTitle\\n __typename\\n }\\n bathRenovation\\n productSubType {\\n name\\n link\\n __typename\\n }\\n movingCalculatorEligible\\n forProfessionalUseOnly\\n replacementOMSID\\n label\\n hidePrice\\n ecoRebate\\n quantityLimit\\n categoryHierarchy\\n sskMin\\n sskMax\\n unitOfMeasureCoverage\\n wasMaxPriceRange\\n wasMinPriceRange\\n hasSubscription\\n isBuryProduct\\n isSponsored\\n isGenericProduct\\n isLiveGoodsProduct\\n sponsoredBeacon {\\n onClickBeacon\\n onViewBeacon\\n onClickBeacons\\n onViewBeacons\\n __typename\\n }\\n sponsoredMetadata {\\n campaignId\\n placementId\\n slotId\\n sponsoredId\\n trackSource\\n __typename\\n }\\n returnable\\n samplesAvailable\\n customerSignal {\\n previouslyPurchased\\n __typename\\n }\\n productDepartmentId\\n productDepartment\\n augmentedReality\\n swatches {\\n isSelected\\n itemId\\n label\\n swatchImgUrl\\n url\\n value\\n __typename\\n }\\n totalNumberOfOptions\\n paintBrand\\n fiscalYear\\n classNumber\\n paintFamily\\n gccExperienceOmsId\\n recommendationFlags {\\n visualNavigation\\n pipCollections\\n packages\\n ACC\\n collections\\n frequentlyBoughtTogether\\n bundles\\n batItems\\n __typename\\n }\\n minimumOrderQuantity\\n projectCalculatorEligible\\n subClassNumber\\n isInStoreReturnMessageEligible\\n protectionPlanSku\\n eligibleProtectionPlanSkus\\n hasServiceAddOns\\n consultationType\\n pipCalculator {\\n coverageUnits\\n display\\n publisher\\n toggle\\n __typename\\n }\\n __typename\\n }\\n identifiers {\\n skuClassification\\n productType\\n storeSkuNumber\\n brandName\\n productLabel\\n isSuperSku\\n parentId\\n canonicalUrl\\n itemId\\n sampleId\\n modelNumber\\n specialOrderSku\\n toolRentalSkuNumber\\n rentalCategory\\n rentalSubCategory\\n upc\\n upcGtin13\\n roomVOEnabled\\n __typename\\n }\\n dataSources\\n availabilityType {\\n type\\n discontinued\\n status\\n buyable\\n __typename\\n }\\n media {\\n augmentedRealityLink {\\n usdz\\n image\\n __typename\\n }\\n images {\\n url\\n type\\n subType\\n sizes\\n altText\\n __typename\\n }\\n video {\\n link {\\n text\\n url\\n __typename\\n }\\n shortDescription\\n title\\n type\\n videoId\\n videoStill\\n url\\n thumbnail\\n longDescription\\n uploadDate\\n dateModified\\n __typename\\n }\\n threeSixty {\\n id\\n url\\n __typename\\n }\\n __typename\\n }\\n itemId\\n taxonomy {\\n breadCrumbs {\\n browseUrl\\n creativeIconUrl\\n deselectUrl\\n dimensionName\\n label\\n refinementKey\\n url\\n __typename\\n }\\n brandLinkUrl\\n __typename\\n }\\n pricing(storeId: $storeId) {\\n value\\n unitOfMeasure\\n alternatePriceDisplay\\n message\\n original\\n mapAboveOriginalPrice\\n promotion {\\n dollarOff\\n type\\n description {\\n shortDesc\\n longDesc\\n __typename\\n }\\n percentageOff\\n promotionTag\\n savingsCenter\\n savingsCenterPromos\\n specialBuySavings\\n specialBuyDollarOff\\n specialBuyPercentageOff\\n dates {\\n end\\n start\\n __typename\\n }\\n experienceTag\\n subExperienceTag\\n __typename\\n }\\n alternate {\\n bulk {\\n pricePerUnit\\n thresholdQuantity\\n value\\n __typename\\n }\\n unit {\\n caseUnitOfMeasure\\n unitsOriginalPrice\\n unitsPerCase\\n value\\n __typename\\n }\\n __typename\\n }\\n preferredPriceFlag\\n specialBuy\\n conditionalPromotions {\\n dates {\\n start\\n end\\n __typename\\n }\\n description {\\n shortDesc\\n longDesc\\n __typename\\n }\\n experienceTag\\n subExperienceTag\\n eligibilityCriteria {\\n itemGroup\\n minPurchaseAmount\\n minPurchaseQuantity\\n relatedSkusCount\\n omsSkus\\n __typename\\n }\\n reward {\\n tiers {\\n minPurchaseAmount\\n minPurchaseQuantity\\n rewardPercent\\n rewardAmountPerOrder\\n rewardAmountPerItem\\n rewardFixedPrice\\n maxAllowedRewardAmount\\n maxPurchaseQuantity\\n __typename\\n }\\n __typename\\n }\\n nvalues\\n brandRefinementId\\n __typename\\n }\\n __typename\\n }\\n subscription @skip(if: $skipSubscribeAndSave) {\\n defaultfrequency\\n discountPercentage\\n subscriptionEnabled\\n __typename\\n }\\n favoriteDetail @skip(if: $skipFavoriteCount) {\\n count\\n __typename\\n }\\n details {\\n description\\n highlights\\n collection {\\n url\\n collectionId\\n name\\n __typename\\n }\\n installation {\\n leadGenUrl\\n __typename\\n }\\n __typename\\n }\\n badges(storeId: $storeId) {\\n label\\n name\\n color\\n creativeImageUrl\\n endDate\\n message\\n timerDuration\\n timer {\\n timeBombThreshold\\n daysLeftThreshold\\n dateDisplayThreshold\\n message\\n __typename\\n }\\n __typename\\n }\\n reviews {\\n ratingsReviews {\\n totalReviews\\n averageRating\\n __typename\\n }\\n __typename\\n }\\n paintDetails(configId: $configId, storeId: $storeId) @skip(if: $skipPaintDetails) {\\n brandLogo\\n colorType\\n rgb {\\n red\\n green\\n blue\\n __typename\\n }\\n colorDisplayName\\n __typename\\n }\\n dataSource\\n specificationGroup @skip(if: $skipSpecificationGroup) {\\n specifications {\\n specName\\n specValue\\n __typename\\n }\\n specTitle\\n __typename\\n }\\n seo {\\n seoKeywords\\n seoDescription\\n __typename\\n }\\n installServices(storeId: $storeId, zipCode: $zipCode) @skip(if: $skipInstallServices) {\\n scheduleAMeasure\\n gccCarpetDesignAndOrderEligible\\n __typename\\n }\\n keyProductFeatures @skip(if: $skipKPF) {\\n keyProductFeaturesItems {\\n features {\\n name\\n refinementId\\n refinementUrl\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n sizeAndFitDetail {\\n attributeGroups {\\n attributes {\\n attributeName\\n dimensions\\n __typename\\n }\\n dimensionLabel\\n productType\\n __typename\\n }\\n __typename\\n }\\n seoDescription\\n __typename\\n }\\n}"}'
3.1.2. Response
3.1.2.1. Response headers:
Response header | Value |
---|---|
Access-Control-Allow-Headers: | x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN, X-Parent-Trace-Id |
Access-Control-Allow-Headers: | x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN, X-Parent-Trace-Id |
Access-Control-Allow-Methods: | GET, PUT, POST, DELETE, OPTIONS |
Access-Control-Allow-Methods: | GET, PUT, POST, DELETE, OPTIONS |
Access-Control-Allow-Origin: | * |
Access-Control-Allow-Origin: | * |
Cache-Control: | max-age=0, no-cache, no-store |
Content-Encoding: | gzip |
Content-Length: | 2871 |
Content-Type: | text/plain;charset=UTF-8 |
Content-Type: | application/json |
Date: | Tue, 26 Mar 2024 01:03:07 GMT |
Expires: | Tue, 26 Mar 2024 01:03:07 GMT |
Graphql-Service: | product-information-api |
Pragma: | no-cache |
Server-Timing: | cdn-cache; desc=MISS |
Server-Timing: | edge; dur=47 |
Server-Timing: | origin; dur=504 |
Server-Timing: | ak_p; desc="1711414987101_388971226_1090123131_55143_13516_22_0_219";dur=1 |
Vary: | Origin |
Vary: | Access-Control-Request-Method |
Vary: | Access-Control-Request-Headers |
Vary: | Accept-Encoding |
X-Cloud-Trace-Context: | 696bc358c0e94ba59e7c7c783c9deaa0 |
X-Cloud-Trace-Context: | 696bc358c0e94ba59e7c7c783c9deaa0 |
X-Proto: | secure |
X-Tm-Zone: | us-central1-c |
3.1.2.2. Response payload/body:
Toggle response body…
{
"data": {
"product": {
"fulfillment": {
"backordered": false,
"fulfillmentOptions": [
{
"type": "pickup",
"services": [
{
"type": "boss",
"deliveryTimeline": null,
"deliveryDates": {
"startDate": "2024-03-28",
"endDate": "2024-04-02",
"__typename": "DeliveryDate"
},
"deliveryCharge": null,
"dynamicEta": null,
"hasFreeShipping": false,
"freeDeliveryThreshold": null,
"locations": [
{
"curbsidePickupFlag": false,
"isBuyInStoreCheckNearBy": null,
"distance": null,
"inventory": {
"isOutOfStock": false,
"isInStock": true,
"isLimitedQuantity": false,
"isUnavailable": false,
"quantity": 8,
"maxAllowedBopisQty": null,
"minAllowedBopisQty": null,
"__typename": "Inventory"
},
"isAnchor": true,
"locationId": "2781",
"state": "MI",
"storeName": "Detroit 7 Mile/Meyers",
"storePhone": null,
"type": "online",
"storeTimeZone": null,
"__typename": "Location"
}
],
"totalCharge": 0,
"optimalFulfillment": false,
"hasSameDayCarDelivery": false,
"__typename": "Service"
}
],
"fulfillable": true,
"__typename": "FulfillmentOption"
},
{
"type": "delivery",
"services": [
{
"type": "sth",
"deliveryTimeline": "later",
"deliveryDates": {
"startDate": "2024-03-29",
"endDate": "2024-04-01",
"__typename": "DeliveryDate"
},
"deliveryCharge": null,
"dynamicEta": null,
"hasFreeShipping": true,
"freeDeliveryThreshold": null,
"locations": [
{
"curbsidePickupFlag": null,
"isBuyInStoreCheckNearBy": null,
"distance": null,
"inventory": {
"isOutOfStock": false,
"isInStock": true,
"isLimitedQuantity": false,
"isUnavailable": false,
"quantity": 8,
"maxAllowedBopisQty": null,
"minAllowedBopisQty": null,
"__typename": "Inventory"
},
"isAnchor": false,
"locationId": "8119",
"state": "MI",
"storeName": null,
"storePhone": null,
"type": "online",
"storeTimeZone": null,
"__typename": "Location"
}
],
"totalCharge": 0,
"optimalFulfillment": true,
"hasSameDayCarDelivery": false,
"__typename": "Service"
}
],
"fulfillable": true,
"__typename": "FulfillmentOption"
}
],
"anchorStoreStatus": false,
"anchorStoreStatusType": "NA",
"backorderedShipDate": null,
"bossExcludedShipStates": "AK,GU,HI,PR,VI",
"excludedShipStates": "AK,GU,HI,PR,VI",
"seasonStatusEligible": null,
"onlineStoreStatus": true,
"onlineStoreStatusType": "ACTIVE",
"fallbackMode": false,
"sthExcludedShipState": null,
"bossExcludedShipState": null,
"inStoreAssemblyEligible": false,
"bodfsAssemblyEligible": false,
"__typename": "Fulfillment"
},
"info": {
"dotComColorEligible": false,
"globalCustomConfigurator": null,
"bathRenovation": false,
"productSubType": null,
"movingCalculatorEligible": false,
"forProfessionalUseOnly": false,
"replacementOMSID": null,
"label": null,
"hidePrice": false,
"ecoRebate": false,
"quantityLimit": 90,
"categoryHierarchy": null,
"sskMin": null,
"sskMax": null,
"unitOfMeasureCoverage": null,
"wasMaxPriceRange": null,
"wasMinPriceRange": null,
"hasSubscription": false,
"isBuryProduct": null,
"isSponsored": null,
"isGenericProduct": null,
"isLiveGoodsProduct": false,
"sponsoredBeacon": null,
"sponsoredMetadata": null,
"returnable": "90-Day",
"samplesAvailable": false,
"customerSignal": null,
"productDepartmentId": null,
"productDepartment": "21",
"augmentedReality": false,
"swatches": null,
"totalNumberOfOptions": null,
"paintBrand": null,
"fiscalYear": null,
"classNumber": "1",
"paintFamily": null,
"gccExperienceOmsId": null,
"recommendationFlags": {
"visualNavigation": false,
"pipCollections": false,
"packages": false,
"ACC": false,
"collections": false,
"frequentlyBoughtTogether": true,
"bundles": false,
"batItems": false,
"__typename": "RecommendationFlags"
},
"minimumOrderQuantity": 0,
"projectCalculatorEligible": false,
"subClassNumber": "7",
"isInStoreReturnMessageEligible": false,
"protectionPlanSku": null,
"eligibleProtectionPlanSkus": null,
"hasServiceAddOns": false,
"consultationType": "Exterior Doors",
"pipCalculator": null,
"__typename": "Info"
},
"identifiers": {
"skuClassification": "normal",
"productType": "MERCHANDISE",
"storeSkuNumber": "1005806038",
"brandName": "Huber",
"productLabel": "6 in. x 20 ft. ZIP System Linered Stretch Tape",
"isSuperSku": false,
"parentId": null,
"canonicalUrl": "/p/Huber-6-in-x-20-ft-ZIP-System-Linered-Stretch-Tape-EHD5017118/310526318",
"itemId": "310526318",
"sampleId": null,
"modelNumber": "EHD5017118",
"specialOrderSku": null,
"toolRentalSkuNumber": null,
"rentalCategory": null,
"rentalSubCategory": null,
"upc": "728265020204",
"upcGtin13": "0728265020204",
"roomVOEnabled": false,
"__typename": "Identifiers"
},
"dataSources": "catalog",
"availabilityType": {
"type": "Shared",
"discontinued": false,
"status": true,
"buyable": true,
"__typename": "AvailabilityType"
},
"media": {
"augmentedRealityLink": null,
"images": [
{
"url": "https://images.thdstatic.com/productImages/c8145b5d-5321-4987-9cb7-5d9671e77223/svn/huber-door-flashing-ehd5017118-64_<SIZE>.jpg",
"type": "IMAGE",
"subType": "PRIMARY",
"sizes": [
"65",
"100",
"145",
"300",
"400",
"600",
"1000"
],
"altText": null,
"__typename": "Image"
},
{
"url": "https://images.thdstatic.com/productImages/43429fab-9ee9-427d-a83e-2327f38ff6b3/svn/huber-door-flashing-ehd5017118-c3_<SIZE>.jpg",
"type": "IMAGE_ALTERNATE_VIEW",
"subType": null,
"sizes": [
"65",
"100",
"145",
"300",
"400",
"600",
"1000"
],
"altText": null,
"__typename": "Image"
},
{
"url": "https://images.thdstatic.com/productImages/7b1d726a-bf78-4816-81e0-ab05b056b423/svn/huber-door-flashing-ehd5017118-4f_<SIZE>.jpg",
"type": "IMAGE_ALTERNATE_VIEW_2",
"subType": null,
"sizes": [
"65",
"100",
"145",
"300",
"400",
"600",
"1000"
],
"altText": null,
"__typename": "Image"
},
{
"url": "https://images.thdstatic.com/productImages/e4a4d377-3bc3-4a1f-987d-0da77dc21caa/svn/huber-door-flashing-ehd5017118-1f_<SIZE>.jpg",
"type": "IMAGE_ALTERNATE_VIEW_3",
"subType": null,
"sizes": [
"65",
"100",
"145",
"300",
"400",
"600",
"1000"
],
"altText": null,
"__typename": "Image"
}
],
"video": [],
"threeSixty": null,
"__typename": "Media"
},
"itemId": "310526318",
"taxonomy": {
"breadCrumbs": [
{
"browseUrl": null,
"creativeIconUrl": null,
"deselectUrl": null,
"dimensionName": "Category",
"label": "Doors & Windows",
"refinementKey": null,
"url": "/b/Doors-Windows/N-5yc1vZaqih",
"__typename": "BreadCrumb"
},
{
"browseUrl": null,
"creativeIconUrl": null,
"deselectUrl": null,
"dimensionName": "Category",
"label": "Door Accessories",
"refinementKey": null,
"url": "/b/Doors-Windows-Door-Accessories/N-5yc1vZc5eq",
"__typename": "BreadCrumb"
},
{
"browseUrl": null,
"creativeIconUrl": null,
"deselectUrl": null,
"dimensionName": "Category",
"label": "Door Flashing",
"refinementKey": null,
"url": "/b/Doors-Windows-Door-Accessories-Door-Flashing/N-5yc1vZc5fx",
"__typename": "BreadCrumb"
}
],
"brandLinkUrl": "/b/Doors-Windows-Door-Accessories-Door-Flashing/Huber/N-5yc1vZc5fxZ7ay",
"__typename": "Taxonomy"
},
"pricing": {
"value": 56.63,
"unitOfMeasure": "roll",
"alternatePriceDisplay": false,
"message": null,
"original": null,
"mapAboveOriginalPrice": null,
"promotion": null,
"alternate": {
"bulk": null,
"unit": {
"caseUnitOfMeasure": null,
"unitsOriginalPrice": null,
"unitsPerCase": null,
"value": null,
"__typename": "UnitPricing"
},
"__typename": "Alternate"
},
"preferredPriceFlag": false,
"specialBuy": null,
"conditionalPromotions": [],
"__typename": "Pricing"
},
"subscription": null,
"favoriteDetail": {
"count": 38,
"__typename": "FavoriteDetail"
},
"details": {
"description": "ZIP System stretch tape easily stretches to fit sills, curves and corners with a single piece without having to piece tape segments together. Made of a high performance composite acrylic, the tape conforms to challenging applications and locks out moisture even over mismatched surfaces. ZIP System stretch tape can be pulled up and reapplied for easy, fast and hassle-free installation that provides the right seal against weather intrusion.",
"highlights": [
"Stretch tape perfect for sills, curves, and corners",
"Made of composite acrylic for challenging applications",
"Easy to pull-off and re-apply for easy installation"
],
"collection": null,
"installation": null,
"__typename": "Details"
},
"badges": [
{
"label": "Best Seller",
"name": "bestseller",
"color": null,
"creativeImageUrl": null,
"endDate": null,
"message": "BestSeller in Flashing Tools & Accessories",
"timerDuration": "0",
"timer": null,
"__typename": "Badge"
}
],
"reviews": {
"ratingsReviews": {
"totalReviews": "23",
"averageRating": "4.3043",
"__typename": "RatingsReviews"
},
"__typename": "Reviews"
},
"dataSource": "catalog",
"specificationGroup": [
{
"specifications": [
{
"specName": "Returnable",
"specValue": "90-Day",
"__typename": "Specification"
}
],
"specTitle": "Details",
"__typename": "SpecificationGroup"
}
],
"seo": {
"seoKeywords": null,
"seoDescription": "Accord a prepossessing and brilliant appearance to the floors of your residence by choosing this excellent Huber ZIP System Linered Stretch Tape.",
"__typename": "Seo"
},
"keyProductFeatures": null,
"sizeAndFitDetail": {
"attributeGroups": [],
"__typename": "SizeAndFitDetail"
},
"seoDescription": "Accord a prepossessing and brilliant appearance to the floors of your residence by choosing this excellent Huber ZIP System Linered Stretch Tape.",
"__typename": "BaseProduct"
}
}
}
Edited by Zaira Ardor