# Publix Scraper: Weekly Ad, BOGO, Price Cuts & Coupons by Store (`zaiq/publix-scraper`) Actor

Scrape Publix deals for any store by ZIP code or store number: the weekly ad with Buy 1 Get 1 Free offers and ad prices, price reductions with regular and reduced prices, and digital coupons, with dates, sizes, departments and images. Filter by words or departments. Pay per deal.

- **URL**: https://apify.com/zaiq/publix-scraper.md
- **Developed by:** [Zaiq](https://apify.com/zaiq) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 3 total users, 2 monthly users, 92.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 deals

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

## Publix Scraper: Weekly Ad, BOGO Deals, Price Reductions and Digital Coupons by Store

Get every deal a Publix store publishes on publix.com: the weekly ad (Buy 1 Get 1 Free offers and ad prices), price
reductions with the regular and the reduced price, digital coupons, and ad items stacked with a coupon, each with its
dates, size, department and image. Choose stores by ZIP code or store number; deals and prices differ between stores,
and every row says which store it belongs to.

### What it does

- Finds the nearest Publix stores to each ZIP code you give (as many per ZIP code as you ask for), or uses the store
  numbers you give.
- Reads each store's deals from publix.com and returns one row per deal: the offer text ("Buy 1 Get 1 FREE",
  "2 for $4.00", "$8.99 each", "Save $2.00"), the price per item where Publix gives one, the regular price for price
  reductions, "save up to" amounts, start and end dates, size, brand, department and image.
- Works out the price of one item for multi-buys: "2 for $4.00" is $2.00 each, and a price reduction of
  "10 for $10.00" from $1.69 each is $1.00 each with a regular price of $1.69.
- Filters by deal type, by words (for example coffee or chicken) and by department (for example meat or produce).

No login and no Publix account are used.

#### What it does not do

Publix shows prices on publix.com only for products on promotion. Its everyday shelf prices are online only through
Instacart, which sets its own, usually higher, prices. This Actor returns what Publix itself publishes for each store
and nothing from Instacart.

### Who uses it

- **Deal and coupon sites, newsletters and apps** that publish the Publix weekly ad and BOGO list every week.
- **Brands and agencies** checking where and when their products are promoted, at what price.
- **Retail and pricing analysts** comparing Publix promotions between regions.

### Example

Publix at Channel Club, Tampa (store 1549), on 4 October 2026: 1,531 deals in 12 seconds.

| Deal type | Deals |
|---|---|
| Price reductions (regular and reduced price) | 740 |
| Weekly ad items | 609, of which 244 Buy 1 Get 1 Free |
| Digital coupons | 169 |
| Weekly ad items stacked with a coupon | 13 |

Some of the rows:

| Item | Offer | Price each | Regular | Dates |
|---|---|---|---|---|
| Publix Assorted Pork Loin Chops | Buy 1 Get 1 FREE, save up to $5.99/lb | | | 1 to 7 Oct |
| Publix Cheesy Deluxe Macaroni Dinner, 12 or 14-oz box | 2 for $4.00 | $2.00 | | 1 to 7 Oct |
| Publix Half & Half, one quart | Price reduction, save $0.48 | $2.67 | $3.15 | |
| Publix Sour Cream, 16 oz | Price reduction, save $0.47 | $1.92 | $2.39 | |

Prices differ between stores. Price reductions at three stores the same day (Tampa FL, Atlanta GA and Charlotte NC):
741, 1,000 and 884 deals; 453 deals were at all three, and 16 of those at different prices, for example a 1 lb box of
baking soda at $0.90 in Tampa and $1.25 in Atlanta and Charlotte.

### Input

```json
{
  "zipCodes": ["33602", "30303"],
  "storesPerZip": 1,
  "dealTypes": ["weekly-ad", "price-reductions", "digital-coupons"],
  "searchTerms": ["coffee", "chicken"],
  "departments": ["meat", "grocery"],
  "maxItemsPerQuery": 2000,
  "maxItems": 5000
}
```

