> For the complete documentation index, see [llms.txt](https://developers.oxylabs.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.oxylabs.io/products/web-scraper-api/targets/e-commerce/the-home-depot.md).

# The Home Depot

Learn how to start scraping The Home Depot.

Home Depot has no dedicated source. You scrape its pages with the `universal` source by passing the page `url`. Product pages have a dedicated parser: add `"parse": true` to receive structured JSON instead of the page HTML.

{% hint style="warning" %}
For some targets our system **forces JavaScript rendering** even if you do not set `render`; those requests count as rendered traffic. The list of force-rendered targets and how to switch rendering off are in [Forcing rendering on specific pages](/products/web-scraper-api/features/js-rendering-and-browser-control.md#forcing-rendering-on-specific-pages).
{% endhint %}

<table><thead><tr><th width="148.91015625">Page type</th><th width="416.44140625">URL format</th><th width="71.31640625">Parser</th></tr></thead><tbody><tr><td><a href="#search"><strong>Search page</strong></a></td><td><code>https://www.homedepot.com/s/&#x3C;search-term></code></td><td>No</td></tr><tr><td><a href="#product"><strong>Product page</strong></a></td><td><code>https://www.homedepot.com/p/&#x3C;product-name>/&#x3C;product-id></code></td><td>Yes</td></tr><tr><td><a href="#category"><strong>Category page</strong></a></td><td><code>https://www.homedepot.com/b/&#x3C;category-path>/N-&#x3C;category-id></code></td><td>No</td></tr></tbody></table>

{% hint style="info" %}
Besides the parameters listed below, you can include additional parameters such as `user_agent_type`, `geo_location`, `render`, and more to customize your scraping request. Read more [here](/products/web-scraper-api/features.md).
{% endhint %}

## Search

### Request samples

{% tabs %}
{% tab title="cURL" %}

```shell
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
        "source": "universal",
        "url": "https://www.homedepot.com/s/drill",
        "render": "html"
    }'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint

# Structure payload.
payload = {
    'source': 'universal',
    'url': 'https://www.homedepot.com/s/drill',
    'render': 'html'
}

# Get response.
response = requests.request(
    'POST',
    'https://realtime.oxylabs.io/v1/queries',
    auth=('USERNAME', 'PASSWORD'),
    json=payload
)

# Instead of response with job status and results url, this will return the
# JSON response with the result.
pprint(response.json())
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const https = require("https");

const username = "USERNAME";
const password = "PASSWORD";
const body = {
    source: "universal",
    url: "https://www.homedepot.com/s/drill",
    render: "html"
};

const options = {
    hostname: "realtime.oxylabs.io",
    path: "/v1/queries",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        Authorization:
            "Basic " + Buffer.from(`${username}:${password}`).toString("base64"),
    },
};

const request = https.request(options, (response) => {
    let data = "";

    response.on("data", (chunk) => {
        data += chunk;
    });

    response.on("end", () => {
        const responseData = JSON.parse(data);
        console.log(JSON.stringify(responseData, null, 2));
    });
});

request.on("error", (error) => {
    console.error("Error:", error);
});

request.write(JSON.stringify(body));
request.end();
```

{% endtab %}

{% tab title="HTTP" %}

```http
# The whole string you submit has to be URL-encoded.

https://realtime.oxylabs.io/v1/queries?source=universal&url=https://www.homedepot.com/s/drill&render=html&access_token=12345abcde
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$params = array(
    'source' => 'universal',
    'url' => 'https://www.homedepot.com/s/drill',
    'render' => 'html'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://realtime.oxylabs.io/v1/queries");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "USERNAME" . ":" . "PASSWORD");

$headers = array();
$headers[] = "Content-Type: application/json";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
echo $result;

if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    const Username = "USERNAME"
    const Password = "PASSWORD"

    payload := map[string]interface{}{
        "source": "universal",
        "url": "https://www.homedepot.com/s/drill",
        "render": "html",
    }

    jsonValue, _ := json.Marshal(payload)

    client := &http.Client{}
    request, _ := http.NewRequest("POST",
        "https://realtime.oxylabs.io/v1/queries",
        bytes.NewBuffer(jsonValue),
    )

    request.SetBasicAuth(Username, Password)
    response, _ := client.Do(request)

    responseText, _ := ioutil.ReadAll(response.Body)
    fmt.Println(string(responseText))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;

namespace OxyApi
{
    class Program
    {
        static async Task Main()
        {
            const string Username = "USERNAME";
            const string Password = "PASSWORD";

            var parameters = new {
                source = "universal",
                url = "https://www.homedepot.com/s/drill",
                render = "html"
            };

            var client = new HttpClient();

            Uri baseUri = new Uri("https://realtime.oxylabs.io");
            client.BaseAddress = baseUri;

            var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/v1/queries");
            requestMessage.Content = JsonContent.Create(parameters);

            var authenticationString = $"{Username}:{Password}";
            var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.UTF8.GetBytes(authenticationString));
            requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);

            var response = await client.SendAsync(requestMessage);
            var contents = await response.Content.ReadAsStringAsync();

            Console.WriteLine(contents);
        }
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
package org.example;

import okhttp3.*;
import org.json.JSONObject;
import java.util.concurrent.TimeUnit;

public class Main implements Runnable {
    private static final String AUTHORIZATION_HEADER = "Authorization";
    public static final String USERNAME = "USERNAME";
    public static final String PASSWORD = "PASSWORD";

    public void run() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("source", "universal");
        jsonObject.put("url", "https://www.homedepot.com/s/drill");
        jsonObject.put("render", "html");

        Authenticator authenticator = (route, response) -> {
            String credential = Credentials.basic(USERNAME, PASSWORD);
            return response
                    .request()
                    .newBuilder()
                    .header(AUTHORIZATION_HEADER, credential)
                    .build();
        };

        var client = new OkHttpClient.Builder()
                .authenticator(authenticator)
                .readTimeout(180, TimeUnit.SECONDS)
                .build();

        var mediaType = MediaType.parse("application/json; charset=utf-8");
        var body = RequestBody.create(jsonObject.toString(), mediaType);
        var request = new Request.Builder()
                .url("https://realtime.oxylabs.io/v1/queries")
                .post(body)
                .build();

        try (var response = client.newCall(request).execute()) {
            if (response.body() != null) {
                try (var responseBody = response.body()) {
                    System.out.println(responseBody.string());
                }
            }
        } catch (Exception exception) {
            System.out.println("Error: " + exception.getMessage());
        }

        System.exit(0);
    }

    public static void main(String[] args) {
        new Thread(new Main()).start();
    }
}
```

{% endtab %}

{% tab title="JSON" %}

```json
{
    "source": "universal",
    "url": "https://www.homedepot.com/s/drill",
    "render": "html"
}
```

{% endtab %}
{% endtabs %}

### Request parameter values

<table><thead><tr><th width="180">Parameter</th><th>Description</th><th width="160">Default Value</th></tr></thead><tbody><tr><td><mark style="background-color:green;"><strong><code>source</code></strong></mark></td><td>Sets the scraper. Home Depot pages are scraped with the <code>universal</code> source.</td><td><code>universal</code></td></tr><tr><td><mark style="background-color:green;"><strong><code>url</code></strong></mark></td><td>The URL of the search page, e.g. <code>https://www.homedepot.com/s/drill</code>.</td><td>-</td></tr><tr><td><code>render</code></td><td>Enables JavaScript rendering when set to <code>html</code>. Without rendering, most Home Depot search requests fail.</td><td>-</td></tr></tbody></table>

&#x20;   \- mandatory parameter

## Product <a href="#product" id="product"></a>

### Request samples

{% tabs %}
{% tab title="cURL" %}

```shell
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
        "source": "universal",
        "url": "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378",
        "parse": true
    }'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint

# Structure payload.
payload = {
    'source': 'universal',
    'url': 'https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378',
    'parse': True
}

# Get response.
response = requests.request(
    'POST',
    'https://realtime.oxylabs.io/v1/queries',
    auth=('USERNAME', 'PASSWORD'),
    json=payload
)

# Instead of response with job status and results url, this will return the
# JSON response with the result.
pprint(response.json())
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const https = require("https");

const username = "USERNAME";
const password = "PASSWORD";
const body = {
    source: "universal",
    url: "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378",
    parse: true
};

const options = {
    hostname: "realtime.oxylabs.io",
    path: "/v1/queries",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        Authorization:
            "Basic " + Buffer.from(`${username}:${password}`).toString("base64"),
    },
};

const request = https.request(options, (response) => {
    let data = "";

    response.on("data", (chunk) => {
        data += chunk;
    });

    response.on("end", () => {
        const responseData = JSON.parse(data);
        console.log(JSON.stringify(responseData, null, 2));
    });
});

request.on("error", (error) => {
    console.error("Error:", error);
});

request.write(JSON.stringify(body));
request.end();
```

{% endtab %}

{% tab title="HTTP" %}

```http
# The whole string you submit has to be URL-encoded.

https://realtime.oxylabs.io/v1/queries?source=universal&url=https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378&parse=true&access_token=12345abcde
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$params = array(
    'source' => 'universal',
    'url' => 'https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378',
    'parse' => true
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://realtime.oxylabs.io/v1/queries");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "USERNAME" . ":" . "PASSWORD");

$headers = array();
$headers[] = "Content-Type: application/json";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
echo $result;

if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    const Username = "USERNAME"
    const Password = "PASSWORD"

    payload := map[string]interface{}{
        "source": "universal",
        "url": "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378",
        "parse": true,
    }

    jsonValue, _ := json.Marshal(payload)

    client := &http.Client{}
    request, _ := http.NewRequest("POST",
        "https://realtime.oxylabs.io/v1/queries",
        bytes.NewBuffer(jsonValue),
    )

    request.SetBasicAuth(Username, Password)
    response, _ := client.Do(request)

    responseText, _ := ioutil.ReadAll(response.Body)
    fmt.Println(string(responseText))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;

namespace OxyApi
{
    class Program
    {
        static async Task Main()
        {
            const string Username = "USERNAME";
            const string Password = "PASSWORD";

            var parameters = new {
                source = "universal",
                url = "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378",
                parse = true
            };

            var client = new HttpClient();

            Uri baseUri = new Uri("https://realtime.oxylabs.io");
            client.BaseAddress = baseUri;

            var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/v1/queries");
            requestMessage.Content = JsonContent.Create(parameters);

            var authenticationString = $"{Username}:{Password}";
            var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.UTF8.GetBytes(authenticationString));
            requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);

            var response = await client.SendAsync(requestMessage);
            var contents = await response.Content.ReadAsStringAsync();

            Console.WriteLine(contents);
        }
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
package org.example;

import okhttp3.*;
import org.json.JSONObject;
import java.util.concurrent.TimeUnit;

public class Main implements Runnable {
    private static final String AUTHORIZATION_HEADER = "Authorization";
    public static final String USERNAME = "USERNAME";
    public static final String PASSWORD = "PASSWORD";

    public void run() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("source", "universal");
        jsonObject.put("url", "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378");
        jsonObject.put("parse", true);

        Authenticator authenticator = (route, response) -> {
            String credential = Credentials.basic(USERNAME, PASSWORD);
            return response
                    .request()
                    .newBuilder()
                    .header(AUTHORIZATION_HEADER, credential)
                    .build();
        };

        var client = new OkHttpClient.Builder()
                .authenticator(authenticator)
                .readTimeout(180, TimeUnit.SECONDS)
                .build();

        var mediaType = MediaType.parse("application/json; charset=utf-8");
        var body = RequestBody.create(jsonObject.toString(), mediaType);
        var request = new Request.Builder()
                .url("https://realtime.oxylabs.io/v1/queries")
                .post(body)
                .build();

        try (var response = client.newCall(request).execute()) {
            if (response.body() != null) {
                try (var responseBody = response.body()) {
                    System.out.println(responseBody.string());
                }
            }
        } catch (Exception exception) {
            System.out.println("Error: " + exception.getMessage());
        }

        System.exit(0);
    }

    public static void main(String[] args) {
        new Thread(new Main()).start();
    }
}
```

{% endtab %}

{% tab title="JSON" %}

```json
{
    "source": "universal",
    "url": "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378",
    "parse": true
}
```

{% endtab %}
{% endtabs %}

### Request parameter values

<table><thead><tr><th width="180">Parameter</th><th>Description</th><th width="160">Default Value</th></tr></thead><tbody><tr><td><mark style="background-color:green;"><strong><code>source</code></strong></mark></td><td>Sets the scraper. Home Depot pages are scraped with the <code>universal</code> source.</td><td><code>universal</code></td></tr><tr><td><mark style="background-color:green;"><strong><code>url</code></strong></mark></td><td>The URL of the product page. The short form with the product ID only, e.g. <code>https://www.homedepot.com/p/100650378</code>, works too.</td><td>-</td></tr><tr><td><code>parse</code></td><td>Returns parsed data when set to <code>true</code>. Explore the <a href="#output-data-dictionary">output data dictionary</a>.</td><td><code>false</code></td></tr><tr><td><code>render</code></td><td>Enables JavaScript rendering when set to <code>html</code>. Without rendering, Home Depot returns the product page without its delivery details.</td><td>-</td></tr><tr><td><code>context</code>: <code>store_id</code></td><td>Optional store localization, see <a href="#localization-and-filtering">Localization and Filtering</a>.</td><td>-</td></tr></tbody></table>

&#x20;   \- mandatory parameter

### Response example <a href="#response-example" id="response-example"></a>

A parsed product page for product ID `100650378` (lists shortened to one item, long values cut):

<details>

<summary>The Home Depot product response example</summary>

```json
{
    "results": [
        {
            "content": {
                "add_to_cart": true,
                "additional_image_urls": [
                    "https://photos-us.bazaarvoice.com/photo/2/cGhvdG86bWlsd2F1a2VldG9vbA/f84bcd2f-196a-58c8-9aec-de8e54016435"
                ],
                "answered_questions": [
                    {
                        "answer": "The battery itself is light, but the tool feels about twice as heavy to me as the corded version. The specified weights are similar. Not sure how that could be.",
                        "question": "What is the weight without the battery ?"
                    }
                ],
                "answered_questions_count": 452,
                "availability": "in_stock",
                "category": {
                    "name": "Milwaukee Power Tool Combo Kits",
                    "url": "https://www.homedepot.com/b/Tools-Power-Tools-Power-Tool-Combo-Kits/Milwaukee/N-5yc1vZc2ecZzv"
                },
                "category_tree": [
                    {
                        "name": "Home",
                        "url": "https://www.homedepot.com/"
                    }
                ],
                "category_urls": [
                    "https://www.homedepot.com/"
                ],
                "country_code": "US",
                "currency": "USD",
                "delivery": false,
                "description": "The Milwaukee M18 Cordless Lithium-Ion 2-Tool Combo Kit includes the M18 Compact Drill/Driver (2606-20) and M18 1/4 in. Hex Impact Driver (2...",
                "details": [
                    {
                        "name": "Battery Power Type",
                        "value": "Lithium Ion"
                    }
                ],
                "discontinued": false,
                "domain": "https://www.homedepot.com/",
                "features": [
                    "Milwaukee 4-pole frameless motor features a robust design combined with rare-earth magnets for longer life"
                ],
                "final_price": 199,
                "group_id": "100650378",
                "gtin": "0045242159338",
                "image_urls": [
                    "https://images.thdstatic.com/productImages/ed71b8cb-0cb2-4f52-ade7-f2b2e83e9c76/svn/milwaukee-power-tool-combo-kits-2691-22-64_1000.jpg"
                ],
                "in_stock": true,
                "listing_has_variations": false,
                "main_image": "https://images.thdstatic.com/productImages/ed71b8cb-0cb2-4f52-ade7-f2b2e83e9c76/svn/milwaukee-power-tool-combo-kits-2691-22-64_1000.jpg",
                "manufacturer": "Milwaukee",
                "manufacturer_description": {
                    "details": [
                        {
                            "name": "Battery Power Type",
                            "value": "Lithium Ion"
                        }
                    ],
                    "features": [
                        "Milwaukee 4-pole frameless motor features a robust design combined with rare-earth magnets for longer life"
                    ]
                },
                "model_number": "2691-22",
                "mpn": "2691-22",
                "parent_id": "337736538",
                "parse_status_code": 12000,
                "price": "$199.00",
                "product_category": "Home>Tools>Power Tools>Power Tool Combo Kits>Milwaukee Power Tool Combo Kits",
                "product_id": "100650378",
                "product_name": "M18 18V Lithium-Ion Cordless Drill Driver/Impact Driver Combo Kit (2-Tool) W/ Two 1.5Ah Batteries, Charger Tool Bag",
                "rating": 4.6,
                "related_documents": [
                    {
                        "name": "SDS",
                        "url": "https://images.thdstatic.com/catalog/pdfImages/39/39b14438-5bf1-4568-a268-062fcb9b7c8b.pdf"
                    }
                ],
                "return_policy": "https://www.homedepot.com/c/Return_Policy",
                "return_window": 90,
                "review_count": 9253,
                "reviews": [
                    {
                        "content": "[This review was collected as part of a promotion.] Having a milwaukee brushless drill and charger with 2 cp 2.0 M18 lit...",
                        "max_rating": 5,
                        "min_rating": 1,
                        "rating": 5,
                        "review_id": "402310729",
                        "title": "Performs well for price, accepts older M18 battery"
                    }
                ],
                "reviews_count": 9253,
                "root_category": {
                    "name": "Home",
                    "url": "https://www.homedepot.com/"
                },
                "seller_privacy_policy": "https://www.homedepot.com/privacy/privacy-and-security-statement",
                "seller_tos": "https://www.homedepot.com/c/Terms_of_Use",
                "seller_url": "https://www.homedepot.com",
                "ship_to_store": false,
                "sku": "233545",
                "star_rating": 5,
                "store_country": "US",
                "store_name": "Cumberland",
                "target_countries": [
                    "US"
                ],
                "top_reviews": [
                    {
                        "description": "[This review was collected as part of a promotion.] Having a milwaukee brushless drill and charger with 2 cp 2.0 M18 lit...",
                        "name": "DIY Al",
                        "rating": 5,
                        "title": "Performs well for price, accepts older M18 battery"
                    }
                ],
                "upc": "045242159338",
                "upcgtin13": "0045242159338",
                "url": "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378",
                "video_count": 2,
                "warranty": {
                    "available": true,
                    "length": "5 Year Warranty (Tool), 2 Year Warranty (Battery)",
                    "type": "Manufacturer Warranty"
                }
            },
            "created_at": "2026-09-28 03:37:29",
            "updated_at": "2026-09-28 03:37:35",
            "page": 1,
            "url": "https://www.homedepot.com/p/Milwaukee-M18-18V-Lithium-Ion-Cordless-Drill-Driver-Impact-Driver-Combo-Kit-2-Tool-W-Two-1-5Ah-Batteries-Charger-Tool-Bag-2691-22/100650378",
            "job_id": "7510180859647894529",
            "status_code": 200,
            "is_render_forced": false,
            "parser_type": "homedepot_product"
        }
    ]
}
```

</details>

### Output data dictionary <a href="#output-data-dictionary" id="output-data-dictionary"></a>

The table below presents a detailed list of each product page element we parse, along with its description and data type. The table also includes some metadata.

<table><thead><tr><th width="204.33984375">Key</th><th width="346.765625">Description</th><th width="90.078125">Type</th></tr></thead><tbody><tr><td><code>url</code></td><td>The URL of the product page.</td><td>string</td></tr><tr><td><code>product_id</code></td><td>The Home Depot product ID, the 9-digit number at the end of the product URL.</td><td>string</td></tr><tr><td><code>parent_id</code></td><td>The ID of the parent product the item belongs to.</td><td>string</td></tr><tr><td><code>group_id</code></td><td>The ID of the product group.</td><td>string</td></tr><tr><td><code>sku</code></td><td>The Home Depot store SKU.</td><td>string</td></tr><tr><td><code>model_number</code></td><td>The manufacturer model number.</td><td>string</td></tr><tr><td><code>mpn</code></td><td>The manufacturer part number.</td><td>string</td></tr><tr><td><code>upc</code></td><td>The UPC barcode number.</td><td>string</td></tr><tr><td><code>gtin</code></td><td>The GTIN of the product.</td><td>string</td></tr><tr><td><code>upcgtin13</code></td><td>The 13-digit GTIN form of the UPC.</td><td>string</td></tr><tr><td><code>product_name</code></td><td>The name of the product.</td><td>string</td></tr><tr><td><code>manufacturer</code></td><td>The brand or manufacturer of the product.</td><td>string</td></tr><tr><td><code>description</code></td><td>The product description.</td><td>string</td></tr><tr><td><code>features</code></td><td>List of the product's feature bullet points.</td><td>array</td></tr><tr><td><code>details</code></td><td>List of product specifications as name-value pairs.</td><td>array</td></tr><tr><td><code>details.name</code></td><td>The name of the specification.</td><td>string</td></tr><tr><td><code>details.value</code></td><td>The value of the specification.</td><td>string</td></tr><tr><td><code>manufacturer_description</code></td><td>Object repeating the manufacturer's <code>details</code> and <code>features</code> lists.</td><td>object</td></tr><tr><td><code>price</code></td><td>The price as shown on the page, with the currency symbol, e.g. <code>$199.00</code>.</td><td>string</td></tr><tr><td><code>final_price</code></td><td>The price as a number.</td><td>float</td></tr><tr><td><code>currency</code></td><td>The ISO 4217 three-letter code of the currency.</td><td>string</td></tr><tr><td><code>availability</code></td><td>The availability status, e.g. <code>in_stock</code>.</td><td>string</td></tr><tr><td><code>in_stock</code></td><td>Indicates whether the product is in stock.</td><td>boolean</td></tr><tr><td><code>discontinued</code></td><td>Indicates whether the product is discontinued.</td><td>boolean</td></tr><tr><td><code>add_to_cart</code></td><td>Indicates whether the product can be added to the cart.</td><td>boolean</td></tr><tr><td><code>delivery</code></td><td>Indicates whether delivery is offered. Accurate only when the page is rendered (<code>"render": "html"</code>); without rendering it comes back as <code>false</code>.</td><td>boolean</td></tr><tr><td><code>ship_to_store</code></td><td>Indicates whether shipping to a store is offered. Accurate only when the page is rendered (<code>"render": "html"</code>); without rendering it comes back as <code>false</code>.</td><td>boolean</td></tr><tr><td><code>shipping_cost</code> (optional)</td><td>List of shipping costs, one object for each fulfillment method the product offers: <code>ship_to_store</code>, <code>delivery</code> or both. Returned when the page is rendered (<code>"render": "html"</code>).</td><td>array</td></tr><tr><td><code>shipping_cost.ship_to_store</code></td><td>Ship-to-store pickup cost: <code>shipping_price</code> (number, <code>0</code> when free) and <code>currency</code>.</td><td>object</td></tr><tr><td><code>shipping_cost.delivery</code></td><td>Home delivery cost: <code>shipping_price</code> (number, <code>0</code> when free) and <code>currency</code>.</td><td>object</td></tr><tr><td><code>store_name</code></td><td>The name of the store the page was served for, e.g. <code>Hutchinson</code>.</td><td>string</td></tr><tr><td><code>zipcode</code> (optional)</td><td>The ZIP code of that store, when shown.</td><td>string</td></tr><tr><td><code>store_country</code></td><td>The country of the store.</td><td>string</td></tr><tr><td><code>country_code</code></td><td>The country code of the site.</td><td>string</td></tr><tr><td><code>target_countries</code></td><td>List of countries the product is sold to.</td><td>array</td></tr><tr><td><code>rating</code></td><td>The average rating of the product.</td><td>float</td></tr><tr><td><code>star_rating</code></td><td>The rating rounded to whole stars.</td><td>integer</td></tr><tr><td><code>review_count</code></td><td>The number of reviews.</td><td>integer</td></tr><tr><td><code>reviews_count</code></td><td>The number of reviews (same value as <code>review_count</code>).</td><td>integer</td></tr><tr><td><code>reviews</code></td><td>List of reviews shown on the page.</td><td>array</td></tr><tr><td><code>reviews.review_id</code></td><td>The ID of the review.</td><td>string</td></tr><tr><td><code>reviews.title</code></td><td>The title of the review.</td><td>string</td></tr><tr><td><code>reviews.content</code></td><td>The text of the review.</td><td>string</td></tr><tr><td><code>reviews.rating</code></td><td>The rating given in the review.</td><td>integer</td></tr><tr><td><code>reviews.min_rating</code></td><td>The lowest possible rating.</td><td>integer</td></tr><tr><td><code>reviews.max_rating</code></td><td>The highest possible rating.</td><td>integer</td></tr><tr><td><code>top_reviews</code></td><td>List of the top reviews shown on the page.</td><td>array</td></tr><tr><td><code>top_reviews.name</code></td><td>The reviewer name.</td><td>string</td></tr><tr><td><code>top_reviews.title</code></td><td>The title of the review.</td><td>string</td></tr><tr><td><code>top_reviews.description</code></td><td>The text of the review.</td><td>string</td></tr><tr><td><code>top_reviews.rating</code></td><td>The rating given in the review.</td><td>integer</td></tr><tr><td><code>answered_questions</code></td><td>List of customer questions with answers.</td><td>array</td></tr><tr><td><code>answered_questions.question</code></td><td>The question.</td><td>string</td></tr><tr><td><code>answered_questions.answer</code></td><td>The answer.</td><td>string</td></tr><tr><td><code>answered_questions_count</code></td><td>The number of answered questions.</td><td>integer</td></tr><tr><td><code>main_image</code></td><td>The URL of the main product image.</td><td>string</td></tr><tr><td><code>image_urls</code></td><td>List of URLs of the product images.</td><td>array</td></tr><tr><td><code>additional_image_urls</code></td><td>List of URLs of customer photos.</td><td>array</td></tr><tr><td><code>video_count</code></td><td>The number of product videos.</td><td>integer</td></tr><tr><td><code>category</code></td><td>The product's own category.</td><td>object</td></tr><tr><td><code>category.name</code></td><td>The name of the category.</td><td>string</td></tr><tr><td><code>category.url</code></td><td>The URL of the category.</td><td>string</td></tr><tr><td><code>category_tree</code></td><td>List of the categories from the top level down to the product's category.</td><td>array</td></tr><tr><td><code>category_tree.name</code></td><td>The name of the category.</td><td>string</td></tr><tr><td><code>category_tree.url</code></td><td>The URL of the category.</td><td>string</td></tr><tr><td><code>category_urls</code></td><td>List of the category URLs in the category path.</td><td>array</td></tr><tr><td><code>root_category</code></td><td>The top-level category.</td><td>object</td></tr><tr><td><code>root_category.name</code></td><td>The name of the top-level category.</td><td>string</td></tr><tr><td><code>root_category.url</code></td><td>The URL of the top-level category.</td><td>string</td></tr><tr><td><code>product_category</code></td><td>The full category path, separated by <code>></code>.</td><td>string</td></tr><tr><td><code>listing_has_variations</code></td><td>Indicates whether the product has variations.</td><td>boolean</td></tr><tr><td><code>warranty</code></td><td>Object with warranty details.</td><td>object</td></tr><tr><td><code>warranty.available</code></td><td>Indicates whether a warranty is offered.</td><td>boolean</td></tr><tr><td><code>warranty.type</code></td><td>The type of warranty.</td><td>string</td></tr><tr><td><code>warranty.length</code></td><td>The length of the warranty.</td><td>string</td></tr><tr><td><code>related_documents</code></td><td>List of documents for the product, e.g. manuals or guides.</td><td>array</td></tr><tr><td><code>related_documents.name</code></td><td>The name of the document.</td><td>string</td></tr><tr><td><code>related_documents.url</code></td><td>The URL of the document.</td><td>string</td></tr><tr><td><code>return_window</code></td><td>The return window in days.</td><td>integer</td></tr><tr><td><code>return_policy</code></td><td>The URL of the return policy.</td><td>string</td></tr><tr><td><code>seller_url</code></td><td>The URL of the seller.</td><td>string</td></tr><tr><td><code>seller_tos</code></td><td>The URL of the seller's terms of use.</td><td>string</td></tr><tr><td><code>seller_privacy_policy</code></td><td>The URL of the seller's privacy policy.</td><td>string</td></tr><tr><td><code>domain</code></td><td>The site the page was scraped from.</td><td>string</td></tr><tr><td><code>parse_status_code</code></td><td>The status code of the parsing job. You can see the parser status codes described <strong>here</strong>.</td><td>integer</td></tr><tr><td><code>created_at</code></td><td>The timestamp when the scraping job was created.</td><td>timestamp</td></tr><tr><td><code>updated_at</code></td><td>The timestamp when the scraping job was finished.</td><td>timestamp</td></tr><tr><td><code>page</code></td><td>The page number in the pagination of results.</td><td>integer</td></tr><tr><td><code>status_code</code></td><td>The HTTP status code of the scraped page.</td><td>integer</td></tr><tr><td><code>is_render_forced</code></td><td>Identifies whether rendering has been forced for this request.</td><td>boolean</td></tr><tr><td><code>parser_type</code></td><td>The type of parser used to extract the data, <code>homedepot_product</code>.</td><td>string</td></tr><tr><td><code>job_id</code></td><td>The ID of the job associated with the scraping job.</td><td>string</td></tr></tbody></table>

## Category

### Request samples

{% tabs %}
{% tab title="cURL" %}

```shell
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
        "source": "universal",
        "url": "https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f"
    }'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint

# Structure payload.
payload = {
    'source': 'universal',
    'url': 'https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f'
}

# Get response.
response = requests.request(
    'POST',
    'https://realtime.oxylabs.io/v1/queries',
    auth=('USERNAME', 'PASSWORD'),
    json=payload
)

# Instead of response with job status and results url, this will return the
# JSON response with the result.
pprint(response.json())
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const https = require("https");

const username = "USERNAME";
const password = "PASSWORD";
const body = {
    source: "universal",
    url: "https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f"
};

const options = {
    hostname: "realtime.oxylabs.io",
    path: "/v1/queries",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        Authorization:
            "Basic " + Buffer.from(`${username}:${password}`).toString("base64"),
    },
};

const request = https.request(options, (response) => {
    let data = "";

    response.on("data", (chunk) => {
        data += chunk;
    });

    response.on("end", () => {
        const responseData = JSON.parse(data);
        console.log(JSON.stringify(responseData, null, 2));
    });
});

request.on("error", (error) => {
    console.error("Error:", error);
});

request.write(JSON.stringify(body));
request.end();
```

{% endtab %}

{% tab title="HTTP" %}

```http
# The whole string you submit has to be URL-encoded.

https://realtime.oxylabs.io/v1/queries?source=universal&url=https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f&access_token=12345abcde
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$params = array(
    'source' => 'universal',
    'url' => 'https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://realtime.oxylabs.io/v1/queries");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "USERNAME" . ":" . "PASSWORD");

$headers = array();
$headers[] = "Content-Type: application/json";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
echo $result;

if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    const Username = "USERNAME"
    const Password = "PASSWORD"

    payload := map[string]interface{}{
        "source": "universal",
        "url": "https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f",
    }

    jsonValue, _ := json.Marshal(payload)

    client := &http.Client{}
    request, _ := http.NewRequest("POST",
        "https://realtime.oxylabs.io/v1/queries",
        bytes.NewBuffer(jsonValue),
    )

    request.SetBasicAuth(Username, Password)
    response, _ := client.Do(request)

    responseText, _ := ioutil.ReadAll(response.Body)
    fmt.Println(string(responseText))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;

namespace OxyApi
{
    class Program
    {
        static async Task Main()
        {
            const string Username = "USERNAME";
            const string Password = "PASSWORD";

            var parameters = new {
                source = "universal",
                url = "https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f"
            };

            var client = new HttpClient();

            Uri baseUri = new Uri("https://realtime.oxylabs.io");
            client.BaseAddress = baseUri;

            var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/v1/queries");
            requestMessage.Content = JsonContent.Create(parameters);

            var authenticationString = $"{Username}:{Password}";
            var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.UTF8.GetBytes(authenticationString));
            requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);

            var response = await client.SendAsync(requestMessage);
            var contents = await response.Content.ReadAsStringAsync();

            Console.WriteLine(contents);
        }
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
package org.example;

import okhttp3.*;
import org.json.JSONObject;
import java.util.concurrent.TimeUnit;

public class Main implements Runnable {
    private static final String AUTHORIZATION_HEADER = "Authorization";
    public static final String USERNAME = "USERNAME";
    public static final String PASSWORD = "PASSWORD";

    public void run() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("source", "universal");
        jsonObject.put("url", "https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f");

        Authenticator authenticator = (route, response) -> {
            String credential = Credentials.basic(USERNAME, PASSWORD);
            return response
                    .request()
                    .newBuilder()
                    .header(AUTHORIZATION_HEADER, credential)
                    .build();
        };

        var client = new OkHttpClient.Builder()
                .authenticator(authenticator)
                .readTimeout(180, TimeUnit.SECONDS)
                .build();

        var mediaType = MediaType.parse("application/json; charset=utf-8");
        var body = RequestBody.create(jsonObject.toString(), mediaType);
        var request = new Request.Builder()
                .url("https://realtime.oxylabs.io/v1/queries")
                .post(body)
                .build();

        try (var response = client.newCall(request).execute()) {
            if (response.body() != null) {
                try (var responseBody = response.body()) {
                    System.out.println(responseBody.string());
                }
            }
        } catch (Exception exception) {
            System.out.println("Error: " + exception.getMessage());
        }

        System.exit(0);
    }

    public static void main(String[] args) {
        new Thread(new Main()).start();
    }
}
```

{% endtab %}

{% tab title="JSON" %}

```json
{
    "source": "universal",
    "url": "https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f"
}
```

{% endtab %}
{% endtabs %}

### Request parameter values

<table><thead><tr><th width="180">Parameter</th><th>Description</th><th width="160">Default Value</th></tr></thead><tbody><tr><td><mark style="background-color:green;"><strong><code>source</code></strong></mark></td><td>Sets the scraper. Home Depot pages are scraped with the <code>universal</code> source.</td><td><code>universal</code></td></tr><tr><td><mark style="background-color:green;"><strong><code>url</code></strong></mark></td><td>The URL of the category page, e.g. <code>https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f</code>.</td><td>-</td></tr></tbody></table>

&#x20;   \- mandatory parameter

## Localization and Filtering <a href="#localization-and-filtering" id="localization-and-filtering"></a>

<table><thead><tr><th width="103.66796875">Parameter</th><th width="88.19140625">Applies to</th><th width="485.5">Description</th><th width="83.234375">Default</th></tr></thead><tbody><tr><td><code>context</code>: <code>store_id</code></td><td>Product pages</td><td>Home Depot store number as a 4-digit string. Find the store in the <a href="https://www.homedepot.com/l/storeDirectory">Home Depot store directory</a>; its number is the last part of the store page URL, e.g. <code>homedepot.com/l/21st-South/UT/Salt-Lake-City/84115/</code><strong><code>4403</code></strong>. Prefix 3-digit numbers with a zero, e.g. 121 → <code>"0121"</code>. The parsed <code>store_name</code> shows the store the page was served for. Do not combine with <code>render</code>.</td><td>-</td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://developers.oxylabs.io/products/web-scraper-api/targets/e-commerce/the-home-depot.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
