# Petco Scraper: Online Prices, Autoship & Pickup Eligibility (`moggedhq/petco-scraper`) Actor

Get Petco online prices for dog food, cat litter and pet supplies, with regular prices, Autoship prices, sale groups, size variants and pickup eligibility. Search, categories or product links. About $0.004 per product: 1,000 products cost $4. No login. Store stock is not included.

- **URL**: https://apify.com/moggedhq/petco-scraper.md
- **Developed by:** [mogged](https://apify.com/moggedhq) (community)
- **Categories:** E-commerce, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Petco Scraper: Online Prices, Autoship & Pickup Eligibility

For retail price analysts, pet brands and comparison services monitoring Petco's national online catalog. Collect distinct size and flavor SKUs with their current online price, regular price, recurring Autoship price, sale flag and fulfillment eligibility. **$0.004 per delivered product**, or **$0.08 for 20 products**, plus a minimum **$0.00005 Actor start charge**. No retailer login or customer account is required.

Search dog food, cat litter or aquarium filters, browse a category, or monitor known SKUs. Export the common US retail fields to JSON, CSV or Excel. Every row states `priceScope: "online"`.

### What you get

Each distinct size or flavor SKU is one product. Overlapping inputs return and charge a SKU once within a run.

| Field | Meaning |
| --- | --- |
| `verdict` | Readable product name, online price and recurring Autoship price when supplied. |
| `retailer`, `country`, `currency` | Petco, US and USD. |
| `storeId`, `storeName`, `location` | Null on national online product rows. Requested store directory context is in SUMMARY. |
| `productId`, `sku`, `variantId` | Petco's public numeric part number for the exact size or flavor. |
| `gtin` | Common barcode field, retained as null in this catalog feed. |
| `title`, `brand`, `size` | Product title, supplied brand and a package-size label parsed from the title where explicit. |
| `price`, `regularPrice`, `onSale` | Current online price, source list price and whether current is lower than list. |
| `promoText`, `promoType` | Online markdown explanation or supplied deal-group membership. |
| `promoStart`, `promoEnd` | Null when the catalog supplies no promotion dates. |
| `memberPrice`, `memberProgram` | Null. Petco Perks membership is separate from recurring Autoship pricing. |
| `unitPrice`, `unitOfMeasure` | Null; an estimated unit price is not substituted for a retailer-supplied unit price. |
| `inStock`, `stockLevel` | Null. Channel eligibility alone does not establish stock. |
| `rating`, `reviewCount` | Aggregate rating and review count supplied for the catalog product family. |
| `category`, `taxonomy` | Supplied merchandising taxonomy as a string and an array. |
| `url`, `imageUrl`, `scrapedAt` | Variant product URL, supplied image URL and UTC observation timestamp. |

Additional fields make channel and subscription comparisons clearer:

| Field | Meaning |
| --- | --- |
| `autoshipPrice`, `autoshipTerms` | Published recurring Autoship price and enrollment scope. |
| `pickupEligible` | Whether the catalog marks the variant as eligible for pickup somewhere. |
| `sameDayDeliveryEligible`, `autoshipEligible` | Catalog eligibility flags for those channels. |
| `inStoreOnly` | The retailer's in-store-only catalog flag when supplied. |
| `pickupPrice`, `storePrice`, `shelfPrice`, `stockScope` | Null because the catalog response does not verify these values. |
| `priceScope` | Always `online` for delivered prices. |
| `catEntryId`, `parentProductId` | Internal catalog-entry ID and product-family ID, distinct from the public SKU. |
| `species`, `lifeStage`, `packCount` | Explicit facets or count labels where present; otherwise null. |
| `dealGroupIds`, `isDeal` | Deal or clearance category membership and combined deal flag. |
| `facets` | Supplied product facets, including brand, flavor and dietary attributes where available. |
| `details` | Optional public catalog description and the scope of that description. |
| `sourceType`, `source`, `sourceUrl` | Input type, input value and the public catalog request supplying the observation. |

The overview view follows the retail-family price columns with explicit scope. The deals view exposes promotion fields. The free `DEALS` output contains delivered deals; large exports link to JSON parts.

### Use it in three steps

1. Enter search terms, category links or exact Petco SKUs.
2. Set `maxItemsPerSearch` and the global `maxItems` cap. Add ZIP codes only when you want nearby-store directory context.
3. Start the Actor, inspect SUMMARY for coverage, then export or read the dataset through the API.

On November 5, 2026, the prefill resolved ZIP 10003 and delivered 20 variants in 11 seconds, with 20 product charges and no source failures. Two additional cloud runs each delivered 1,100 unique variants across several inputs, without duplicates or source failures.

### Inputs and examples

The primary input names match the US retail family so the same automation can call sibling retailer Actors.

| Input | Example and behavior |
| --- | --- |
| `searchTerms` | `["dog food", "cat litter"]`; ordinary Petco searches. |
| `startUrls` | Optional HTTPS category, deals category, search or full product links from petco.com. |
| `productIds` | `["3748364", "2998871"]`; exact public SKUs, checked against the returned variant. |
| `locations` | `["10003", "90210"]`; ZIP codes for nearest-store metadata in SUMMARY. |
| `storeIds` | `["3741"]`; public store numbers, overriding ZIP selection for directory lookup. |
| `maxItemsPerSearch` | New SKU rows from each search or category, default 20, maximum 1,000. |
| `maxItems` | Global unique-SKU cap, default 20, maximum 10,000. |
| `dealsOnly` | Keep online markdowns and catalog deal or clearance memberships. |
| `includeDetails` | Add the available catalog description, without an additional product fee. |
| `proxyConfiguration` | Default datacenter routing first, then US residential retries when necessary. |
| `postalCodes`, `categoryUrls` | Optional aliases; use locations and startUrls for family compatibility. |

A basket comparison across two searches:

```json
{
  "searchTerms": ["dog food", "cat litter"],
  "maxItemsPerSearch": 50,
  "maxItems": 100
}
```

A category watch:

```json
{
  "startUrls": ["https://www.petco.com/category/dog/dog-food/dry-dog-food"],
  "maxItemsPerSearch": 200,
  "maxItems": 200,
  "dealsOnly": false
}
```

An exact-product watch with store directory context:

```json
{
  "productIds": ["3748364", "2998871"],
  "locations": ["10003", "90210"],
  "maxItems": 2
}
```

That last example delivers up to two national online observations. The two ZIPs add directory metadata in SUMMARY and do not multiply the product count or product charge. An exact SKU that cannot be found returns no substitute size. Full product URLs must include the numeric SKU at the end.

Category links use the final category group. Limits count delivered variant SKUs. With no sources supplied, the default search is dog food. Searches with zero keyword matches exclude the retailer's recommendation fallback and have no product charge. Parseable invalid input produces a free note and summary.

### Reading the price fields

`price` is the national one-time online price for that SKU. `regularPrice` is the supplied list price. `onSale` requires a current price below list.

`autoshipPrice` is the supplied recurring delivery price. First-order incentives, minimum-spend offers and account promotions are separate. The Actor does not enroll customers or calculate a checkout basket.

Petco Perks, pickup discounts and Autoship are separate programs. A pickup-eligible product does not establish units at a store. General banners do not become product-specific discounts. Unknown values stay null.

`dealsOnly` includes markdowns and deal/clearance memberships. Membership can reflect a qualifying offer or seasonal collection without a lower price. Use onSale to isolate numeric markdowns. Autoship eligibility alone does not qualify.

### Real output example

Selected fields from the November 5, 2026 prefill:

```json
{
  "retailer": "Petco",
  "country": "US",
  "currency": "USD",
  "productId": "3748364",
  "sku": "3748364",
  "title": "Purina Pro Plan Sensitive Skin and Stomach Salmon and Rice Formula Dog Food, 40 lbs.",
  "price": 97.99,
  "regularPrice": 97.99,
  "onSale": false,
  "autoshipPrice": 93.09,
  "priceScope": "online",
  "pickupEligible": true,
  "storeId": null,
  "inStock": null,
  "gtin": null
}
```

Every run saves SUMMARY with delivered products, resolved stores, deals found, free failures, duplicate exclusions, source outcomes and spending-limit status. Product rows have `recordType: "PRODUCT"`. Free explanatory rows have `recordType: "NOTE"`; filter recordType when importing a dataset into a numeric table.

### Pricing and spending controls

Base price is **$0.004 per delivered product**. Bronze is $0.0038, Silver $0.0036 and Gold $0.0032. A minimum $0.00005 Actor start charge is retained. Notes, summaries, duplicate SKUs, missing exact products and failed requests have no product charge. Optional catalog descriptions have no extra charge.

| Delivered products | Base | Bronze | Silver | Gold |
| --- | --- | --- | --- | --- |
| 20 | $0.08 | $0.076 | $0.072 | $0.064 |
| 100 | $0.40 | $0.38 | $0.36 | $0.32 |
| 1,000 | $4.00 | $3.80 | $3.60 | $3.20 |

Add the small start charge. Apify's maximum total charge limits the run. The Actor checks available product capacity before delivering additional rows and records a spending-limit stop in SUMMARY. A run cap limits delivered products; it does not guarantee that many matches exist.

### Monitor prices every day

Save a task with the exact SKUs, search terms or category links you want to monitor. In Apify Console, create a schedule, select that task, choose the schedule and timezone, and connect its completed-run webhook to your database or workflow.

Use `retailer + priceScope + sku` as the observation key and scrapedAt as observation time. Preserve identifiers as text, separate one-time and subscription prices, and retain null availability. resolvedStores supplies directory context only.

Every scheduled run creates a new snapshot and charges for its delivered products again. Save snapshots in your database for history. Read SUMMARY before accepting them as complete: empty searches, source failures and spending-limit stops have different meanings. Make, Zapier, n8n, Sheets and webhooks can consume the completed outputs.

### API and automation

Use your own Apify token. Start a run, wait for completion, then read its dataset and SUMMARY:

```bash
curl -X POST \
  'https://api.apify.com/v2/acts/moggedhq~petco-scraper/runs' \
  -H 'Authorization: Bearer YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"searchTerms":["cat litter"],"maxItems":20}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("moggedhq/petco-scraper").call(
    run_input={"productIds": ["3748364", "2998871"], "maxItems": 2}
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('moggedhq/petco-scraper').call({
  searchTerms: ['dog food'], maxItems: 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

### Use with AI agents (MCP)

Connect to `https://mcp.apify.com`. Ask for Petco online prices, regular prices, recurring Autoship prices and pickup eligibility for your keywords or SKUs. Supply a cap and ask the assistant to inspect SUMMARY and retain online price scope. Locations add directory context.

### Limits

This Actor covers the public national online catalog. Verified local store prices, shelf prices, selected-store stock counts and pickup availability at a specific store are outside coverage. Product rows keep store and inventory fields null. ZIP and store selection resolve public directory metadata only.

The catalog does not supply verified UPCs, advertised unit prices, promotion start/end dates, first-order Autoship offer amounts, personalized Petco Perks offers, product-page ingredients, guaranteed analysis or feeding directions through this route. Those fields stay null. includeDetails adds a catalog description only. Ratings can be shared across related sizes and flavors.

Pickup and same-day flags are catalog eligibility signals. They are not a promise that a selected store can fulfill an order. Taxes, shipping, basket conditions and checkout discounts are outside the observed online price. Prices and catalog availability can change after collection; the source's search index can also update at a different moment from a product page.

Requests are sequential and paced, with fresh sessions on retries. Saved page snapshots, dataset rows and billing receipts support reboot recovery. Source refusals and outages can still prevent complete output. The Actor does not log in, use customer account cookies, solve CAPTCHAs or call paid unblocking services. Store directory metadata used for exact store-number lookups can be reused for up to seven days and is timestamped in SUMMARY.

### FAQ

**Does each size have its own row?** Yes. Each distinct priced variant SKU is a separate product. The parentProductId keeps related sizes together.

**Does a ZIP change the price?** No. ZIPs resolve nearby-store directory context in SUMMARY. Product prices remain explicitly national online observations.

**Can I monitor an exact bag size?** Yes. Supply the SKU from that size's product URL in productIds. A missing SKU never becomes a sibling-size result.

**Is the Autoship price the first-order promotion?** No. It is the published recurring catalog price. Initial-order incentives and account eligibility are separate.

**Why is a field null?** This route does not supply a verified value for that field. Unknown stock is not treated as out of stock.

Petco is a trademark of its respective owner. This independently developed tool is not affiliated with or endorsed by Petco.

# Actor input Schema

## `searchTerms` (type: `array`):

Petco searches such as dog food, cat litter or aquarium filter. Returns distinct size/flavor SKUs with national online prices. Leave empty when using only URLs or product IDs.

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

Optional HTTPS petco.com category, deals category, search or full product links. Product URLs must end in the numeric SKU. Category paths use the last category group.

## `productIds` (type: `array`):

Optional Petco part numbers, such as 3748364 or 2998871. These are the numeric SKUs at the end of product URLs, not internal catEntryId or UPC values. Exact SKU identity is checked.

## `locations` (type: `array`):

US ZIP codes, such as 10003 or 90210. Resolves the nearest public store in SUMMARY. Prices remain national online prices; selected-store stock and shelf prices are not included.

## `storeIds` (type: `array`):

Optional public store numbers, such as 3741. Overrides ZIP selection. Resolves store directory metadata only; it does not turn national catalog prices into local store prices.

## `maxItemsPerSearch` (type: `integer`):

Maximum new variant SKU rows from each search or category. Each size/flavor with its own price is one product. Exact product inputs return one matching SKU.

## `maxItems` (type: `integer`):

Global distinct product SKU cap. About $0.004 per product: 20 products cost $0.08 plus the small start charge. Overlapping sources are deduplicated.

## `dealsOnly` (type: `boolean`):

Keep online markdowns and products assigned to a deal or clearance group by Petco. Group membership does not guarantee a markdown. Recurring Autoship eligibility alone does not qualify.

## `includeDetails` (type: `boolean`):

Adds the public catalog description. Facets and taxonomy already accompany every row. Product-page UPCs, ingredients, nutrition and feeding directions are not available and remain null. No extra fee.

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

Default datacenter pool first, then US residential retries. Custom proxy configuration is optional. No login, account session, CAPTCHA solving or paid unblocker is used.

## `postalCodes` (type: `array`):

Alias for locations. Use locations for compatibility with the US retail family.

## `categoryUrls` (type: `array`):

Optional category URL alias. startUrls is the shared family input.

## Actor input object example

```json
{
  "searchTerms": [
    "dog food"
  ],
  "locations": [
    "10003"
  ],
  "maxItemsPerSearch": 20,
  "maxItems": 20,
  "dealsOnly": false,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

No description

## `deals` (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 = {
    "searchTerms": [
        "dog food"
    ],
    "locations": [
        "10003"
    ],
    "maxItemsPerSearch": 20,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("moggedhq/petco-scraper").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 = {
    "searchTerms": ["dog food"],
    "locations": ["10003"],
    "maxItemsPerSearch": 20,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("moggedhq/petco-scraper").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 '{
  "searchTerms": [
    "dog food"
  ],
  "locations": [
    "10003"
  ],
  "maxItemsPerSearch": 20,
  "maxItems": 20
}' |
apify call moggedhq/petco-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moggedhq/petco-scraper"
        }
    }
}
```

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/GESDxrmZtQT4VEElc/builds/ARq7Fcn2Ox7EhlewK/openapi.json