| Field | What it does |
|---|---|
| `zipCodes` | ZIP codes in Publix states. Each gives the nearest Publix stores within 50 miles. |
| `storesPerZip` | How many of the nearest stores to use for each ZIP code (default 1, up to 10). |
| `storeIds` | Publix store numbers, for example `1549` (Publix at Channel Club, Tampa). Shown on every row as `storeId`. |
| `dealTypes` | `weekly-ad`, `price-reductions`, `digital-coupons` (default all three). |
| `searchTerms` | Optional: keep only deals whose title, brand, description or department contains one of these words. |
| `departments` | Optional: keep only deals in these departments or categories (meat, produce, dairy, bakery, deli, grocery, frozen, bogo and so on). |
| `maxItemsPerQuery` | Deals per store (default 2,000; a store usually has 1,000 to 1,600). |
| `maxItems` | Deals in total (default 5,000; 0 means no limit, your spending limit still applies). |
| `includeFailures`, `maxConcurrency`, `proxyConfiguration` | Free failure rows (default on), stores at once (default 4) and the proxy (US residential by default). |

### Output

One row per deal per store. A price reduction from the run above:

```json
{
  "retailer": "Publix",
  "storeId": "1549",
  "storeName": "Publix at Channel Club",
  "storeAddress": "1105 E Twiggs St",
  "storeCity": "Tampa",
  "storeState": "FL",
  "storeZip": "33602",
  "productId": "RIO-PCI-112949",
  "name": "Publix Half & Half, Ultra-Pasteurized",
  "brand": "Publix",
  "size": "one quart (946 ml)",
  "price": 2.67,
  "regularPrice": 3.15,
  "salePrice": 2.67,
  "onSale": true,
  "currency": "USD",
  "promotionText": "Price reduction: $0.48",
  "dealType": "Price reduction",
  "savings": "$0.48",
  "multiBuy": null,
  "category": "dairy",
  "imageUrl": "https://images.publixcdn.com/pct/images/products/65000/067726-600x600-A.jpg",
  "productUrl": "https://www.publix.com/pd/publix-half-half-ultra-pasteurized/RIO-PCI-112949",
  "scrapedAt": "2026-10-04T16:22:07Z",
  "charged": true
}
```

And a weekly ad item:

```json
{
  "retailer": "Publix",
  "storeId": "1549",
  "storeName": "Publix at Channel Club",
  "dealId": "68fd0513-6e7e-4bc5-a775-b89d80f5a9d4",
  "dealType": "Weekly ad",
  "name": "Publix Assorted Pork Loin Chops",
  "brand": "Publix",
  "price": null,
  "onSale": true,
  "promotionText": "Weekly ad: Buy 1 Get 1 FREE",
  "promotionStart": "2026-10-01T00:00:00Z",
  "promotionEnd": "2026-10-07T23:59:59Z",
  "savings": "Buy 1 Get 1 FREE",
  "savingsUpTo": 5.99,
  "dealNote": "SAVE UP TO $5.99 LB",
  "bogo": true,
  "multiBuy": null,
  "department": "Meat",
  "categoryPath": ["meat", "bogo"],
  "description": "Free item of equal or lesser price. 8 Chops per Package",
  "scrapedAt": "2026-10-04T16:21:59Z",
  "charged": true
}
```

- `price` is the price of one item when Publix gives a price. Buy 1 Get 1 Free items have no price: Publix states the
  offer and how much it saves at most (`savingsUpTo`).
- `regularPrice` is given for price reductions only; Publix does not publish the regular price of weekly ad items.
- `dealType`: "Weekly ad", "Price reduction", "Digital coupon" or "Weekly ad + digital coupon". Coupons are listed in
  `coupons` with their value, minimum purchase and dates; they must be clipped in a Publix account to be used.
- `productId` is Publix's product number (price reductions and some ad items). `requestedZip` is the ZIP code that
  led to the store.
- Failure rows have `error` set and `charged: false`. The key-value store record `RUN-SUMMARY` lists the stores
  used, failures, stop reason and traffic.

### Where the prices come from

Each row is a deal publix.com shows for that store at the time in `scrapedAt`. A weekly ad runs for a week (1 to 7
October 2026 in the run above) and differs by region, and price reductions differ by store, so always use the store
columns with the price. Nothing comes from Instacart.

### Use it from code, automations and AI agents

