# Revival Animal Health Scraper (`muhammadafzal/revival-animal-health-scraper`) Actor

Extract Revival Animal Health products, prices, availability, brands, images, SKUs and variants for pet supply catalog research and price tracking.

- **URL**: https://apify.com/muhammadafzal/revival-animal-health-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 revival animal health 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

## Revival Animal Health Scraper

Extract public Revival Animal Health product catalogs into a structured Apify dataset. Each row contains one unique product with all publicly exposed variants, prices, availability, brand, description, images, SKUs and barcodes. Use it for catalog research, assortment comparison and periodic price observations.

### What it extracts

| Field | Meaning |
|---|---|
| `productId`, `handle`, `url` | Public product identity and canonical product page |
| `title`, `brand`, `productType` | Name, public vendor and product type |
| `description` | Clean plain text from the public description |
| `price`, `priceMax`, `currency` | Lowest and highest variant prices and observed currency |
| `available` | Whether at least one public variant is available |
| `tags`, `images` | Public tags and HTTPS image URLs |
| `variants` | Variant IDs, titles, SKUs, barcodes, prices, comparison prices, availability, images and option values |
| `scrapedAt` | UTC extraction timestamp |

Missing optional values are `null` or empty arrays. A comparison price can equal the current price; it does not necessarily represent a discount. One-time prices are extracted; subscription prices, taxes, delivery charges, account discounts, clinical recommendations, customer details and exact inventory quantities are outside the output contract. Prescription products are catalog observations; no prescription access, account login, checkout or purchasing is performed.

### Choose products or collections

Supply individual `/products/HANDLE` URLs for known products or `/collections/HANDLE` URLs to discover products across collection pages. The default collection is `shop-all-dog`. Cat, horse and other current public collections use the same workflow. The site homepage selects `/collections/all`. Legacy `/category/` URLs are rejected with guidance to use current collection URLs.

```json
{
  "startUrls": [{"url": "https://revivalanimal.com/collections/shop-all-dog"}],
  "maxResults": 5,
  "maxPages": 2,
  "startPage": 1,
  "keyword": "",
  "brand": "",
  "onlyAvailable": false
}
```

For a single product:

```json
{
  "startUrls": [{"url": "https://revivalanimal.com/products/breeders-edge-oral-cal-plus-gel"}],
  "maxResults": 1
}
```

| Input | Default | Bounds and behavior |
|---|---|---|
| `startUrls` | Shop-all-dog collection | 1–20 HTTPS product or collection URLs |
| `maxResults` | 5 | 1–1000 unique delivered products |
| `maxPages` | 2 | 1–50 pages per collection |
| `startPage` | 1 | 1–100; ignored for individual products |
| `keyword` | Empty | Case-insensitive substring in name, description, brand or tags; up to 100 characters |
| `brand` | Empty | Case-insensitive brand substring; up to 100 characters |
| `onlyAvailable` | false | Require at least one publicly available variant |

Filters operate on products discovered within the selected pages. A restrictive filter can return fewer than `maxResults`; increase `maxPages` deliberately when you need broader coverage. Product URL query strings are removed to deduplicate variant links; collection pagination is controlled by `startPage` and `maxPages`. Product order follows the public collection order observed during the run and may change over time.

Verified free-plan runs deliver at most **five products**. Paid and unknown local contexts use the requested limit. Every write checks both this effective cap and the remaining event budget. All variants are included in their product row without additional result events.

### Use through the API or an agent

