# Walmart Product Details — Independent (`peerless_columbine/independent-walmart-product-details`) Actor

Extract Walmart.com US product details from direct product URLs: display prices, sellers, images, variants, UPCs and returns. Independent tool; search and category crawling are excluded from supported use.

- **URL**: https://apify.com/peerless\_columbine/independent-walmart-product-details.md
- **Developed by:** [tingyou333 zhuang](https://apify.com/peerless_columbine) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.90 / 1,000 product detail rows

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Walmart Product Details — Independent

Turn public **Walmart.com US product URLs** into structured product records with display prices, sellers, images, UPCs, aggregate ratings, return policies and inline variants. Use the results to enrich a catalog or compare dated public product observations.

**Supported release scope: direct product details. Search, category discovery and automatic listing pagination are excluded.** The input form still accepts those URL types, but their live collection attempts encountered source challenges. Use `/ip/` product links for this release.

This is an independent tool, not a Walmart product, partner service or endorsed integration. Walmart names and source artwork identify the data source only.

### Quickstart

Paste one or more US product URLs into **Start URLs**. Start with a small product limit and leave proxy use disabled:

```json
{
  "startUrls": [
    {"url": "https://www.walmart.com/ip/BLANCA-NIEVES-Laundry-Detergent-70-54-Ounce/16935510"}
  ],
  "maxProductsPerStartUrl": 1,
  "enqueueProductVariants": true,
  "useProxy": false,
  "maxRuntimeSecs": 90
}
```

This exact input produced **one product row with two inline variants** in a private 256MB run. At a limit of 1, variants do not create extra rows and `enqueuedVariantIds` is empty. Raising the limit and enabling variants allows separately visited variants to become additional product rows; that traversal has passed a small local check, not broad cloud coverage.

Open the dataset's **Product details**, **Source evidence**, or **Variant and policy data** view. Export JSON to preserve nested objects; use the tabular views for a smaller catalog extract. Check the `SUMMARY` key-value record for limits, skipped duplicates and failures.

The input above is ready to copy. The selected real output fields below and [Latest acceptance sample](#latest-acceptance-sample) describe the dated observation; current prices and availability can change.

### Supported inputs

| Input | Type and default | Meaning |
|---|---|---|
| `startUrls` | URL-object array; `[]` | Up to 100 distinct US product URLs, such as `{"url":"https://www.walmart.com/ip/16935510"}`. Runtime also accepts legacy URL strings. Empty input produces no product rows. Request headers, cookies, custom methods and remote request-list imports are not supported. Optional `userData` has no effect on collection or output. |
| `maxProductsPerStartUrl` | Integer; `10`, range 0–10000 | Maximum persisted rows per start URL, including separately visited variants. `0` removes this count limit; request, time and fee limits still apply. |
| `enqueueProductVariants` | Boolean; `false` | Visit discovered linked variants within remaining limits. Inline `variantList` is included regardless of this setting. |
| `includeSourceProduct` | Boolean; `true` | Include the original public product block for detailed auditing. |
| `maxConcurrency` | Integer; `2`, range 1–4 | Concurrent detail requests. Rows are saved in discovery order. |
| `maxRequests` | Integer; `150`, range 1–1000 | Total target request-attempt limit, including redirects and retries. |
| `requestTimeoutSecs` | Integer; `15`, range 1–25 | Timeout per request. |
| `maxRequestRetries` | Integer; `1`, range 0–2 | Retry transient network/timeouts and selected server errors. Challenges and 403 responses are not retried. |
| `maxRuntimeSecs` | Integer; `90`, range 1–95 | Collection deadline. Storage and shutdown also need time within the platform run limit. |
| `requestIntervalSecs` | Number; `0.25`, range 0–5 | Minimum interval between request starts across concurrent requests, redirects and retries. `0` disables spacing. |
| `dnsMode` | `system` by default; optional `google-doh` | Public-IP validation remains enabled in either mode. The explicit DoH option can handle local DNS that maps public sites to reserved addresses; it keeps TLS hostname validation. |
| `useProxy` | Boolean; `false` | Optional user-owned proxy. Configuration or connection failures are reported explicitly. |
| `proxyConfiguration` | Object; disabled | Apify proxy groups/country or custom `proxyUrls`. An enabled configuration conflicts with explicit `useProxy:false`. Paid proxy operation has not been live-tested and may add fees. |
| `maxPagesPerStartUrl` | Integer; `5`, range 1–25 | Legacy listing-mode limit. Search/category/pagination are excluded from this release's supported scope. |

Products are deduplicated by `usItemId` across the run. A product encountered under multiple start URLs may be emitted only once. A limit is a maximum, not a guarantee of that many results. Source failures, missing detail data and limits can reduce the result count.

### Output fields

A row is emitted only after full product detail data passes validation. Listing cards and error messages are not product rows.

| Fields | Type and semantics |
|---|---|
| `itemType`, `type`, `productId`, `usItemId`, `name`, `url` | Identity strings. `itemType` is `DetailProduct`; `productId` is Walmart's internal ID, while `usItemId` is the US item number. `type` is the source class, such as `VARIANT`, and can be null. |
| `brand`, `brandUrl`, `upc`, `model`, `manufacturerProductId`, `rhPath`, `ironbankCategory`, `gender` | Source identity/category strings or null. UPCs retain leading zeroes. |
| `priceInfo` | Exactly five nullable display strings: `price`, `priceDisplay`, `priceRange`, `wasPrice`, `unitPrice`. A price such as `$14.43` is a string, not a numeric amount. |
| `secondaryOfferPrice`, `offerId`, `offerType`, `availability`, `fulfillmentType` | Source offer display price, identity and status strings or null. Secondary offer price is not a full seller-offer list. |
| `sellerId`, `sellerName`, `sellerAverageRating`, `sellerReviewCount`, `additionalOfferCount`, `transactableOfferCount` | Seller strings and numeric/count fields, nullable when the source omits them. |
| `averageRating`, `numberOfReviews`, `ratingCounts` | Numeric rating, integer review count, and star-count object with keys `1`–`5`. These are aggregates, not review text or a complete review corpus. |
| `thumbnailUrl`, `allImages`, `shortDescription`, `description`, `longDescription` | Image URLs and source text/HTML. `description` can remain null while `longDescription` contains separate source HTML. |
| `variantList` | Array or null. Each entry contains `imageUrl`, `productId`, `usItemId`, `url`, `allImages`, five-field `priceInfo`, `subscriptionEligible`, `variants`, `buyBoxSuppression`, and `availabilityStatus`. The selected product may appear in its own list. |
| `enqueuedVariantIds` | Internal product IDs admitted to the variant queue within the remaining count limit. An inline variant does not necessarily have a separately fetched row. |
| `returnPolicy` | Object or null: `returnable`, `freeReturns`, `returnWindow` (`value`, `unitType`), `returnPolicyText`, `holidayReturnEnabled`. |
| `hasCarePlans`, `buyBoxSuppression`, `isSponsored`, `subscriptionEligible`, `giftingEligibility`, `legalRestriction`, `shippingRestriction`, `suppressReviews`, `buyNowEligible`, `personalizable`, `showExploreOtherConditionsCTA` | Source booleans or null. No missing restriction/eligibility flag is replaced with an invented false. |
| `orderMinLimit`, `orderLimit`, `badges`, `badge`, `ebooks` | Source limits and optional content. Nonempty badge/ebooks forms have limited evidence; the example does not establish every possible shape. |
| `images`, `imageInfo`, `category`, `specifications`, `fulfillmentOptions`, `variantCriteria`, `sourceProduct` | Additional source-backed fields. `sourceProduct` is omitted when disabled. Raw source objects retain details outside the normalized fields. |
| `_provenance` | Source URL, capture time, response SHA-256, market/language/currency, missing fields and warnings. |

Missing values remain null; observed zero counts remain zero. A missing `priceDisplay` remains null even when `price` exists. A missing variants map and an empty map are distinguished as null versus `[]`. Source HTML is returned as text, not executed.

The following **excerpt** comes from the complete real cloud output captured on 2026-09-26:

```json
{
  "itemType": "DetailProduct",
  "type": "VARIANT",
  "productId": "69L71KUFK8CM",
  "usItemId": "16935510",
  "priceInfo": {
    "price": "$14.43",
    "priceDisplay": "$14.43",
    "priceRange": null,
    "wasPrice": null,
    "unitPrice": "20.5 ¢/oz"
  },
  "description": null,
  "secondaryOfferPrice": "$14.42",
  "returnPolicy": {
    "returnable": true,
    "freeReturns": true,
    "returnWindow": {
      "value": 90,
      "unitType": "Day"
    },
    "returnPolicyText": "Free 90-day returns",
    "holidayReturnEnabled": false
  },
  "enqueuedVariantIds": []
}
```

### Limits and coverage

- **US direct product pages only for supported use.** Search, category, sorting/filtering of listings and automatic listing pagination have not passed live acceptance and are excluded. Their controls remain in the input schema for compatibility; they are not a success claim.
- English Walmart.com source data and source-reported USD are supported. No Canada/Mexico collection, language switching or currency conversion is provided.
- Public price, seller, stock and returns can vary with time and the source's anonymous location/offer context. There is no postal-code/store input, inventory reservation, checkout quote, historical-price guarantee or complete offer coverage.
- Source challenges, 403s and missing detail data stop with diagnostics. There is no login, personal-cookie import, CAPTCHA solving, account/cart access or hidden fallback dataset. The shipping runtime uses HTTP and does not include a browser.
- Inline variant extraction passed the documented cloud sample. Separately visiting variants passed bounded local checks; completeness across all products or packs is not guaranteed.
- The output is not a full competitor-parity claim. One recorded comparison covered 120 reference paths with no missing/type differences and one real `secondaryOfferPrice` value difference. Other products and nonempty optional branches need their own checks.
- A private 256MB/120-second-cap run succeeded for the exact one-product example. This does not establish reliability, capacity or cost for larger workloads. The supported cases and unverified behavior are listed in this Limits and coverage section.

### Pricing

The paid unit is **one valid product detail row saved in the default dataset**. Each separately saved variant or listing is another row. Inline arrays do not create extra row events. Failed requests, duplicate rows and diagnostic records do not create result events. A valid source record may have nullable optional fields; a row charge does not guarantee every field.

| Apify plan | USD per row | USD per 1,000 rows |
|---|---:|---:|
| FREE | 0.005 | 5.00 |
| BRONZE | 0.0043 | 4.30 |
| SILVER | 0.0036 | 3.60 |
| GOLD | 0.0029 | 2.90 |
| PLATINUM | 0.0029 | 2.90 |
| DIAMOND | 0.0029 | 2.90 |

There is no startup event fee. FREE names the Apify subscription tier; it does not mean results are free. The Pricing tab shows the active rate before a run.

**Apify platform compute, storage and transfer are charged separately**, including for failed or empty runs. An explicitly enabled proxy can add provider fees. A row limit is not an all-inclusive dollar cap. Use small inputs first and inspect actual run usage. Historical owner test runs are not customer revenue or cost forecasts.

### API example

The existing Actor ID is `wOOw85fhlhPzQpx6p`. Save the JSON from Quickstart as `input.json` in your current directory. Supply your token through `APIFY_TOKEN`; this command starts a charged run:

```sh
curl --request POST \
  --url 'https://api.apify.com/v2/acts/wOOw85fhlhPzQpx6p/runs?memory=256&timeout=120' \
  --header "Authorization: Bearer ${APIFY_TOKEN}" \
  --header 'Content-Type: application/json' \
  --data @input.json
```

Poll the returned run, read its `SUMMARY` record, then export the default dataset. Keep your token in secret storage; do not place it in a shared URL. Saved datasets can feed catalog enrichment, spreadsheets, or your existing Make/n8n workflow.

### FAQ

**Will this find products from a keyword or category?** That mode is excluded from the supported release. Supply product URLs directly.

**Why does cap=1 return no extra variant rows?** The cap includes separately visited variants. The one parent row still contains the source's inline variants.

**Does a null price mean free?** No. Null means the source did not provide that field. Display strings retain currency formatting.

**Can I download all customer reviews?** No. Only rating/review aggregates are collected.

**Where are errors?** In `SUMMARY`, not product rows. `PARTIAL`, `LIMITED`, `FAILED`, and `EMPTY` distinguish incomplete or empty outcomes. An error-only run is not reported as a successful empty result.

**Can I use my own proxy?** Yes, explicitly. Configuration mechanics are tested; paid proxy operation has not been live-tested and may add fees.

**Is the icon a Walmart endorsement?** No. It identifies the source. This tool is independently maintained.

### Latest acceptance sample

The quickstart input was checked in Apify Cloud on 2026-09-26 (UTC; run finished at 2026-09-26T18:30:52.552Z). It saved 1 valid rows. The output example on this page copies real source values from that dataset; it is a dated sample, not current inventory or a current quote.

One US product, item 16935510, returned a displayed $14.43 price and two inline variants. The cap of one permitted no extra variant rows. Search and category discovery are outside the supported scope. The legacy SUMMARY field `pricingActivatedByThisCode=false` describes the absence of manual charge calls; dataset rows are billed by the platform at the active Pricing-tab rate.

# Actor input Schema

## `startUrls` (type: `array`):

Public Walmart.com US URLs. Query filters and ordering are preserved between listing pages. No personal cookies.

## `maxProductsPerStartUrl` (type: `integer`):

Counts persisted detail rows including variants. Authorized competitor sample cap=1 + variants=true returned one row and no enqueued IDs; broader cap semantics are unverified. 0 means no product cap here, under page/request/time/fee bounds.

## `enqueueProductVariants` (type: `boolean`):

Visit every discovered inline variant until the explicit limits. Inline variantList is included even when false.

## `dnsMode` (type: `string`):

google-doh is explicit local opt-in for fake-IP networks; fixed public resolver and full TLS validation.

## `includeSourceProduct` (type: `boolean`):

Adds sourceProduct so source-specific nested fields remain auditable. No full review corpus.

## `requestIntervalSecs` (type: `number`):

Minimum seconds between target HTTP request starts across concurrent requests, including redirects and retries. 0 disables spacing; request timeout and runtime limits still apply.

## `useProxy` (type: `boolean`):

Optional and off by default. Set true with proxyConfiguration. Configuration errors stop the run. Proxy fees are separate; no paid proxy was tested.

## `proxyConfiguration` (type: `object`):

Apify proxy groups/country or custom proxyUrls. Never silently ignored. Leave disabled for free private acceptance.

## `maxPagesPerStartUrl` (type: `integer`):

Explicit resource bound. Runs report truncation in SUMMARY. Challenges/403 are never retried.

## `maxRequests` (type: `integer`):

Explicit resource bound. Runs report truncation in SUMMARY. Challenges/403 are never retried.

## `maxConcurrency` (type: `integer`):

Explicit resource bound. Runs report truncation in SUMMARY. Challenges/403 are never retried.

## `requestTimeoutSecs` (type: `integer`):

Explicit resource bound. Runs report truncation in SUMMARY. Challenges/403 are never retried.

## `maxRequestRetries` (type: `integer`):

Explicit resource bound. Runs report truncation in SUMMARY. Challenges/403 are never retried.

## `maxRuntimeSecs` (type: `integer`):

Explicit resource bound. Runs report truncation in SUMMARY. Challenges/403 are never retried.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.walmart.com/ip/BLANCA-NIEVES-Laundry-Detergent-70-54-Ounce/16935510"
    }
  ],
  "maxProductsPerStartUrl": 2,
  "enqueueProductVariants": false,
  "dnsMode": "system",
  "includeSourceProduct": true,
  "requestIntervalSecs": 0.25,
  "useProxy": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxPagesPerStartUrl": 5,
  "maxRequests": 150,
  "maxConcurrency": 2,
  "requestTimeoutSecs": 15,
  "maxRequestRetries": 1,
  "maxRuntimeSecs": 90
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.walmart.com/ip/BLANCA-NIEVES-Laundry-Detergent-70-54-Ounce/16935510"
        }
    ],
    "maxProductsPerStartUrl": 2,
    "enqueueProductVariants": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("peerless_columbine/independent-walmart-product-details").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.walmart.com/ip/BLANCA-NIEVES-Laundry-Detergent-70-54-Ounce/16935510" }],
    "maxProductsPerStartUrl": 2,
    "enqueueProductVariants": False,
}

# Run the Actor and wait for it to finish
run = client.actor("peerless_columbine/independent-walmart-product-details").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.walmart.com/ip/BLANCA-NIEVES-Laundry-Detergent-70-54-Ounce/16935510"
    }
  ],
  "maxProductsPerStartUrl": 2,
  "enqueueProductVariants": false
}' |
apify call peerless_columbine/independent-walmart-product-details --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,peerless_columbine/independent-walmart-product-details"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wOOw85fhlhPzQpx6p/builds/vdV92GVEgXTcdqEhY/openapi.json