- **API**: run it and get the results in one call: `POST https://api.apify.com/v2/acts/zaiq~publix-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input as JSON. The API tab on this page has ready-made Python, JavaScript and cURL examples.
- **Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("zaiq/publix-scraper").call(run_input={'zipCodes': ['33602'], 'maxItemsPerQuery': 25, 'maxItems': 25})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

- **No code**: connect it to Google Sheets, Zapier, Make or n8n from the Integrations tab, schedule runs in Apify Console, and get a webhook when a run finishes.
- **AI agents (MCP)**: add it as a tool to Claude, Cursor or any MCP client through Apify's MCP server: `https://mcp.apify.com?tools=zaiq/publix-scraper`.

### Pricing

You pay only for deal rows: $0.004 per deal ($4 per 1,000), Apify platform usage included. Failure rows and
duplicates are free. Your spending limit for the run is respected: the run stops cleanly before going over it.

### Limits

- Deals only: no everyday shelf prices (Publix does not publish them on its own site), no stock and no aisles.
- Publix stores are in Florida, Georgia, Alabama, South Carolina, North Carolina, Tennessee, Virginia and Kentucky; a
  ZIP code with no store within 50 miles returns a free row saying so.
- Product URLs are built from Publix's product numbers; weekly ad items without one link to the weekly ad page.

### FAQ

**Do I need a Publix account?** No. Nothing is signed in to, and coupons are reported, not clipped.

**How often does the weekly ad change?** Every week; each row has its start and end date. Run the Actor on a weekly
schedule, on the day the new ad starts, to keep a history.

**How do I get only the BOGO list?** Set Deal types to Weekly ad and Only these departments to `bogo`.

**Why does a BOGO item have no price?** Publix advertises Buy 1 Get 1 Free without a shelf price; `savingsUpTo` is the
most you save.

# Actor input Schema

## `zipCodes` (type: `array`):

Deals differ by store. Each ZIP code gives the nearest Publix stores within 50 miles (Florida, Georgia, Alabama, South Carolina, North Carolina, Tennessee, Virginia and Kentucky); set how many with Stores per ZIP code.

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

Optional, instead of or as well as ZIP codes. Publix store numbers such as 1549 (Publix at Channel Club, Tampa). Shown on every row as storeId.

## `storesPerZip` (type: `integer`):

How many of the nearest stores to scrape for each ZIP code (nearest first).

## `dealTypes` (type: `array`):

Which deals to return. Weekly ad includes Buy 1 Get 1 Free offers and ad items that are stacked with a digital coupon.

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

Optional. Keep only deals whose title, brand, description or department contains one of these words (for example chicken, coffee, cereal).

## `departments` (type: `array`):

Optional. Keep only deals in these departments or categories, for example meat, produce, dairy, bakery, deli, grocery, frozen, bogo.

## `maxItemsPerQuery` (type: `integer`):

Stop each store after this many deals. A store usually has 1,000 to 1,600 deals.

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

The run stops after this many deal rows. 0 means no limit (your spending limit still applies).

## `includeFailures` (type: `boolean`):

Add a free row (with an error field) for each ZIP code without a store or store without deals. Switch off to keep only deal rows.

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

How many stores are read at the same time.

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

US residential proxies are used by default (publix.com serves US visitors).

## Actor input object example

```json
{
  "zipCodes": [
    "33602"
  ],
  "storesPerZip": 1,
  "dealTypes": [
    "weekly-ad",
    "price-reductions",
    "digital-coupons"
  ],
  "maxItemsPerQuery": 25,
  "maxItems": 25,
  "includeFailures": true,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Dataset with one row per deal per store.

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

Stores used, products written, failures, stop reason and approximate traffic.

# 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 = {
    "zipCodes": [
        "33602"
    ],
    "maxItemsPerQuery": 25,
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/publix-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 = {
    "zipCodes": ["33602"],
    "maxItemsPerQuery": 25,
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/publix-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 '{
  "zipCodes": [
    "33602"
  ],
  "maxItemsPerQuery": 25,
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call zaiq/publix-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaiq/publix-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/ddllLveE5flvoebgx/builds/1KYioMyHh3E1Tme9r/openapi.json
