# Category

The `target_category` source is designed to retrieve Target category pages based on Target's taxonomy node ID. The source supports localization features and allows you to browse through Target's product categories.

## Request samples

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

```bash
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
    "source": "target_category",
    "category_id": "owq2q",
    "render": "html"
}'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint

# Structure payload
payload = {
    'source': 'target_category',
    'category_id': 'owq2q',
    'render': 'html',
}

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

# Print the response
pprint(response.json())
```

{% endtab %}

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

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

const username = "USERNAME";
const password = "PASSWORD";
const body = {
    source: "target_category",
    category_id: "owq2q",
    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=target_category&category_id=owq2q&render=html&access_token=12345abcde
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$params = array(
    'source' => 'target_category',
    'category_id' => 'owq2q',
    '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":  "target_category",
		"category_id": "owq2q",
		"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="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", "target_category");
        jsonObject.put("category_id", "owq2q");
        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": "target_category",
    "category_id": "owq2q",
    "render": "html"
}
```

{% endtab %}
{% endtabs %}

We use synchronous [**Realtime**](https://developers.oxylabs.io/scraping-solutions/web-scraper-api/integration-methods/realtime) integration method in our examples. If you would like to use [**Proxy Endpoint**](https://developers.oxylabs.io/scraping-solutions/web-scraper-api/integration-methods/proxy-endpoint) or asynchronous [**Push-Pull**](https://developers.oxylabs.io/scraping-solutions/web-scraper-api/integration-methods/push-pull) integration, refer to the [**integration methods**](https://developers.oxylabs.io/scraping-solutions/web-scraper-api/integration-methods) section.

## Request parameter values

### Generic

| Parameter                                                     | Description                                                                                                                                                                                            | Default Value    |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------- |
| `source`                                                      | Sets the scraper.                                                                                                                                                                                      | target\_category |
| <mark style="background-color:green;">**category\_id**</mark> | Target's taxonomy node ID for the category (e.g., "owq2q" for PlayStation 5 controllers).                                                                                                              | -                |
| `render`                                                      | Enables JavaScript rendering when set to `html`. [**More info**](https://developers.oxylabs.io/scraping-solutions/web-scraper-api/features/js-rendering-and-browser-control/javascript-rendering)**.** | -                |
| `callback_url`                                                | URL to your callback endpoint. [**More info**](https://developers.oxylabs.io/scraping-solutions/integration-methods/push-pull#callback).                                                               | -                |
| `user_agent_type`                                             | Device type and browser. The full list can be found [**here**](https://developers.oxylabs.io/scraping-solutions/web-scraper-api/features/http-context-and-job-management/user-agent-type).             | desktop          |

&#x20;    \- mandatory parameter

### Localization

Adapt results to specific stores, fulfillment types, and delivery locations.

| Parameter          | Description                                                                                             | Type    |
| ------------------ | ------------------------------------------------------------------------------------------------------- | ------- |
| `fulfillment_type` | Set the fulfillment type. Available values are: pickup, shipping, shop\_in\_store, same\_day\_delivery. | String  |
| `store_id`         | Set the store location.                                                                                 | Integer |
| `delivery_zip`     | Set the shipping to location.                                                                           | String  |

## Understanding Target's node IDs

Target's category system uses node IDs to identify specific categories. These node IDs are unique identifiers in Target's taxonomy system.

### Example node IDs

Node IDs can be found in the category page URL. It's the part of the URL that has the format `N-<5 symbols>` . Here are some example category URLs and their corresponding node IDs:

1. PlayStation 5 controllers: `owq2q`
   * Full URL: <https://www.target.com/c/playstation-5-controllers-video-games/-/N-owq2q>
2. PlayStation 5 accessories: `lbxgt`
   * Full URL: <https://www.target.com/c/playstation-5-accessories/-/N-lbxgt>
3. PlayStation 5: `hj96d`
   * Full URL: <https://www.target.com/c/playstation-5/-/N-hj96d>

<figure><img src="https://63892162-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FzrXw45naRpCZ0Ku9AjY1%2Fuploads%2F0Jq6hZMzkJBdxQFKMZ80%2Fimage.png?alt=media&#x26;token=1f4e99fb-ebd6-482e-89b1-8a887c334d72" alt=""><figcaption></figcaption></figure>

### Node ID format

When using the `target_category` source, you only need to provide the node ID without the `N-` prefix. The API will automatically format the URL correctly.
