# Spices Board India Small Cardamom Auctions (`vixendata/spices-board-small-cardamom-auctions`) Actor

Official small cardamom auction prices, lots and quantities with exact decimal values.

- **URL**: https://apify.com/vixendata/spices-board-small-cardamom-auctions.md
- **Developed by:** [Vixendata](https://apify.com/vixendata) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 58.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 published auction aggregate fact set (not an individual lot)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Spices Board India Small Cardamom Auctions

Read official public small-cardamom auction results: auction date and auctioneer, lot count, arrived/sold kilograms, and minimum/maximum/average INR-per-kg prices. Useful for commodity reporting, purchasing research and historical comparison. Not investment advice.

### Quick start

Default input `{}` reads the latest page, returning up to 10 auctions. For two pages use:

```json
{"maxPages": 2, "maxItems": 20}
```

For a bounded date-filtered scan:

```json
{"maxPages": 10, "maxItems": 100, "dateFrom": "2026-09-01", "dateTo": "2026-09-30"}
```

- `maxPages`: 1–20, default 1. Starts at the latest page and follows only the site's explicit next-page links.
- `maxItems`: 1–200, default 10. Maximum output auctions.
- `dateFrom`, `dateTo`: optional inclusive YYYY-MM-DD filters. They filter only the visited pages, not the entire archive. A narrow older date range may return no rows when the page bound is too small.

Pages are serially requested at least two seconds apart, respecting any longer robots crawl delay/request rate. There is one initial robots request (plus at most one same-origin homepage redirect) and at most `maxPages` auction requests. Responses are capped at 2 MB. No login, CAPTCHA solving, rotating proxies, alternative APIs or retries. All non-200 responses except that narrowly allowed robots redirect, other redirects, access challenges and malformed table structures stop with a failed run.

### Output and precision

One dataset row per distinct published auction fact set. `auctionDate` is the source's calendar date, without invented timezone conversion. `observedAt` is UTC extraction time. Price and weight fields are exact decimal strings: `"3836.00"` preserves published precision. Missing numeric cells become JSON null; zero remains zero, never missing. `lots` and `sourceSerial` are integers or null. Raw cell strings are retained in `rawValues`.

Fields include `recordId`, `auctionDate`, `auctioneer`, `lots`, `arrivedKg`, `soldKg`, `maxPriceInrPerKg`, `minPriceInrPerKg`, `averagePriceInrPerKg`, `currency` (INR), `priceUnit` (INR/kg), `weightUnit` (kg), `commodity`, attribution and source URLs.

The SHA-256 `recordId` derives from date, auctioneer and numeric auction facts, excluding page-relative serial and observation time. Different auctioneers or different facts on the same date survive deduplication. The source exposes no durable auction identifier; indistinguishable exact duplicates are collapsed, while revisions create a new record ID. This is a bounded current snapshot, not a revision-history service. Repeat-page and URL-loop detection prevent cycling.

The `OUTPUT` key-value record describes pages, request count, rows, stop reason and robots status. On a source failure the Actor fails and does not claim complete coverage or publish accumulated rows.

### Attribution and source access

Source: [Spices Board India](https://www.indianspices.com/marketing/price/domestic/daily-price-small.html).
[Website policy](https://www.indianspices.com/website-policy.html) permits accurate reproduction with attribution and excludes separately credited third-party material. This Actor extracts factual auction rows only, not newspaper-sourced market-price material or long prose.

On 7 October 2026, `/robots.txt` redirected to the same-origin homepage, which returned an ordinary HTML page rather than machine-readable directives. This is recorded as `unavailable_html`, not explicit permission. The Actor can read the ordinary public auction pages in that situation; if valid robots directives are returned, it enforces them. Any access-denial/challenge markup or HTTP error at the robots endpoint stops the run. Unknown non-HTML malformed robots responses stop as well.

### Development and testing

```bash
python -m venv .venv
.venv/bin/pip install -r requirements.txt -r requirements-dev.txt
.venv/bin/python -m unittest discover -s tests -v
.venv/bin/python -m src.main
```

`.actor/` declares official Apify input and dataset metadata. Tests validate those against snapshots of the official Apify metaschemas and validate every genuine fixture row against the actual dataset fields schema. Sanitized fixtures retain just public auction tables and pagination. Tests cover current facts, two-page traversal, loops, duplicate pages, header drift, date/input validation, missing/zero values, precision, distinct same-day facts, access denials, robots and bounded requests.

`smoke/latest.json` and `smoke/two-pages.json` are small suggested hosted smoke inputs. No hosted run, upload or Apify spend is part of this local build. `review/` contains local test and runtime evidence. The Dockerfile pins the Python major/minor base and requirements pins the SDK/Crawlee/Pydantic runtime versions; transitive dependencies/base-image updates are not a full reproducible lock.

# Actor input Schema

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

Bounded maxPages to retrieve.

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

Bounded maxItems to retrieve.

## `dateFrom` (type: `string`):

Inclusive YYYY-MM-DD filter on visited pages only. Omit to leave unbounded.

## `dateTo` (type: `string`):

Inclusive YYYY-MM-DD filter on visited pages only. Omit to leave unbounded.

## Actor input object example

```json
{
  "maxPages": 1,
  "maxItems": 10
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("vixendata/spices-board-small-cardamom-auctions").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("vixendata/spices-board-small-cardamom-auctions").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 '{}' |
apify call vixendata/spices-board-small-cardamom-auctions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vixendata/spices-board-small-cardamom-auctions"
        }
    }
}
```

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/dmrnFbbvxWmfAhtEx/builds/XN78CrTFK6D2bIjox/openapi.json