Use Apify Console, `apify call muhammadafzal/revival-animal-health-scraper`, or the authenticated Apify API. Example Node.js client:

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/revival-animal-health-scraper').call({
  startUrls: [{ url: 'https://revivalanimal.com/products/breeders-edge-oral-cal-plus-gel' }],
  maxResults: 1,
}, { memory: 256, timeout: 300, maxTotalChargeUsd: 0.05 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const summary = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('OUTPUT');
```

An Apify MCP client can call this batch Actor by its name and input object, then retrieve the default dataset and `OUTPUT`. There is no dedicated HTTP or Standby server. The Actor stays private until the owner publishes it; other users need appropriate access first.

### Example product output

This compact excerpt shows an observed product; complete rows also contain descriptions, tags, images, all variant fields and `scrapedAt`. Prices and availability can change.

```json
{
  "productId": "8993990049923",
  "url": "https://revivalanimal.com/products/breeders-edge-oral-cal-plus-gel",
  "title": "Breeder's Edge® Oral Cal Plus™ Gel",
  "brand": "Breeder's Edge",
  "price": 19.94,
  "priceMax": 27.29,
  "currency": "USD",
  "available": true
}
```

### Pay per event

Pricing includes platform usage; platform-usage pass-through is disabled. One synthetic start event applies to each initial run at supported memory allocations; resurrecting a run incurs another start event. One primary dataset-item event applies per unique delivered product. Empty, unavailable-page and rejected-input runs have no product events but still have the start event. No custom event duplicates either synthetic event.

| Event | FREE | BRONZE | SILVER | GOLD |
|---|---:|---:|---:|---:|
| Actor start | $0.006250 | $0.006094 | $0.005938 | $0.005000 |
| Product with variants | $0.005000 | $0.004875 | $0.004750 | $0.004000 |
| Discount from list | 0% | 2.5% | 5% | 20% |

Values round upward at six-decimal precision. At FREE list pricing, one product costs $0.01125 and five products cost $0.03125, including the start. At GOLD, those totals are $0.009 and $0.025. The minimum supported maximum-charge setting is $0.01. The budget can stop a run before its requested result count. Owner test runs expose event counts while actual payment treatment follows Apify's owner-run rules.

### Reliability, limits and diagnostics

The scraper reads public HTML and embedded product JSON, with JSON-LD as a parsing fallback. It scopes collection links to the product grid, follows public next-page signals and deduplicates stable product IDs before writing. It uses sequential HTTP requests, up to two retries for transient failures, exponential backoff with jitter, and bounded `Retry-After` handling for rate limits. No proxy or external provider is required by the tested direct route.

A run performs at most 2000 HTTP attempts, reads at most 12 MB per response and stops collection work after 240 seconds, leaving time to save diagnostics. Earlier platform deadlines also trigger finalization. Three extraction/network failures stop the run; access denials stop promptly. Increasing page and result limits may still hit these work bounds. Successful partial results remain in the dataset.

`OUTPUT` contains the outcome (`DATA`, `EMPTY`, `PARTIAL`, `BLOCKED`, `REJECTED` or `FAILED`), stop reason, delivered count, request/page counts, effective result limit, warnings and event counts. `resultEvents` includes acknowledged events saved before a restart; `sdkResultEvents` shows the current SDK snapshot, which can lag the cumulative platform ledger on resurrection. A valid filter with no matches is `EMPTY`; an access denial is `BLOCKED`, not a fabricated empty catalog. Unknown paths are rejected before crawling. Missing pages produce warnings and no product events. Resume state is persisted in `STATE`; dataset reconciliation prevents duplicate writes when completed records outpace the last saved checkpoint.

### Responsible use and support

Use the extracted public catalog for lawful research with appropriate permission. Respect site terms, robots policies, applicable rights and reasonable request volumes. This independent scraper is not affiliated with Revival Animal Health. Product descriptions are source data and are not veterinary advice. Do not rely on observed stock status to guarantee fulfillment.

For support, provide the Apify run ID and `OUTPUT` summary. Avoid sharing credentials. Report a source markup change with a public product or collection URL so its extraction behavior can be reproduced.

# Actor input Schema

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

Use this to scrape product pages or browse collections. Accepts HTTPS revivalanimal.com /products/HANDLE and /collections/HANDLE URLs. Up to 20 URLs. The homepage selects the full catalog. Legacy /category URLs are unsupported.

## `maxResults` (type: `integer`):

Use this to cap unique delivered products, including all variants in each product row. Default 5; range 1–1000. Verified free-plan runs are capped at 5. The charge budget can lower the delivered count.

## `maxPages` (type: `integer`):

Use this to bound collection pagination. Default 2; range 1–50 for each collection. Filters apply after product extraction, so restrictive filters may return fewer products within this bound.

## `startPage` (type: `integer`):

Use this to start collection browsing at a specific page, for example 2. Default 1; range 1–100. Ignored for individual product URLs.

## `keyword` (type: `string`):

Use this for a case-insensitive substring match in title, description, brand and tags, for example vaccine. Up to 100 characters. Empty returns all examined products; this filters the selected pages locally.

## `brand` (type: `string`):

Use this to match a brand substring, for example Breeder's Edge. Case-insensitive, up to 100 characters. Empty includes all brands on the selected pages.

## `onlyAvailable` (type: `boolean`):

Use this to keep products with at least one publicly available variant. Default false includes unavailable products. Availability is observed storefront data, not an inventory quantity or purchase guarantee.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://revivalanimal.com/collections/shop-all-dog"
    }
  ],
  "maxResults": 5,
  "maxPages": 2,
  "startPage": 1,
  "keyword": "",
  "brand": "",
  "onlyAvailable": false
}
```

# Actor output Schema

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

Default dataset of product records including variants.

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

Outcome, delivered count, stop reason, limits, warnings and event counts.

# 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://revivalanimal.com/collections/shop-all-dog"
        }
    ],
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/revival-animal-health-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 = {
    "startUrls": [{ "url": "https://revivalanimal.com/collections/shop-all-dog" }],
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/revival-animal-health-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 '{
  "startUrls": [
    {
      "url": "https://revivalanimal.com/collections/shop-all-dog"
    }
  ],
  "maxResults": 5
}' |
apify call muhammadafzal/revival-animal-health-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/revival-animal-health-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/g63whrS2MS4PWPmHI/builds/UJXGMTLnS57xNJXN5/openapi.json
