# Cruz Verde Colombia Pharmacy Price & Stock Scraper (`scrapers_lat/cruz-verde-scraper`) Actor

Extract medicine prices and stock from Cruz Verde Colombia pharmacy. Get product name, brand, laboratory, active ingredient, INVIMA registration, price, discount, stock by zone and prescription flag. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers_lat/cruz-verde-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 4.38 out of 5 stars

## Pricing

from $6.15 / 1,000 results

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

[![Cruz Verde Colombia Pharmacy Price & Stock Scraper](https://scrapers.lat/banners/cruz-verde-scraper.png)](https://console.apify.com/actors/Thhpk9YSZ0DwXcj1l/input)

## Cruz Verde Colombia Pharmacy Price & Stock Scraper

Here is one real result, with every field the actor returns (this record has `withDetails` and both AI add-ons enabled; the long `technicalSheet` is trimmed with a note, values real):

```json
{
  "imageUrl": "https://beta1.cruzverde.com.co/on/demandware.static/-/Sites-masterCatalog_Colombia/default/dw5a59a0a5/images/large/531007_1_DOLOFEN_500MG_CAP_BLAND_CAJ_X_20_PROCAPS.jpg",
  "name": "Dolofen 500Mg Cápsulas Blandas Caja X 20",
  "url": "https://www.cruzverde.com.co/product/dolofen-500mg-capsulas-blandas-caja-x-20/COCV_531007",
  "productId": "COCV_531007",
  "brand": "PROCAPS SA",
  "subBrand": "DOLOFEN",
  "laboratory": "PROCAPS SA",
  "activeIngredient": "ACETAMINOFEN",
  "sanitaryRegistration": "INVIMA 2021M-005440-R4",
  "price": 13930,
  "originalPrice": 19900,
  "discountPercent": 30,
  "currency": "COP",
  "pricePerUnit": "CAPSULA a $ 696,50",
  "inStock": true,
  "stock": 520,
  "stockByZone": null,
  "prescriptionRequired": true,
  "isBioequivalent": false,
  "regulated": false,
  "isMedication": false,
  "promotionalTag": "AHORRA 30%",
  "minOrderQuantity": 1,
  "hasExpressDelivery": false,
  "category": "medicamento-alivdolor-doloryfiebre",
  "storePickup": true,
  "homeDelivery": true,
  "images": ["https://beta1.cruzverde.com.co/on/demandware.static/-/Sites-masterCatalog_Colombia/default/dw5a59a0a5/images/large/531007_1_DOLOFEN_500MG_CAP_BLAND_CAJ_X_20_PROCAPS.jpg"],
  "description": "Descubre Dolofen 500 mg, una fórmula en cápsulas blandas que contiene principios activos de alta calidad. Domicilio gratis por compras superiores a $170.000.",
  "technicalSheet": "DESCRIPCION ARTÍCULO: DOLOFEN 500MG CAP BLAND CAJ X 20 PROCAPS PRINCIPIO ACTIVO: ACETAMINOFEN CONCENTRACIÓN: 500MG PRESENTACIÓN: CAJ X 20 ...",
  "aiDescription": "Dolofen 500 mg is a soft capsule medication containing acetaminophen, designed to relieve pain and reduce fever. Each box contains 20 capsules, and it is important to follow the dosage instructions and consult a doctor if symptoms persist.",
  "aiAttributes": {
    "form": "cápsulas blandas",
    "activeIngredient": "acetaminofén",
    "strength": "500 mg",
    "presentation": "caja x 20",
    "usage": null,
    "prescriptionRequired": null
  },
  "searchTerm": "acetaminofen",
  "observedAt": "2026-08-14T07:16:59.399Z",
  "error": null
}
```

The most complete Cruz Verde (Colombia) pharmacy scraper available. It returns every field the Cruz Verde catalog exposes, including list and discounted price in COP, per-zone stock, laboratory, active ingredient, INVIMA registration, prescription flag and technical sheet, plus two optional AI add-ons, and lets you search by product, ingredient or brand across seven cities.

**📥 [Input](https://apify.com/scrapers_lat/cruz-verde-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/cruz-verde-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/cruz-verde-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/cruz-verde-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Colombia-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor opens a guest session on Cruz Verde Colombia, searches the catalog for each term you pass, paginates through the matches, and writes one normalized record per product to the run's dataset. List and discounted prices are parsed to numbers in COP with the discount percent computed, and when `withDetails` is on the actor opens each product for the laboratory, active ingredient, INVIMA registration, prescription flag and technical sheet. Add extra inventory zones and each record also carries per-zone stock in `stockByZone`. Missing source values are returned as `null`, never invented.

Data covers the Cruz Verde Colombia catalog, priced and stocked for the selected inventory zone (Bogota by default; seven cities available). Two optional AI add-ons (`withAiDescription`, `withAiAttributes`) can enrich each record; they are opt-in, billed only when they produce output, and disabled on free Apify plans.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns 2 acetaminophen products with details.

```json
{
  "searchTerms": ["acetaminofen"],
  "maxProducts": 2,
  "withDetails": true
}
```

Add more `inventoryZones` to capture per-zone stock. At least one `searchTerms` entry is required.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchTerms` | array | yes | `["acetaminofen"]` | Product names, active ingredients or brands to search, for example `acetaminofen`, `ibuprofeno`, `dolex`. One record per matching product. |
| `maxProducts` | integer | no | `10` | Maximum products to collect across all search terms. Free Apify plans are capped at 10 per run. |
| `withDetails` | boolean | no | `true` | Open each product to add laboratory, active ingredient, INVIMA registration, prescription flag, presentation and full description. |
| `inventoryZones` | array | no | `["COCV_zona64"]` | Inventory zones (cities) for stock and prices. First zone drives prices/images; extra zones add per-zone stock. Options: Bogota `COCV_zona64`, Medellin `COCV_zona120`, Cali `COCV_zona14`, Barranquilla `COCV_zona70`, Cartagena `COCV_zona90`, Bucaramanga `COCV_zona80`, Pereira `COCV_zona99`. |
| `inventoryZone` | string | no | `COCV_zona64` | Deprecated single-zone input, kept for backwards compatibility. Use `inventoryZones` instead. |
| `sort` | enum | no | (relevance) | Order: `price-low-to-high`, `price-high-to-low`, `product-name-ascending`, `product-name-descending`. Empty keeps relevance. |
| `withAiDescription` | boolean | no | `false` | Add a clean English AI product description. Paid add-on, disabled on free plans. |
| `withAiAttributes` | boolean | no | `false` | Extract normalized attributes (form, active ingredient, strength, presentation, usage, prescription) via AI. Paid add-on, disabled on free plans. |

### Output reference

One dataset item per product. Types: `string`, `number`, `boolean`, `string[]`, `object`, or `null` when the source value is absent. Detail-only fields are populated when `withDetails` is on.

| Field | Type | Description |
|---|---|---|
| `imageUrl` | string | Primary product image. |
| `name` | string | Product name. |
| `url` | string | Public product page URL. |
| `productId` | string | Cruz Verde product ID. |
| `brand` | string | Brand. |
| `subBrand` | string | Sub-brand, or `null`. Present with `withDetails`. |
| `laboratory` | string | Manufacturing laboratory, or `null`. Present with `withDetails`. |
| `activeIngredient` | string | Active ingredient, or `null`. Present with `withDetails`. |
| `sanitaryRegistration` | string | INVIMA sanitary registration, or `null`. Present with `withDetails`. |
| `price` | number | Current/discounted price in COP. |
| `originalPrice` | number | List price in COP when discounted, else `null`. |
| `discountPercent` | number | Discount percent when discounted, else `null`. |
| `currency` | string | Currency code. Always `COP`. |
| `pricePerUnit` | string | Price-per-unit text, for example `CAPSULA a $ 696,50`. |
| `inStock` | boolean | Whether stock is available in the primary zone, or `null`. |
| `stock` | number | Stock quantity in the primary zone, or `null`. |
| `stockByZone` | object | Per-zone stock `{ zone: quantity }` when extra zones are set, else `null`. |
| `prescriptionRequired` | boolean | Whether a prescription is required, or `null`. Present with `withDetails`. |
| `isBioequivalent` | boolean | Whether the product is bioequivalent, or `null`. Present with `withDetails`. |
| `regulated` | boolean | Whether the product is price-regulated, or `null`. Present with `withDetails`. |
| `isMedication` | boolean | Whether it is classed as a medication, or `null`. Present with `withDetails`. |
| `promotionalTag` | string | Promotion label, for example `AHORRA 30%`, or `null`. Present with `withDetails`. |
| `minOrderQuantity` | number | Minimum order quantity, or `null`. Present with `withDetails`. |
| `hasExpressDelivery` | boolean | Whether express delivery is available, or `null`. Present with `withDetails`. |
| `category` | string | Category slug, or `null`. Present with `withDetails`. |
| `storePickup` | boolean | Whether store pickup is available, or `null`. |
| `homeDelivery` | boolean | Whether home delivery is available, or `null`. |
| `images` | string\[] | Full image gallery, or `null`. Present with `withDetails`. |
| `description` | string | Product description, or `null`. Present with `withDetails`. |
| `technicalSheet` | string | Technical sheet text, HTML stripped, or `null`. Present with `withDetails`. |
| `aiDescription` | string | AI English description. Present only when `withAiDescription` is enabled. |
| `aiAttributes` | object | AI normalized attributes. Present only when `withAiAttributes` is enabled. |
| `searchTerm` | string | The search term that produced this record. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. On a failed run, a single item with a populated `error` field is written instead. |

### Example output record

Real record from a live run (input `{"searchTerms":["acetaminofen"],"maxProducts":2,"withDetails":true}`):

```json
{
  "name": "Dolofen 500Mg Cápsulas Blandas Caja X 20",
  "url": "https://www.cruzverde.com.co/product/dolofen-500mg-capsulas-blandas-caja-x-20/COCV_531007",
  "productId": "COCV_531007",
  "brand": "PROCAPS SA",
  "laboratory": "PROCAPS SA",
  "activeIngredient": "ACETAMINOFEN",
  "sanitaryRegistration": "INVIMA 2021M-005440-R4",
  "price": 13930,
  "originalPrice": 19900,
  "discountPercent": 30,
  "currency": "COP",
  "pricePerUnit": "CAPSULA a $ 696,50",
  "inStock": true,
  "stock": 520,
  "prescriptionRequired": true,
  "promotionalTag": "AHORRA 30%",
  "category": "medicamento-alivdolor-doloryfiebre",
  "storePickup": true,
  "homeDelivery": true,
  "searchTerm": "acetaminofen",
  "observedAt": "2026-08-14T07:16:59.399Z",
  "error": null
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~cruz-verde-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["acetaminofen"],"maxProducts":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~cruz-verde-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["ibuprofeno","dolex"],"inventoryZones":["COCV_zona64","COCV_zona120"],"maxProducts":200}'
```

Apify CLI:

```bash
apify call scrapers_lat/cruz-verde-scraper \
  --input '{"searchTerms":["acetaminofen"],"maxProducts":10}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per product returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/cruz-verde-scraper/pricing) for the current per-result price.
- **Detail enrichment billed separately.** With `withDetails` on, a `details` event is charged per product only when the detail fetch succeeds.
- **AI add-ons billed separately.** `withAiDescription` and `withAiAttributes` each charge their own event only when they produce output, and are disabled on free plans.
- **No charge on failure.** If a run errors, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 records per run. Upgrade for higher `maxProducts`.

### FAQ and troubleshooting

**A run returned 0 records. Why?**
The search term matched no products. Try the active ingredient or a broader brand name. Zero-result runs are not charged.

**How do I get prices and stock for a specific city?**
Set `inventoryZones` to the city zone(s). The first zone drives prices and images; extra zones add per-zone stock in `stockByZone`.

**Do I get the discounted price and the promotion?**
Yes. When a product is on sale you get `price` (discounted), `originalPrice`, `discountPercent` and the `promotionalTag`.

**Is the INVIMA registration included?**
Yes, in `sanitaryRegistration`, collected when `withDetails` is on, along with laboratory, active ingredient and the prescription flag.

**Do the AI add-ons work on a free plan?**
No. The AI add-ons require a paid Apify plan and are disabled automatically for free users. The base product fields are always returned.

**Is this an official Cruz Verde tool?**
No. This actor is independent and has no affiliation with Cruz Verde. It reads only data that is publicly available on cruzverde.com.co. Product names and trademarks belong to their respective owners.

### Related scrapers

- [Coto Argentina Grocery Price & Discount Scraper](https://apify.com/scrapers_lat/coto-argentina-scraper): grocery prices, discounts and stock at Coto Argentina.
- [MercadoLibre Product & Price Scraper (LATAM)](https://apify.com/scrapers_lat/mercadolibre-scraper): marketplace listings and prices across Latin America.
- [Jumbo Argentina Grocery Price Scraper](https://apify.com/scrapers_lat/jumbo-ar-scraper): grocery prices and promotions at Jumbo Argentina.
- [Dia Argentina Grocery Price & Stock Scraper](https://apify.com/scrapers_lat/dia-ar-scraper): grocery prices and stock at Dia Argentina.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with Cruz Verde. Accesses only publicly available product data. Product names and trademarks belong to their respective owners.

# Actor input Schema

## `maxProducts` (type: `integer`):

Maximum number of products to collect across all search terms. Optional.

## `withDetails` (type: `boolean`):

When enabled, the scraper opens each product detail page to add laboratory, active ingredient, INVIMA sanitary registration, prescription flag, presentation and the full description. When disabled, only the faster search-listing fields are returned.

## `withAiDescription` (type: `boolean`):

Add a clean English AI product description generated from the Spanish source data. Opt-in, billed per enriched record; requires a paid Apify plan.

## `withAiAttributes` (type: `boolean`):

Extract normalized attributes (form, active ingredient, strength, presentation, usage, prescription) via AI. Opt-in, billed per enriched record.

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

Product names, active ingredients or brands to search on Cruz Verde Colombia (for example acetaminofen, ibuprofeno, dolex). One record is produced per matching product. Add one or more.

## `inventoryZones` (type: `array`):

Cruz Verde inventory zones (cities) used for stock and prices. The first zone is the primary one used for prices, images and the base stock. Add more cities to capture per-zone stock for each product in the stockByZone field. Defaults to Bogota.

## `inventoryZone` (type: `string`):

Deprecated single-zone input, kept for backwards compatibility. Use Inventory Zones instead. When set and no zones are chosen above, this zone is used.

## `sort` (type: `string`):

Order in which products are returned by the Cruz Verde search.

## Actor input object example

```json
{
  "maxProducts": 10,
  "withDetails": true,
  "withAiDescription": false,
  "withAiAttributes": false,
  "searchTerms": [
    "acetaminofen"
  ],
  "inventoryZones": [
    "COCV_zona64"
  ],
  "inventoryZone": "COCV_zona64",
  "sort": ""
}
```

# Actor output Schema

## `results` (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 = {
    "maxProducts": 10,
    "searchTerms": [
        "acetaminofen"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/cruz-verde-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 = {
    "maxProducts": 10,
    "searchTerms": ["acetaminofen"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/cruz-verde-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 '{
  "maxProducts": 10,
  "searchTerms": [
    "acetaminofen"
  ]
}' |
apify call scrapers_lat/cruz-verde-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/cruz-verde-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/Thhpk9YSZ0DwXcj1l/builds/JshjOj9RRFxumYulq/openapi.json
