# Sam's Club API — live samsclub.com data: product search with member prices, Instant Savings, unit prices and stock; one item in full with the in-club, delivery and shipping price of a chosen club, in-club stock count and aisle, UPC, model, specifications and ratings; the clubs near a ZIP code; and which nearby clubs have an item in stock. No login, no membership, no API key.

> Search samsclub.com by keyword with the site's own sort and price filter. Rows carry the card price, was-price and Instant Savings, unit price, stock status, pickup/delivery/shipping flags, rating and review count and SNAP flag; the site's paid tiles come in a separate `sponsored` list. Prices are the site's default club (named in `data.club`, `store_defaulted: true`); use `product` with `club_id` for another club's price.
> ReefAPI engine `samsclub` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/samsclub/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/samsclub/v1/search — 3 credits
Search samsclub.com by keyword with the site's own sort and price filter. Rows carry the card price, was-price and Instant Savings, unit price, stock status, pickup/delivery/shipping flags, rating and review count and SNAP flag; the site's paid tiles come in a separate `sponsored` list. Prices are the site's default club (named in `data.club`, `store_defaulted: true`); use `product` with `club_id` for another club's price.

**Parameters:**
- `query` (string, required) — Search text as typed into samsclub.com's own search box. The site's search is semantic: a nonsense term still returns a few loosely related items ('zzqqxxyyqqvv' -> 8), so read `total` rather than expecting 0.
- `page` (integer, optional, default 1) — Result page (about 40-50 items each; 'chicken' 166 results -> 4 pages, no product repeated across pages 1-3; the sponsored tiles come apart in `sponsored`).
- `sort` (enum, optional, default "best_match") — Result order, the site's own sort keys. Unknown values are refused (the site silently falls back to best match). [one of: best_match, price_low, price_high]
- `min_price` (number, optional) — Lowest card price in USD. Applied by the site to the products ('chicken' 166 -> 13 for 20-30, every product row in range); the site's paid tiles ignore it and are returned apart in `sponsored`.
- `max_price` (number, optional) — Highest card price in USD (see min_price).

**Returns:** data.products[]: item_id, product_id, name, url, image, price, price_display, was_price, savings_amount, savings_text, price_type (MEMBER = Instant Savings), unit_price, price_range, currency, availability, availability_text, fulfillment[], pickup_club_id, rating, review_count, department, product_type, category_path_id, snap_eligible, badges[], promotions[], sponsored (false), rank (organic position), grid_position. data.sponsored[]: the site's paid tiles on this page, same row shape with sponsored true, never in products or total (they repeat on every page and ignore the price filter). data.total = organic results (exact on a one-page answer, else the site's count minus this page's ads with total_is_exact false); data.total_reported_by_site; data.pagination {page, last_page, has_more}; data.club {club_id, postal_code, state}; data.store_defaulted.

**Example request body:**
```json
{
  "query": "paper towels"
}
```

### POST https://api.reefapi.com/samsclub/v1/product — 3 credits
One Sam's Club item in full for a chosen club (or the site's default club): headline price plus the in-club, delivery and shipping price separately, was-price and savings, unit price, stock per fulfillment option with the in-club quantity, aisle location, item number, UPC, brand, model, specifications, description, images, rating breakdown and top reviews.

**Parameters:**
- `item_id` (string, required) — Sam's Club item id: the number at the end of the item URL (samsclub.com/ip/<name>/<item_id>) and the `item_id` of a search row.
- `club_id` (string, optional) — Sam's Club club (store) number from the `clubs` action. Price, in-club stock count and aisle location are that club's. Without it the site's default club is used and `store_defaulted` is true.

**Returns:** data.product: item_id, product_id, item_number, name, brand, model, upc, url, price, price_display, was_price, savings_amount, unit_price, currency, channel_prices[] {channel PICKUP|DELIVERY|SHIPPING, price, was_price, savings_amount, unit_price, item_number, max_order_quantity}, availability, fulfillment_options[] {type, availability, available_quantity, max_order_quantity, low_stock, speed, location}, aisle_location, club_name, order_limit, member_limit, sales_unit, snap_eligible, rating, review_count, rating_breakdown, recommended_percentage, reviews_with_text, top_reviews[], short_description, description, highlights[], specifications[] {label, value}, category_path[], images[], promotions[]. data.club {club_id, name, postal_code}; data.store_defaulted.

**Example request body:**
```json
{
  "item_id": "13624255116",
  "club_id": "8165"
}
```

### POST https://api.reefapi.com/samsclub/v1/clubs — 2 credits
Sam's Club clubs near a US ZIP code, nearest first: club number, name, address, distance, time zone, pickup services and opening hours.

**Parameters:**
- `zip_code` (string, required) — 5-digit US ZIP code; clubs are returned nearest first.

**Returns:** data.clubs[]: club_id, name, distance_miles, address, city, state, postal_code, country, latitude, longitude, time_zone, services[], selectable_online, open_24_hours, hours[] {day, open, close, closed}.

**Example request body:**
```json
{
  "zip_code": "75231"
}
```

### POST https://api.reefapi.com/samsclub/v1/club_availability — 1 credit
Which Sam's Club clubs near a ZIP code have one item in stock (the site's own 'check other clubs' answer), nearest first.

**Parameters:**
- `item_id` (string, required) — Sam's Club item id: the number at the end of the item URL (samsclub.com/ip/<name>/<item_id>) and the `item_id` of a search row.
- `zip_code` (string, required) — 5-digit US ZIP code; clubs are returned nearest first.
- `limit` (integer, optional, default 10) — How many nearby clubs to check (1-20, default 10).

**Returns:** data.clubs[]: club_id, name, distance_miles, address, city, state, postal_code, availability (IN_STOCK | OUT_OF_STOCK as the site states it), services[], hours[]. data.in_stock_count.

**Example request body:**
```json
{
  "item_id": "13624255116",
  "zip_code": "75231"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=samsclub
- Human docs page: https://reefapi.com/docs/samsclub
- Overview page: https://reefapi.com/samsclub-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
